Added Checks for NotMergeable and Merged pull requests

This commit is contained in:
Marvin Pohl 2018-09-27 13:21:10 +02:00
parent 293acd8a2b
commit 29750bcbdb
2 changed files with 379 additions and 7 deletions

View File

@ -1,11 +1,8 @@
import calendar
import buildbot.www.change_hook as change_hook import buildbot.www.change_hook as change_hook
from buildbot.test.fake.web import FakeRequest from buildbot.test.fake.web import FakeRequest
from buildbot.test.fake.web import fakeMasterForHooks from buildbot.test.fake.web import fakeMasterForHooks
import mock
import calendar
from twisted.internet import defer from twisted.internet import defer
from twisted.trial import unittest from twisted.trial import unittest
@ -355,6 +352,356 @@ giteaJsonPullRequestPayload = rb"""
} }
""" """
giteaJsonPullRequestPayloadNotMergeable = rb"""
{
"secret": "test",
"action": "opened",
"number": 1,
"pull_request": {
"id": 8,
"url": "",
"number": 1,
"user": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"title": "TestPR",
"body": "",
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "open",
"comments": 0,
"html_url": "https://git.example.com/max/webhook_test/pulls/1",
"diff_url": "https://git.example.com/max/webhook_test/pulls/1.diff",
"patch_url": "https://git.example.com/max/webhook_test/pulls/1.patch",
"mergeable": false,
"merged": false,
"merged_at": null,
"merge_commit_sha": null,
"merged_by": null,
"base": {
"label": "master",
"ref": "master",
"sha": "7c5de0796c409e7802abe759113d7fc37e0d6578",
"repo_id": 20,
"repo": {
"id": 20,
"owner": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"name": "webhook_test",
"full_name": "max/webhook_test",
"description": "",
"empty": false,
"private": true,
"fork": false,
"parent": null,
"mirror": false,
"size": 48,
"html_url": "https://git.example.com/max/webhook_test",
"ssh_url": "ssh://git@git.example.com/max/webhook_test.git",
"clone_url": "https://git.example.com/max/webhook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2018-09-04T10:45:23Z",
"updated_at": "2018-09-04T12:10:14Z",
"permissions": {
"admin": false,
"push": false,
"pull": false
}
}
},
"head": {
"label": "feature-branch",
"ref": "feature-branch",
"sha": "9d7157cc4a137b3e1dfe92750ccfb1bbad239f99",
"repo_id": 20,
"repo": {
"id": 20,
"owner": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"name": "webhook_test",
"full_name": "max/webhook_test",
"description": "",
"empty": false,
"private": true,
"fork": false,
"parent": null,
"mirror": false,
"size": 48,
"html_url": "https://git.example.com/max/webhook_test",
"ssh_url": "ssh://git@git.example.com/max/webhook_test.git",
"clone_url": "https://git.example.com/max/webhook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2018-09-04T10:45:23Z",
"updated_at": "2018-09-04T12:10:14Z",
"permissions": {
"admin": false,
"push": false,
"pull": false
}
}
},
"merge_base": "7c5de0796c409e7802abe759113d7fc37e0d6578",
"due_date": null,
"created_at": "2018-09-04T12:14:49Z",
"updated_at": "2018-09-04T12:14:49Z",
"closed_at": null
},
"repository": {
"id": 20,
"owner": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"name": "webhook_test",
"full_name": "max/webhook_test",
"description": "",
"empty": false,
"private": true,
"fork": false,
"parent": null,
"mirror": false,
"size": 48,
"html_url": "https://git.example.com/max/webhook_test",
"ssh_url": "ssh://git@git.example.com/max/webhook_test.git",
"clone_url": "https://git.example.com/max/webhook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2018-09-04T10:45:23Z",
"updated_at": "2018-09-04T12:10:14Z",
"permissions": {
"admin": true,
"push": true,
"pull": true
}
},
"sender": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
}
}
"""
giteaJsonPullRequestPayloadMerged = rb"""
{
"secret": "test",
"action": "opened",
"number": 1,
"pull_request": {
"id": 8,
"url": "",
"number": 1,
"user": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"title": "TestPR",
"body": "",
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "open",
"comments": 0,
"html_url": "https://git.example.com/max/webhook_test/pulls/1",
"diff_url": "https://git.example.com/max/webhook_test/pulls/1.diff",
"patch_url": "https://git.example.com/max/webhook_test/pulls/1.patch",
"mergeable": true,
"merged": true,
"merged_at": null,
"merge_commit_sha": null,
"merged_by": null,
"base": {
"label": "master",
"ref": "master",
"sha": "7c5de0796c409e7802abe759113d7fc37e0d6578",
"repo_id": 20,
"repo": {
"id": 20,
"owner": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"name": "webhook_test",
"full_name": "max/webhook_test",
"description": "",
"empty": false,
"private": true,
"fork": false,
"parent": null,
"mirror": false,
"size": 48,
"html_url": "https://git.example.com/max/webhook_test",
"ssh_url": "ssh://git@git.example.com/max/webhook_test.git",
"clone_url": "https://git.example.com/max/webhook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2018-09-04T10:45:23Z",
"updated_at": "2018-09-04T12:10:14Z",
"permissions": {
"admin": false,
"push": false,
"pull": false
}
}
},
"head": {
"label": "feature-branch",
"ref": "feature-branch",
"sha": "9d7157cc4a137b3e1dfe92750ccfb1bbad239f99",
"repo_id": 20,
"repo": {
"id": 20,
"owner": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"name": "webhook_test",
"full_name": "max/webhook_test",
"description": "",
"empty": false,
"private": true,
"fork": false,
"parent": null,
"mirror": false,
"size": 48,
"html_url": "https://git.example.com/max/webhook_test",
"ssh_url": "ssh://git@git.example.com/max/webhook_test.git",
"clone_url": "https://git.example.com/max/webhook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2018-09-04T10:45:23Z",
"updated_at": "2018-09-04T12:10:14Z",
"permissions": {
"admin": false,
"push": false,
"pull": false
}
}
},
"merge_base": "7c5de0796c409e7802abe759113d7fc37e0d6578",
"due_date": null,
"created_at": "2018-09-04T12:14:49Z",
"updated_at": "2018-09-04T12:14:49Z",
"closed_at": null
},
"repository": {
"id": 20,
"owner": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
},
"name": "webhook_test",
"full_name": "max/webhook_test",
"description": "",
"empty": false,
"private": true,
"fork": false,
"parent": null,
"mirror": false,
"size": 48,
"html_url": "https://git.example.com/max/webhook_test",
"ssh_url": "ssh://git@git.example.com/max/webhook_test.git",
"clone_url": "https://git.example.com/max/webhook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2018-09-04T10:45:23Z",
"updated_at": "2018-09-04T12:10:14Z",
"permissions": {
"admin": true,
"push": true,
"pull": true
}
},
"sender": {
"id": 1,
"login": "max",
"full_name": "Max Mustermann",
"email": "max@example.com",
"avatar_url": "https://secure.gravatar.com/avatar/c9a5fca94b7fd6f8d4dbab8d1575e4fc?d=identicon",
"language": "en-US",
"username": "max"
}
}
"""
class TestChangeHookGiteaPush(unittest.TestCase): class TestChangeHookGiteaPush(unittest.TestCase):
def setUp(self): def setUp(self):
@ -378,7 +725,8 @@ class TestChangeHookGiteaPush(unittest.TestCase):
change["comments"], "TestBranch\n") change["comments"], "TestBranch\n")
self.assertEqual(change["branch"], "feature-branch") self.assertEqual(change["branch"], "feature-branch")
self.assertEqual(change[ self.assertEqual(change[
"revlink"], "https://git.example.com/max/webhook_test/commit/9d7157cc4a137b3e1dfe92750ccfb1bbad239f99") "revlink"],
"https://git.example.com/max/webhook_test/commit/9d7157cc4a137b3e1dfe92750ccfb1bbad239f99")
def checkChangesFromPullRequest(self, codebase=None): def checkChangesFromPullRequest(self, codebase=None):
self.assertEqual(len(self.changeHook.master.addedChanges), 1) self.assertEqual(len(self.changeHook.master.addedChanges), 1)
@ -429,6 +777,24 @@ class TestChangeHookGiteaPush(unittest.TestCase):
res = yield self.request.test_render(self.changeHook) res = yield self.request.test_render(self.changeHook)
self.checkChangesFromPullRequest(res) self.checkChangesFromPullRequest(res)
@defer.inlineCallbacks
def testPullRequestNotMergeableEvent(self):
self.request = FakeRequest(content=giteaJsonPullRequestPayloadNotMergeable)
self.request.uri = b'/change_hook/gitea'
self.request.method = b'POST'
self.request.received_headers[_HEADER_EVENT_TYPE] = b"pull_request"
yield self.request.test_render(self.changeHook)
self.assertEqual(len(self.changeHook.master.addedChanges), 0)
@defer.inlineCallbacks
def testPullRequestMergedEvent(self):
self.request = FakeRequest(content=giteaJsonPullRequestPayloadMerged)
self.request.uri = b'/change_hook/gitea'
self.request.method = b'POST'
self.request.received_headers[_HEADER_EVENT_TYPE] = b"pull_request"
yield self.request.test_render(self.changeHook)
self.assertEqual(len(self.changeHook.master.addedChanges), 0)
class TestChangeHookGiteaSecretPhrase(unittest.TestCase): class TestChangeHookGiteaSecretPhrase(unittest.TestCase):
def setUp(self): def setUp(self):

View File

@ -59,6 +59,12 @@ class GiteaHandler(BaseHookHandler):
log.msg("Gitea Pull Request event '{}' ignored".format(action)) log.msg("Gitea Pull Request event '{}' ignored".format(action))
return [] return []
pull_request = payload['pull_request'] pull_request = payload['pull_request']
if not pull_request['mergeable']:
log.msg("Gitea Pull Request ignored because it is not mergeable.")
return []
if pull_request['merged']:
log.msg("Gitea Pull Request ignored because it is already merged.")
return []
timestamp = dateparse(pull_request['updated_at']) timestamp = dateparse(pull_request['updated_at'])
base = pull_request['base'] base = pull_request['base']
head = pull_request['head'] head = pull_request['head']
@ -104,8 +110,8 @@ class GiteaHandler(BaseHookHandler):
try: try:
content = request.content.read() content = request.content.read()
payload = json.loads(bytes2unicode(content)) payload = json.loads(bytes2unicode(content))
except Exception as e: except Exception as exception:
raise ValueError('Error loading JSON: ' + str(e)) raise ValueError('Error loading JSON: ' + str(exception))
if secret is not None and secret != payload['secret']: if secret is not None and secret != payload['secret']:
raise ValueError('Invalid secret') raise ValueError('Invalid secret')
event_type = bytes2unicode(request.getHeader(_HEADER_EVENT_TYPE)) event_type = bytes2unicode(request.getHeader(_HEADER_EVENT_TYPE))