public void When_DistinctIdAndAliasFromParams_Then_AllPropertiesSet()
        {
            MessageBuildResult messageBuildResult =
                AliasMessageBuilder.Build(Token, null, DistinctId, Alias);

            AssertMessageSuccess(messageBuildResult, Token, DistinctId, Alias);
        }
Exemple #2
0
        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)[]
Exemple #4
0
        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));
        }
Exemple #5
0
        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));
        }
Exemple #7
0
        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);
            }
        }
Exemple #8
0
        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);
        }
Exemple #10
0
        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));
        }
Exemple #11
0
        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);
        }
Exemple #13
0
        public void When_DistinctIdFromRawProperties_Then_DistinctIdSetInMessage()
        {
            MessageBuildResult messageBuildResult =
                TrackMessageBuilder.Build(Token, Event, null, new { DistinctId }, null, null);

            AssertMessageSuccess(messageBuildResult, Token, Event, DistinctId);
        }
Exemple #14
0
        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);
        }
Exemple #21
0
        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));
        }
Exemple #22
0
        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);
        }
Exemple #23
0
        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));
        }
Exemple #25
0
        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));
                }
            }
        }
Exemple #26
0
        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);
        }
Exemple #29
0
        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);
        }