88import responses
99from flag_engine .environments .models import EnvironmentModel
1010from flag_engine .features .models import FeatureModel , FeatureStateModel
11- from hamcrest import assert_that , none , not_none , is_ , has_entry , has_length , empty , equal_to , same_instance , is_not
11+ from hamcrest import (
12+ assert_that ,
13+ empty ,
14+ equal_to ,
15+ has_entry ,
16+ has_length ,
17+ is_ ,
18+ is_not ,
19+ none ,
20+ not_none ,
21+ same_instance ,
22+ )
1223from pytest_mock import MockerFixture
1324from responses import matchers
1425
2233
2334
2435def test_flagsmith_starts_polling_manager_on_init_if_enabled (
25- mocker : MockerFixture , server_api_key : str , requests_session_response_ok : None
36+ mocker : MockerFixture , server_api_key : str , requests_session_response_ok : None
2637) -> None :
2738 # Given
2839 mock_polling_manager = mocker .MagicMock ()
@@ -40,7 +51,7 @@ def test_flagsmith_starts_polling_manager_on_init_if_enabled(
4051
4152@responses .activate ()
4253def test_update_environment_sets_environment (
43- flagsmith : Flagsmith , environment_json : str , environment_model : EnvironmentModel
54+ flagsmith : Flagsmith , environment_json : str , environment_model : EnvironmentModel
4455) -> None :
4556 # Given
4657 responses .add (method = "GET" , url = flagsmith .environment_url , body = environment_json )
@@ -56,7 +67,7 @@ def test_update_environment_sets_environment(
5667
5768@responses .activate ()
5869def test_get_environment_flags_calls_api_when_no_local_environment (
59- api_key : str , flagsmith : Flagsmith , flags_json : str
70+ api_key : str , flagsmith : Flagsmith , flags_json : str
6071) -> None :
6172 # Given
6273 responses .add (method = "GET" , url = flagsmith .environment_flags_url , body = flags_json )
@@ -79,7 +90,7 @@ def test_get_environment_flags_calls_api_when_no_local_environment(
7990
8091@responses .activate ()
8192def test_get_environment_flags_uses_local_environment_when_available (
82- flagsmith : Flagsmith , environment_model : EnvironmentModel
93+ flagsmith : Flagsmith , environment_model : EnvironmentModel
8394) -> None :
8495 # Given
8596 flagsmith ._environment = environment_model
@@ -91,14 +102,19 @@ def test_get_environment_flags_uses_local_environment_when_available(
91102 # Then
92103 assert_that (responses .calls , empty ())
93104 assert_that (len (all_flags ), equal_to (1 ))
94- assert_that (all_flags [0 ].feature_name , equal_to (environment_model .feature_states [0 ].feature .name ))
105+ assert_that (
106+ all_flags [0 ].feature_name ,
107+ equal_to (environment_model .feature_states [0 ].feature .name ),
108+ )
95109 assert_that (all_flags [0 ].enabled , is_ (environment_model .feature_states [0 ].enabled ))
96- assert_that (all_flags [0 ].value , equal_to (environment_model .feature_states [0 ].get_value ()))
110+ assert_that (
111+ all_flags [0 ].value , equal_to (environment_model .feature_states [0 ].get_value ())
112+ )
97113
98114
99115@responses .activate ()
100116def test_get_identity_flags_calls_api_when_no_local_environment_no_traits (
101- flagsmith : Flagsmith , identities_json : str
117+ flagsmith : Flagsmith , identities_json : str
102118) -> None :
103119 # Given
104120 responses .add (method = "POST" , url = flagsmith .identities_url , body = identities_json )
@@ -122,7 +138,7 @@ def test_get_identity_flags_calls_api_when_no_local_environment_no_traits(
122138
123139@responses .activate ()
124140def test_get_identity_flags_calls_api_when_no_local_environment_with_traits (
125- flagsmith : Flagsmith , identities_json : str
141+ flagsmith : Flagsmith , identities_json : str
126142) -> None :
127143 # Given
128144 responses .add (method = "POST" , url = flagsmith .identities_url , body = identities_json )
@@ -138,12 +154,19 @@ def test_get_identity_flags_calls_api_when_no_local_environment_with_traits(
138154 # Decode 'body' from bytes to string if it is in bytes format.
139155 body = body .decode ()
140156
141- assert_that (body , equal_to (json .dumps (
142- {
143- "identifier" : identifier ,
144- "traits" : [{"trait_key" : k , "trait_value" : v } for k , v in traits .items ()],
145- }
146- )))
157+ assert_that (
158+ body ,
159+ equal_to (
160+ json .dumps (
161+ {
162+ "identifier" : identifier ,
163+ "traits" : [
164+ {"trait_key" : k , "trait_value" : v } for k , v in traits .items ()
165+ ],
166+ }
167+ )
168+ ),
169+ )
147170
148171 # Taken from hard coded values in tests/data/identities.json
149172 assert_that (identity_flags .all_flags ()[0 ].enabled , is_ (True ))
@@ -153,7 +176,7 @@ def test_get_identity_flags_calls_api_when_no_local_environment_with_traits(
153176
154177@responses .activate ()
155178def test_get_identity_flags_uses_local_environment_when_available (
156- flagsmith : Flagsmith , environment_model : EnvironmentModel , mocker : MockerFixture
179+ flagsmith : Flagsmith , environment_model : EnvironmentModel , mocker : MockerFixture
157180) -> None :
158181 # Given
159182 flagsmith ._environment = environment_model
@@ -180,8 +203,8 @@ def test_get_identity_flags_uses_local_environment_when_available(
180203
181204@responses .activate ()
182205def test_get_identity_flags__transient_identity__calls_expected (
183- flagsmith : Flagsmith ,
184- identities_json : str ,
206+ flagsmith : Flagsmith ,
207+ identities_json : str ,
185208) -> None :
186209 # Given
187210 responses .add (
@@ -211,10 +234,10 @@ def test_get_identity_flags__transient_identity__calls_expected(
211234
212235@responses .activate ()
213236def test_get_identity_flags__transient_trait_keys__calls_expected (
214- flagsmith : Flagsmith ,
215- identities_json : str ,
216- environment_model : EnvironmentModel ,
217- mocker : MockerFixture ,
237+ flagsmith : Flagsmith ,
238+ identities_json : str ,
239+ environment_model : EnvironmentModel ,
240+ mocker : MockerFixture ,
218241) -> None :
219242 # Given
220243 responses .add (
@@ -245,7 +268,7 @@ def test_get_identity_flags__transient_trait_keys__calls_expected(
245268
246269
247270def test_request_connection_error_raises_flagsmith_api_error (
248- mocker : MockerFixture , api_key : str
271+ mocker : MockerFixture , api_key : str
249272) -> None :
250273 """
251274 Test the behaviour when session.<method> raises a ConnectionError. Note that this
@@ -316,7 +339,7 @@ def default_flag_handler(feature_name: str) -> DefaultFlag:
316339
317340@responses .activate ()
318341def test_default_flag_is_not_used_when_environment_flags_returned (
319- api_key : str , flags_json : str
342+ api_key : str , flags_json : str
320343) -> None :
321344 # Given
322345 feature_name = "some_feature"
@@ -342,7 +365,9 @@ def default_flag_handler(feature_name: str) -> DefaultFlag:
342365 flag = flags .get_flag (feature_name )
343366 assert_that (flag .is_default , is_not (True ))
344367 assert_that (flag .value , is_not (equal_to (default_flag .value )))
345- assert_that (flag .value , equal_to ("some-value" )) # hard coded value in tests/data/flags.json
368+ assert_that (
369+ flag .value , equal_to ("some-value" )
370+ ) # hard coded value in tests/data/flags.json
346371
347372
348373@responses .activate ()
@@ -382,7 +407,7 @@ def default_flag_handler(feature_name: str) -> DefaultFlag:
382407
383408@responses .activate ()
384409def test_default_flag_is_not_used_when_identity_flags_returned (
385- api_key : str , identities_json : str
410+ api_key : str , identities_json : str
386411) -> None :
387412 # Given
388413 feature_name = "some_feature"
@@ -408,11 +433,13 @@ def default_flag_handler(feature_name: str) -> DefaultFlag:
408433 flag = flags .get_flag (feature_name )
409434 assert_that (flag .is_default , is_not (True ))
410435 assert_that (flag .value , is_not (equal_to (default_flag .value )))
411- assert_that (flag .value , equal_to ("some-value" )) # hard coded value in tests/data/identities.json
436+ assert_that (
437+ flag .value , equal_to ("some-value" )
438+ ) # hard coded value in tests/data/identities.json
412439
413440
414441def test_default_flags_are_used_if_api_error_and_default_flag_handler_given (
415- mocker : MockerFixture ,
442+ mocker : MockerFixture ,
416443) -> None :
417444 # Given
418445 # a default flag and associated handler
@@ -438,7 +465,7 @@ def default_flag_handler(feature_name: str) -> DefaultFlag:
438465
439466
440467def test_get_identity_segments_no_traits (
441- local_eval_flagsmith : Flagsmith , environment_model : EnvironmentModel
468+ local_eval_flagsmith : Flagsmith , environment_model : EnvironmentModel
442469) -> None :
443470 # Given
444471 identifier = "identifier"
@@ -451,7 +478,7 @@ def test_get_identity_segments_no_traits(
451478
452479
453480def test_get_identity_segments_with_valid_trait (
454- local_eval_flagsmith : Flagsmith , environment_model : EnvironmentModel
481+ local_eval_flagsmith : Flagsmith , environment_model : EnvironmentModel
455482) -> None :
456483 # Given
457484 identifier = "identifier"
@@ -462,7 +489,9 @@ def test_get_identity_segments_with_valid_trait(
462489
463490 # Then
464491 assert_that (len (segments ), equal_to (1 ))
465- assert_that (segments [0 ].name , is_ ("Test segment" )) # obtained from data/environment.json
492+ assert_that (
493+ segments [0 ].name , is_ ("Test segment" )
494+ ) # obtained from data/environment.json
466495
467496
468497def test_local_evaluation_requires_server_key () -> None :
@@ -501,7 +530,7 @@ def get_environment(self) -> EnvironmentModel:
501530
502531@responses .activate ()
503532def test_flagsmith_uses_offline_handler_if_set_and_no_api_response (
504- mocker : MockerFixture , environment_model : EnvironmentModel
533+ mocker : MockerFixture , environment_model : EnvironmentModel
505534) -> None :
506535 # Given
507536 api_url = "http://some.flagsmith.com/api/v1/"
@@ -533,9 +562,9 @@ def test_flagsmith_uses_offline_handler_if_set_and_no_api_response(
533562
534563@responses .activate ()
535564def test_offline_mode__local_evaluation__correct_fallback (
536- mocker : MockerFixture ,
537- environment_model : EnvironmentModel ,
538- caplog : pytest .LogCaptureFixture ,
565+ mocker : MockerFixture ,
566+ environment_model : EnvironmentModel ,
567+ caplog : pytest .LogCaptureFixture ,
539568) -> None :
540569 # Given
541570 api_url = "http://some.flagsmith.com/api/v1/"
@@ -577,7 +606,10 @@ def test_cannot_use_offline_mode_without_offline_handler() -> None:
577606 Flagsmith (offline_mode = True , offline_handler = None )
578607
579608 # Then
580- assert_that (e .exconly (), is_ ("ValueError: offline_handler must be provided to use offline mode." ))
609+ assert_that (
610+ e .exconly (),
611+ is_ ("ValueError: offline_handler must be provided to use offline mode." ),
612+ )
581613
582614
583615def test_cannot_use_default_handler_and_offline_handler (mocker : MockerFixture ) -> None :
@@ -591,7 +623,10 @@ def test_cannot_use_default_handler_and_offline_handler(mocker: MockerFixture) -
591623 )
592624
593625 # Then
594- assert_that (e .exconly (), is_ ("ValueError: Cannot use both default_flag_handler and offline_handler." ))
626+ assert_that (
627+ e .exconly (),
628+ is_ ("ValueError: Cannot use both default_flag_handler and offline_handler." ),
629+ )
595630
596631
597632def test_cannot_create_flagsmith_client_in_remote_evaluation_without_api_key () -> None :
@@ -604,7 +639,7 @@ def test_cannot_create_flagsmith_client_in_remote_evaluation_without_api_key() -
604639
605640
606641def test_stream_not_used_by_default (
607- requests_session_response_ok : None , server_api_key : str
642+ requests_session_response_ok : None , server_api_key : str
608643) -> None :
609644 # When
610645 flagsmith = Flagsmith (
@@ -617,7 +652,7 @@ def test_stream_not_used_by_default(
617652
618653
619654def test_stream_used_when_enable_realtime_updates_is_true (
620- requests_session_response_ok : None , server_api_key : str
655+ requests_session_response_ok : None , server_api_key : str
621656) -> None :
622657 # When
623658 flagsmith = Flagsmith (
@@ -631,7 +666,7 @@ def test_stream_used_when_enable_realtime_updates_is_true(
631666
632667
633668def test_error_raised_when_realtime_updates_is_true_and_local_evaluation_false (
634- requests_session_response_ok : None , server_api_key : str
669+ requests_session_response_ok : None , server_api_key : str
635670) -> None :
636671 with pytest .raises (ValueError ):
637672 Flagsmith (
@@ -643,8 +678,8 @@ def test_error_raised_when_realtime_updates_is_true_and_local_evaluation_false(
643678
644679@responses .activate ()
645680def test_flagsmith_client_get_identity_flags__local_evaluation__returns_expected (
646- environment_json : str ,
647- server_api_key : str ,
681+ environment_json : str ,
682+ server_api_key : str ,
648683) -> None :
649684 # Given
650685 identifier = "overridden-id"
@@ -669,7 +704,7 @@ def test_flagsmith_client_get_identity_flags__local_evaluation__returns_expected
669704
670705
671706def test_custom_feature_error_raised_when_invalid_feature (
672- requests_session_response_ok : None , server_api_key : str
707+ requests_session_response_ok : None , server_api_key : str
673708) -> None :
674709 # Given
675710 flagsmith = Flagsmith (
0 commit comments