@@ -45,6 +45,8 @@ def test_create_code_reference__valid_payload__returns_201_with_accepted_referen
4545 assert len (response .data ["code_references" ]) == 3
4646 assert response .data ["project" ] == project .pk
4747 assert response .data ["created_at" ] == "2025-04-14T12:30:00Z"
48+ assert response .data ["vcs_provider" ] == "github"
49+ assert FeatureFlagCodeReferencesScan .objects .get ().vcs_provider == "github"
4850 assert FeatureFlagCodeReferencesScan .objects .get ().code_references == [
4951 {
5052 "feature_name" : "feature-1" ,
@@ -381,3 +383,100 @@ def test_get_feature_code_references__feature_not_found__returns_404(
381383 # Then
382384 assert response .status_code == 404
383385 assert response .data ["detail" ] == "No Feature matches the given query."
386+
387+
388+ def test_create_code_reference__with_gitlab_provider__returns_201 (
389+ admin_client_new : APIClient ,
390+ project : Project ,
391+ ) -> None :
392+ # Given / When
393+ response = admin_client_new .post (
394+ f"/api/v1/projects/{ project .pk } /code-references/" ,
395+ data = {
396+ "repository_url" : "https://gitlab.com/flagsmith" ,
397+ "revision" : "revision-hash" ,
398+ "vcs_provider" : "gitlab" , # Explicitly testing GitLab
399+ "code_references" : [
400+ {
401+ "feature_name" : "feature-1" ,
402+ "file_path" : "path/to/file1.py" ,
403+ "line_number" : 10 ,
404+ },
405+ ],
406+ },
407+ format = "json" ,
408+ )
409+
410+ # Then
411+ assert response .status_code == 201
412+ assert response .data ["vcs_provider" ] == "gitlab"
413+ assert FeatureFlagCodeReferencesScan .objects .get ().vcs_provider == "gitlab"
414+
415+
416+ def test_create_code_reference__with_invalid_provider__returns_400 (
417+ admin_client_new : APIClient ,
418+ project : Project ,
419+ ) -> None :
420+ # Given / When
421+ response = admin_client_new .post (
422+ f"/api/v1/projects/{ project .pk } /code-references/" ,
423+ data = {
424+ "repository_url" : "https://bitbucket.org/flagsmith" ,
425+ "revision" : "revision-hash" ,
426+ "vcs_provider" : "bitbucket" , # Invalid provider
427+ "code_references" : [
428+ {
429+ "feature_name" : "feature-1" ,
430+ "file_path" : "path/to/file1.py" ,
431+ "line_number" : 10 ,
432+ },
433+ ],
434+ },
435+ format = "json" ,
436+ )
437+
438+ # Then
439+ assert response .status_code == 400
440+ assert "vcs_provider" in response .data
441+ assert not FeatureFlagCodeReferencesScan .objects .exists ()
442+
443+
444+ def test_get_feature_code_references__gitlab_scan__returns_expected_permalinks (
445+ admin_client_new : APIClient ,
446+ feature : Feature ,
447+ project : Project ,
448+ ) -> None :
449+ # Given
450+ with freezegun .freeze_time ("2099-01-01T10:00:00-0300" ):
451+ FeatureFlagCodeReferencesScan .objects .create (
452+ project = project ,
453+ repository_url = "https://gitlab.com/flagsmith/backend" ,
454+ revision = "backend-1" ,
455+ vcs_provider = "gitlab" ,
456+ code_references = [
457+ {
458+ "feature_name" : feature .name ,
459+ "file_path" : "backend/file1.py" ,
460+ "line_number" : 20 ,
461+ },
462+ ],
463+ )
464+
465+ # When
466+ response = admin_client_new .get (
467+ f"/api/v1/projects/{ project .pk } /features/{ feature .pk } /code-references/" ,
468+ )
469+
470+ # Then
471+ assert response .status_code == 200
472+
473+ response_data = response .json ()
474+ assert len (response_data ) == 1
475+ assert response_data [0 ]["vcs_provider" ] == "gitlab"
476+
477+ # Assert the permalink uses the GitLab /-/blob/ format
478+ permalink = response_data [0 ]["code_references" ][0 ]["permalink" ]
479+ assert (
480+ permalink
481+ == "https://gitlab.com/flagsmith/backend/-/blob/backend-1/backend/file1.py#L20"
482+ )
0 commit comments