mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	webhooks/gogs: Filter specific Gogs branches.
This commit is contained in:
		@@ -536,10 +536,19 @@ class WebhookTestCase(ZulipTestCase):
 | 
			
		||||
 | 
			
		||||
        return msg
 | 
			
		||||
 | 
			
		||||
    def build_webhook_url(self):
 | 
			
		||||
        # type: () -> Text
 | 
			
		||||
    def build_webhook_url(self, **kwargs):
 | 
			
		||||
        # type: (**Any) -> Text
 | 
			
		||||
        api_key = self.get_api_key(self.TEST_USER_EMAIL)
 | 
			
		||||
        return self.URL_TEMPLATE.format(stream=self.STREAM_NAME, api_key=api_key)
 | 
			
		||||
        url = self.URL_TEMPLATE.format(stream=self.STREAM_NAME, api_key=api_key)
 | 
			
		||||
        if kwargs and url.find('?') == -1:
 | 
			
		||||
            url = "{}?".format(url)
 | 
			
		||||
        else:
 | 
			
		||||
            url = "{}&".format(url)
 | 
			
		||||
 | 
			
		||||
        for key, value in kwargs.items():
 | 
			
		||||
            url = "{}{}={}&".format(url, key, value)
 | 
			
		||||
 | 
			
		||||
        return url[:-1] if kwargs else url
 | 
			
		||||
 | 
			
		||||
    def get_body(self, fixture_name):
 | 
			
		||||
        # type: (Text) -> Union[Text, Dict[str, Text]]
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,13 @@
 | 
			
		||||
 | 
			
		||||
<p>where <code>api_key</code> is the API key of your Zulip bot.</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    You can also limit the notifications you receive to specific
 | 
			
		||||
    branches by specifying them in a comma-separated list at the end
 | 
			
		||||
    of the URL, like so:
 | 
			
		||||
</p>
 | 
			
		||||
<p><code>{{ external_api_uri_subdomain }}/v1/external/gogs?api_key=abcdefgh&stream=gogs&branches=master,development</code></p>
 | 
			
		||||
 | 
			
		||||
<p>Then, set <b>Content type</b> to <code>application/json</code>.</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
from typing import Text
 | 
			
		||||
from mock import patch, MagicMock
 | 
			
		||||
from typing import Text, Optional
 | 
			
		||||
 | 
			
		||||
from zerver.lib.webhooks.git import COMMITS_LIMIT
 | 
			
		||||
from zerver.lib.test_classes import WebhookTestCase
 | 
			
		||||
 | 
			
		||||
