1 package ldevents
2
3 import (
4 "testing"
5
6 "github.com/launchdarkly/go-sdk-common/v3/ldcontext"
7 "github.com/launchdarkly/go-sdk-common/v3/ldreason"
8 "github.com/launchdarkly/go-sdk-common/v3/ldtime"
9 "github.com/launchdarkly/go-sdk-common/v3/ldvalue"
10
11 "github.com/stretchr/testify/assert"
12 )
13
14 var defaultEventFactory = NewEventFactory(false, nil)
15
16 var noReason = ldreason.EvaluationReason{}
17
18 func TestEventFactory(t *testing.T) {
19 fakeTime := ldtime.UnixMillisecondTime(100000)
20 timeFn := func() ldtime.UnixMillisecondTime { return fakeTime }
21 withoutReasons := NewEventFactory(false, timeFn)
22 withReasons := NewEventFactory(true, timeFn)
23 context := Context(ldcontext.New("key"))
24
25 t.Run("NewSuccessfulEvalEvent", func(t *testing.T) {
26 flag := FlagEventProperties{Key: "flagkey", Version: 100}
27
28 expected := EvaluationData{
29 BaseEvent: BaseEvent{
30 CreationDate: fakeTime,
31 Context: context,
32 },
33 Key: flag.Key,
34 Version: ldvalue.NewOptionalInt(flag.Version),
35 Variation: ldvalue.NewOptionalInt(1),
36 Value: ldvalue.String("value"),
37 Default: ldvalue.String("default"),
38 Reason: ldreason.NewEvalReasonFallthrough(),
39 PrereqOf: ldvalue.NewOptionalString("pre"),
40 }
41
42 event1 := withoutReasons.NewEvaluationData(flag, context,
43 ldreason.NewEvaluationDetail(expected.Value, expected.Variation.IntValue(), expected.Reason),
44 false, expected.Default, "pre")
45 assert.Equal(t, ldreason.EvaluationReason{}, event1.Reason)
46 event1.Reason = expected.Reason
47 assert.Equal(t, expected, event1)
48
49 event2 := withReasons.NewEvaluationData(flag, context,
50 ldreason.NewEvaluationDetail(expected.Value, expected.Variation.IntValue(), expected.Reason),
51 false, expected.Default, "pre")
52 assert.Equal(t, expected, event2)
53 })
54
55 t.Run("NewEvaluationData with tracking/debugging", func(t *testing.T) {
56 flag := FlagEventProperties{Key: "flagkey", Version: 100}
57
58 expected := EvaluationData{
59 BaseEvent: BaseEvent{
60 CreationDate: fakeTime,
61 Context: context,
62 },
63 Key: flag.Key,
64 Version: ldvalue.NewOptionalInt(flag.Version),
65 Variation: ldvalue.NewOptionalInt(1),
66 Value: ldvalue.String("value"),
67 Default: ldvalue.String("default"),
68 }
69
70 flag1 := flag
71 flag1.RequireFullEvent = true
72 expected1 := expected
73 expected1.RequireFullEvent = true
74 event1 := withoutReasons.NewEvaluationData(flag1, context,
75 ldreason.NewEvaluationDetail(expected.Value, expected.Variation.IntValue(), ldreason.NewEvalReasonFallthrough()),
76 false, expected.Default, "")
77 assert.Equal(t, expected1, event1)
78
79 flag2 := flag
80 flag2.DebugEventsUntilDate = ldtime.UnixMillisecondTime(200000)
81 expected2 := expected
82 expected2.DebugEventsUntilDate = flag2.DebugEventsUntilDate
83 event2 := withoutReasons.NewEvaluationData(flag2, context,
84 ldreason.NewEvaluationDetail(expected.Value, expected.Variation.IntValue(), ldreason.NewEvalReasonFallthrough()),
85 false, expected.Default, "")
86 assert.Equal(t, expected2, event2)
87 })
88
89 t.Run("NewEvaluationData with experimentation", func(t *testing.T) {
90 flag := FlagEventProperties{Key: "flagkey", Version: 100}
91
92 expected := EvaluationData{
93 BaseEvent: BaseEvent{
94 CreationDate: fakeTime,
95 Context: context,
96 },
97 Key: flag.Key,
98 Version: ldvalue.NewOptionalInt(flag.Version),
99 Variation: ldvalue.NewOptionalInt(1),
100 Value: ldvalue.String("value"),
101 Default: ldvalue.String("default"),
102 Reason: ldreason.NewEvalReasonFallthrough(),
103 RequireFullEvent: true,
104 }
105
106 event := withoutReasons.NewEvaluationData(flag, context,
107 ldreason.NewEvaluationDetail(expected.Value, expected.Variation.IntValue(), ldreason.NewEvalReasonFallthrough()),
108 true, expected.Default, "")
109 assert.Equal(t, expected, event)
110 })
111
112 t.Run("NewUnknownFlagEvaluationData", func(t *testing.T) {
113 expected := EvaluationData{
114 BaseEvent: BaseEvent{
115 CreationDate: fakeTime,
116 Context: context,
117 },
118 Key: "unknown-key",
119 Value: ldvalue.String("default"),
120 Default: ldvalue.String("default"),
121 Reason: ldreason.NewEvalReasonFallthrough(),
122 }
123
124 event1 := withoutReasons.NewUnknownFlagEvaluationData(expected.Key, context, expected.Default, expected.Reason)
125 assert.Equal(t, ldreason.EvaluationReason{}, event1.Reason)
126 event1.Reason = expected.Reason
127 assert.Equal(t, expected, event1)
128 assert.Equal(t, expected.BaseEvent.CreationDate, event1.CreationDate)
129
130 event2 := withReasons.NewUnknownFlagEvaluationData(expected.Key, context, expected.Default, expected.Reason)
131 assert.Equal(t, expected, event2)
132 })
133
134 t.Run("NewCustomEvent", func(t *testing.T) {
135 expected := CustomEventData{
136 BaseEvent: BaseEvent{
137 CreationDate: fakeTime,
138 Context: context,
139 },
140 Key: "event-key",
141 Data: ldvalue.String("data"),
142 HasMetric: true,
143 MetricValue: 2,
144 }
145
146 event := withoutReasons.NewCustomEventData(expected.Key, context, expected.Data, true, expected.MetricValue)
147 assert.Equal(t, expected, event)
148 assert.Equal(t, expected.BaseEvent.CreationDate, event.CreationDate)
149 })
150
151 t.Run("NewIdentifyEvent", func(t *testing.T) {
152 expected := IdentifyEventData{
153 BaseEvent: BaseEvent{
154 CreationDate: fakeTime,
155 Context: context,
156 },
157 }
158
159 event := withoutReasons.NewIdentifyEventData(context)
160 assert.Equal(t, expected, event)
161 assert.Equal(t, expected.BaseEvent.CreationDate, event.CreationDate)
162 })
163 }
164
View as plain text