diff --git a/api/features/views.py b/api/features/views.py index 9ddf9f6b590e..f4477ee77b39 100644 --- a/api/features/views.py +++ b/api/features/views.py @@ -875,7 +875,12 @@ def get_queryset(self): # type: ignore[no-untyped-def] if getattr(self, "swagger_fake_view", False): return FeatureState.objects.none() - return super().get_queryset().filter(identity__pk=self.kwargs["identity_pk"]) # type: ignore[no-untyped-call] + try: + identity_pk = int(self.kwargs["identity_pk"]) + except ValueError: + raise NotFound("Identity not found.") + + return super().get_queryset().filter(identity__pk=identity_pk) # type: ignore[no-untyped-call] @action(methods=["GET"], detail=False) def all(self, request, *args, **kwargs): # type: ignore[no-untyped-def] diff --git a/api/tests/unit/features/test_unit_features_views.py b/api/tests/unit/features/test_unit_features_views.py index f47d3951d262..402f210ab181 100644 --- a/api/tests/unit/features/test_unit_features_views.py +++ b/api/tests/unit/features/test_unit_features_views.py @@ -273,6 +273,24 @@ def test_delete_identity_feature_state__existing_state__creates_audit_log( ) +def test_list_identity_feature_states__non_integer_identity_pk__returns_404( + environment: Environment, + admin_client_new: APIClient, +) -> None: + # Given + url = reverse( + "api-v1:environments:identity-featurestates-list", + args=[environment.api_key, "org_notanumber"], + ) + + # When + response = admin_client_new.get(url) + + # Then + assert response.status_code == status.HTTP_404_NOT_FOUND + assert response.json() == {"detail": "Identity not found."} + + def test_create_feature__tags_from_different_project__returns_400( project: Project, admin_client_new: APIClient,