|
9 | 9 | from pytest_mock import MockerFixture |
10 | 10 |
|
11 | 11 | from edge_proxy.environments import EnvironmentService |
12 | | -from edge_proxy.exceptions import FlagsmithUnknownKeyError |
| 12 | +from edge_proxy.exceptions import ( |
| 13 | + FeatureNotFoundError, |
| 14 | + FlagsmithUnknownKeyError, |
| 15 | +) |
13 | 16 | from edge_proxy.models import IdentityWithTraits |
14 | 17 | from edge_proxy.settings import ( |
15 | 18 | EndpointCacheSettings, |
@@ -230,3 +233,101 @@ async def test_get_identity_flags_response_skips_cache_for_different_identity( |
230 | 233 | assert environment_service.get_identity_response_data.cache_info().currsize == 2 |
231 | 234 | assert environment_service.get_identity_response_data.cache_info().misses == 2 |
232 | 235 | assert environment_service.get_identity_response_data.cache_info().hits == 0 |
| 236 | + |
| 237 | + |
| 238 | +@pytest.mark.asyncio |
| 239 | +async def test_get_flags_response_data_skips_filter_for_server_key( |
| 240 | + mocker: MockerFixture, |
| 241 | +) -> None: |
| 242 | + # Given |
| 243 | + # We create a new settings object that contains a server key as a client_side_key |
| 244 | + api_key = "ser." + environment_1_api_key |
| 245 | + _settings = AppSettings( |
| 246 | + environment_key_pairs=[ |
| 247 | + {"client_side_key": api_key, "server_side_key": "ser.key"} |
| 248 | + ] |
| 249 | + ) |
| 250 | + |
| 251 | + mocked_client = mocker.AsyncMock() |
| 252 | + mocked_client.get.return_value = mocker.MagicMock( |
| 253 | + text=orjson.dumps(environment_1), raise_for_status=lambda: None |
| 254 | + ) |
| 255 | + |
| 256 | + environment_service = EnvironmentService(settings=_settings, client=mocked_client) |
| 257 | + await environment_service.refresh_environment_caches() |
| 258 | + |
| 259 | + # When |
| 260 | + # We retrieve the flag response data |
| 261 | + flags = environment_service.get_flags_response_data(api_key) |
| 262 | + specific_flag = environment_service.get_flags_response_data(api_key, "feature_3") |
| 263 | + |
| 264 | + # Then |
| 265 | + # we get the server-side only flag |
| 266 | + assert len(flags) == 3 |
| 267 | + assert flags[2].get("feature").get("name") == "feature_3" |
| 268 | + assert specific_flag.get("feature").get("name") == "feature_3" |
| 269 | + |
| 270 | + |
| 271 | +@pytest.mark.asyncio |
| 272 | +async def test_get_flags_response_data_filters_server_side_features_for_client_key( |
| 273 | + mocker: MockerFixture, |
| 274 | +) -> None: |
| 275 | + # Given |
| 276 | + # We create a new settings object that contains a client side key |
| 277 | + _settings = AppSettings( |
| 278 | + environment_key_pairs=[ |
| 279 | + {"client_side_key": environment_1_api_key, "server_side_key": "ser.key"} |
| 280 | + ] |
| 281 | + ) |
| 282 | + |
| 283 | + mocked_client = mocker.AsyncMock() |
| 284 | + mocked_client.get.return_value = mocker.MagicMock( |
| 285 | + text=orjson.dumps(environment_1), raise_for_status=lambda: None |
| 286 | + ) |
| 287 | + |
| 288 | + environment_service = EnvironmentService(settings=_settings, client=mocked_client) |
| 289 | + await environment_service.refresh_environment_caches() |
| 290 | + |
| 291 | + # When |
| 292 | + # We retrieve the flag response data |
| 293 | + flags = environment_service.get_flags_response_data(environment_1_api_key) |
| 294 | + with pytest.raises(FeatureNotFoundError): |
| 295 | + environment_service.get_flags_response_data(environment_1_api_key, "feature_3") |
| 296 | + |
| 297 | + # Then |
| 298 | + # we only get the two client side flags |
| 299 | + assert len(flags) == 2 |
| 300 | + |
| 301 | + |
| 302 | +@pytest.mark.asyncio |
| 303 | +async def test_get_identity_flags_response_skips_filter_for_server_key( |
| 304 | + mocker: MockerFixture, |
| 305 | +) -> None: |
| 306 | + # Given |
| 307 | + # We create a new settings object that contains a server key as a client_side_key |
| 308 | + api_key = "ser." + environment_1_api_key |
| 309 | + _settings = AppSettings( |
| 310 | + environment_key_pairs=[ |
| 311 | + {"client_side_key": api_key, "server_side_key": "ser.key"} |
| 312 | + ] |
| 313 | + ) |
| 314 | + |
| 315 | + mocked_client = mocker.AsyncMock() |
| 316 | + mocked_client.get.return_value = mocker.MagicMock( |
| 317 | + text=orjson.dumps(environment_1), raise_for_status=lambda: None |
| 318 | + ) |
| 319 | + |
| 320 | + environment_service = EnvironmentService(settings=_settings, client=mocked_client) |
| 321 | + await environment_service.refresh_environment_caches() |
| 322 | + |
| 323 | + # When |
| 324 | + # We retrieve the flags for an identity |
| 325 | + result = environment_service.get_identity_response_data( |
| 326 | + IdentityWithTraits(identifier="foo"), api_key |
| 327 | + ) |
| 328 | + |
| 329 | + # Then |
| 330 | + # we get the server-side only flag |
| 331 | + flags = result.get("flags") |
| 332 | + assert len(flags) == 3 |
| 333 | + assert flags[2].get("feature").get("name") == "feature_3" |
0 commit comments