@@ -24,6 +26,23 @@ class GogsHookTests(WebhookTestCase):
 | 
			
		||||
        expected_message = u"""john [pushed](http://localhost:3000/john/try-git/compare/479e6b772b7fba19412457483f50b201286d0103...d8fce16c72a2ff56a5afc8a08645a6ce45491794) 2 commits to branch master. Commits by Benjamin(1) and John(1)\n\n{}* Webhook Test ([d8fce16](http://localhost:3000/john/try-git/commit/d8fce16c72a2ff56a5afc8a08645a6ce45491794))""".format(commit_info)
 | 
			
		||||
        self.send_and_test_stream_message('push_commits_multiple_committers', expected_subject, expected_message, HTTP_X_GOGS_EVENT='push')
 | 
			
		||||
 | 
			
		||||
    def test_push_multiple_committers_filtered_by_branches(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        self.url = self.build_webhook_url(branches='master,development')
 | 
			
		||||
        commit_info = u'* Webhook Test ([d8fce16](http://localhost:3000/john/try-git/commit/d8fce16c72a2ff56a5afc8a08645a6ce45491794))\n'
 | 
			
		||||
        expected_subject = u"try-git / master"
 | 
			
		||||
        expected_message = u"""john [pushed](http://localhost:3000/john/try-git/compare/479e6b772b7fba19412457483f50b201286d0103...d8fce16c72a2ff56a5afc8a08645a6ce45491794) 2 commits to branch master. Commits by Benjamin(1) and John(1)\n\n{}* Webhook Test ([d8fce16](http://localhost:3000/john/try-git/commit/d8fce16c72a2ff56a5afc8a08645a6ce45491794))""".format(commit_info)
 | 
			
		||||
        self.send_and_test_stream_message('push_commits_multiple_committers', expected_subject, expected_message, HTTP_X_GOGS_EVENT='push')
 | 
			
		||||
 | 
			
		||||
    def test_push_filtered_by_branches(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        self.url = self.build_webhook_url(branches='master,development')
 | 
			
		||||
        expected_subject = u"try-git / master"
 | 
			
		||||
        expected_message = u"""john [pushed](http://localhost:3000/john/try-git/compare/479e6b772b7fba19412457483f50b201286d0103...d8fce16c72a2ff56a5afc8a08645a6ce45491794) 1 commit to branch master. Commits by John(1)
 | 
			
		||||
 | 
			
		||||
* Webhook Test ([d8fce16](http://localhost:3000/john/try-git/commit/d8fce16c72a2ff56a5afc8a08645a6ce45491794))"""
 | 
			
		||||
        self.send_and_test_stream_message('push', expected_subject, expected_message, HTTP_X_GOGS_EVENT='push')
 | 
			
		||||
 | 
			
		||||
    def test_push_commits_more_than_limits(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        expected_subject = u"try-git / master"
 | 
			
		||||
@@ -34,6 +53,17 @@ class GogsHookTests(WebhookTestCase):
 | 
			
		||||
        )
 | 
			
		||||
        self.send_and_test_stream_message('push_commits_more_than_limits', expected_subject, expected_message, HTTP_X_GOGS_EVENT='push')
 | 
			
		||||
 | 
			
		||||
    def test_push_commits_more_than_limits_filtered_by_branches(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        self.url = self.build_webhook_url(branches='master,development')
 | 
			
		||||
        expected_subject = u"try-git / master"
 | 
			
		||||
        commits_info = "* Webhook Test ([d8fce16](http://localhost:3000/john/try-git/commit/d8fce16c72a2ff56a5afc8a08645a6ce45491794))\n"
 | 
			
		||||
        expected_message = u"john [pushed](http://localhost:3000/john/try-git/compare/479e6b772b7fba19412457483f50b201286d0103...d8fce16c72a2ff56a5afc8a08645a6ce45491794) 30 commits to branch master. Commits by John(30)\n\n{}[and {} more commit(s)]".format(
 | 
			
		||||
            commits_info * COMMITS_LIMIT,
 | 
			
		||||
            30 - COMMITS_LIMIT
 | 
			
		||||
        )
 | 
			
		||||
        self.send_and_test_stream_message('push_commits_more_than_limits', expected_subject, expected_message, HTTP_X_GOGS_EVENT='push')
 | 
			
		||||
 | 
			
		||||
    def test_new_branch(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        expected_subject = u"try-git / my_feature"
 | 
			
		||||
@@ -60,3 +90,35 @@ from `feature` to `master`"""
 | 
			
		||||
        expected_message = u"""john merged [PR #2](http://localhost:3000/john/try-git/pulls/2)
 | 
			
		||||
from `feature` to `master`"""
 | 
			
		||||
        self.send_and_test_stream_message('pull_request_merged', expected_subject, expected_message, HTTP_X_GOGS_EVENT='pull_request')
 | 
			
		||||
 | 
			
		||||
    @patch('zerver.webhooks.gogs.view.check_send_message')
 | 
			
		||||
    def test_push_filtered_by_branches_ignore(self, check_send_message_mock):
 | 
			
		||||
        # type: (MagicMock) -> None
 | 
			
		||||
        self.url = self.build_webhook_url(branches='changes,development')
 | 
			
		||||
        payload = self.get_body('push')
 | 
			
		||||
        result = self.client_post(self.url, payload, HTTP_X_GOGS_EVENT='push',
 | 
			
		||||
                                  content_type="application/json")
 | 
			
		||||
        self.assertFalse(check_send_message_mock.called)
 | 
			
		||||
        self.assert_json_success(result)
 | 
			
		||||
 | 
			
		||||
    @patch('zerver.webhooks.gogs.view.check_send_message')
 | 
			
		||||
    def test_push_commits_more_than_limits_filtered_by_branches_ignore(
 | 
			
		||||
            self, check_send_message_mock):
 | 
			
		||||
        # type: (MagicMock) -> None
 | 
			
		||||
        self.url = self.build_webhook_url(branches='changes,development')
 | 
			
		||||
        payload = self.get_body('push_commits_more_than_limits')
 | 
			
		||||
        result = self.client_post(self.url, payload, HTTP_X_GOGS_EVENT='push',
 | 
			
		||||
                                  content_type="application/json")
 | 
			
		||||
        self.assertFalse(check_send_message_mock.called)
 | 
			
		||||
        self.assert_json_success(result)
 | 
			
		||||
 | 
			
		||||
    @patch('zerver.webhooks.gogs.view.check_send_message')
 | 
			
		||||
    def test_push_multiple_committers_filtered_by_branches_ignore(
 | 
			
		||||
            self, check_send_message_mock):
 | 
			
		||||
        # type: (MagicMock) -> None
 | 
			
		||||
        self.url = self.build_webhook_url(branches='changes,development')
 | 
			
		||||
        payload = self.get_body('push_commits_multiple_committers')
 | 
			
		||||
        result = self.client_post(self.url, payload, HTTP_X_GOGS_EVENT='push',
 | 
			
		||||
                                  content_type="application/json")
 | 
			
		||||
        self.assertFalse(check_send_message_mock.called)
 | 
			
		||||
        self.assert_json_success(result)
 | 
			
		||||
 
 | 
			
		||||
@@ -64,18 +64,22 @@ def format_pull_request_event(payload):
 | 
			
		||||
@has_request_variables
 | 
			
		||||
def api_gogs_webhook(request, user_profile, client,
 | 
			
		||||
                     payload=REQ(argument_type='body'),
 | 
			
		||||
                     stream=REQ(default='commits')):
 | 
			
		||||
    # type: (HttpRequest, UserProfile, Client, Dict[str, Any], Text) -> HttpResponse
 | 
			
		||||
                     stream=REQ(default='commits'),
 | 
			
		||||
                     branches=REQ(default=None)):
 | 
			
		||||
    # type: (HttpRequest, UserProfile, Client, Dict[str, Any], Text, Optional[Text]) -> HttpResponse
 | 
			
		||||
 | 
			
		||||
    repo = payload['repository']['name']
 | 
			
		||||
    event = request.META['HTTP_X_GOGS_EVENT']
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        if event == 'push':
 | 
			
		||||
            branch = payload['ref'].replace('refs/heads/', '')
 | 
			
		||||
            if branches is not None and branches.find(branch) == -1:
 | 
			
		||||
                return json_success()
 | 
			
		||||
            body = format_push_event(payload)
 | 
			
		||||
            topic = SUBJECT_WITH_BRANCH_TEMPLATE.format(
 | 
			
		||||
                repo=repo,
 | 
			
		||||
                branch=payload['ref'].replace('refs/heads/', '')
 | 
			
		||||
                branch=branch
 | 
			
		||||
            )
 | 
			
		||||
        elif event == 'create':
 | 
			
		||||
            body = format_new_branch_event(payload)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user