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,110 @@ 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 ,
119+ {"default_variant" : False , "target_variant" : True },
120+ None ,
121+ None ,
122+ "resolve_boolean_details" ,
123+ False ,
124+ "STATIC" ,
125+ "default_variant" ,
126+ False ,
110127 ),
111128 (
112- {"default_variant" : False , "target_variant" : True }, targeting (),
113- context ("no_target_variant" ), "resolve_boolean_details" , False ,
114- "DEFAULT" , "default_variant" , False ,
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 ,
115137 ),
116138 (
117- {"default_variant" : False , "target_variant" : True }, targeting (),
118- context ("target_variant" ), "resolve_boolean_details" , False ,
119- "TARGETING_MATCH" , "target_variant" , True ,
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 ,
120147 ),
121148 (
122- {"default_variant" : "default" , "target_variant" : "target" }, targeting (),
123- context ("target_variant" ), "resolve_string_details" , "placeholder" ,
124- "TARGETING_MATCH" , "target_variant" , "target" ,
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" ,
125157 ),
126158 (
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 ,
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 ,
130167 ),
131168 (
132- {"default_variant" : True , "target_variant" : False }, targeting (),
133- context ("target_variant" ), "resolve_boolean_details" , True ,
134- "TARGETING_MATCH" , "target_variant" , False ,
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 ,
135177 ),
136178 (
137- {"default_variant" : 10 , "target_variant" : 0 }, targeting (),
138- context ("target_variant" ), "resolve_integer_details" , 1 ,
139- "TARGETING_MATCH" , "target_variant" , 0 ,
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 ,
140187 ),
141188 (
142- {"default_variant" : {}, "target_variant" : {}}, targeting (),
143- context ("target_variant" ), "resolve_object_details" , {},
144- "TARGETING_MATCH" , "target_variant" , {},
189+ {"default_variant" : {}, "target_variant" : {}},
190+ targeting (),
191+ context ("target_variant" ),
192+ "resolve_object_details" ,
193+ {},
194+ "TARGETING_MATCH" ,
195+ "target_variant" ,
196+ {},
145197 ),
146198 (
147- {"default_variant" : None , "target_variant" : None }, targeting (),
148- context ("target_variant" ), "resolve_object_details" , {},
149- "TARGETING_MATCH" , "target_variant" , None ,
199+ {"default_variant" : None , "target_variant" : None },
200+ targeting (),
201+ context ("target_variant" ),
202+ "resolve_object_details" ,
203+ {},
204+ "TARGETING_MATCH" ,
205+ "target_variant" ,
206+ None ,
150207 ),
151208 ],
152209 ids = [
@@ -162,11 +219,17 @@ def test_resolve_boolean_details_invalid_variant(resolver, flag):
162219 ],
163220)
164221def test_resolver_details (
165- resolver , flag ,
166- variants , targeting ,
167- context , method , default_value ,
168- expected_reason , expected_variant , expected_value
169- ):
222+ resolver ,
223+ flag ,
224+ variants ,
225+ targeting ,
226+ context ,
227+ method ,
228+ default_value ,
229+ expected_reason ,
230+ expected_variant ,
231+ expected_value ,
232+ ):
170233 flag .variants = variants
171234 flag .targeting = targeting
172235 resolver .flag_store .get_flag = Mock (return_value = flag )
0 commit comments