From c4ff9604352236424a98ce840f34b387132e1e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Thu, 21 Jul 2016 11:12:07 +0200 Subject: [PATCH] Add gogs integration inside taiga distribution --- settings/common.py | 2 + taiga/hooks/gogs/__init__.py | 0 taiga/hooks/gogs/api.py | 44 ++ taiga/hooks/gogs/event_hooks.py | 52 ++ taiga/hooks/gogs/migrations/0001_initial.py | 39 ++ taiga/hooks/gogs/migrations/__init__.py | 0 taiga/hooks/gogs/migrations/logo.png | Bin 0 -> 97926 bytes taiga/hooks/gogs/models.py | 1 + taiga/hooks/gogs/services.py | 37 ++ taiga/routers.py | 6 + tests/integration/test_hooks_gogs.py | 502 ++++++++++++++++++++ 11 files changed, 683 insertions(+) create mode 100644 taiga/hooks/gogs/__init__.py create mode 100644 taiga/hooks/gogs/api.py create mode 100644 taiga/hooks/gogs/event_hooks.py create mode 100644 taiga/hooks/gogs/migrations/0001_initial.py create mode 100644 taiga/hooks/gogs/migrations/__init__.py create mode 100644 taiga/hooks/gogs/migrations/logo.png create mode 100644 taiga/hooks/gogs/models.py create mode 100644 taiga/hooks/gogs/services.py create mode 100644 tests/integration/test_hooks_gogs.py diff --git a/settings/common.py b/settings/common.py index 66fbb67f..333d310a 100644 --- a/settings/common.py +++ b/settings/common.py @@ -313,6 +313,7 @@ INSTALLED_APPS = [ "taiga.hooks.github", "taiga.hooks.gitlab", "taiga.hooks.bitbucket", + "taiga.hooks.gogs", "taiga.webhooks", "djmail", @@ -506,6 +507,7 @@ PROJECT_MODULES_CONFIGURATORS = { "github": "taiga.hooks.github.services.get_or_generate_config", "gitlab": "taiga.hooks.gitlab.services.get_or_generate_config", "bitbucket": "taiga.hooks.bitbucket.services.get_or_generate_config", + "gogs": "taiga.hooks.gogs.services.get_or_generate_config", } BITBUCKET_VALID_ORIGIN_IPS = ["131.103.20.165", "131.103.20.166", "104.192.143.192/28", "104.192.143.208/28"] diff --git a/taiga/hooks/gogs/__init__.py b/taiga/hooks/gogs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/hooks/gogs/api.py b/taiga/hooks/gogs/api.py new file mode 100644 index 00000000..ced551de --- /dev/null +++ b/taiga/hooks/gogs/api.py @@ -0,0 +1,44 @@ +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Alejandro Alonso +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from taiga.hooks.api import BaseWebhookApiViewSet + +from . import event_hooks + + +class GogsViewSet(BaseWebhookApiViewSet): + event_hook_classes = { + "push": event_hooks.PushEventHook + } + + def _validate_signature(self, project, request): + payload = self._get_payload(request) + + if not hasattr(project, "modules_config"): + return False + + if project.modules_config.config is None: + return False + + secret = project.modules_config.config.get("gogs", {}).get("secret", None) + if secret is None: + return False + + return payload.get('secret', None) == secret + + def _get_event_name(self, request): + return "push" diff --git a/taiga/hooks/gogs/event_hooks.py b/taiga/hooks/gogs/event_hooks.py new file mode 100644 index 00000000..8e68b8db --- /dev/null +++ b/taiga/hooks/gogs/event_hooks.py @@ -0,0 +1,52 @@ +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Alejandro Alonso +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import re +import os.path + +from taiga.hooks.event_hooks import BasePushEventHook + + +class BaseGogsEventHook(): + platform = "Gogs" + platform_slug = "gogs" + + def replace_gogs_references(self, project_url, wiki_text): + if wiki_text is None: + wiki_text = "" + + template = "\g<1>[Gogs#\g<2>]({}/issues/\g<2>)\g<3>".format(project_url) + return re.sub(r"(\s|^)#(\d+)(\s|$)", template, wiki_text, 0, re.M) + + +class PushEventHook(BaseGogsEventHook, BasePushEventHook): + def get_data(self): + result = [] + commits = self.payload.get("commits", []) + project_url = self.payload.get("repository", {}).get("url", None) + + for commit in filter(None, commits): + user_name = commit.get('author', {}).get('username', None) + result.append({ + "user_id": user_name, + "user_name": user_name, + "user_url": os.path.join(os.path.dirname(os.path.dirname(project_url)), user_name), + "commit_id": commit.get("id", None), + "commit_url": commit.get("url", None), + "commit_message": commit.get("message", None), + }) + return result diff --git a/taiga/hooks/gogs/migrations/0001_initial.py b/taiga/hooks/gogs/migrations/0001_initial.py new file mode 100644 index 00000000..09ba6709 --- /dev/null +++ b/taiga/hooks/gogs/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.core.files import File + +import uuid +import os + +CUR_DIR = os.path.dirname(__file__) + + +def create_gogs_system_user(apps, schema_editor): + # We get the model from the versioned app registry; + # if we directly import it, it'll be the wrong version + User = apps.get_model("users", "User") + db_alias = schema_editor.connection.alias + random_hash = uuid.uuid4().hex + user = User.objects.using(db_alias).create( + username="gogs-{}".format(random_hash), + email="gogs-{}@taiga.io".format(random_hash), + full_name="Gogs", + is_active=False, + is_system=True, + bio="", + ) + f = open("{}/logo.png".format(CUR_DIR), "rb") + user.photo.save("logo.png", File(f)) + user.save() + + +class Migration(migrations.Migration): + dependencies = [ + ('users', '0010_auto_20150414_0936') + ] + + operations = [ + migrations.RunPython(create_gogs_system_user), + ] diff --git a/taiga/hooks/gogs/migrations/__init__.py b/taiga/hooks/gogs/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/hooks/gogs/migrations/logo.png b/taiga/hooks/gogs/migrations/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..384a58d20f381e06132089a10c9d5b46e204acf9 GIT binary patch literal 97926 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 U%*WP;hf!jYbUU--;l5wKn0~ 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 Q0{{SkplgCF!#IZj9|Om`00000 literal 0 HcmV?d00001 diff --git a/taiga/hooks/gogs/models.py b/taiga/hooks/gogs/models.py new file mode 100644 index 00000000..fca83d73 --- /dev/null +++ b/taiga/hooks/gogs/models.py @@ -0,0 +1 @@ +# This file is needed to load migrations diff --git a/taiga/hooks/gogs/services.py b/taiga/hooks/gogs/services.py new file mode 100644 index 00000000..40d06fab --- /dev/null +++ b/taiga/hooks/gogs/services.py @@ -0,0 +1,37 @@ +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Alejandro Alonso +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import uuid + +from django.core.urlresolvers import reverse + +from taiga.base.utils.urls import get_absolute_url + + +# Set this in settings.PROJECT_MODULES_CONFIGURATORS["gogs"] +def get_or_generate_config(project): + config = project.modules_config.config + if config and "gogs" in config: + g_config = project.modules_config.config["gogs"] + else: + g_config = {"secret": uuid.uuid4().hex} + + url = reverse("gogs-hook-list") + url = get_absolute_url(url) + url = "%s?project=%s" % (url, project.id) + g_config["webhooks_url"] = url + return g_config diff --git a/taiga/routers.py b/taiga/routers.py index 66e1b9f7..24974b74 100644 --- a/taiga/routers.py +++ b/taiga/routers.py @@ -208,6 +208,12 @@ from taiga.hooks.bitbucket.api import BitBucketViewSet router.register(r"bitbucket-hook", BitBucketViewSet, base_name="bitbucket-hook") +# Gogs webhooks +from taiga.hooks.gogs.api import GogsViewSet + +router.register(r"gogs-hook", GogsViewSet, base_name="gogs-hook") + + # Importer from taiga.export_import.api import ProjectImporterViewSet, ProjectExporterViewSet diff --git a/tests/integration/test_hooks_gogs.py b/tests/integration/test_hooks_gogs.py new file mode 100644 index 00000000..290bc3f8 --- /dev/null +++ b/tests/integration/test_hooks_gogs.py @@ -0,0 +1,502 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino +# Copyright (C) 2014-2016 David Barragán +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Anler Hernández +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import pytest + +from unittest import mock + +from django.core.urlresolvers import reverse +from django.core import mail + +from taiga.base.utils import json +from taiga.hooks.gogs import event_hooks +from taiga.hooks.gogs.api import GogsViewSet +from taiga.hooks.exceptions import ActionSyntaxException +from taiga.projects import choices as project_choices +from taiga.projects.issues.models import Issue +from taiga.projects.tasks.models import Task +from taiga.projects.userstories.models import UserStory +from taiga.projects.models import Membership +from taiga.projects.history.services import get_history_queryset_by_model_instance, take_snapshot +from taiga.projects.notifications.choices import NotifyLevel +from taiga.projects.notifications.models import NotifyPolicy +from taiga.projects import services +from .. import factories as f + +pytestmark = pytest.mark.django_db + + +def test_bad_signature(client): + project = f.ProjectFactory() + url = reverse("gogs-hook-list") + url = "%s?project=%s" % (url, project.id) + data = { + "secret": "badbadbad" + } + response = client.post(url, json.dumps(data), + content_type="application/json") + response_content = response.data + assert response.status_code == 400 + assert "Bad signature" in response_content["_error_message"] + + +def test_ok_signature(client): + project = f.ProjectFactory() + f.ProjectModulesConfigFactory(project=project, config={ + "gogs": { + "secret": "tpnIwJDz4e" + } + }) + + url = reverse("gogs-hook-list") + url = "%s?project=%s" % (url, project.id) + data = {"test:": "data", "secret": "tpnIwJDz4e"} + response = client.post(url, json.dumps(data), + content_type="application/json") + + assert response.status_code == 204 + + +def test_blocked_project(client): + project = f.ProjectFactory(blocked_code=project_choices.BLOCKED_BY_STAFF) + f.ProjectModulesConfigFactory(project=project, config={ + "gogs": { + "secret": "tpnIwJDz4e" + } + }) + + url = reverse("gogs-hook-list") + url = "%s?project=%s" % (url, project.id) + data = {"test:": "data", "secret": "tpnIwJDz4e"} + response = client.post(url, json.dumps(data), + content_type="application/json") + + assert response.status_code == 451 + + +def test_push_event_detected(client): + project = f.ProjectFactory() + url = reverse("gogs-hook-list") + url = "%s?project=%s" % (url, project.id) + data = { + "commits": [ + { + "message": "test message", + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + + GogsViewSet._validate_signature = mock.Mock(return_value=True) + + with mock.patch.object(event_hooks.PushEventHook, "process_event") as process_event_mock: + response = client.post(url, json.dumps(data), + HTTP_X_GITHUB_EVENT="push", + content_type="application/json") + + assert process_event_mock.call_count == 1 + + assert response.status_code == 204 + + +def test_push_event_issue_processing(client): + creation_status = f.IssueStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + new_status = f.IssueStatusFactory(project=creation_status.project) + issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s #%s ok + bye! + """ % (issue.ref, new_status.slug), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(issue.project, payload) + ev_hook.process_event() + issue = Issue.objects.get(id=issue.id) + assert issue.status.id == new_status.id + assert len(mail.outbox) == 1 + + +def test_push_event_task_processing(client): + creation_status = f.TaskStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + new_status = f.TaskStatusFactory(project=creation_status.project) + task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s #%s ok + bye! + """ % (task.ref, new_status.slug), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(task.project, payload) + ev_hook.process_event() + task = Task.objects.get(id=task.id) + assert task.status.id == new_status.id + assert len(mail.outbox) == 1 + + +def test_push_event_user_story_processing(client): + creation_status = f.UserStoryStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_us"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + new_status = f.UserStoryStatusFactory(project=creation_status.project) + user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s #%s ok + bye! + """ % (user_story.ref, new_status.slug), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(user_story.project, payload) + ev_hook.process_event() + user_story = UserStory.objects.get(id=user_story.id) + assert user_story.status.id == new_status.id + assert len(mail.outbox) == 1 + + +def test_push_event_issue_mention(client): + creation_status = f.IssueStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + take_snapshot(issue, user=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s ok + bye! + """ % (issue.ref), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(issue.project, payload) + ev_hook.process_event() + issue_history = get_history_queryset_by_model_instance(issue) + assert issue_history.count() == 1 + assert issue_history[0].comment.startswith("This issue has been mentioned by") + assert len(mail.outbox) == 1 + + +def test_push_event_task_mention(client): + creation_status = f.TaskStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + take_snapshot(task, user=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s ok + bye! + """ % (task.ref), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(task.project, payload) + ev_hook.process_event() + task_history = get_history_queryset_by_model_instance(task) + assert task_history.count() == 1 + assert task_history[0].comment.startswith("This task has been mentioned by") + assert len(mail.outbox) == 1 + + +def test_push_event_user_story_mention(client): + creation_status = f.UserStoryStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_us"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + take_snapshot(user_story, user=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s ok + bye! + """ % (user_story.ref), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(user_story.project, payload) + ev_hook.process_event() + us_history = get_history_queryset_by_model_instance(user_story) + assert us_history.count() == 1 + assert us_history[0].comment.startswith("This user story has been mentioned by") + assert len(mail.outbox) == 1 + + +def test_push_event_multiple_actions(client): + creation_status = f.IssueStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + new_status = f.IssueStatusFactory(project=creation_status.project) + issue1 = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + issue2 = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test TG-%s #%s ok + test TG-%s #%s ok + bye! + """ % (issue1.ref, new_status.slug, issue2.ref, new_status.slug), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + ev_hook1 = event_hooks.PushEventHook(issue1.project, payload) + ev_hook1.process_event() + issue1 = Issue.objects.get(id=issue1.id) + issue2 = Issue.objects.get(id=issue2.id) + assert issue1.status.id == new_status.id + assert issue2.status.id == new_status.id + assert len(mail.outbox) == 2 + + +def test_push_event_processing_case_insensitive(client): + creation_status = f.TaskStatusFactory() + role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) + f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) + new_status = f.TaskStatusFactory(project=creation_status.project) + task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) + payload = { + "commits": [ + { + "message": """test message + test tg-%s #%s ok + bye! + """ % (task.ref, new_status.slug.upper()), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + ev_hook = event_hooks.PushEventHook(task.project, payload) + ev_hook.process_event() + task = Task.objects.get(id=task.id) + assert task.status.id == new_status.id + assert len(mail.outbox) == 1 + + +def test_push_event_task_bad_processing_non_existing_ref(client): + issue_status = f.IssueStatusFactory() + payload = { + "commits": [ + { + "message": """test message + test TG-6666666 #%s ok + bye! + """ % (issue_status.slug), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + mail.outbox = [] + + ev_hook = event_hooks.PushEventHook(issue_status.project, payload) + with pytest.raises(ActionSyntaxException) as excinfo: + ev_hook.process_event() + + assert str(excinfo.value) == "The referenced element doesn't exist" + assert len(mail.outbox) == 0 + + +def test_push_event_us_bad_processing_non_existing_status(client): + user_story = f.UserStoryFactory.create() + payload = { + "commits": [ + { + "message": """test message + test TG-%s #non-existing-slug ok + bye! + """ % (user_story.ref), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + + mail.outbox = [] + + ev_hook = event_hooks.PushEventHook(user_story.project, payload) + with pytest.raises(ActionSyntaxException) as excinfo: + ev_hook.process_event() + + assert str(excinfo.value) == "The status doesn't exist" + assert len(mail.outbox) == 0 + + +def test_push_event_bad_processing_non_existing_status(client): + issue = f.IssueFactory.create() + payload = { + "commits": [ + { + "message": """test message + test TG-%s #non-existing-slug ok + bye! + """ % (issue.ref), + "author": { + "username": "test", + }, + } + ], + "repository": { + "url": "http://test-url/test/project" + } + } + + mail.outbox = [] + + ev_hook = event_hooks.PushEventHook(issue.project, payload) + with pytest.raises(ActionSyntaxException) as excinfo: + ev_hook.process_event() + + assert str(excinfo.value) == "The status doesn't exist" + assert len(mail.outbox) == 0 + + +def test_api_get_project_modules(client): + project = f.create_project() + f.MembershipFactory(project=project, user=project.owner, is_admin=True) + + url = reverse("projects-modules", args=(project.id,)) + + client.login(project.owner) + response = client.get(url) + assert response.status_code == 200 + content = response.data + assert "gogs" in content + assert content["gogs"]["secret"] != "" + assert content["gogs"]["webhooks_url"] != "" + + +def test_api_patch_project_modules(client): + project = f.create_project() + f.MembershipFactory(project=project, user=project.owner, is_admin=True) + + url = reverse("projects-modules", args=(project.id,)) + + client.login(project.owner) + data = { + "gogs": { + "secret": "test_secret", + "url": "test_url", + } + } + response = client.patch(url, json.dumps(data), content_type="application/json") + assert response.status_code == 204 + + config = services.get_modules_config(project).config + assert "gogs" in config + assert config["gogs"]["secret"] == "test_secret" + assert config["gogs"]["webhooks_url"] != "test_url" + + +def test_replace_gogs_references(): + ev_hook = event_hooks.BaseGogsEventHook + assert ev_hook.replace_gogs_references(None, "project-url", "#2") == "[Gogs#2](project-url/issues/2)" + assert ev_hook.replace_gogs_references(None, "project-url", "#2 ") == "[Gogs#2](project-url/issues/2) " + assert ev_hook.replace_gogs_references(None, "project-url", " #2 ") == " [Gogs#2](project-url/issues/2) " + assert ev_hook.replace_gogs_references(None, "project-url", " #2") == " [Gogs#2](project-url/issues/2)" + assert ev_hook.replace_gogs_references(None, "project-url", "#test") == "#test" + assert ev_hook.replace_gogs_references(None, "project-url", None) == ""