X-Git-Url: https://pwan.org/git/?p=margebot.git;a=blobdiff_plain;f=tests%2Ftest_marge.py;h=9ab5d901579c2dc905868a6f71c966c4acb2e277;hp=defbed9a770184d0e270743d81a6b39152027759;hb=c60ca167527ed704f3ff1a03b071e0e6e13e4062;hpb=24741a1f032666dc2df447f1c1ea8de67f443984 diff --git a/tests/test_marge.py b/tests/test_marge.py index defbed9..9ab5d90 100644 --- a/tests/test_marge.py +++ b/tests/test_marge.py @@ -19,10 +19,186 @@ import pytest 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 @@ -54,10 +230,6 @@ class TestMarge(object): return testbot - @pytest.fixture - def margebot_no_reviews(self, margebot, monkeypatch): - return margebot - @pytest.fixture def margebot_one_review(self, margebot, monkeypatch): @@ -67,174 +239,6 @@ class TestMarge(object): 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", [ @@ -263,29 +267,41 @@ class TestMarge(object): margebot.push_message('!webstatus') assert 'margebot/' 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', @@ -297,12 +313,13 @@ class TestMarge(object): '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', @@ -314,12 +331,13 @@ class TestMarge(object): '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', @@ -332,12 +350,13 @@ class TestMarge(object): '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', @@ -350,62 +369,82 @@ class TestMarge(object): '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')