public void TwoFeatureEventsForSameUserGenerateOnlyOneIndexEvent()
        {
            var mockSender = MakeMockSender();
            var captured   = EventCapture.From(mockSender);

            using (var ep = MakeProcessor(_config, mockSender))
            {
                var flag1 = new TestFlagProperties {
                    Key = "flagkey1", Version = 11, TrackEvents = true
                };
                var flag2 = new TestFlagProperties {
                    Key = "flagkey2", Version = 22, TrackEvents = true
                };
                var value = LdValue.Of("value");
                RecordEval(ep, flag1, BasicEval);
                RecordEval(ep, flag2, BasicEval);
                ep.Flush();
                ep.WaitUntilInactive();

                Assert.Collection(captured.Events,
                                  item => CheckIndexEvent(item, BasicEval.Timestamp, _userJson),
                                  item => CheckFeatureEvent(item, flag1, BasicEval, LdValue.Null),
                                  item => CheckFeatureEvent(item, flag2, BasicEval, LdValue.Null),
                                  item => CheckSummaryEvent(item));
            }
        }
 private void CheckFeatureOrDebugEvent(string kind, LdValue t, TestFlagProperties f, TestEvalProperties e,
                                       LdValue userJson)
 {
     Assert.Equal(LdValue.Of(kind), t.Get("kind"));
     Assert.Equal(LdValue.Of(e.Timestamp.Value), t.Get("creationDate"));
     Assert.Equal(LdValue.Of(f.Key), t.Get("key"));
     Assert.Equal(LdValue.Of(f.Version), t.Get("version"));
     Assert.Equal(e.Variation.HasValue ? LdValue.Of(e.Variation.Value) : LdValue.Null, t.Get("variation"));
     Assert.Equal(e.Value, t.Get("value"));
     CheckEventUserOrKey(t, e.User, userJson);
     Assert.Equal(e.Reason.HasValue ?
                  LdValue.Parse(LdJsonSerialization.SerializeObject(e.Reason.Value)) : LdValue.Null,
                  t.Get("reason"));
 }
 private void RecordEval(EventProcessor ep, TestFlagProperties f, TestEvalProperties e)
 {
     ep.RecordEvaluationEvent(new EvaluationEvent
     {
         Timestamp            = e.Timestamp,
         User                 = e.User,
         FlagKey              = f.Key,
         FlagVersion          = f.Version,
         Variation            = e.Variation,
         Value                = e.Value,
         Default              = e.DefaultValue,
         Reason               = e.Reason,
         PrereqOf             = e.PrereqOf,
         TrackEvents          = f.TrackEvents,
         DebugEventsUntilDate = f.DebugEventsUntilDate
     });
 }
 private void CheckDebugEvent(LdValue t, TestFlagProperties f, TestEvalProperties e,
                              LdValue userJson)
 {
     CheckFeatureOrDebugEvent("debug", t, f, e, userJson);
 }
        public void NonTrackedEventsAreSummarized()
        {
            var mockSender = MakeMockSender();
            var captured   = EventCapture.From(mockSender);

            using (var ep = MakeProcessor(_config, mockSender))
            {
                var flag1 = new TestFlagProperties {
                    Key = "flagkey1", Version = 11
                };
                var flag2 = new TestFlagProperties {
                    Key = "flagkey2", Version = 22
                };
                var value1       = LdValue.Of("value1");
                var value2       = LdValue.Of("value2");
                var default1     = LdValue.Of("default1");
                var default2     = LdValue.Of("default2");
                var earliestTime = UnixMillisecondTime.OfMillis(10000);
                var latestTime   = UnixMillisecondTime.OfMillis(20000);
                RecordEval(ep, flag1, new TestEvalProperties
                {
                    Timestamp    = earliestTime,
                    User         = _user,
                    Variation    = 1,
                    Value        = value1,
                    DefaultValue = default1
                });
                RecordEval(ep, flag1, new TestEvalProperties
                {
                    Timestamp    = UnixMillisecondTime.OfMillis(earliestTime.Value + 10),
                    User         = _user,
                    Variation    = 1,
                    Value        = value1,
                    DefaultValue = default1
                });
                RecordEval(ep, flag1, new TestEvalProperties
                {
                    Timestamp    = UnixMillisecondTime.OfMillis(earliestTime.Value + 20),
                    User         = _user,
                    Variation    = 2,
                    Value        = value2,
                    DefaultValue = default1
                });
                RecordEval(ep, flag2, new TestEvalProperties
                {
                    Timestamp    = latestTime,
                    User         = _user,
                    Variation    = 2,
                    Value        = value2,
                    DefaultValue = default2
                });
                ep.Flush();
                ep.WaitUntilInactive();

                Assert.Collection(captured.Events,
                                  item => CheckIndexEvent(item, earliestTime, _userJson),
                                  item => CheckSummaryEventDetails(item,
                                                                   earliestTime,
                                                                   latestTime,
                                                                   MustHaveFlagSummary(flag1.Key, default1,
                                                                                       MustHaveFlagSummaryCounter(value1, 1, flag1.Version, 2),
                                                                                       MustHaveFlagSummaryCounter(value2, 2, flag1.Version, 1)
                                                                                       ),
                                                                   MustHaveFlagSummary(flag2.Key, default2,
                                                                                       MustHaveFlagSummaryCounter(value2, 2, flag2.Version, 1)
                                                                                       )
                                                                   )
                                  );
            }
        }