Skip to content

Commit e4261db

Browse files
committed
Add ForgejoIntegrationTestCase test suite for the Forgejo integration #350
Signed-off-by: tdruez <[email protected]>
1 parent cf6f480 commit e4261db

File tree

2 files changed

+111
-1
lines changed

2 files changed

+111
-1
lines changed

workflow/integrations/forgejo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def update_issue(self, repo_id, issue_id, title=None, body=None, state=None):
8686

8787
def post_comment(self, repo_id, issue_id, comment_body, base_url=None):
8888
"""Post a comment on an existing Forgejo issue."""
89-
url = f"{base_url}/{FORGEJO_API_PATH}/repos/{repo_id}/issues/{issue_id}/comments"
89+
url = f"{base_url}{FORGEJO_API_PATH}/repos/{repo_id}/issues/{issue_id}/comments"
9090
return self.post(url, json={"body": comment_body})
9191

9292
@staticmethod

workflow/tests/test_integrations.py

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)