def _fail_unexpected(build, exception): r = Run(build, "build-failure") db.session.add(r) r.set_status(BuildStatus.FAILED) db.session.commit() storage = Storage() with storage.console_logfd(r, "a") as f: f.write("Unexpected error prevented build from running:\n") f.write(str(exception)) storage.copy_log(r) if BUILD_URL_FMT: url = BUILD_URL_FMT.format(project=build.project.name, build=build.build_id) else: url = url_for( "api_run.run_get_artifact", proj=build.project.name, build_id=build.build_id, run=r.name, path="console.log", ) exception = ApiError(500, str(exception)) exception.resp.headers.extend({"Location": url}) return exception
class SendmailTest(JobServTest): def setUp(self): super().setUp() self.create_projects("job-1") self.proj = Project.query.filter_by(name="job-1").first_or_404() self.build = Build.create(self.proj) self.run = Run(self.build, "run-name") db.session.add(self.run) self.run.set_status(BuildStatus.FAILED) @patch("jobserv.notify.smtplib") def test_notify_build_complete(self, smtplib): smtplib.SMTP().starttls.return_value = (220, b"ok") smtplib.SMTP().login.return_value = (235, b"ok") notify_build_complete_email(self.build, "*****@*****.**") msg = smtplib.SMTP().send_message.call_args_list[0][0][0] self.assertEqual("jobserv: job-1 build #1 : FAILED", msg["Subject"]) self.assertIn("\n run-name: FAILED", msg.get_payload()) def test_get_build_stats(self): # we already have one build created from constructor for i in range(9): b = Build.create(self.proj) r = Run(b, "run-name") db.session.add(r) if i % 2: r.set_status(BuildStatus.FAILED) else: r.set_status(BuildStatus.PASSED) db.session.commit() stats = _get_build_stats(b) self.assertEqual(10, stats["total"]) self.assertEqual(5, stats["passes"]) self.assertEqual(50, stats["pass_rate"])
def test_get_build_stats(self): # we already have one build created from constructor for i in range(9): b = Build.create(self.proj) r = Run(b, "run-name") db.session.add(r) if i % 2: r.set_status(BuildStatus.FAILED) else: r.set_status(BuildStatus.PASSED) db.session.commit() stats = _get_build_stats(b) self.assertEqual(10, stats["total"]) self.assertEqual(5, stats["passes"]) self.assertEqual(50, stats["pass_rate"])
def test_run_get(self, storage): db.session.add(Run(self.build, "run0")) db.session.add(Run(self.build, "run1")) # be a little anal and make sure our DB queries can handle # multiple jobs with the same run names self.create_projects("proj-2") p = Project.query.all()[1] b = Build.create(p) r = Run(b, "run0") db.session.add(r) r.set_status(BuildStatus.PASSED) r = Run(b, "run1") db.session.add(r) r.set_status(BuildStatus.FAILED) data = self.get_json(self.urlbase + "run1/")["run"] self.assertEqual("run1", data["name"]) self.assertEqual("QUEUED", data["status"]) url = "/projects/proj-2/builds/%d/runs/%s/" % (b.build_id, "run1") data = self.get_json(url)["run"] self.assertEqual("FAILED", data["status"]) self.assertEqual("FAILED", data["status_events"][0]["status"])
def test_run_get(self, storage): db.session.add(Run(self.build, 'run0')) db.session.add(Run(self.build, 'run1')) # be a little anal and make sure our DB queries can handle # multiple jobs with the same run names self.create_projects('proj-2') p = Project.query.all()[1] b = Build.create(p) r = Run(b, 'run0') db.session.add(r) r.set_status(BuildStatus.PASSED) r = Run(b, 'run1') db.session.add(r) r.set_status(BuildStatus.FAILED) data = self.get_json(self.urlbase + 'run1/')['run'] self.assertEqual('run1', data['name']) self.assertEqual('QUEUED', data['status']) url = '/projects/proj-2/builds/%d/runs/%s/' % (b.build_id, 'run1') data = self.get_json(url)['run'] self.assertEqual('FAILED', data['status']) self.assertEqual('FAILED', data['status_events'][0]['status'])