public void When_DistinctIdAndAliasFromParams_Then_AllPropertiesSet() { MessageBuildResult messageBuildResult = AliasMessageBuilder.Build(Token, null, DistinctId, Alias); AssertMessageSuccess(messageBuildResult, Token, DistinctId, Alias); }
public void When_NameFormattingConfigured_Then_FormattingAppliedToPropertyNames() { var config = new MixpanelConfig { MixpanelPropertyNameFormat = MixpanelPropertyNameFormat.TitleCase }; var superProperties = CreateSuperProperties( // Must be overwritten by message property ObjectProperty.Default("PropertyA", PropertyOrigin.SuperProperty, 10), ObjectProperty.Default("PropertyC", PropertyOrigin.SuperProperty, 3)); var rawProperties = new { PropertyA = 1, PropertyB = 2 }; MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, superProperties, rawProperties, DistinctId, config); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId, new KeyValuePair <string, object>("Property A", 1), new KeyValuePair <string, object>("Property B", 2), new KeyValuePair <string, object>("Property C", 3)); }
private void AssertDeleteMessageSuccess(MessageBuildResult messageBuildResult, object expectedDistinctId) { AssertMessageSuccess(messageBuildResult); AssetMessageProperties( messageBuildResult, new (string name, object value)[]
public void When_PredefinedPropertiesUsed_Then_AllPropertiesInMessage() { var rawProperties = new Dictionary <string, object> { { MixpanelProperty.DistinctId, DistinctId }, { MixpanelProperty.Time, Time }, { MixpanelProperty.Ip, Ip }, { MixpanelProperty.Duration, Duration }, { MixpanelProperty.Os, Os }, { MixpanelProperty.ScreenWidth, ScreenWidth }, { MixpanelProperty.ScreenHeight, ScreenHeight } }; MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, null, rawProperties, null, null); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId, new KeyValuePair <string, object>(TrackSpecialProperty.Time, TimeUnix), new KeyValuePair <string, object>(TrackSpecialProperty.Ip, Ip), new KeyValuePair <string, object>(TrackSpecialProperty.Duration, DurationSeconds), new KeyValuePair <string, object>(TrackSpecialProperty.Os, Os), new KeyValuePair <string, object>(TrackSpecialProperty.ScreenWidth, ScreenWidth), new KeyValuePair <string, object>(TrackSpecialProperty.ScreenHeight, ScreenHeight)); }
public void When_DistinctIdParameter_Then_DistinctIdSetInMessage() { MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, null, null, DistinctId, null); AssertMessageSuccess(messageBuildResult, Token, Event, DistinctId); }
public static MessageBuildResult Build( string token, IEnumerable <ObjectProperty> superProperties, object distinctId, object alias) { MessageCandidate messageCandidate = TrackMessageBuilderBase.CreateValidMessageCandidate( token, superProperties, null, distinctId, null, out string messageCandidateErrorMessage); if (messageCandidate == null) { return(MessageBuildResult.CreateFail(messageCandidateErrorMessage)); } var message = new Dictionary <string, object>(2); message["event"] = "$create_alias"; var properties = new Dictionary <string, object>(3); message["properties"] = properties; // token properties["token"] = messageCandidate.GetSpecialProperty(TrackSpecialProperty.Token).Value; // distinct_id ObjectProperty rawDistinctId = messageCandidate.GetSpecialProperty(TrackSpecialProperty.DistinctId); if (rawDistinctId == null) { return(MessageBuildResult.CreateFail($"'{TrackSpecialProperty.DistinctId}' is not set.")); } ValueParseResult distinctIdParseResult = DistinctIdParser.Parse(rawDistinctId.Value); if (!distinctIdParseResult.Success) { return(MessageBuildResult.CreateFail( $"Error parsing '{TrackSpecialProperty.DistinctId}'.", distinctIdParseResult.ErrorDetails)); } properties["distinct_id"] = distinctIdParseResult.Value; // alias ValueParseResult aliasParseResult = DistinctIdParser.Parse(alias); if (!aliasParseResult.Success) { return(MessageBuildResult.CreateFail("Error parsing 'alias'. " + aliasParseResult.ErrorDetails)); } properties["alias"] = aliasParseResult.Value; return(MessageBuildResult.CreateSuccess(message)); }
private MixpanelMessage GetMessage( MessageKind messageKind, Func <MessageBuildResult> messageBuildResultFn) { try { MessageBuildResult messageBuildResult = messageBuildResultFn(); if (!messageBuildResult.Success) { LogError( $"Cannot build message for {messageKind}.", new Exception(messageBuildResult.Error)); } return(new MixpanelMessage { Kind = messageKind, Data = messageBuildResult.Message }); } catch (Exception e) { LogError($"Error building message for {messageKind}.", e); return(null); } }
public void When_AllSpecialProperties_Then_AllPropertiesInMessage() { var rawProperties = new { DistinctId, Time, Ip, Duration, Os, ScreenWidth, ScreenHeight }; MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, null, rawProperties, null, null); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId, new KeyValuePair <string, object>(TrackSpecialProperty.Time, TimeUnix), new KeyValuePair <string, object>(TrackSpecialProperty.Ip, Ip), new KeyValuePair <string, object>(TrackSpecialProperty.Duration, DurationSeconds), new KeyValuePair <string, object>(TrackSpecialProperty.Os, Os), new KeyValuePair <string, object>(TrackSpecialProperty.ScreenWidth, ScreenWidth), new KeyValuePair <string, object>(TrackSpecialProperty.ScreenHeight, ScreenHeight)); }
public void When_NoDistinctId_Then_MessageBuildFails() { MessageBuildResult messageBuildResult = PeopleTrackChargeMessageBuilder.Build( Token, null, DecimalPropertyValue, Time, null, null); AssertMessageFail(messageBuildResult); }
public void When_SuperPropertiesAndRawProperties_Then_RawPropertiesOverwriteSuperProperties() { var superProperties = CreateSuperProperties( // Must be overwritten by message property ObjectProperty.Default(StringPropertyName2, PropertyOrigin.SuperProperty, StringPropertyValue2 + "-Super"), ObjectProperty.Default(IntPropertyName, PropertyOrigin.SuperProperty, IntPropertyValue)); var rawProperties = new Dictionary <string, object> { { StringPropertyName, StringPropertyValue }, { StringPropertyName2, StringPropertyValue2 }, { DecimalPropertyName, DecimalPropertyValue } }; MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, superProperties, rawProperties, DistinctId, null); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId, new KeyValuePair <string, object>(StringPropertyName, StringPropertyValue), new KeyValuePair <string, object>(StringPropertyName2, StringPropertyValue2), new KeyValuePair <string, object>(DecimalPropertyName, DecimalPropertyValue), new KeyValuePair <string, object>(IntPropertyName, IntPropertyValue)); }
public static MessageBuildResult Build( string token, IEnumerable <ObjectProperty> superProperties, decimal amount, DateTime time, object distinctId, MixpanelConfig config) { MessageBuildResult messageBuildResult = PeopleMessageBuilderBase.CreateMessage( token, superProperties, null, distinctId, config, "$append", rawValue => throw new InvalidOperationException()); if (!messageBuildResult.Success) { return(messageBuildResult); } messageBuildResult.Message["$append"] = new Dictionary <string, object>(1) { { "$transactions", new Dictionary <string, object>(2) { { "$time", TimeParser.ParseMixpanelFormat(time).Value }, { "$amount", amount } } } }; return(messageBuildResult); }
public void When_DistinctIdParameter_Then_DistinctIdSetInMessage() { MessageBuildResult messageBuildResult = PeopleDeleteMessageBuilder.Build(Token, null, DistinctId, null); AssertDeleteMessageSuccess(messageBuildResult, DistinctId); }
public void When_DistinctIdFromRawProperties_Then_DistinctIdSetInMessage() { MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, null, new { DistinctId }, null, null); AssertMessageSuccess(messageBuildResult, Token, Event, DistinctId); }
public void When_DistinctIdParameter_Then_DistinctIdSetInMessage() { MessageBuildResult messageBuildResult = PeopleRemoveMessageBuilder.Build(Token, null, null, DistinctId, null); AssertMessageSuccess( messageBuildResult, new (string name, object value)[]
public void When_DistinctIdParameter_Then_DistinctIdSetInMessage() { MessageBuildResult messageBuildResult = PeopleTrackChargeMessageBuilder.Build( Token, null, DecimalPropertyValue, Time, DistinctId, null); AssertTrackChargeMessageSuccess(messageBuildResult, DistinctId); }
public void When_DistinctIdFromParamsAndSuperProps_Then_DistinctIdFromParamsOverwritesSuperProps() { var superProperties = CreateSuperProperties( ObjectProperty.Default(DistinctIdPropertyName, PropertyOrigin.SuperProperty, SuperDistinctId)); MessageBuildResult messageBuildResult = AliasMessageBuilder.Build(Token, superProperties, DistinctId, Alias); AssertMessageSuccess(messageBuildResult, Token, DistinctId, Alias); }
public void When_TokenFromSuperProps_Then_AllPropertiesSet() { var superProperties = CreateSuperProperties( ObjectProperty.Default("token", PropertyOrigin.SuperProperty, Token)); MessageBuildResult messageBuildResult = AliasMessageBuilder.Build(null, superProperties, DistinctId, Alias); AssertMessageSuccess(messageBuildResult, Token, DistinctId, Alias); }
public void When_DistinctIdFromSuperProperties_Then_DistinctIdSetInMessage() { var superProperties = CreateSuperProperties( ObjectProperty.Default(DistinctIdPropertyName, PropertyOrigin.SuperProperty, SuperDistinctId)); MessageBuildResult messageBuildResult = PeopleDeleteMessageBuilder.Build(Token, superProperties, null, null); AssertDeleteMessageSuccess(messageBuildResult, SuperDistinctId); }
private static MessageBuildResult Build( string operation, string token, IEnumerable <ObjectProperty> superProperties, object rawProperties, object distinctId, MixpanelConfig config) { MessageCandidate messageCandidate = PeopleMessageBuilderBase.CreateValidMessageCandidate( token, superProperties, rawProperties, distinctId, config, out string messageCandidateErrorMessage); if (messageCandidate == null) { return(MessageBuildResult.CreateFail(messageCandidateErrorMessage)); } var message = new Dictionary <string, object>(); var set = new Dictionary <string, object>(); message[operation] = set; // Special properties PeopleMessageBuilderBase.RunForValidSpecialProperties( messageCandidate, (specialPropertyName, isMessageSpecialProperty, value) => { if (isMessageSpecialProperty) { message[specialPropertyName] = value; } else { set[specialPropertyName] = value; } }); // User properties PeopleMessageBuilderBase.RunForValidUserProperties( messageCandidate, rawValue => GenericPropertyParser.Parse(rawValue, allowCollections: true), (formattedPropertyName, value) => { set[formattedPropertyName] = value; }); return(MessageBuildResult.CreateSuccess(message)); }
public void When_NonSpecialSuperProperties_Then_Ignored() { var superProperties = CreateSuperProperties( ObjectProperty.Default(DistinctIdPropertyName, PropertyOrigin.SuperProperty, SuperDistinctId), // Should be ignored ObjectProperty.Default(DecimalSuperPropertyName, PropertyOrigin.SuperProperty, DecimalSuperPropertyValue)); MessageBuildResult messageBuildResult = PeopleDeleteMessageBuilder.Build(Token, superProperties, null, null); AssertDeleteMessageSuccess(messageBuildResult, SuperDistinctId); }
public static MessageBuildResult CreateMessage( string token, IEnumerable <ObjectProperty> superProperties, object rawProperties, object distinctId, MixpanelConfig config, string actionName, Func <object, ValueParseResult> userPropertyParseFn) { MessageCandidate messageCandidate = CreateValidMessageCandidate( token, superProperties, rawProperties, distinctId, config, out string messageCandidateErrorMessage); if (messageCandidate == null) { return(MessageBuildResult.CreateFail(messageCandidateErrorMessage)); } var message = new Dictionary <string, object>(); var action = new Dictionary <string, object>(); message[actionName] = action; // Special properties RunForValidSpecialProperties( messageCandidate, (specialPropertyName, isMessageSpecialProperty, value) => { // Ignore non-message specific special properties as they are not valid in profile update messages if (isMessageSpecialProperty) { message[specialPropertyName] = value; } }); // User properties RunForValidUserProperties( messageCandidate, userPropertyParseFn, (formattedPropertyName, value) => { action[formattedPropertyName] = value; }); return(MessageBuildResult.CreateSuccess(message)); }
public void When_TokenFromRawProperties_Then_TokenSetInMessage() { var rawProperties = new { Token, DistinctId }; MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(null, Event, null, rawProperties, null, null); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId); }
public void When_SuperProperties_Then_AllPropertiesInMessage() { var superProperties = CreateSuperProperties( ObjectProperty.Default(StringPropertyName, PropertyOrigin.SuperProperty, StringPropertyValue), ObjectProperty.Default(DecimalPropertyName, PropertyOrigin.SuperProperty, DecimalPropertyValue)); MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, superProperties, null, DistinctId, null); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId, new KeyValuePair <string, object>(StringPropertyName, StringPropertyValue), new KeyValuePair <string, object>(DecimalPropertyName, DecimalPropertyValue)); }
private void AssertMessageSuccess( MessageBuildResult messageBuildResult, string token, string distinctId, string alias) { Assert.That(messageBuildResult.Success, Is.True); Assert.That(messageBuildResult.Error, Is.Null); IDictionary <string, object> message = messageBuildResult.Message; Assert.That(message.Count, Is.EqualTo(2)); Assert.That(message["event"], Is.EqualTo("$create_alias")); var properties = message["properties"] as IDictionary <string, object>; Assert.That(properties, Is.Not.Null); Assert.That(properties.Count, Is.EqualTo(3)); Assert.That(properties["token"], Is.EqualTo(token)); Assert.That(properties["distinct_id"], Is.EqualTo(distinctId)); Assert.That(properties["alias"], Is.EqualTo(alias)); }
private void AssertMessageSuccess( MessageBuildResult messageBuildResult, string token, string @event, string distinctId, params KeyValuePair <string, object>[] customProperties) { Assert.That(messageBuildResult.Success, Is.True); Assert.That(messageBuildResult.Error, Is.Null); IDictionary <string, object> message = messageBuildResult.Message; Assert.That(message.Count, Is.EqualTo(2)); Assert.That(message["event"], Is.EqualTo(@event)); var properties = message["properties"] as IDictionary <string, object>; Assert.That(properties, Is.Not.Null); Assert.That(properties.Count, Is.EqualTo(2 + (customProperties != null ? customProperties.Length : 0))); Assert.That(properties["token"], Is.EqualTo(token)); Assert.That(properties["distinct_id"], Is.EqualTo(distinctId)); foreach (KeyValuePair <string, object> kv in customProperties ?? new KeyValuePair <string, object> [0]) { string propertyName = kv.Key; object expectedValue = kv.Value; bool propertyExists = properties.TryGetValue(propertyName, out var actualValue); Assert.That(propertyExists, "Missing property: " + propertyName); if (CollectionParser.IsCollection(actualValue)) { Assert.That(expectedValue, Is.EquivalentTo((IEnumerable)actualValue)); } else { Assert.That(expectedValue, Is.EqualTo(actualValue)); } } }
public void When_RawProperties_Then_AllPropertiesInMessage() { var rawProperties = new Dictionary <string, object> { { StringPropertyName, StringPropertyValue }, { IntPropertyName, IntPropertyValue }, { DecimalPropertyName, DecimalPropertyArray } }; MessageBuildResult messageBuildResult = TrackMessageBuilder.Build(Token, Event, null, rawProperties, DistinctId, null); AssertMessageSuccess( messageBuildResult, Token, Event, DistinctId, new KeyValuePair <string, object>(StringPropertyName, StringPropertyValue), new KeyValuePair <string, object>(IntPropertyName, IntPropertyValue), new KeyValuePair <string, object>(DecimalPropertyName, DecimalPropertyArray)); }
// Message example: // { // "$token": "36ada5b10da39a1347559321baf13063", // "$distinct_id": "13793", // "$unset": [ "Days Overdue" ] // } public static MessageBuildResult Build( string token, IEnumerable <ObjectProperty> superProperties, IEnumerable <string> propertyNames, object distinctId, MixpanelConfig config) { MessageCandidate messageCandidate = PeopleMessageBuilderBase.CreateValidMessageCandidate( token, superProperties, null, distinctId, config, out string messageCandidateErrorMessage); if (messageCandidate == null) { return(MessageBuildResult.CreateFail(messageCandidateErrorMessage)); } var message = new Dictionary <string, object>(); // Special properties PeopleMessageBuilderBase.RunForValidSpecialProperties( messageCandidate, (specialPropertyName, isMessageSpecialProperty, value) => { // Ignore non-message specific special properties as they are not valid in profile update messages if (isMessageSpecialProperty) { message[specialPropertyName] = value; } }); message["$unset"] = propertyNames ?? new string[0]; return(MessageBuildResult.CreateSuccess(message)); }
public static MessageBuildResult Build( string token, IEnumerable <ObjectProperty> superProperties, object distinctId, MixpanelConfig config) { MessageBuildResult messageBuildResult = PeopleMessageBuilderBase.CreateMessage( token, superProperties, null, distinctId, config, "$delete", rawValue => throw new InvalidOperationException()); if (!messageBuildResult.Success) { return(messageBuildResult); } messageBuildResult.Message["$delete"] = Empty; return(messageBuildResult); }
private MixpanelMessageTest TestMessage(Func <MessageBuildResult> messageBuildResultFn) { var testMessage = new MixpanelMessageTest(); try { MessageBuildResult messageBuildResult = messageBuildResultFn(); if (!messageBuildResult.Success) { throw new Exception(messageBuildResult.Error); } testMessage.Data = messageBuildResult.Message; testMessage.Json = ToJson(testMessage.Data); testMessage.Base64 = ToBase64(testMessage.Json); } catch (Exception e) { testMessage.Exception = e; return(testMessage); } return(testMessage); }
public void When_NoDistinctId_Then_MessageBuildFails() { MessageBuildResult messageBuildResult = PeopleDeleteMessageBuilder.Build(Token, null, null, null); AssertMessageFail(messageBuildResult); }