diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_gui.py | 45 | ||||
| -rw-r--r-- | tests/test_remote.py | 46 |
2 files changed, 83 insertions, 8 deletions
diff --git a/tests/test_gui.py b/tests/test_gui.py index ca415d3..f5894de 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -468,6 +468,29 @@ class SmokeTest(unittest.TestCase): self.assertIn("…", text) self.assertNotIn("pkg " * 40, text) + def test_failed_build_shows_results(self): + job = dict(JOB, id="20260101-000002-slackrepo", kind="slackrepo", args=["build", "a", "b", "c"]) + w, remote = self.window(jobs=({"jobs": [dict(job, status="running")]}, None), + **{"job-start": ({"id": "20260101-000003-slackrepo"}, None)}) + w.mine.add(job["id"]) + w.poll_jobs() + results = {"cat/a": "ok", "cat/b": "failed", "cat/c": "aborted", "d": "bad"} + remote.answers["jobs"] = ({"jobs": [dict(job, status="failed", end=125, exit=0, + results=results)]}, None) + w.poll_jobs() + self.assertEqual(w.notifier.sent[-1][1], + "Failed: cat/b, cat/c, d (1 ok, 1 failed, 1 aborted, 1 bad) after 2m 5s") + d = w.next_steps[job["id"]] + self.assertEqual(d.list.item(0).text(), "cat/b failed") + d.retry_btn.click() + self.assertIn(("job-start", "slackrepo", "build", "--preview", "b", "c"), remote.calls) + + def test_prunable_enables_prune(self): + w, _ = self.window(stats=(dict(STATS, prunable=3, slackrepo={"results": {}, "built": 5}), None)) + w.poll_jobs() + self.assertTrue(w.packages_tab.act_prune.isEnabled()) + self.assertIn("3 to prune", w.dashboard.tiles["Built"].detail.text()) + def test_slackpkg_dot(self): old = dict(STATS, slackpkg={"update": None, "upgrade": 1}) w, _ = self.window(stats=(old, None)) @@ -500,7 +523,7 @@ class SmokeTest(unittest.TestCase): tab.chips["orphaned"].setChecked(False) started = [] tab.start_requested.connect(started.append) - tab.act("update") + tab.act("build") self.assertEqual(started, []) # nothing checked, no current row tab.table.clicked.emit(tab.proxy.index(3, 2)) # a click on a row's values ticks it self.assertEqual(tab.model.checked, {"curl"}) @@ -508,10 +531,10 @@ class SmokeTest(unittest.TestCase): self.assertEqual(tab.model.checked, set()) tab.table.setCurrentIndex(tab.proxy.index(1, 1)) self.assertIn("<s>x</s>", tab.detail.text()) - tab.act("update") # highlighted but not ticked: nothing + tab.act("build") # highlighted but not ticked: nothing self.assertEqual(started, []) tab.model.checked.add("foo") - tab.act("update") + tab.act("build") tab.model.checked.clear() select, clear = tab.keys select.activated.emit() @@ -521,9 +544,12 @@ class SmokeTest(unittest.TestCase): tab.model.checked.update({"nuclei", "curl"}) tab.act("build") tab.update_all() - self.assertEqual(started, [["slackrepo", "update", "--preview", "foo"], + tab.set_prunable(2) + tab.act_prune.trigger() + self.assertEqual(started, [["slackrepo", "build", "--preview", "foo"], ["slackrepo", "build", "--preview", "curl", "nuclei"], - ["slackrepo", "update", "--preview"]]) + ["slackrepo", "update", "--preview"], + ["slackrepo", "prune", "--preview"]]) def end_preview(self, job, **answers): """A window where job, started by this session, goes from running to its status.""" @@ -717,13 +743,14 @@ class SmokeTest(unittest.TestCase): self.assertNotIn(("inventory",), remote.calls) # each tab loads on first show expect = { "Dashboard": (["Refresh"], []), - "Packages": (["Build", "Update", "Rebuild", "Remove", "Update all", "New hint", "Publish"], + "Packages": (["Build", "Rebuild", "Remove", "Update all", "Prune", "New hint", "Publish"], ["Select visible", "Clear", "Refresh"]), "Hints": (["Check upstream", "Update selected", "Delete hint", "Phantom deps…"], ["Select visible", "Clear", "No download", "Refresh"]), "Results": (["Show build log"], ["Refresh"]), "Repository": ([], ["Refresh"]), - "Jobs": (["Pull overlay", "Check shadowing", "Rebuild tree", "Run it", "Kill"], []), + "Jobs": (["Pull overlay", "Check shadowing", "Rebuild tree", "Run it", "Build results", "Kill"], + []), } for i in range(w.tabs.count()): w.tabs.setCurrentIndex(i) @@ -742,6 +769,8 @@ class SmokeTest(unittest.TestCase): p, h, j = w.open_packages(), w.open_hints(), w.open_jobs() for a, why in ((p.act_build["build"], "tick packages first"), (p.act_new_hint, "none of the ticked packages is without a hint"), + (p.act_prune, "no built package lost its SlackBuild"), + (j.act_results, "select a build with failed packages"), (h.act_update, "tick outdated packages after Check upstream"), (h.act_delete, "none of the ticked packages has a hint"), (j.act_run, "select a finished preview"), (j.act_kill, "select a running job")): @@ -872,7 +901,7 @@ class SmokeTest(unittest.TestCase): self.assertEqual(w.hint_dialogs, []) w.show_hint_result({"ok": ["nuclei"], "failed": []}) w.hint_dialogs[0].build() - self.assertIn(("job-start", "slackrepo", "update", "--preview", "nuclei"), remote.calls) + self.assertIn(("job-start", "slackrepo", "build", "--preview", "nuclei"), remote.calls) def test_clear_with_filter_and_current_row(self): # regression: Clear emitted layoutChanged with no layoutAboutToBeChanged; diff --git a/tests/test_remote.py b/tests/test_remote.py index 44d3a90..9f28701 100644 --- a/tests/test_remote.py +++ b/tests/test_remote.py @@ -172,6 +172,26 @@ class KindsTest(Base): with self.subTest(args=args), self.assertRaises(sbb.Error): sbb.KINDS["slackrepo"](self.cfg, args) + def test_slackrepo_prune(self): + self.make_pkg("misc/kept") + db = sqlite3.connect(self.cfg["slackrepo_db"]) + db.executescript(""" + create table packages (pkgnam text primary key, itemid text); + insert into packages values ('kept-1-x86_64-1_x', 'misc/kept'), + ('gone-1-x86_64-1_x', 'misc/gone'), ('gone-doc-1-noarch-1_x', 'misc/gone'), + ('evil-1', '-rf/x'); + """) + db.close() + kind = sbb.KINDS["slackrepo"] + self.assertEqual(kind(self.cfg, ["prune", "--preview"]), + (["slackrepo", "--repo=SBo-danix", "remove", "--preview", "misc/gone"], {})) + self.assertEqual(sbb.cmd_stats(self.cfg)["prunable"], 1) + with self.assertRaises(sbb.Error): + kind(self.cfg, ["prune", "kept"]) + self.make_pkg("misc/gone") + with self.assertRaisesRegex(sbb.Error, "nothing to prune"): + kind(self.cfg, ["prune"]) + def test_publish(self): self.assertEqual(sbb.KINDS["publish"](self.cfg, []), (["sb-publish"], {})) with self.assertRaises(sbb.Error): @@ -749,6 +769,32 @@ class JobsTest(Base): m = sbb.read_meta(d) self.assertEqual((m["status"], m["exit"]), ("failed", 3)) + def slackrepo_job(self, results, args=("build", "a", "b")): + jid, d = self.make_job(["sh", "-c", "exit 0"], kind="slackrepo", args=list(args)) + db = sqlite3.connect(self.cfg["slackrepo_db"]) + db.execute("create table buildresults (itemid text primary key, time text, result text)") + db.execute("insert into buildresults values ('cat/old', '1', 'failed')") # before the job + db.executemany("insert into buildresults values (?, ?, ?)", + [(i, str(int(time.time()) + 1), r) for i, r in results.items()]) + db.commit() + db.close() + sbb.cmd_run(self.cfg, jid) + return sbb.read_meta(d) + + def test_run_results_failed(self): + m = self.slackrepo_job({"cat/a": "ok", "cat/b": "aborted"}) + self.assertEqual((m["status"], m["exit"]), ("failed", 0)) + self.assertEqual(m["results"], {"cat/a": "ok", "cat/b": "aborted"}) + + def test_run_results_ok(self): + m = self.slackrepo_job({"cat/a": "ok", "cat/b": "skipped"}) + self.assertEqual((m["status"], m["results"]), ("ok", {"cat/a": "ok", "cat/b": "skipped"})) + + def test_run_preview_no_results(self): + m = self.slackrepo_job({"cat/a": "failed"}, args=("build", "--preview", "a")) + self.assertEqual(m["status"], "ok") + self.assertNotIn("results", m) + def test_run_missing_program(self): jid, d = self.make_job(["/nonexistent/prog"]) sbb.cmd_run(self.cfg, jid) |
