1- import pytest
21from unittest .mock import Mock , create_autospec
2+
3+ import pytest
4+
5+ from openfeature .contrib .provider .flagd .config import Config
36from openfeature .contrib .provider .flagd .resolvers .in_process import InProcessResolver
4- from openfeature .evaluation_context import EvaluationContext
5- from openfeature .exception import FlagNotFoundError
67from openfeature .contrib .provider .flagd .resolvers .process .flags import Flag , FlagStore
7- from openfeature .contrib . provider . flagd . config import Config
8+ from openfeature .evaluation_context import EvaluationContext
89from openfeature .exception import FlagNotFoundError , ParseError
910
11+
1012@pytest .fixture
1113def config ():
1214 return create_autospec (Config )
1315
16+
1417@pytest .fixture
1518def flag_store ():
1619 return create_autospec (FlagStore )
1720
21+
1822@pytest .fixture
1923def targeting ():
2024 return {
@@ -24,33 +28,37 @@ def targeting():
2428 None ,
2529 ]
2630 }
27-
31+
32+
2833@pytest .fixture
2934def flag (targeting ):
3035 return Flag (
3136 key = "flag" ,
3237 state = "ENABLED" ,
3338 variants = {"default_variant" : False , "target_variant" : True },
3439 default_variant = "default_variant" ,
35- targeting = targeting
40+ targeting = targeting ,
3641 )
3742
43+
3844@pytest .fixture
3945def context ():
4046 return EvaluationContext (targeting_key = "target_variant" )
4147
48+
4249@pytest .fixture
4350def resolver (config ):
44- config .offline_flag_source_path = ' flag.json'
51+ config .offline_flag_source_path = " flag.json"
4552 config .deadline_ms = 100
4653 return InProcessResolver (
4754 config = config ,
4855 emit_provider_ready = Mock (),
4956 emit_provider_error = Mock (),
5057 emit_provider_stale = Mock (),
51- emit_provider_configuration_changed = Mock ()
58+ emit_provider_configuration_changed = Mock (),
5259 )
5360
61+
5462@pytest .fixture
5563def flag ():
5664 return Flag (
@@ -61,6 +69,7 @@ def flag():
6169 targeting = None ,
6270 )
6371
72+
6473def targeting ():
6574 return {
6675 "if" : [
@@ -70,14 +79,17 @@ def targeting():
7079 ]
7180 }
7281
82+
7383def context (targeting_key ):
7484 return EvaluationContext (targeting_key = targeting_key )
7585
86+
7687def test_resolve_boolean_details_flag_not_found (resolver ):
7788 resolver .flag_store .get_flag = Mock (return_value = None )
7889 with pytest .raises (FlagNotFoundError ):
7990 resolver .resolve_boolean_details ("nonexistent_flag" , False )
8091
92+
8193def test_resolve_boolean_details_disabled_flag (flag , resolver ):
8294 flag .state = "DISABLED"
8395 resolver .flag_store .get_flag = Mock (return_value = flag )
@@ -88,65 +100,100 @@ def test_resolve_boolean_details_disabled_flag(flag, resolver):
88100 assert result .variant == None
89101 assert result .value == False
90102
103+
91104def test_resolve_boolean_details_invalid_variant (resolver , flag ):
92- flag .targeting = {
93- "var" : ["targetingKey" , "invalid_variant" ]
94- }
105+ flag .targeting = {"var" : ["targetingKey" , "invalid_variant" ]}
95106
96107 resolver .flag_store .get_flag = Mock (return_value = flag )
97108
98109 with pytest .raises (ParseError ):
99110 resolver .resolve_boolean_details ("flag" , False )
100111
112+
101113@pytest .mark .parametrize (
102- "variants, targeting,"
103- "context, method, default_value,"
104- "expected_reason, expected_variant, expected_value," ,
114+ "variants, targeting,"
115+ "context, method, default_value,"
116+ "expected_reason, expected_variant, expected_value," ,
105117 [
106118 (
107- {"default_variant" : False , "target_variant" : True }, None ,
108- None , "resolve_boolean_details" , False ,
109- "STATIC" , "default_variant" , False ,
110- ) ,
111- (
112- { "default_variant" : False , "target_variant" : True }, targeting () ,
113- context ( "no_target_variant" ), "resolve_boolean_details" , False ,
114- "DEFAULT" , "default_variant" , False ,
119+ {"default_variant" : False , "target_variant" : True },
120+ None ,
121+ None ,
122+ "resolve_boolean_details" ,
123+ False ,
124+ "STATIC" ,
125+ "default_variant" ,
126+ False ,
115127 ),
116128 (
117- {"default_variant" : False , "target_variant" : True }, targeting (),
118- context ("target_variant" ), "resolve_boolean_details" , False ,
119- "TARGETING_MATCH" , "target_variant" , True ,
129+ {"default_variant" : False , "target_variant" : True },
130+ targeting (),
131+ context ("no_target_variant" ),
132+ "resolve_boolean_details" ,
133+ False ,
134+ "DEFAULT" ,
135+ "default_variant" ,
136+ False ,
120137 ),
121138 (
122- {"default_variant" : "default" , "target_variant" : "target" }, targeting (),
123- context ("target_variant" ), "resolve_string_details" , "placeholder" ,
124- "TARGETING_MATCH" , "target_variant" , "target" ,
139+ {"default_variant" : False , "target_variant" : True },
140+ targeting (),
141+ context ("target_variant" ),
142+ "resolve_boolean_details" ,
143+ False ,
144+ "TARGETING_MATCH" ,
145+ "target_variant" ,
146+ True ,
125147 ),
126148 (
127- {"default_variant" : 1.0 , "target_variant" : 2.0 }, targeting (),
128- context ("target_variant" ), "resolve_float_details" , 0.0 ,
129- "TARGETING_MATCH" , "target_variant" , 2.0 ,
149+ {"default_variant" : "default" , "target_variant" : "target" },
150+ targeting (),
151+ context ("target_variant" ),
152+ "resolve_string_details" ,
153+ "placeholder" ,
154+ "TARGETING_MATCH" ,
155+ "target_variant" ,
156+ "target" ,
130157 ),
131158 (
132- {"default_variant" : True , "target_variant" : False }, targeting (),
133- context ("target_variant" ), "resolve_boolean_details" , True ,
134- "TARGETING_MATCH" , "target_variant" , False ,
159+ {"default_variant" : 1.0 , "target_variant" : 2.0 },
160+ targeting (),
161+ context ("target_variant" ),
162+ "resolve_float_details" ,
163+ 0.0 ,
164+ "TARGETING_MATCH" ,
165+ "target_variant" ,
166+ 2.0 ,
135167 ),
136168 (
137- {"default_variant" : 10 , "target_variant" : 0 }, targeting (),
138- context ("target_variant" ), "resolve_integer_details" , 1 ,
139- "TARGETING_MATCH" , "target_variant" , 0 ,
169+ {"default_variant" : True , "target_variant" : False },
170+ targeting (),
171+ context ("target_variant" ),
172+ "resolve_boolean_details" ,
173+ True ,
174+ "TARGETING_MATCH" ,
175+ "target_variant" ,
176+ False ,
140177 ),
141178 (
142- {"default_variant" : {}, "target_variant" : {}}, targeting (),
143- context ("target_variant" ), "resolve_object_details" , {},
144- "TARGETING_MATCH" , "target_variant" , {},
179+ {"default_variant" : 10 , "target_variant" : 0 },
180+ targeting (),
181+ context ("target_variant" ),
182+ "resolve_integer_details" ,
183+ 1 ,
184+ "TARGETING_MATCH" ,
185+ "target_variant" ,
186+ 0 ,
145187 ),
146188 (
147- {"default_variant" : None , "target_variant" : None }, targeting (),
148- context ("target_variant" ), "resolve_object_details" , {},
149- "TARGETING_MATCH" , "target_variant" , None ,
189+ {"default_variant" : {}, "target_variant" : {}},
190+ targeting (),
191+ context ("target_variant" ),
192+ "resolve_object_details" ,
193+ {},
194+ "TARGETING_MATCH" ,
195+ "target_variant" ,
196+ {},
150197 ),
151198 ],
152199 ids = [
@@ -158,15 +205,20 @@ def test_resolve_boolean_details_invalid_variant(resolver, flag):
158205 "boolean_falsy_target" ,
159206 "integer_falsy_target" ,
160207 "object_falsy_target" ,
161- "none_target_value" ,
162208 ],
163209)
164210def test_resolver_details (
165- resolver , flag ,
166- variants , targeting ,
167- context , method , default_value ,
168- expected_reason , expected_variant , expected_value
169- ):
211+ resolver ,
212+ flag ,
213+ variants ,
214+ targeting ,
215+ context ,
216+ method ,
217+ default_value ,
218+ expected_reason ,
219+ expected_variant ,
220+ expected_value ,
221+ ):
170222 flag .variants = variants
171223 flag .targeting = targeting
172224 resolver .flag_store .get_flag = Mock (return_value = flag )
0 commit comments