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..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,12 +188,13 @@ 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( +@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, ) -> 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 +206,38 @@ 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 + 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(