webhooks/gogs: Filter specific Gogs branches.

This commit is contained in:
Eeshan Garg 2017-04-06 18:56:29 -02:30
parent 680e39ff55
commit e68b957f3d
4 changed files with 89 additions and 7 deletions

View File

@ -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]]

View File

@ -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&amp;stream=gogs&amp;branches=master,development</code></p>
<p>Then, set <b>Content type</b> to <code>application/json</code>.</p>
<p>

View File

@ -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)

View File

@ -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)