def test_simple(self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo( backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) source = self.create_source( project=project, revision_sha='a' * 40, ) build = self.create_build( project=project, source=source, ) build = self.create_build( project=project, source=source, ) get_options.return_value = { 'green-build.notify': '1', } vcs = build.source.repository.get_vcs.return_value vcs.run.return_value = '134:asdadfadf' # test with failing build build.result = Result.failed build_finished_handler(build_id=build.id.hex) assert len(responses.calls) == 0 # test with passing build build.result = Result.passed build_finished_handler(build_id=build.id.hex) vcs.run.assert_called_once_with([ 'log', '-r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '--limit=1', '--template={rev}:{node|short}' ]) get_options.assert_called_once_with(build.project_id) assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'https://foo.example.com/' assert responses.calls[0].request.body == 'project={project_slug}&build_server=changes&build_url=http%3A%2F%2Fexample.com%2Fprojects%2F{project_slug}%2Fbuilds%2F{build_id}%2F&id=134%3Aasdadfadf'.format( project_slug=build.project.slug, build_id=build.id.hex, ) event = Event.query.filter( Event.type == EventType.green_build, ).first() assert event assert event.item_id == build.id
def test_set_latest_green_build_with_vcs_sha_errors(self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo( backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) sha = uuid4().hex source = self.create_source( project=project, revision_sha=sha, revision=self.create_revision(repository=repository, branches=['default'], sha=sha ) ) vcs = repository.get_vcs.return_value vcs.is_child_parent.return_value = True # Ensure a new build can be set to green if the current green is # missing in vcs. vcs.is_child_parent.side_effect = UnknownParentRevision( cmd="vcs merge-base ...", retcode=128, stdout="", stderr="fatal: Not a valid commit name [some SHA]\n") build3 = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '1'} vcs.run.return_value = '137:asdadfadf' build3.result = Result.passed build_finished_handler(build_id=build3.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build3 # Ensure a new build cannot be set to green if the new build's SHA is # missing in vcs. vcs.is_child_parent.side_effect = UnknownChildRevision( cmd="vcs merge-base ...", retcode=128, stdout="", stderr="fatal: Not a valid commit name [some SHA]\n") bad_sha_build = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '1'} vcs.run.return_value = '138:asdadfadf' bad_sha_build.result = Result.passed build_finished_handler(build_id=bad_sha_build.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build3 # Cleanup the mock (in case more blocks are added) vcs.is_child_parent.side_effect = None
def test_set_latest_green_build_with_vcs_sha_errors( self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo(backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) sha = uuid4().hex source = self.create_source(project=project, revision_sha=sha, revision=self.create_revision( repository=repository, branches=['default'], sha=sha)) vcs = repository.get_vcs.return_value vcs.is_child_parent.return_value = True # Ensure a new build can be set to green if the current green is # missing in vcs. vcs.is_child_parent.side_effect = UnknownParentRevision( cmd="vcs merge-base ...", retcode=128, stdout="", stderr="fatal: Not a valid commit name [some SHA]\n") build3 = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '1'} vcs.run.return_value = '137:asdadfadf' build3.result = Result.passed build_finished_handler(build_id=build3.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build3 # Ensure a new build cannot be set to green if the new build's SHA is # missing in vcs. vcs.is_child_parent.side_effect = UnknownChildRevision( cmd="vcs merge-base ...", retcode=128, stdout="", stderr="fatal: Not a valid commit name [some SHA]\n") bad_sha_build = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '1'} vcs.run.return_value = '138:asdadfadf' bad_sha_build.result = Result.passed build_finished_handler(build_id=bad_sha_build.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build3 # Cleanup the mock (in case more blocks are added) vcs.is_child_parent.side_effect = None
def test_simple(get_options): with app.test_request_context(): release_id = '134:asdadfadf' responses.add(responses.POST, 'https://foo.example.com') get_options.return_value = { 'green-build.notify': '1', } build = mock.Mock(spec=Build()) build.patch_id = None build.project.slug = 'server' build.id = UUID(hex='c' * 32) build.project_id = UUID(hex='b' * 32) build.revision_sha = 'a' * 40 build.repository.backend = RepositoryBackend.hg vcs = build.repository.get_vcs.return_value vcs.run.return_value = release_id # test with failing build build.result = Result.failed build_finished_handler(build) assert len(responses.calls) == 0 # test with passing build build.result = Result.passed build_finished_handler(build) vcs.run.assert_called_once_with([ 'log', '-r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '--limit=1', '--template={rev}:{node|short}' ]) get_options.assert_called_once_with(build.project_id) assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'https://foo.example.com/' assert responses.calls[0].request.body == 'project=server&build_server=changes&build_url=http%3A%2F%2Flocalhost%2Fbuilds%2Fcccccccccccccccccccccccccccccccc%2F&id=134%3Aasdadfadf'
def test_set_latest_green_build(self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo( backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) sha = uuid4().hex source = self.create_source( project=project, revision_sha=sha, revision=self.create_revision(repository=repository, branches=['default'], sha=sha ) ) vcs = repository.get_vcs.return_value vcs.is_child_parent.return_value = True # Ensure latest green build set even if notify is false. build = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '0'} vcs.run.return_value = '134:asdadfadf' build.result = Result.passed build_finished_handler(build_id=build.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build # Ensure latest green build not set even if failed. failed_build = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '0'} vcs.run.return_value = '135:asdadfadf' failed_build.result = Result.failed build_finished_handler(build_id=failed_build.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build build2 = self.create_build(project=project, source=source) get_options.return_value = {'green-build.notify': '1'} vcs.run.return_value = '136:asdadfadf' build2.result = Result.passed build_finished_handler(build_id=build2.id.hex) assert self._get_latest_green_build(project.id, 'default').build == build2
def test_simple(self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo( backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) sha = uuid4().hex source = self.create_source( project=project, revision_sha=sha, revision=self.create_revision(repository=repository, branches=['default'], sha=sha ) ) build = self.create_build( project=project, source=source, ) get_options.return_value = { 'green-build.notify': '1', } vcs = build.source.repository.get_vcs.return_value vcs.run.return_value = '134:asdadfadf' # test with failing build build.result = Result.failed build_finished_handler(build_id=build.id.hex) assert len(responses.calls) == 0 # test with passing build build.result = Result.passed build_finished_handler(build_id=build.id.hex) vcs.run.assert_called_once_with([ 'log', '-r %s' % sha, '--limit=1', '--template={rev}:{node|short}' ]) get_options.assert_called_once_with(build.project_id) assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'https://foo.example.com/' assert responses.calls[0].request.body == 'project={project_slug}&build_server=changes&build_url=http%3A%2F%2Fexample.com%2Fprojects%2F{project_slug}%2Fbuilds%2F{build_id}%2F&id=134%3Aasdadfadf'.format( project_slug=build.project.slug, build_id=build.id.hex, ) event = Event.query.filter( Event.type == EventType.green_build, ).first() assert event assert event.item_id == build.id
def test_simple(self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo(backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) sha = uuid4().hex source = self.create_source(project=project, revision_sha=sha, revision=self.create_revision( repository=repository, branches=['default'], sha=sha)) build = self.create_build( project=project, source=source, ) get_options.return_value = { 'green-build.notify': '1', } vcs = build.source.repository.get_vcs.return_value vcs.run.return_value = '134:asdadfadf' # test with failing build build.result = Result.failed build_finished_handler(build_id=build.id.hex) assert len(responses.calls) == 0 # test with passing build but not on correct branch: build.result = Result.passed get_options.return_value = { 'green-build.notify': '1', 'build.branch-names': 'some_other_branch', } build_finished_handler(build_id=build.id.hex) get_options.assert_called_once_with(build.project_id) assert len(responses.calls) == 0 # test with passing build # (remove the branch filter) get_options.return_value = { 'green-build.notify': '1', } def set_tags(b, tags): b.tags = tags db.session.add(b) db.session.commit() # Commit queue builds shouldn't be reported. set_tags(build, ['commit-queue']) build_finished_handler(build_id=build.id.hex) assert len(responses.calls) == 0 # Not commit queue set_tags(build, []) build_finished_handler(build_id=build.id.hex) vcs.run.assert_called_once_with([ 'log', '-r %s' % sha, '--limit=1', '--template={rev}:{node|short}' ]) assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'https://foo.example.com/' body = urlparse.parse_qs(responses.calls[0].request.body) assert body['project'][0] == build.project.slug assert body['build_server'][0] == 'changes' assert body['build_url'][ 0] == "http://example.com/projects/%s/builds/%s/" % ( build.project.slug, build.id.hex) assert body['id'][0] == '134:asdadfadf' assert 'author_name' in body assert 'author_email' in body assert 'revision_message' in body assert 'commit_timestamp' in body event = Event.query.filter( Event.type == EventType.green_build, ).first() assert event assert event.item_id == build.id
def test_simple(self, vcs, get_options): responses.add(responses.POST, 'https://foo.example.com') repository = self.create_repo( backend=RepositoryBackend.hg, ) project = self.create_project(repository=repository) sha = uuid4().hex source = self.create_source( project=project, revision_sha=sha, revision=self.create_revision(repository=repository, branches=['default'], sha=sha ) ) build = self.create_build( project=project, source=source, ) get_options.return_value = { 'green-build.notify': '1', } vcs = build.source.repository.get_vcs.return_value vcs.run.return_value = '134:asdadfadf' # test with failing build build.result = Result.failed build_finished_handler(build_id=build.id.hex) assert len(responses.calls) == 0 # test with passing build build.result = Result.passed build_finished_handler(build_id=build.id.hex) vcs.run.assert_called_once_with([ 'log', '-r %s' % sha, '--limit=1', '--template={rev}:{node|short}' ]) get_options.assert_called_once_with(build.project_id) assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'https://foo.example.com/' body = urlparse.parse_qs(responses.calls[0].request.body) assert body['project'][0] == build.project.slug assert body['build_server'][0] == 'changes' assert body['build_url'][0] == "http://example.com/projects/%s/builds/%s/" % (build.project.slug, build.id.hex) assert body['id'][0] == '134:asdadfadf' assert 'author_name' in body assert 'author_email' in body assert 'revision_message' in body assert 'commit_timestamp' in body event = Event.query.filter( Event.type == EventType.green_build, ).first() assert event assert event.item_id == build.id