From db41ef3536a985b5bbc623761814b21f0ce856ab Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Thu, 10 Mar 2022 11:37:15 +0100 Subject: [PATCH] Add a test case for check_bugowner --- check_bugowner.py | 4 +- tests/OBSLocal.py | 15 ++++--- tests/check_bugowner_tests.py | 82 +++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 tests/check_bugowner_tests.py diff --git a/check_bugowner.py b/check_bugowner.py index bfe8d7dd..3d654300 100755 --- a/check_bugowner.py +++ b/check_bugowner.py @@ -41,11 +41,11 @@ class CheckerBugowner(ReviewBot.ReviewBot): if matched_package and matched_package != target_package: continue if not self.valid_maintainer(matched_maintainer): - self.review_messages['declined'] += f"\n{matched_maintainer} could not be found on this instance." + self.review_messages['declined'] = f"\n{matched_maintainer} could not be found on this instance." return False return True self.review_messages['declined'] += f"\n{target_package } appears to be a new package and " + \ - "no 'bugowner' line could be found in the request description." + "no matching 'bugowner:' line could be found in the request description." return False def existing_url(self, url): diff --git a/tests/OBSLocal.py b/tests/OBSLocal.py index 7726d128..ca021cd5 100644 --- a/tests/OBSLocal.py +++ b/tests/OBSLocal.py @@ -525,7 +525,7 @@ class StagingWorkflow(ABC): project_links=project_links) return self.projects[name] - def submit_package(self, package, project=None): + def submit_package(self, package, project=None, request_description=""): """Creates submit request from package to target project. Both have to exist (Use :func:`create_submit_request` otherwise). @@ -534,12 +534,14 @@ class StagingWorkflow(ABC): :type package: Package :param project: project where to send submit request, None means use the default. :type project: Project or str or None + :param request_description what the request description should be + :type request_description str or None :return: created request. :rtype: Request """ if not project: project = self.project - request = Request(source_package=package, target_project=project) + request = Request(source_package=package, target_project=project, description=request_description) self.requests.append(request) return request @@ -550,7 +552,7 @@ class StagingWorkflow(ABC): self.requests.append(request) return request - def create_submit_request(self, project, package, text=None, add_commit=True): + def create_submit_request(self, project, package, text=None, add_commit=True, description=""): """Creates submit request from package in specified project to default project. It creates project if not exist and also package. @@ -573,7 +575,7 @@ class StagingWorkflow(ABC): package = Package(name=package, project=project) if add_commit: package.create_commit(text=text) - return self.submit_package(package) + return self.submit_package(package, request_description=description) def __del__(self): if not self.api: @@ -1049,7 +1051,7 @@ class Request(object): .. _osc.core: https://github.com/openSUSE/osc/blob/master/osc/core.py """ - def __init__(self, source_package=None, target_project=None, target_package=None, type='submit'): + def __init__(self, source_package=None, target_project=None, target_package=None, type='submit', description=""): """Creates a request in the OBS instance and instantiates an object to represent it""" self.revoked = True @@ -1058,7 +1060,8 @@ class Request(object): src_project=source_package.project.name, src_package=source_package.name, dst_project=target_project, - dst_package=target_package) + dst_package=target_package, + message=description) print('created submit request {}/{} -> {}'.format( source_package.project.name, source_package.name, target_project)) elif type == 'delete': diff --git a/tests/check_bugowner_tests.py b/tests/check_bugowner_tests.py new file mode 100644 index 00000000..b4b474c5 --- /dev/null +++ b/tests/check_bugowner_tests.py @@ -0,0 +1,82 @@ +import logging +from . import OBSLocal +from check_bugowner import CheckerBugowner +import pytest + +PROJECT = "SLE:Next-SP" + + +@pytest.fixture +def default_config(request): + wf = OBSLocal.FactoryWorkflow(PROJECT) + project = wf.projects[PROJECT] + + request.cls.bot_user = 'factory-auto' + + wf.create_user(request.cls.bot_user) + # When creating a review, set the by_user to bot_user + project.add_reviewers(users=[request.cls.bot_user]) + + request.cls.wf = wf + + request.cls.review_bot = CheckerBugowner(request.cls.wf.apiurl, user=request.cls.bot_user, logger=logging.getLogger()) + + yield "workflow" + del request.cls.wf + + +class TestCheckBugowner(OBSLocal.TestCase): + + @pytest.mark.usefixtures("default_config") + def test_no_bugowner(self): + """Declines the request for a new package""" + req_id = self.wf.create_submit_request('devel:wine', 'merlot').reqid + + self.assertReview(req_id, by_user=(self.bot_user, 'new')) + + self.review_bot.set_request_ids([req_id]) + self.review_bot.check_requests() + + review = self.assertReview(req_id, by_user=(self.bot_user, 'declined')) + self.assertIn('merlot appears to be a new package', review.comment) + + @pytest.mark.usefixtures("default_config") + def test_existing_package(self): + """Accepts requests for existing packages""" + self.wf.create_package(PROJECT, 'merlot') + + req_id = self.wf.create_submit_request('devel:wine', 'merlot').reqid + + self.assertReview(req_id, by_user=(self.bot_user, 'new')) + + self.review_bot.set_request_ids([req_id]) + self.review_bot.check_requests() + + review = self.assertReview(req_id, by_user=(self.bot_user, 'accepted')) + self.assertEqual('ok', review.comment) + + @pytest.mark.usefixtures("default_config") + def test_invalid_bugowner(self): + """Declines the request for a new package because of wrong maintainer""" + req_id = self.wf.create_submit_request('devel:wine', 'merlot', description="bugowner: thatguythere").reqid + + self.assertReview(req_id, by_user=(self.bot_user, 'new')) + + self.review_bot.set_request_ids([req_id]) + self.review_bot.check_requests() + + review = self.assertReview(req_id, by_user=(self.bot_user, 'declined')) + self.assertIn('thatguythere could not be found on this instance.', review.comment) + + @pytest.mark.usefixtures("default_config") + def test_valid_bugowner(self): + """Accept request with valid maintainer""" + self.wf.create_user('thegirl') + req_id = self.wf.create_submit_request('devel:wine', 'merlot', description="bugowner: thegirl").reqid + + self.assertReview(req_id, by_user=(self.bot_user, 'new')) + + self.review_bot.set_request_ids([req_id]) + self.review_bot.check_requests() + + self.assertReview(req_id, by_user=(self.bot_user, 'accepted'))