diff --git a/api/edge_api/identities/serializers.py b/api/edge_api/identities/serializers.py index ce22aa8d9bbe..fa1bc4897d26 100644 --- a/api/edge_api/identities/serializers.py +++ b/api/edge_api/identities/serializers.py @@ -42,10 +42,21 @@ from .tasks import call_environment_webhook_for_feature_state_change +class LowerCaseCharField(serializers.CharField): + def to_representation(self, value: typing.Any) -> str: + return super().to_representation(value).lower() + + def to_internal_value(self, data: typing.Any) -> str: + return super().to_internal_value(data).lower() + + class EdgeIdentitySerializer(serializers.Serializer): identity_uuid = serializers.CharField(read_only=True) identifier = serializers.CharField(required=True, max_length=2000) - dashboard_alias = serializers.CharField(required=False, max_length=100) + dashboard_alias = LowerCaseCharField( + required=False, + max_length=100, + ) def create(self, *args, **kwargs): identifier = self.validated_data.get("identifier") @@ -274,7 +285,7 @@ class GetEdgeIdentityOverridesQuerySerializer(serializers.Serializer): class EdgeIdentitySearchField(serializers.CharField): def to_internal_value(self, data: str) -> EdgeIdentitySearchData: kwargs = {} - search_term = data + search_term = data.lower() if search_term.startswith(DASHBOARD_ALIAS_SEARCH_PREFIX): kwargs["search_attribute"] = DASHBOARD_ALIAS_ATTRIBUTE diff --git a/api/tests/integration/edge_api/identities/test_edge_identity_viewset.py b/api/tests/integration/edge_api/identities/test_edge_identity_viewset.py index 87d5052cfa6e..963516be0f2f 100644 --- a/api/tests/integration/edge_api/identities/test_edge_identity_viewset.py +++ b/api/tests/integration/edge_api/identities/test_edge_identity_viewset.py @@ -373,6 +373,39 @@ def test_search_for_identities_by_dashboard_alias( assert len(response.json()["results"]) == 1 +def test_search_for_identities_by_dashboard_alias_casts_search_to_lower( + admin_client: APIClient, + dynamo_enabled_environment: Environment, + environment_api_key: str, + identity_document: dict[str, Any], + flagsmith_identities_table: Table, +) -> None: + # Given + identifier = identity_document["identifier"] + dashboard_alias = identity_document["dashboard_alias"] + + flagsmith_identities_table.put_item(Item=identity_document) + + base_url = reverse( + "api-v1:environments:environment-edge-identities-list", + args=[environment_api_key], + ) + url = "%s?%s" % ( + base_url, + urllib.parse.urlencode( + {"q": f'{DASHBOARD_ALIAS_SEARCH_PREFIX}"{dashboard_alias.upper()}"'} + ), + ) + + # When + response = admin_client.get(url) + + # Then + assert response.status_code == status.HTTP_200_OK + assert response.json()["results"][0]["identifier"] == identifier + assert len(response.json()["results"]) == 1 + + def test_update_edge_identity( admin_client_new: APIClient, dynamo_enabled_environment: Environment, @@ -384,7 +417,8 @@ def test_update_edge_identity( identity_uuid = identity_document["identity_uuid"] composite_key = identity_document["composite_key"] - dashboard_alias = "new-dashboard-alias" + input_dashboard_alias = "New-Dashboard-Alias" + expected_dashboard_alias = input_dashboard_alias.lower() flagsmith_identities_table.put_item(Item=identity_document) @@ -394,13 +428,15 @@ def test_update_edge_identity( ) # When - response = admin_client_new.patch(url, data={"dashboard_alias": dashboard_alias}) + response = admin_client_new.patch( + url, data={"dashboard_alias": input_dashboard_alias} + ) # Then assert response.status_code == status.HTTP_200_OK assert response.json() == { - "dashboard_alias": dashboard_alias, + "dashboard_alias": expected_dashboard_alias, "identifier": identity_document["identifier"], "identity_uuid": identity_uuid, } @@ -411,7 +447,10 @@ def test_update_edge_identity( identity_from_db = flagsmith_identities_table.get_item( Key={"composite_key": composite_key} )["Item"] - assert {**identity_document, "dashboard_alias": dashboard_alias} == identity_from_db + assert { + **identity_document, + "dashboard_alias": expected_dashboard_alias, + } == identity_from_db def test_edge_identities_traits_list(