12
12
)
13
13
14
14
from devcycle_python_sdk .models .variable import Variable , TypeEnum
15
+ from devcycle_python_sdk .models .eval_reason import (
16
+ EvalReason ,
17
+ EvalReasons ,
18
+ DefaultReasonDetails ,
19
+ )
15
20
16
21
from devcycle_python_sdk .open_feature_provider .provider import (
17
22
DevCycleProvider ,
@@ -69,14 +74,19 @@ def test_resolve_details_client_returns_none(self):
69
74
70
75
def test_resolve_details_client_returns_default_variable (self ):
71
76
self .client .variable .return_value = Variable .create_default_variable (
72
- key = "test-flag" , default_value = False
77
+ key = "test-flag" ,
78
+ default_value = False ,
79
+ default_reason_detail = DefaultReasonDetails .USER_NOT_TARGETED ,
73
80
)
74
81
context = EvaluationContext (targeting_key = "user-1234" )
75
82
details = self .provider ._resolve ("test-flag" , False , context )
76
83
77
84
self .assertIsNotNone (details )
78
85
self .assertEqual (details .value , False )
79
86
self .assertEqual (details .reason , Reason .DEFAULT )
87
+ self .assertEqual (
88
+ details .flag_metadata ["evalReasonDetails" ], "User Not Targeted"
89
+ )
80
90
81
91
def test_resolve_boolean_details (self ):
82
92
key = "test-flag"
@@ -90,6 +100,9 @@ def test_resolve_boolean_details(self):
90
100
type = TypeEnum .BOOLEAN ,
91
101
isDefaulted = False ,
92
102
defaultValue = False ,
103
+ eval = EvalReason (
104
+ reason = "TARGETING_MATCH" , details = "All Users" , target_id = "targetId"
105
+ ),
93
106
)
94
107
95
108
context = EvaluationContext (targeting_key = "user-1234" )
@@ -98,6 +111,9 @@ def test_resolve_boolean_details(self):
98
111
self .assertIsNotNone (details )
99
112
self .assertEqual (details .value , variable_value )
100
113
self .assertEqual (details .reason , Reason .TARGETING_MATCH )
114
+ self .assertEqual (details .reason , Reason .TARGETING_MATCH )
115
+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "All Users" )
116
+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
101
117
102
118
def test_resolve_string_details (self ):
103
119
key = "test-flag"
@@ -111,6 +127,9 @@ def test_resolve_string_details(self):
111
127
type = TypeEnum .STRING ,
112
128
isDefaulted = False ,
113
129
defaultValue = False ,
130
+ eval = EvalReason (
131
+ reason = "TARGETING_MATCH" , details = "All Users" , target_id = "targetId"
132
+ ),
114
133
)
115
134
116
135
context = EvaluationContext (targeting_key = "user-1234" )
@@ -120,6 +139,8 @@ def test_resolve_string_details(self):
120
139
self .assertEqual (details .value , variable_value )
121
140
self .assertIsInstance (details .value , str )
122
141
self .assertEqual (details .reason , Reason .TARGETING_MATCH )
142
+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "All Users" )
143
+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
123
144
124
145
def test_resolve_integer_details (self ):
125
146
key = "test-flag"
@@ -133,6 +154,9 @@ def test_resolve_integer_details(self):
133
154
type = TypeEnum .STRING ,
134
155
isDefaulted = False ,
135
156
defaultValue = False ,
157
+ eval = EvalReason (
158
+ reason = "TARGETING_MATCH" , details = "All Users" , target_id = "targetId"
159
+ ),
136
160
)
137
161
138
162
context = EvaluationContext (targeting_key = "user-1234" )
@@ -142,6 +166,8 @@ def test_resolve_integer_details(self):
142
166
self .assertIsInstance (details .value , int )
143
167
self .assertEqual (details .value , variable_value )
144
168
self .assertEqual (details .reason , Reason .TARGETING_MATCH )
169
+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "All Users" )
170
+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
145
171
146
172
def test_resolve_float_details (self ):
147
173
key = "test-flag"
@@ -155,6 +181,7 @@ def test_resolve_float_details(self):
155
181
type = TypeEnum .STRING ,
156
182
isDefaulted = False ,
157
183
defaultValue = False ,
184
+ eval = EvalReason (reason = "SPLIT" , details = "Rollout" , target_id = "targetId" ),
158
185
)
159
186
160
187
context = EvaluationContext (targeting_key = "user-1234" )
@@ -163,7 +190,9 @@ def test_resolve_float_details(self):
163
190
self .assertIsNotNone (details )
164
191
self .assertIsInstance (details .value , float )
165
192
self .assertEqual (details .value , variable_value )
166
- self .assertEqual (details .reason , Reason .TARGETING_MATCH )
193
+ self .assertEqual (details .reason , Reason .SPLIT )
194
+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "Rollout" )
195
+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
167
196
168
197
def test_resolve_object_details_verify_default_value (self ):
169
198
key = "test-flag"
@@ -204,6 +233,9 @@ def test_resolve_object_details(self):
204
233
type = TypeEnum .STRING ,
205
234
isDefaulted = False ,
206
235
defaultValue = False ,
236
+ eval = EvalReason (
237
+ reason = "TARGETING_MATCH" , details = "Rollout" , target_id = "targetId"
238
+ ),
207
239
)
208
240
209
241
context = EvaluationContext (targeting_key = "user-1234" )
@@ -213,6 +245,52 @@ def test_resolve_object_details(self):
213
245
self .assertIsInstance (details .value , dict )
214
246
self .assertDictEqual (details .value , variable_value )
215
247
self .assertEqual (details .reason , Reason .TARGETING_MATCH )
248
+ self .assertIsNotNone (details .flag_metadata )
249
+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "Rollout" )
250
+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
251
+
252
+ def test_resolve_string_details_null_eval (self ):
253
+ key = "test-flag"
254
+ variable_value = "some string"
255
+ default_value = "default string"
256
+
257
+ self .client .variable .return_value = Variable (
258
+ _id = None ,
259
+ value = variable_value ,
260
+ key = key ,
261
+ type = TypeEnum .STRING ,
262
+ isDefaulted = False ,
263
+ defaultValue = False ,
264
+ )
265
+
266
+ context = EvaluationContext (targeting_key = "user-1234" )
267
+ details = self .provider .resolve_string_details (key , default_value , context )
268
+
269
+ self .assertIsNotNone (details )
270
+ self .assertEqual (details .value , variable_value )
271
+ self .assertIsInstance (details .value , str )
272
+ self .assertEqual (details .reason , Reason .TARGETING_MATCH )
273
+
274
+ def test_default_string_details_null_eval (self ):
275
+ key = "test-flag"
276
+ default_value = "default string"
277
+
278
+ self .client .variable .return_value = Variable (
279
+ _id = None ,
280
+ value = default_value ,
281
+ key = key ,
282
+ type = TypeEnum .STRING ,
283
+ isDefaulted = True ,
284
+ defaultValue = False ,
285
+ )
286
+
287
+ context = EvaluationContext (targeting_key = "user-1234" )
288
+ details = self .provider .resolve_string_details (key , default_value , context )
289
+
290
+ self .assertIsNotNone (details )
291
+ self .assertEqual (details .value , default_value )
292
+ self .assertIsInstance (details .value , str )
293
+ self .assertEqual (details .reason , Reason .DEFAULT )
216
294
217
295
218
296
if __name__ == "__main__" :
0 commit comments