From 4f9ad903a02b8d63d239caf8513dce16c7273ffe Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Thu, 11 Jun 2026 16:54:50 -0300 Subject: [PATCH] Allow empty code reference scans to clear references Co-Authored-By: Claude Fable 5 --- api/projects/code_references/serializers.py | 4 +- ...est_unit_projects_code_references_views.py | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/api/projects/code_references/serializers.py b/api/projects/code_references/serializers.py index f6dd1f31e9a0..f6a31f6a035d 100644 --- a/api/projects/code_references/serializers.py +++ b/api/projects/code_references/serializers.py @@ -38,9 +38,7 @@ class FeatureFlagCodeReferencesScanSerializer( default=VCSProvider.GITHUB, ) revision = serializers.CharField(max_length=100) - code_references = _CodeReferenceSubmitSerializer( - many=True, required=True, allow_empty=False - ) + code_references = _CodeReferenceSubmitSerializer(many=True, required=True) class FeatureFlagCodeReferencesRepositorySummarySerializer( diff --git a/api/tests/unit/projects/code_references/test_unit_projects_code_references_views.py b/api/tests/unit/projects/code_references/test_unit_projects_code_references_views.py index 6ef68d918960..27df62c0a2f5 100644 --- a/api/tests/unit/projects/code_references/test_unit_projects_code_references_views.py +++ b/api/tests/unit/projects/code_references/test_unit_projects_code_references_views.py @@ -76,6 +76,60 @@ def test_create_code_reference__valid_payload__returns_201_with_accepted_referen ] +def test_create_code_reference__empty_references__returns_201_and_clears_previous_references( + admin_client_new: APIClient, + feature: Feature, + project: Project, + log: StructuredLogCapture, +) -> None: + # Given + with freezegun.freeze_time("2099-06-01T12:00:00+00:00"): + admin_client_new.post( + f"/api/v1/projects/{project.pk}/code-references/", + data={ + "repository_url": "https://github.flagsmith.com/", + "revision": "rev-1", + "code_references": [ + { + "feature_name": feature.name, + "file_path": "path/to/file.py", + "line_number": 1, + }, + ], + }, + format="json", + ) + assert ScannedCodeReferences.objects.filter(feature=feature).exists() + + # When + with freezegun.freeze_time("2099-06-02T12:00:00+00:00"): + response = admin_client_new.post( + f"/api/v1/projects/{project.pk}/code-references/", + data={ + "repository_url": "https://github.flagsmith.com/", + "revision": "rev-2", + "code_references": [], + }, + format="json", + ) + + # Then + assert response.status_code == 201 + assert response.data["code_references"] == [] + references_response = admin_client_new.get( + f"/api/v1/projects/{project.pk}/features/{feature.pk}/code-references/", + ) + assert references_response.status_code == 200 + assert references_response.json() == [] + assert log.events[-1] == { + "event": "scan.created", + "level": "info", + "organisation__id": project.organisation_id, + "code_references__count": 0, + "feature__count": 0, + } + + def test_create_code_reference__not_authenticated__returns_401( client: APIClient, project: Project,