From b099e352b663ee648de8c19ec1cd1c24ec834a37 Mon Sep 17 00:00:00 2001 From: wadii Date: Tue, 26 May 2026 15:49:23 +0200 Subject: [PATCH 1/2] fix: code references count returns 0 after unchanged rescan --- api/projects/code_references/services.py | 4 +++- .../test_unit_projects_code_references_views.py | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/api/projects/code_references/services.py b/api/projects/code_references/services.py index e2cb628a26d4..4e8705b0b85e 100644 --- a/api/projects/code_references/services.py +++ b/api/projects/code_references/services.py @@ -146,7 +146,9 @@ def record_scan( for feature_name, references in references_by_feature.items() if (feature := features_by_name.get(feature_name)) is not None ], - ignore_conflicts=True, + update_conflicts=True, + unique_fields=["feature", "repository", "code_references_hash"], + update_fields=["created_at", "revision"], ) return FeatureFlagCodeReferencesScan( 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 0d82600ab878..7439adae9b8f 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 @@ -188,12 +188,12 @@ def test_create_code_reference__file_path_too_long__returns_400( assert not ScannedCodeReferences.objects.exists() -def test_create_code_reference__duplicate_payload__deduplicates_storage( +def test_create_code_reference__duplicate_payload__deduplicates_storage_and_references_remain_retrievable( admin_client_new: APIClient, project: Project, ) -> None: # Given - Feature.objects.create(project=project, name="feature-1") + feature = Feature.objects.create(project=project, name="feature-1") payload = { "repository_url": "https://github.flagsmith.com/", "revision": "rev-1", @@ -205,17 +205,25 @@ def test_create_code_reference__duplicate_payload__deduplicates_storage( }, ], } - - # When admin_client_new.post( f"/api/v1/projects/{project.pk}/code-references/", data=payload, format="json" ) + + # When admin_client_new.post( f"/api/v1/projects/{project.pk}/code-references/", data=payload, format="json" ) # Then assert ScannedCodeReferences.objects.count() == 1 + response = admin_client_new.get( + f"/api/v1/projects/{project.pk}/features/{feature.pk}/code-references/", + ) + assert response.status_code == 200 + data = response.json() + assert len(data) == 1 + assert len(data[0]["code_references"]) == 1 + assert data[0]["code_references"][0]["file_path"] == "path/to/file.py" def test_get_feature_code_references__multiple_scans_exist__returns_latest_per_repository( From d254f0615ccc76bbbd9b2549596fa5648050dc99 Mon Sep 17 00:00:00 2001 From: wadii Date: Tue, 26 May 2026 16:13:12 +0200 Subject: [PATCH 2/2] fix: use freeze and assert full payload --- ...est_unit_projects_code_references_views.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) 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 7439adae9b8f..6ef68d918960 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 @@ -188,6 +188,7 @@ def test_create_code_reference__file_path_too_long__returns_400( assert not ScannedCodeReferences.objects.exists() +@freezegun.freeze_time("2099-06-01T12:00:00+00:00") def test_create_code_reference__duplicate_payload__deduplicates_storage_and_references_remain_retrievable( admin_client_new: APIClient, project: Project, @@ -220,10 +221,23 @@ def test_create_code_reference__duplicate_payload__deduplicates_storage_and_refe f"/api/v1/projects/{project.pk}/features/{feature.pk}/code-references/", ) assert response.status_code == 200 - data = response.json() - assert len(data) == 1 - assert len(data[0]["code_references"]) == 1 - assert data[0]["code_references"][0]["file_path"] == "path/to/file.py" + assert response.json() == [ + { + "repository_url": "https://github.flagsmith.com/", + "vcs_provider": "github", + "revision": "rev-1", + "last_successful_repository_scanned_at": "2099-06-01T12:00:00+00:00", + "last_feature_found_at": "2099-06-01T12:00:00+00:00", + "code_references": [ + { + "feature_name": "feature-1", + "file_path": "path/to/file.py", + "line_number": 1, + "permalink": "https://github.flagsmith.com/blob/rev-1/path/to/file.py#L1", + }, + ], + }, + ] def test_get_feature_code_references__multiple_scans_exist__returns_latest_per_repository(