@@ -441,3 +441,113 @@ def test_jira_post_comment_calls_post(self, mock_request):
441441
442442 self .assertEqual (response ["id" ], "1001" )
443443 mock_request .assert_called_once ()
444+
445+
446+ class ForgejoIntegrationTestCase (TestCase ):
447+ def setUp (self ):
448+ patcher = mock .patch ("workflow.models.Request.handle_integrations" , return_value = None )
449+ self .mock_handle_integrations = patcher .start ()
450+ self .addCleanup (patcher .stop )
451+
452+ self .dataspace = Dataspace .objects .create (name = "nexB" )
453+ self .dataspace .set_configuration ("forgejo_token" , "fake-token" )
454+ self .super_user = create_superuser ("nexb_user" , self .dataspace )
455+ self .component_ct = ContentType .objects .get (app_label = "component_catalog" , model = "component" )
456+ self .request_template = RequestTemplate .objects .create (
457+ name = "Forgejo Template" ,
458+ description = "Integration test template" ,
459+ content_type = self .component_ct ,
460+ dataspace = self .dataspace ,
461+ issue_tracker_id = "https://code.forgejo.org/nexB/repo" ,
462+ )
463+ self .question = Question .objects .create (
464+ template = self .request_template ,
465+ label = "Example Question" ,
466+ input_type = "TextField" ,
467+ position = 0 ,
468+ dataspace = self .dataspace ,
469+ )
470+ self .request = self .request_template .create_request (
471+ title = "Example Request" ,
472+ requester = self .super_user ,
473+ serialized_data = '{"Example Question": "Some value"}' ,
474+ )
475+ self .forgejo = ForgejoIntegration (dataspace = self .dataspace )
476+
477+ def test_forgejo_extract_forgejo_info_valid_url (self ):
478+ url = "https://code.forgejo.org/user/repo"
479+ base_url , repo_path = ForgejoIntegration .extract_forgejo_info (url )
480+ self .assertEqual (base_url , "https://code.forgejo.org" )
481+ self .assertEqual (repo_path , "user/repo" )
482+
483+ def test_forgejo_extract_forgejo_info_invalid_url_missing_host (self ):
484+ with self .assertRaises (ValueError ):
485+ ForgejoIntegration .extract_forgejo_info ("invalid-url" )
486+
487+ def test_forgejo_extract_forgejo_info_invalid_url_missing_repo_path (self ):
488+ with self .assertRaises (ValueError ):
489+ ForgejoIntegration .extract_forgejo_info ("https://code.forgejo.org/user" )
490+
491+ def test_forgejo_get_headers_returns_auth_header (self ):
492+ headers = self .forgejo .get_headers ()
493+ self .assertEqual (headers , {"Authorization" : "token fake-token" })
494+
495+ def test_forgejo_make_issue_title (self ):
496+ title = self .forgejo .make_issue_title (self .request )
497+ self .assertEqual (title , "[DEJACODE] Example Request" )
498+
499+ def test_forgejo_make_issue_body_contains_question (self ):
500+ body = self .forgejo .make_issue_body (self .request )
501+ self .assertIn ("### Example Question" , body )
502+ self .assertIn ("Some value" , body )
503+
504+ @mock .patch ("requests.Session.request" )
505+ def test_forgejo_create_issue_calls_post (self , mock_request ):
506+ mock_request .return_value .json .return_value = {"number" : 42 }
507+ mock_request .return_value .raise_for_status .return_value = None
508+
509+ self .forgejo .api_url = "https://code.forgejo.org/api/v1"
510+ issue = self .forgejo .create_issue (
511+ repo_id = "user/repo" ,
512+ title = "Issue Title" ,
513+ body = "Issue Body" ,
514+ )
515+ self .assertEqual (issue ["number" ], 42 )
516+ mock_request .assert_called_once ()
517+
518+ @mock .patch ("requests.Session.request" )
519+ def test_forgejo_update_issue_calls_patch (self , mock_request ):
520+ mock_request .return_value .json .return_value = {"state" : "closed" }
521+ mock_request .return_value .raise_for_status .return_value = None
522+
523+ self .forgejo .api_url = "https://code.forgejo.org/api/v1"
524+ response = self .forgejo .update_issue (
525+ repo_id = "user/repo" ,
526+ issue_id = 123 ,
527+ title = "Updated title" ,
528+ body = "Updated body" ,
529+ state = "closed" ,
530+ )
531+ self .assertEqual (response ["state" ], "closed" )
532+ mock_request .assert_called_once ()
533+
534+ @mock .patch ("requests.Session.request" )
535+ def test_forgejo_post_comment_calls_post (self , mock_request ):
536+ mock_request .return_value .json .return_value = {"id" : 99 , "body" : "Test comment" }
537+ mock_request .return_value .raise_for_status .return_value = None
538+
539+ response = self .forgejo .post_comment (
540+ repo_id = "user/repo" ,
541+ issue_id = 123 ,
542+ comment_body = "Test comment" ,
543+ base_url = "https://code.forgejo.org" ,
544+ )
545+ self .assertEqual (response ["body" ], "Test comment" )
546+ mock_request .assert_called_once_with (
547+ method = "POST" ,
548+ url = "https://code.forgejo.org/api/v1/repos/user/repo/issues/123/comments" ,
549+ params = None ,
550+ data = None ,
551+ json = {"body" : "Test comment" },
552+ timeout = self .forgejo .default_timeout ,
553+ )
0 commit comments