1+ import json
12import logging
23import os
34import site
1718from django .core .cache import caches
1819from django .db .backends .base .creation import TEST_DATABASE_PREFIX
1920from django .test .utils import setup_databases
21+ from django .urls import reverse
2022from flag_engine .segments .constants import EQUAL
2123from moto import mock_dynamodb # type: ignore[import-untyped]
2224from mypy_boto3_dynamodb .service_resource import DynamoDBServiceResource , Table
2527from pytest_django .fixtures import SettingsWrapper
2628from pytest_django .plugin import blocking_manager_key
2729from pytest_mock import MockerFixture
30+ from rest_framework import status
2831from rest_framework .authtoken .models import Token
2932from rest_framework .test import APIClient
3033from task_processor .task_run_method import TaskRunMethod
8386from tests .test_helpers import fix_issue_3869
8487from tests .types import (
8588 AdminClientAuthType ,
89+ GetEnvironmentFlagsResponseJSONCallable ,
90+ GetIdentityFlagsResponseJSONCallable ,
8691 WithEnvironmentPermissionsCallable ,
8792 WithOrganisationPermissionsCallable ,
8893 WithProjectPermissionsCallable ,
@@ -548,8 +553,8 @@ def multivariate_options(
548553
549554
550555@pytest .fixture ()
551- def identity_matching_segment (project , trait ): # type: ignore[no-untyped-def]
552- segment = Segment .objects .create (name = "Matching segment" , project = project )
556+ def identity_matching_segment (project : Project , trait : Trait ) -> Segment :
557+ segment : Segment = Segment .objects .create (name = "Matching segment" , project = project )
553558 matching_rule = SegmentRule .objects .create (
554559 segment = segment , type = SegmentRule .ALL_RULE
555560 )
@@ -563,10 +568,17 @@ def identity_matching_segment(project, trait): # type: ignore[no-untyped-def]
563568
564569
565570@pytest .fixture ()
566- def api_client (): # type: ignore[no-untyped-def]
571+ def api_client () -> APIClient :
567572 return APIClient ()
568573
569574
575+ @pytest .fixture ()
576+ def sdk_client (environment : Environment ) -> APIClient :
577+ client = APIClient ()
578+ client .credentials (HTTP_X_ENVIRONMENT_KEY = environment .api_key )
579+ return client
580+
581+
570582@pytest .fixture ()
571583def feature (project : Project , environment : Environment ) -> Feature :
572584 return Feature .objects .create (name = "Test Feature1" , project = project ) # type: ignore[no-any-return]
@@ -1265,3 +1277,46 @@ def set_github_webhook_secret() -> None:
12651277 from django .conf import settings
12661278
12671279 settings .GITHUB_WEBHOOK_SECRET = "secret-key"
1280+
1281+
1282+ # TODO: move _flags_response_json to common?
1283+ @pytest .fixture ()
1284+ def get_environment_flags_response_json (
1285+ sdk_client : APIClient ,
1286+ ) -> GetEnvironmentFlagsResponseJSONCallable :
1287+ get_environment_flags_url = reverse ("api-v1:flags" )
1288+
1289+ def _get_environment_flags_response_json (num_expected_flags : int ) -> typing .Dict : # type: ignore[type-arg]
1290+ _response = sdk_client .get (get_environment_flags_url )
1291+ assert _response .status_code == status .HTTP_200_OK
1292+ _response_json = _response .json ()
1293+ assert len (_response_json ) == num_expected_flags
1294+ return _response_json # type: ignore[no-any-return]
1295+
1296+ return _get_environment_flags_response_json
1297+
1298+
1299+ @pytest .fixture ()
1300+ def get_identity_flags_response_json (
1301+ sdk_client : APIClient , identity : Identity
1302+ ) -> GetIdentityFlagsResponseJSONCallable :
1303+ identities_url = reverse ("api-v1:sdk-identities" )
1304+
1305+ def _get_identity_flags_response_json ( # type: ignore[no-untyped-def]
1306+ num_expected_flags : int , identifier : str = identity .identifier , ** traits
1307+ ) -> typing .Dict : # type: ignore[type-arg]
1308+ traits = traits or {}
1309+ data = {
1310+ "identifier" : identifier ,
1311+ "traits" : [{"trait_key" : k , "trait_value" : v } for k , v in traits .items ()],
1312+ }
1313+
1314+ _response = sdk_client .post (
1315+ identities_url , data = json .dumps (data ), content_type = "application/json"
1316+ )
1317+ assert _response .status_code == status .HTTP_200_OK
1318+ _response_json = _response .json ()
1319+ assert len (_response_json ["flags" ]) == num_expected_flags
1320+ return _response_json # type: ignore[no-any-return]
1321+
1322+ return _get_identity_flags_response_json # type: ignore[return-value]
0 commit comments