import requests
import errbot
from errbot.backends.test import testbot # pylint: disable=unused-import
-import gitlab
+from httmock import urlmatch, HTTMock
from plugins.marge import deltastr
+# HTTMock urlmatchers
+
+
+@urlmatch(path=r'/api/v4/users/author_id$')
+def mock_users_get_author_id(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'username': 'author_id username', 'id': 3001})}
+
+
+@urlmatch(path=r'/api/v4/users/[^/\?]+$')
+def mock_users_get_unexpected(url, request):
+ return {'status_code': 404}
+
+
+@urlmatch(path=r'/api/v4/users', query='username=gbin')
+def mock_users_search_gbin(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps([{'username': 'gbin', 'id': 3002}])}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/hooks$')
+def mock_projects_hooks_list(url, request):
+ if request.method == "GET":
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': '[]'}
+ elif request.method == "POST":
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({"id": "hook_id",
+ "merge_requests_events": True,
+ "url": "url"})}
+ elif request.method == "PUT":
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({"id": "hook_id",
+ "merge_requests_events": True,
+ "url": "url"})}
+ else:
+ return {'status-code': 404}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+$')
+def mock_projects_get(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({"id": "projectid"})}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests')
+def mock_projects_mergerequests_list_none(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': '[]'}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests/[^/]+')
+def mock_projects_mergerequests_get_unreviewed_review(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'iid': 'mr_id',
+ 'author': {'id': 2001},
+ 'created_at': 'Oct 29, 2017 2:37am',
+ 'merge_status': 'can_be_merged',
+ 'state': 'opened',
+ 'upvotes': 0,
+ 'web_url': 'http://gitlab.example.com/sample/mr/2001',
+ 'work_in_progress': False})}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests/[^/]+')
+def mock_projects_mergerequests_get_wip_review(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'iid': 'mr_id',
+ 'author': {'id': 2001},
+ 'created_at': 'Oct 29, 2017 2:37am',
+ 'merge_status': 'can_be_merged',
+ 'state': 'opened',
+ 'upvotes': 0,
+ 'web_url': 'http://gitlab.example.com/sample/mr/2001',
+ 'work_in_progress': True})}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests/[^/]+')
+def mock_projects_mergerequests_get_waiting_review(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'iid': 'mr_id',
+ 'author': {'id': 2001},
+ 'created_at': 'Oct 29, 2017 2:37am',
+ 'merge_status': 'can_be_merged',
+ 'state': 'opened',
+ 'upvotes': 1,
+ 'web_url': 'http://gitlab.example.com/sample/mr/2001',
+ 'work_in_progress': False})}
+
+
+@urlmatch(path=r'/api/v4/projects/[^/]+/merge_requests/[^/]+/award_emoji')
+def mock_projects_mergerequests_awardemojis_list(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps([{'id': 'id',
+ 'name': 'thumbsup',
+ 'user': {'username': 'ReviewerX'}}])}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests/[^/]+')
+def mock_projects_mergerequests_get_mergable_review(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'iid': 'mr_id',
+ 'author': {'id': 2001},
+ 'created_at': 'Oct 29, 2017 2:37am',
+ 'merge_status': 'can_be_merged',
+ 'state': 'opened',
+ 'upvotes': 2,
+ 'web_url': 'http://gitlab.example.com/sample/mr/2001',
+ 'work_in_progress': False})}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests/[^/]+')
+def mock_projects_mergerequests_get_conflicted_review(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'iid': 'mr_id',
+ 'author': {'id': 2001},
+ 'created_at': 'Oct 29, 2017 2:37am',
+ 'merge_status': 'merge_conflicts',
+ 'state': 'opened',
+ 'upvotes': 2,
+ 'web_url': 'http://gitlab.example.com/sample/mr/2001',
+ 'work_in_progress': False})}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests$', query='state=opened')
+def mock_projects_mergerequests_list_unreviewed_review(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps([{'iid': 'mr_id',
+ 'author': {'id': 2001},
+ 'created_at': 'Oct 29, 2017 2:37am',
+ 'merge_status': 'can_be_merged',
+ 'state': 'opened',
+ 'upvotes': 0,
+ 'web_url': 'http://gitlab.example.com/sample/mr/2001',
+ 'work_in_progresso': False}])}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/merge_requests', query='state=reopened')
+def mock_projects_mergerequests_list_reopened(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps([])}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/hooks/[^/]+$')
+def mock_projects_hooks_get_already_watching(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps({'id': 'hook_id',
+ 'merge_requests_events': True,
+ 'url': 'https://webhook.errbot.com:3142/margebot/room1,room2,room3'})}
+
+
+@urlmatch(path=r'^/api/v4/projects/[^/]+/hooks$')
+def mock_projects_hooks_list_already_watching(url, request):
+ return {'status_code': 200,
+ 'headers': {'content-type': 'application/json'},
+ 'content': json.dumps([{'id': 'hook_id',
+ 'merge_requests_events': True,
+ 'url': 'https://webhook.errbot.com:3142/margebot/room1,room2,room3'}])}
+
+
class TestMarge(object):
"""
Margebot Tests
return testbot
- @pytest.fixture
- def margebot_no_reviews(self, margebot, monkeypatch):
- return margebot
-
@pytest.fixture
def margebot_one_review(self, margebot, monkeypatch):
monkeypatch.setattr(errbot.storage.StoreMixin, '__getitem__', mock_get, raising=False)
return margebot
- @pytest.fixture
- def one_wip_review(self, margebot_one_review, monkeypatch):
-
- def mock_getmergerequest(self, project, iid):
- return {'author': {'id': 2001},
- 'created_at': 'Oct 29, 2017 2:37am',
- 'merge_status': 'can_be_merged',
- 'state': 'opened',
- 'upvotes': 0,
- 'web_url': 'http://gitlab.example.com/sample/mr/2001',
- 'work_in_progress': True}
- monkeypatch.setattr(gitlab.Gitlab, 'getmergerequest', mock_getmergerequest)
- return margebot_one_review
-
- @pytest.fixture
- def one_waiting_review(self, margebot_one_review, monkeypatch):
-
- def mock_getmergerequest(self, project, iid):
- return {'author': {'id': 2001},
- 'created_at': 'Oct 29, 2017 2:37am',
- 'iid': 1,
- 'merge_status': 'can_be_merged',
- 'state': 'opened',
- 'target_project_id': 1,
- 'upvotes': 1,
- 'web_url': 'http://gitlab.example.com/sample/mr/2001',
- 'work_in_progress': False}
- monkeypatch.setattr(gitlab.Gitlab, 'getmergerequest', mock_getmergerequest)
-
- def mock_getawardemoji(self, project, iid):
- return [{'name': 'happycat',
- 'user': {'username': 'ReviewerY'}},
- {'name': 'thumbsup',
- 'user': {'username': 'ReviewerX'}}]
- monkeypatch.setattr(gitlab.Gitlab, 'getawardemoji', mock_getawardemoji)
-
- return margebot_one_review
-
- @pytest.fixture
- def one_conflicted_review(self, margebot_one_review, monkeypatch):
-
- def mock_getmergerequest(self, project, iid):
- return {'author': {'id': 2001},
- 'created_at': 'Oct 29, 2017 2:37am',
- 'merge_status': 'merge_conflicts',
- 'state': 'opened',
- 'upvotes': 2,
- 'web_url': 'http://gitlab.example.com/sample/mr/2001',
- 'work_in_progress': False}
- monkeypatch.setattr(gitlab.Gitlab, 'getmergerequest', mock_getmergerequest)
- return margebot_one_review
-
- @pytest.fixture
- def one_mergable_review(self, margebot_one_review, monkeypatch):
-
- def mock_getmergerequest(self, project, iid):
- return {'author': {'id': 2001},
- 'created_at': 'Oct 29, 2017 2:37am',
- 'merge_status': 'can_be_merged',
- 'state': 'opened',
- 'upvotes': 2,
- 'web_url': 'http://gitlab.example.com/sample/mr/2001',
- 'work_in_progress': False}
- monkeypatch.setattr(gitlab.Gitlab, 'getmergerequest', mock_getmergerequest)
- return margebot_one_review
-
- @pytest.fixture
- def gitlab(self, monkeypatch):
-
- def mock_getuser(self, user):
- if user == '(missing)':
- return False
- else:
- return {'username': user + ' username'}
- monkeypatch.setattr(gitlab.Gitlab, 'getuser', mock_getuser)
-
- def mock_getusers(self, search=None):
- if search:
- ((_, val)) = search
- if val == "(missing)":
- return []
- else:
- return [{'user': val, 'id': 3001}]
- else:
- return [{'user': 'user1', 'id': 3001}, {'user': 'user2', 'id': 3002}]
- monkeypatch.setattr(gitlab.Gitlab, 'getusers', mock_getusers)
-
- def mock_getproject(self, repo):
- return {
- 'id': 'projectid'
- }
- monkeypatch.setattr(gitlab.Gitlab, 'getproject', mock_getproject)
-
- def mock_getprojecthooks(self, repo):
- if repo == "(missing)":
- return []
- else:
- return [{'id': 'hook_id', 'merge_requests_events': True, 'url': 'url'}]
- monkeypatch.setattr(gitlab.Gitlab, 'getprojecthooks', mock_getprojecthooks)
-
- # Waiting on Gitlab 8.9 or greater
- # def mock_getapprovals(id):
- # return []
- # monkeypatch.setattr(gitlab.Gitlab, 'getapprovals', mock_getapprovals)
-
- def mock_getmergerequests(self, project, page, per_page, state=None):
- return []
- monkeypatch.setattr(gitlab.Gitlab, 'getmergerequests', mock_getmergerequests)
-
- def mock_addprojecthook_extra(self, project, url, push=False, issues=False, merge_requests=False, tag_push=False, extra_data=None):
- return True
- monkeypatch.setattr(gitlab.Gitlab, 'addprojecthook_extra', mock_addprojecthook_extra, raising=False)
-
- def mock_editprojecthook_extra(self, project, hook_id, url, push=False, issues=False, merge_requests=False, tag_push=False, extra_data=None):
- return True
- monkeypatch.setattr(gitlab.Gitlab, 'editprojecthook_extra', mock_editprojecthook_extra, raising=False)
-
- return gitlab.Gitlab
-
-
-# @pytest.fixture
-# def MargeGitlab(self, monkeypatch):
-# def mock_addprojecthook_extra(self, project, url, push=False, issues=False, merge_requests=False, tag_push=False, extra_data=None):
-# return True
-# monkeypatch.setattr(plugins.marge.MargeGitlab, 'addprojecthook_extra')
-#
-# def mock_editprojecthook_extra(self, project, hook_id, url, push=False, issues=False, merge_requests=False, tag_push=False, extra_data=None):
-# return True
-# monkeypatch.setattr(plugins.marge.MargeGitlab, 'editprojecthook_extra')
-# return plugins.marge.MargeGitlab
-
- @pytest.fixture
- def gitlab_no_reviews(self, gitlab, monkeypatch):
- def mock_getmergerequest(self, project, iid):
- return {}
- monkeypatch.setattr(gitlab, 'getuser', mock_getmergerequest)
- return gitlab
-
- @pytest.fixture
- def gitlab_one_review(self, gitlab, monkeypatch):
- ret_mr = {'iid': 'mr_id',
- 'author': {'id': 2001},
- 'created_at': 'Oct 29, 2017 2:37am',
- 'merge_status': 'can_be_merged',
- 'state': 'opened',
- 'upvotes': 0,
- 'web_url': 'http://gitlab.example.com/sample/mr/2001',
- 'work_in_progress': False}
-
- def mock_getmergerequest(self, project, iid):
- return ret_mr
- monkeypatch.setattr(gitlab, 'getmergerequest', mock_getmergerequest)
-
- def mock_getmergerequests(self, project, page, per_page, state=None):
- if state and state == 'opened':
- return [ret_mr]
- else:
- return []
- monkeypatch.setattr(gitlab, 'getmergerequests', mock_getmergerequests)
- return gitlab
-
- @pytest.fixture
- def gitlab_already_watching(self, gitlab, monkeypatch):
- def mock_getprojecthooks(self, project):
- return [{'id': 'hook_id', 'merge_requests_events': True, 'url': 'https://webhook.errbot.com:3142/margebot/room1,room2,room3'}]
- monkeypatch.setattr(gitlab, 'getprojecthooks', mock_getprojecthooks)
- return gitlab
-
# ============================================================================
@pytest.mark.parametrize("rdelta,expected", [
margebot.push_message('!webstatus')
assert 'margebot/<rooms>' in margebot.pop_message()
- def test_watchrepo(self, margebot, gitlab):
- margebot.push_message('!watchrepo group/new_repo room1,room2,room3')
- pm = margebot.pop_message()
- assert 'Now watching for new MRs in the group/new_repo repo to the room1,room2,room3 room(s)' in pm
- assert 'No open MRs were found in the repo.' in pm
-
- def test_watchrepo_already_watching_repo(self, margebot, gitlab_already_watching):
- margebot.push_message('!watchrepo group/new_repo room1,room2,room3')
- pm = margebot.pop_message()
- assert 'Already reporting group/new_repo MRs to the room1,room2,room3 room(s)' in pm
-
- def test_watchrepo_updating_roomlist(self, margebot, gitlab_already_watching):
- margebot.push_message('!watchrepo group/new_repo room4,room5,room6')
- pm = margebot.pop_message()
- assert 'Updating room list for group/new_repo MRs from room1,room2,room3 to room4,room5,room6' in pm
-
- def test_watchrepo_existing_mr(self, margebot, gitlab_one_review):
- margebot.push_message('!watchrepo sample/mr room1,room2,room3')
- pm = margebot.pop_message()
- assert 'Now watching for new MRs in the sample/mr repo to the room1,room2,room3 room(s)' in pm
- assert '1 open MR was found in the repo.' in pm
-
- def test_gitlab_hook(self, margebot, gitlab):
+ def test_watchrepo(self, margebot):
+ with HTTMock(mock_projects_get,
+ mock_projects_hooks_list,
+ mock_projects_mergerequests_list_none):
+ margebot.push_message('!watchrepo group/new_repo room1,room2,room3')
+ pm = margebot.pop_message()
+ assert 'Now watching for new MRs in the group/new_repo repo to the room1,room2,room3 room(s)' in pm
+ assert 'No open MRs were found in the repo.' in pm
+
+ def test_watchrepo_already_watching_repo(self, margebot):
+ with HTTMock(mock_projects_hooks_list_already_watching,
+ mock_projects_get):
+ margebot.push_message('!watchrepo group/new_repo room1,room2,room3')
+ pm = margebot.pop_message()
+ assert 'Already reporting group/new_repo MRs to the room1,room2,room3 room(s)' in pm
+
+ def test_watchrepo_updating_roomlist(self, margebot):
+ with HTTMock(mock_projects_hooks_list_already_watching,
+ mock_projects_hooks_get_already_watching,
+ mock_projects_get):
+ margebot.push_message('!watchrepo group/new_repo room4,room5,room6')
+ pm = margebot.pop_message()
+ assert 'Updating room list for group/new_repo MRs from room1,room2,room3 to room4,room5,room6' in pm
+
+ def test_watchrepo_existing_mr(self, margebot):
+ with HTTMock(mock_projects_get,
+ mock_projects_hooks_list,
+ mock_projects_mergerequests_list_unreviewed_review,
+ mock_projects_mergerequests_list_reopened):
+ margebot.push_message('!watchrepo sample/mr room1,room2,room3')
+ pm = margebot.pop_message()
+ assert 'Now watching for new MRs in the sample/mr repo to the room1,room2,room3 room(s)' in pm
+ assert '1 open MR was found in the repo.' in pm
+
+ def test_gitlab_hook(self, margebot):
request = json.dumps({'object_kind': 'merge_request',
'object_attributes': {
'state': 'opened',
'iid': 'iid'},
'project': {
'homepage': 'url'}})
- margebot.push_message("!webhook test /margebot/room1,room2 " + request)
- assert 'Hi there ! author_id username has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
- margebot.push_message('!reviews')
- assert 'Hi there ! author_id username has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
+ with HTTMock(mock_users_get_author_id):
+ margebot.push_message("!webhook test /margebot/room1,room2 " + request)
+ assert 'Hi there ! author_id username has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
+ margebot.push_message('!reviews')
+ assert 'Hi there ! author_id username has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
- def test_gitlab_hook_wip(self, margebot, gitlab):
+ def test_gitlab_hook_wip(self, margebot):
request = json.dumps({'object_kind': 'merge_request',
'object_attributes': {
'state': 'opened',
'iid': 'iid'},
'project': {
'homepage': 'url'}})
- margebot.push_message("!webhook test /margebot/room1,room2 " + request)
- assert 'Hi there ! author_id username has opened a new WIP MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
- margebot.push_message('!reviews')
- assert 'Hi there ! author_id username has opened a new WIP MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
+ with HTTMock(mock_users_get_author_id):
+ margebot.push_message("!webhook test /margebot/room1,room2 " + request)
+ assert 'Hi there ! author_id username has opened a new WIP MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
+ margebot.push_message('!reviews')
+ assert 'Hi there ! author_id username has opened a new WIP MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
- def test_gitlab_hook_unexpected_user(self, margebot, gitlab):
+ def test_gitlab_hook_unexpected_user(self, margebot):
request = json.dumps({'object_kind': 'merge_request',
'object_attributes': {
'state': 'opened',
'project': {
'homepage': 'url'}})
- margebot.push_message("!webhook test /margebot/room1,room2 " + request)
- assert 'Hi there ! (missing) has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
- margebot.push_message('!reviews')
- assert 'Hi there ! (missing) has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
+ with HTTMock(mock_users_get_unexpected):
+ margebot.push_message("!webhook test /margebot/room1,room2 " + request)
+ assert 'Hi there ! (missing) has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
+ margebot.push_message('!reviews')
+ assert 'Hi there ! (missing) has opened a new MR: \"title\"\nurl/merge_requests/iid' in margebot.pop_message()
- def test_gitlab_hook_unexpected_object_kind(self, margebot, gitlab, caplog):
+ def test_gitlab_hook_unexpected_object_kind(self, margebot, caplog):
request = json.dumps({'object_kind': 'not_merge_request',
'object_attributes': {
'state': 'opened',
'project': {
'homepage': 'url'}})
- margebot.push_message("!webhook test /margebot/room1,room2 " + request)
- margebot.pop_message()
- margebot.push_message('!reviews')
- assert 'Hi gbin: I found no open MRs for you.' in margebot.pop_message()
- assert 'unexpecting object_kind: not_merge_request' in caplog.text # Has to be at end of method
-
- def test_nothing_to_review(self, margebot, gitlab_no_reviews):
- margebot.push_message('!reviews')
- assert 'Hi gbin: I found no open MRs for you.' in margebot.pop_message()
-
- def test_get_one_open_mr(self, margebot_one_review, gitlab_one_review):
- margebot_one_review.push_message('!reviews')
- output = margebot_one_review.pop_message()
- assert 'These MRs need some attention' in output
- assert 'http://gitlab.example.com/sample/mr/2001' in output
- assert 'No upvotes, please review.' in output
-
- def test_get_one_wip_mr(self, one_wip_review, gitlab):
- one_wip_review.push_message('!reviews')
- output = one_wip_review.pop_message()
- assert 'These MRs need some attention' in output
- assert 'http://gitlab.example.com/sample/mr/2001' in output
- assert 'No upvotes, please review but still WIP.' in output
-
- def test_get_one_waiting_mr(self, margebot, one_waiting_review, gitlab):
- one_waiting_review.push_message('!reviews')
- output = margebot.pop_message()
- assert 'These MRs need some attention' in output
- assert 'http://gitlab.example.com/sample/mr/2001' in output
- assert 'Approved by ReviewerX and waiting for another upvote.' in output
-
- def test_get_one_mergable_mr(self, margebot, one_mergable_review, gitlab):
- one_mergable_review.push_message('!reviews')
- output = margebot.pop_message()
- assert 'These MRs need some attention' in output
- assert 'http://gitlab.example.com/sample/mr/2001' in output
- assert 'Has 2+ upvotes and could be merged in now.' in output
-
- def test_get_one_conflicted_mr(self, margebot, one_conflicted_review, gitlab):
- one_conflicted_review.push_message('!reviews')
- output = margebot.pop_message(timeout=1)
- assert 'These MRs need some attention' in output
- assert 'http://gitlab.example.com/sample/mr/2001' in output
- assert 'Has 2+ upvotes and could be merged in now except there are merge conflicts.' in output
-
- def test_crontab_hook(self, one_waiting_review, gitlab, monkeypatch, mocker):
- plugin = one_waiting_review._bot.plugin_manager.get_plugin_obj_by_name('Marge')
+ with HTTMock(mock_users_search_gbin):
+ margebot.push_message("!webhook test /margebot/room1,room2 " + request)
+ margebot.pop_message()
+ margebot.push_message('!reviews')
+ assert 'Hi gbin: I found no open MRs for you.' in margebot.pop_message()
+ assert 'unexpecting object_kind: not_merge_request' in caplog.text # Has to be at end of method
+
+ def test_nothing_to_review(self, margebot):
+ with HTTMock(mock_users_search_gbin):
+ margebot.push_message('!reviews')
+ assert 'Hi gbin: I found no open MRs for you.' in margebot.pop_message()
+
+ def test_get_one_open_mr(self, margebot_one_review):
+ with HTTMock(mock_users_search_gbin,
+ mock_projects_get,
+ mock_projects_mergerequests_get_unreviewed_review):
+ margebot_one_review.push_message('!reviews')
+ output = margebot_one_review.pop_message()
+ assert 'These MRs need some attention' in output
+ assert 'http://gitlab.example.com/sample/mr/2001' in output
+ assert 'No upvotes, please review.' in output
+
+ def test_get_one_wip_mr(self, margebot_one_review):
+ with HTTMock(mock_users_search_gbin,
+ mock_projects_get,
+ mock_projects_mergerequests_get_wip_review):
+ margebot_one_review.push_message('!reviews')
+ output = margebot_one_review.pop_message()
+ assert 'These MRs need some attention' in output
+ assert 'http://gitlab.example.com/sample/mr/2001' in output
+ assert 'No upvotes, please review but still WIP.' in output
+
+ def test_get_one_waiting_mr(self, margebot_one_review):
+ with HTTMock(mock_users_search_gbin,
+ mock_projects_get,
+ mock_projects_mergerequests_awardemojis_list,
+ mock_projects_mergerequests_get_waiting_review):
+ margebot_one_review.push_message('!reviews')
+ output = margebot_one_review.pop_message()
+ assert 'These MRs need some attention' in output
+ assert 'http://gitlab.example.com/sample/mr/2001' in output
+ assert 'Approved by ReviewerX and waiting for another upvote.' in output
+
+ def test_get_one_mergable_mr(self, margebot_one_review):
+ with HTTMock(mock_users_search_gbin,
+ mock_projects_get,
+ mock_projects_mergerequests_get_mergable_review):
+ margebot_one_review.push_message('!reviews')
+ output = margebot_one_review.pop_message()
+ assert 'These MRs need some attention' in output
+ assert 'http://gitlab.example.com/sample/mr/2001' in output
+ assert 'Has 2+ upvotes and could be merged in now.' in output
+
+ def test_get_one_conflicted_mr(self, margebot_one_review):
+ with HTTMock(mock_users_search_gbin,
+ mock_projects_get,
+ mock_projects_mergerequests_get_conflicted_review):
+ margebot_one_review.push_message('!reviews')
+ output = margebot_one_review.pop_message(timeout=1)
+ assert 'These MRs need some attention' in output
+ assert 'http://gitlab.example.com/sample/mr/2001' in output
+ assert 'Has 2+ upvotes and could be merged in now except there are merge conflicts.' in output
+
+ def test_crontab_hook(self, margebot_one_review, monkeypatch, mocker):
+ plugin = margebot_one_review._bot.plugin_manager.get_plugin_obj_by_name('Marge')
def mock_rooms():
return [mocker.MagicMock(node='room1'), mocker.MagicMock(node='room2')]
monkeypatch.setattr(plugin, 'rooms', mock_rooms)
- plugin.crontab_hook("unused")
- output = one_waiting_review.pop_message()
- assert 'These MRs need some attention' in output
- assert 'http://gitlab.example.com/sample/mr/2001 (opened' in output
+ with HTTMock(mock_projects_get,
+ mock_projects_mergerequests_get_unreviewed_review):
+ plugin.crontab_hook("unused")
+ output = margebot_one_review.pop_message()
+ assert 'These MRs need some attention' in output
+ assert 'http://gitlab.example.com/sample/mr/2001 (opened' in output
def test_margebot_unknown_command(self, margebot):
margebot.push_message('Margebot, alacazam')