11import json
2+ import logging
23import time
34import typing
45
@@ -1054,9 +1055,10 @@ def test_get_experiment_flag_raises_without_events_enabled(api_key: str) -> None
10541055
10551056
10561057@responses .activate ()
1057- def test_get_experiment_flag_returns_flag_and_tracks_exposure (
1058+ def test_get_experiment_flag__variant__returns_flag_and_tracks_exposure (
10581059 mocker : MockerFixture , api_key : str , identities_json : str
10591060) -> None :
1061+ # Given
10601062 config = EventProcessorConfig (events_api_url = "http://test/" )
10611063 flagsmith = Flagsmith (
10621064 environment_key = api_key , enable_events = True , event_processor_config = config
@@ -1065,29 +1067,33 @@ def test_get_experiment_flag_returns_flag_and_tracks_exposure(
10651067 mock_track = mocker .patch .object (flagsmith ._event_processor , "track_exposure_event" )
10661068 responses .add (method = "POST" , url = flagsmith .identities_url , body = identities_json )
10671069
1070+ # When
10681071 result = flagsmith .get_experiment_flag (
10691072 feature_name = "some_feature" ,
10701073 identifier = "user1" ,
10711074 traits = {"plan" : "premium" },
10721075 )
10731076
1077+ # Then
10741078 assert isinstance (result , Flag )
10751079 assert result .is_default is False
10761080 assert result .feature_name == "some_feature"
10771081 assert result .value == "some-value"
1082+ assert result .variant == "treatment"
10781083 mock_track .assert_called_once_with (
10791084 feature_name = "some_feature" ,
10801085 identifier = "user1" ,
1081- value = "some-value " ,
1086+ value = "treatment " ,
10821087 traits = {"plan" : "premium" },
10831088 metadata = None ,
10841089 )
10851090
10861091
10871092@responses .activate ()
1088- def test_get_experiment_flag_skips_exposure_for_default_flag (
1089- mocker : MockerFixture , api_key : str
1093+ def test_get_experiment_flag__default_flag__skips_exposure (
1094+ mocker : MockerFixture , api_key : str , caplog : pytest . LogCaptureFixture
10901095) -> None :
1096+ # Given
10911097 config = EventProcessorConfig (events_api_url = "http://test/" )
10921098
10931099 def default_flag_handler (feature_name : str ) -> DefaultFlag :
@@ -1106,20 +1112,27 @@ def default_flag_handler(feature_name: str) -> DefaultFlag:
11061112 body = json .dumps ({"flags" : [], "traits" : []}),
11071113 )
11081114
1109- result = flagsmith .get_experiment_flag (
1110- feature_name = "missing_feature" , identifier = "user1"
1111- )
1115+ # When
1116+ with caplog .at_level (logging .DEBUG , logger = "flagsmith.flagsmith" ):
1117+ result = flagsmith .get_experiment_flag (
1118+ feature_name = "missing_feature" , identifier = "user1"
1119+ )
11121120
1121+ # Then
11131122 assert isinstance (result , DefaultFlag )
11141123 assert result .is_default is True
11151124 assert result .value == "default-variant"
11161125 mock_track .assert_not_called ()
1126+ assert (
1127+ "Not sending $flag_exposure for feature missing_feature: feature not found."
1128+ in caplog .messages
1129+ )
11171130
11181131
1119- def test_get_experiment_flag_uses_variant_as_exposure_value (
1132+ def test_get_experiment_flag__variant__used_as_exposure_value (
11201133 mocker : MockerFixture , api_key : str
11211134) -> None :
1122- # Given - a resolved flag carrying a variant
1135+ # Given
11231136 config = EventProcessorConfig (events_api_url = "http://test/" )
11241137 flagsmith = Flagsmith (
11251138 environment_key = api_key , enable_events = True , event_processor_config = config
@@ -1141,7 +1154,7 @@ def test_get_experiment_flag_uses_variant_as_exposure_value(
11411154 # When
11421155 flagsmith .get_experiment_flag (feature_name = "checkout_v2" , identifier = "user1" )
11431156
1144- # Then - the exposure value is the variant, not the flag value
1157+ # Then
11451158 mock_track .assert_called_once_with (
11461159 feature_name = "checkout_v2" ,
11471160 identifier = "user1" ,
@@ -1151,10 +1164,10 @@ def test_get_experiment_flag_uses_variant_as_exposure_value(
11511164 )
11521165
11531166
1154- def test_get_experiment_flag_falls_back_to_value_without_variant (
1155- mocker : MockerFixture , api_key : str
1167+ def test_get_experiment_flag__no_variant__skips_exposure (
1168+ mocker : MockerFixture , api_key : str , caplog : pytest . LogCaptureFixture
11561169) -> None :
1157- # Given - a resolved flag with no variant
1170+ # Given
11581171 config = EventProcessorConfig (events_api_url = "http://test/" )
11591172 flagsmith = Flagsmith (
11601173 environment_key = api_key , enable_events = True , event_processor_config = config
@@ -1174,15 +1187,17 @@ def test_get_experiment_flag_falls_back_to_value_without_variant(
11741187 mock_track = mocker .patch .object (flagsmith ._event_processor , "track_exposure_event" )
11751188
11761189 # When
1177- flagsmith .get_experiment_flag (feature_name = "checkout_v2" , identifier = "user1" )
1190+ with caplog .at_level (logging .DEBUG , logger = "flagsmith.flagsmith" ):
1191+ result = flagsmith .get_experiment_flag (
1192+ feature_name = "checkout_v2" , identifier = "user1"
1193+ )
11781194
1179- # Then - the exposure value falls back to the flag value
1180- mock_track .assert_called_once_with (
1181- feature_name = "checkout_v2" ,
1182- identifier = "user1" ,
1183- value = "blue" ,
1184- traits = None ,
1185- metadata = None ,
1195+ # Then
1196+ assert result is flag
1197+ mock_track .assert_not_called ()
1198+ assert (
1199+ "Not sending $flag_exposure for feature checkout_v2: flag has no variant."
1200+ in caplog .messages
11861201 )
11871202
11881203
@@ -1260,10 +1275,10 @@ def test_flagsmith_posts_analytics_to_api_url_when_analytics_url_unset(
12601275 assert len (analytics_posts ) == 1
12611276
12621277
1263- def test_get_experiment_flag_skips_exposure_for_disabled_feature (
1264- mocker : MockerFixture , api_key : str
1278+ def test_get_experiment_flag__disabled_feature__skips_exposure (
1279+ mocker : MockerFixture , api_key : str , caplog : pytest . LogCaptureFixture
12651280) -> None :
1266- # Given - a resolved flag for a disabled feature
1281+ # Given
12671282 config = EventProcessorConfig (events_api_url = "http://test/" )
12681283 flagsmith = Flagsmith (
12691284 environment_key = api_key , enable_events = True , event_processor_config = config
@@ -1283,10 +1298,15 @@ def test_get_experiment_flag_skips_exposure_for_disabled_feature(
12831298 mock_track = mocker .patch .object (flagsmith ._event_processor , "track_exposure_event" )
12841299
12851300 # When
1286- result = flagsmith .get_experiment_flag (
1287- feature_name = "checkout_v2" , identifier = "user1"
1288- )
1301+ with caplog .at_level (logging .DEBUG , logger = "flagsmith.flagsmith" ):
1302+ result = flagsmith .get_experiment_flag (
1303+ feature_name = "checkout_v2" , identifier = "user1"
1304+ )
12891305
1290- # Then - the flag is returned but no exposure event is tracked
1306+ # Then
12911307 assert result is flag
12921308 mock_track .assert_not_called ()
1309+ assert (
1310+ "Not sending $flag_exposure for feature checkout_v2: feature is disabled."
1311+ in caplog .messages
1312+ )
0 commit comments