1212)
1313
1414from devcycle_python_sdk .models .variable import Variable , TypeEnum
15+ from devcycle_python_sdk .models .eval_reason import (
16+ EvalReason ,
17+ EvalReasons ,
18+ DefaultReasonDetails ,
19+ )
1520
1621from devcycle_python_sdk .open_feature_provider .provider import (
1722 DevCycleProvider ,
@@ -69,14 +74,19 @@ def test_resolve_details_client_returns_none(self):
6974
7075 def test_resolve_details_client_returns_default_variable (self ):
7176 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 ,
7380 )
7481 context = EvaluationContext (targeting_key = "user-1234" )
7582 details = self .provider ._resolve ("test-flag" , False , context )
7683
7784 self .assertIsNotNone (details )
7885 self .assertEqual (details .value , False )
7986 self .assertEqual (details .reason , Reason .DEFAULT )
87+ self .assertEqual (
88+ details .flag_metadata ["evalReasonDetails" ], "User Not Targeted"
89+ )
8090
8191 def test_resolve_boolean_details (self ):
8292 key = "test-flag"
@@ -90,6 +100,9 @@ def test_resolve_boolean_details(self):
90100 type = TypeEnum .BOOLEAN ,
91101 isDefaulted = False ,
92102 defaultValue = False ,
103+ eval = EvalReason (
104+ reason = "TARGETING_MATCH" , details = "All Users" , target_id = "targetId"
105+ ),
93106 )
94107
95108 context = EvaluationContext (targeting_key = "user-1234" )
@@ -98,6 +111,9 @@ def test_resolve_boolean_details(self):
98111 self .assertIsNotNone (details )
99112 self .assertEqual (details .value , variable_value )
100113 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" )
101117
102118 def test_resolve_string_details (self ):
103119 key = "test-flag"
@@ -111,6 +127,9 @@ def test_resolve_string_details(self):
111127 type = TypeEnum .STRING ,
112128 isDefaulted = False ,
113129 defaultValue = False ,
130+ eval = EvalReason (
131+ reason = "TARGETING_MATCH" , details = "All Users" , target_id = "targetId"
132+ ),
114133 )
115134
116135 context = EvaluationContext (targeting_key = "user-1234" )
@@ -120,6 +139,8 @@ def test_resolve_string_details(self):
120139 self .assertEqual (details .value , variable_value )
121140 self .assertIsInstance (details .value , str )
122141 self .assertEqual (details .reason , Reason .TARGETING_MATCH )
142+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "All Users" )
143+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
123144
124145 def test_resolve_integer_details (self ):
125146 key = "test-flag"
@@ -133,6 +154,9 @@ def test_resolve_integer_details(self):
133154 type = TypeEnum .STRING ,
134155 isDefaulted = False ,
135156 defaultValue = False ,
157+ eval = EvalReason (
158+ reason = "TARGETING_MATCH" , details = "All Users" , target_id = "targetId"
159+ ),
136160 )
137161
138162 context = EvaluationContext (targeting_key = "user-1234" )
@@ -142,6 +166,8 @@ def test_resolve_integer_details(self):
142166 self .assertIsInstance (details .value , int )
143167 self .assertEqual (details .value , variable_value )
144168 self .assertEqual (details .reason , Reason .TARGETING_MATCH )
169+ self .assertEqual (details .flag_metadata ["evalReasonDetails" ], "All Users" )
170+ self .assertEqual (details .flag_metadata ["evalReasonTargetId" ], "targetId" )
145171
146172 def test_resolve_float_details (self ):
147173 key = "test-flag"
@@ -155,6 +181,7 @@ def test_resolve_float_details(self):
155181 type = TypeEnum .STRING ,
156182 isDefaulted = False ,
157183 defaultValue = False ,
184+ eval = EvalReason (reason = "SPLIT" , details = "Rollout" , target_id = "targetId" ),
158185 )
159186
160187 context = EvaluationContext (targeting_key = "user-1234" )
@@ -163,7 +190,9 @@ def test_resolve_float_details(self):
163190 self .assertIsNotNone (details )
164191 self .assertIsInstance (details .value , float )
165192 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" )
167196
168197 def test_resolve_object_details_verify_default_value (self ):
169198 key = "test-flag"
@@ -204,6 +233,9 @@ def test_resolve_object_details(self):
204233 type = TypeEnum .STRING ,
205234 isDefaulted = False ,
206235 defaultValue = False ,
236+ eval = EvalReason (
237+ reason = "TARGETING_MATCH" , details = "Rollout" , target_id = "targetId"
238+ ),
207239 )
208240
209241 context = EvaluationContext (targeting_key = "user-1234" )
@@ -213,6 +245,52 @@ def test_resolve_object_details(self):
213245 self .assertIsInstance (details .value , dict )
214246 self .assertDictEqual (details .value , variable_value )
215247 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 )
216294
217295
218296if __name__ == "__main__" :
0 commit comments