def setupReporter(self, token=None, **kwargs): self.setUpTestReactor() self.setup_reporter_test() self.master = fakemaster.make_master(self, wantData=True, wantDb=True, wantMq=True) http_headers = {} if token is None else { 'Authorization': 'Bearer tokentoken' } http_auth = ('username', 'passwd') if token is None else None self._http = yield fakehttpclientservice.HTTPClientService.getService( self.master, self, 'serv', auth=http_auth, headers=http_headers, debug=None, verify=None) auth = (Interpolate("username"), Interpolate("passwd")) if token is None else None self.sp = BitbucketServerCoreAPIStatusPush("serv", token=token, auth=auth, **kwargs) yield self.sp.setServiceParent(self.master) yield self.master.startService()
def setupReporter(self, token=None, **kwargs): self.setUpTestReactor() self.setup_reporter_test() # ignore config error if txrequests is not installed self.patch(config, '_errors', Mock()) self.master = fakemaster.make_master(self, wantData=True, wantDb=True, wantMq=True) http_headers = {} if token is None else { 'Authorization': 'Bearer tokentoken' } self._http = yield fakehttpclientservice.HTTPClientService.getService( self.master, self, 'serv', auth=('username', 'passwd'), headers=http_headers, debug=None, verify=None) self.sp = BitbucketServerCoreAPIStatusPush( "serv", token=token, auth=(Interpolate("username"), Interpolate("passwd")), **kwargs) yield self.sp.setServiceParent(self.master) yield self.master.startService()
def test_config_auth_and_token_mutually_exclusive(self): with self.assertRaisesConfigError( "Only one authentication method can be given (token or auth)"): BitbucketServerCoreAPIStatusPush("serv", token="x", auth=("username", "passwd"))
def test_config_no_base_url(self): with self.assertRaisesConfigError("Parameter base_url has to be given"): BitbucketServerCoreAPIStatusPush(base_url=None)
class TestBitbucketServerCoreAPIStatusPush(ConfigErrorsMixin, TestReactorMixin, unittest.TestCase, ReporterTestMixin, LoggingMixin): @defer.inlineCallbacks def setupReporter(self, token=None, **kwargs): self.setUpTestReactor() self.setup_reporter_test() # ignore config error if txrequests is not installed self.patch(config, '_errors', Mock()) self.master = fakemaster.make_master(self, wantData=True, wantDb=True, wantMq=True) http_headers = {} if token is None else {'Authorization': 'Bearer tokentoken'} self._http = yield fakehttpclientservice.HTTPClientService.getService( self.master, self, 'serv', auth=('username', 'passwd'), headers=http_headers, debug=None, verify=None) self.sp = BitbucketServerCoreAPIStatusPush( "serv", token=token, auth=(Interpolate("username"), Interpolate("passwd")), **kwargs) yield self.sp.setServiceParent(self.master) yield self.master.startService() def setUp(self): self.master = None @defer.inlineCallbacks def tearDown(self): if self.master and self.master.running: yield self.master.stopService() @defer.inlineCallbacks def _check_start_and_finish_build(self, build, parentPlan=False): # we make sure proper calls to txrequests have been made _name = "Builder_parent #1 \u00BB Builder0 #0" if parentPlan else "Builder0 #0" _parent = "Builder_parent" if parentPlan else "Builder0" self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': _name, 'description': 'Build started.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': 'refs/heads/master', 'buildNumber': '0', 'state': 'INPROGRESS', 'parent': _parent, 'duration': None, 'testResults': None}, code=HTTP_PROCESSED) self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': _name, 'description': 'Build done.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': 'refs/heads/master', 'buildNumber': '0', 'state': 'SUCCESSFUL', 'parent': _parent, 'duration': 10000, 'testResults': None}, code=HTTP_PROCESSED) self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': _name, 'description': 'Build done.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': 'refs/heads/master', 'buildNumber': '0', 'state': 'FAILED', 'parent': _parent, 'duration': 10000, 'testResults': None}, code=HTTP_PROCESSED) build['started_at'] = datetime.datetime(2019, 4, 1, 23, 38, 33, 154354, tzinfo=tzutc()) build['complete'] = False yield self.sp._got_event(('builds', 20, 'new'), build) build["complete_at"] = datetime.datetime(2019, 4, 1, 23, 38, 43, 154354, tzinfo=tzutc()) build['complete'] = True yield self.sp._got_event(('builds', 20, 'finished'), build) build['results'] = FAILURE yield self.sp._got_event(('builds', 20, 'finished'), build) def test_config_no_base_url(self): with self.assertRaisesConfigError("Parameter base_url has to be given"): BitbucketServerCoreAPIStatusPush(base_url=None) def test_config_auth_and_token_mutually_exclusive(self): with self.assertRaisesConfigError( "Only one authentication method can be given (token or auth)"): BitbucketServerCoreAPIStatusPush("serv", token="x", auth=("username", "passwd")) @defer.inlineCallbacks def test_basic(self): yield self.setupReporter() build = yield self.insert_build_finished(SUCCESS) yield self._check_start_and_finish_build(build) @defer.inlineCallbacks def test_with_parent(self): yield self.setupReporter() build = yield self.insert_build_finished(SUCCESS, parent_plan=True) yield self._check_start_and_finish_build(build, parentPlan=True) @defer.inlineCallbacks def test_with_token(self): yield self.setupReporter(token='tokentoken') build = yield self.insert_build_finished(SUCCESS) yield self._check_start_and_finish_build(build) @defer.inlineCallbacks def test_error_setup_status(self): yield self.setupReporter() @defer.inlineCallbacks def raise_deferred_exception(**kwargs): raise TestException() self.sp.createStatus = Mock(side_effect=raise_deferred_exception) build = yield self.insert_build_finished(SUCCESS) yield self.sp._got_event(('builds', 20, 'new'), build) self.assertEqual(len(self.flushLoggedErrors(TestException)), 1) @defer.inlineCallbacks def test_error(self): self.setupReporter() build = yield self.insert_build_finished(SUCCESS) self.setUpLogging() # we make sure proper calls to txrequests have been made self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': 'Builder0 #0', 'description': 'Build started.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': 'refs/heads/master', 'buildNumber': '0', 'state': 'INPROGRESS', 'parent': 'Builder0', 'duration': None, 'testResults': None}, code=HTTP_NOT_FOUND) build['complete'] = False yield self.sp._got_event(('builds', 20, 'new'), build) self.assertLogged('404: Unable to send Bitbucket Server status') @defer.inlineCallbacks def test_with_full_ref(self): yield self.setupReporter() self.reporter_test_branch = "refs/heads/master" build = yield self.insert_build_finished(SUCCESS) yield self._check_start_and_finish_build(build) @defer.inlineCallbacks def test_with_no_ref(self): yield self.setupReporter() self.reporter_test_branch = None build = yield self.insert_build_finished(SUCCESS) self.setUpLogging() self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': 'Builder0 #0', 'description': 'Build started.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': None, 'buildNumber': '0', 'state': 'INPROGRESS', 'parent': 'Builder0', 'duration': None, 'testResults': None}, code=HTTP_PROCESSED) build['complete'] = False yield self.sp._got_event(('builds', 20, 'new'), build) self.assertLogged("WARNING: Unable to resolve ref for SSID: 234.") @defer.inlineCallbacks def test_with_no_revision(self): yield self.setupReporter() self.reporter_test_revision = None build = yield self.insert_build_finished(SUCCESS) self.setUpLogging() # we don't expect any request build['complete'] = False yield self.sp._got_event(('builds', 20, 'new'), build) self.assertLogged("Unable to get the commit hash for SSID: 234") @defer.inlineCallbacks def test_with_no_repo(self): yield self.setupReporter() self.reporter_test_repo = None build = yield self.insert_build_finished(SUCCESS) self.setUpLogging() # we don't expect any request build['complete'] = False yield self.sp._got_event(('builds', 20, 'new'), build) self.assertLogged("Unable to parse repository info from 'None' for SSID: 234") @defer.inlineCallbacks def test_with_renderers(self): @util.renderer def r_testresults(props): return { "failed": props.getProperty("unittests_failed", 0), "skipped": props.getProperty("unittests_skipped", 0), "successful": props.getProperty("unittests_successful", 0), } @util.renderer def r_duration(props): return props.getProperty("unittests_runtime") yield self.setupReporter(statusName=Interpolate("%(prop:plan_name)s"), statusSuffix=Interpolate(" [%(prop:unittests_os)s]"), buildNumber=Interpolate('100'), ref=Interpolate("%(prop:branch)s"), parentName=Interpolate("%(prop:master_plan)s"), testResults=r_testresults, duration=r_duration) self.reporter_test_props['unittests_failed'] = 0 self.reporter_test_props['unittests_skipped'] = 2 self.reporter_test_props['unittests_successful'] = 3 self.reporter_test_props['unittests_runtime'] = 50000 self.reporter_test_props['unittests_os'] = "win10" self.reporter_test_props['plan_name'] = "Unittests" self.reporter_test_props['master_plan'] = "Unittests-master" build = yield self.insert_build_finished(SUCCESS) self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': 'Unittests [win10]', 'description': 'Build done.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': "refs/pull/34/merge", 'buildNumber': '100', 'state': 'SUCCESSFUL', 'parent': 'Unittests-master', 'duration': 50000, 'testResults': {'failed': 0, 'skipped': 2, 'successful': 3}}, code=HTTP_PROCESSED) build['complete'] = True yield self.sp._got_event(('builds', 20, 'finished'), build) @defer.inlineCallbacks def test_with_test_results(self): yield self.setupReporter() self.reporter_test_props['tests_skipped'] = 2 self.reporter_test_props['tests_successful'] = 3 build = yield self.insert_build_finished(SUCCESS) self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': 'Builder0 #0', 'description': 'Build done.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': 'refs/heads/master', 'buildNumber': '0', 'state': 'SUCCESSFUL', 'parent': 'Builder0', 'duration': 10000, 'testResults': {'failed': 0, 'skipped': 2, 'successful': 3}}, code=HTTP_PROCESSED) build['started_at'] = datetime.datetime(2019, 4, 1, 23, 38, 33, 154354, tzinfo=tzutc()) build["complete_at"] = datetime.datetime(2019, 4, 1, 23, 38, 43, 154354, tzinfo=tzutc()) build['complete'] = True yield self.sp._got_event(('builds', 20, 'finished'), build) @defer.inlineCallbacks def test_verbose(self): yield self.setupReporter(verbose=True) build = yield self.insert_build_finished(SUCCESS) self.setUpLogging() self._http.expect( 'post', '/rest/api/1.0/projects/example.org/repos/repo/commits/d34db33fd43db33f/builds', json={'name': 'Builder0 #0', 'description': 'Build started.', 'key': 'Builder0', 'url': 'http://localhost:8080/#builders/79/builds/0', 'ref': "refs/heads/master", 'buildNumber': '0', 'state': 'INPROGRESS', 'parent': 'Builder0', 'duration': None, 'testResults': None}, code=HTTP_PROCESSED) build['complete'] = False yield self.sp._got_event(('builds', 20, 'new'), build) self.assertLogged('Sending payload:') self.assertLogged('Status "INPROGRESS" sent for example.org/repo d34db33fd43db33f')