Add clear failed queue action
Add a Queue page bulk action and API route to remove all failed jobs, cover it with regression tests, and update the version, changelog, and README for the new queue workflow.
This commit is contained in:
+71
@@ -466,6 +466,45 @@ class QueueApiTests(unittest.TestCase):
|
||||
self.assertEqual(retried["status"], "pending")
|
||||
self.assertFalse(retried["cancel_requested"])
|
||||
|
||||
def test_clear_failed_removes_only_failed_jobs(self):
|
||||
failed = self.queue.add(
|
||||
{
|
||||
"query": "Failed Show",
|
||||
"title": "Failed Show",
|
||||
"anime_name": "Failed Show",
|
||||
"mode": "sub",
|
||||
"quality": "best",
|
||||
"episodes": "1",
|
||||
"download_dir": "/tmp/example",
|
||||
"season": "1",
|
||||
}
|
||||
)
|
||||
done = self.queue.add(
|
||||
{
|
||||
"query": "Done Show",
|
||||
"title": "Done Show",
|
||||
"anime_name": "Done Show",
|
||||
"mode": "sub",
|
||||
"quality": "best",
|
||||
"episodes": "1",
|
||||
"download_dir": "/tmp/example",
|
||||
"season": "1",
|
||||
}
|
||||
)
|
||||
with self.queue.lock:
|
||||
failed_job = self.queue._find(failed["id"])
|
||||
failed_job["status"] = "failed"
|
||||
self.queue._save_job_locked(failed_job)
|
||||
done_job = self.queue._find(done["id"])
|
||||
done_job["status"] = "done"
|
||||
self.queue._save_job_locked(done_job)
|
||||
|
||||
result = self.queue.clear_failed()
|
||||
listing = self.queue.list()
|
||||
|
||||
self.assertEqual(result["count"], 1)
|
||||
self.assertEqual([job["id"] for job in listing["jobs"]], [done["id"]])
|
||||
|
||||
def test_detach_show_clears_queue_coverage_and_sync_binding(self):
|
||||
created = self.queue.add(
|
||||
{
|
||||
@@ -2817,6 +2856,33 @@ class HandlerRouteTests(unittest.TestCase):
|
||||
self.assertEqual(handler.json_status, HTTPStatus.OK)
|
||||
self.assertIn("anipy-cli", handler.json_payload)
|
||||
|
||||
def test_clear_failed_route_removes_failed_jobs(self):
|
||||
with APP.DOWNLOAD_QUEUE._connect() as conn:
|
||||
conn.execute("DELETE FROM jobs")
|
||||
job = APP.DOWNLOAD_QUEUE.add(
|
||||
{
|
||||
"query": "Failed Route Show",
|
||||
"title": "Failed Route Show",
|
||||
"anime_name": "Failed Route Show",
|
||||
"mode": "sub",
|
||||
"quality": "best",
|
||||
"episodes": "1",
|
||||
"download_dir": "/tmp/example",
|
||||
"season": "1",
|
||||
}
|
||||
)
|
||||
with APP.DOWNLOAD_QUEUE.lock:
|
||||
stored = APP.DOWNLOAD_QUEUE._find(job["id"])
|
||||
stored["status"] = "failed"
|
||||
APP.DOWNLOAD_QUEUE._save_job_locked(stored)
|
||||
|
||||
handler = DummyHandler("/api/queue/clear-failed", body=b"{}", content_length=2)
|
||||
APP.Handler.do_POST(handler)
|
||||
|
||||
self.assertEqual(handler.json_status, HTTPStatus.OK)
|
||||
self.assertEqual(handler.json_payload["count"], 1)
|
||||
self.assertEqual(APP.DOWNLOAD_QUEUE.list()["total"], 0)
|
||||
|
||||
def test_changelog_route_returns_project_changelog_content(self):
|
||||
handler = DummyHandler("/api/changelog")
|
||||
APP.Handler.do_GET(handler)
|
||||
@@ -3366,6 +3432,11 @@ class TemplateHelperTests(unittest.TestCase):
|
||||
def test_search_page_sends_watchlist_auto_download_series(self):
|
||||
self.assertIn('auto_download_series: $("seasonInput").value || "1"', APP.INDEX_HTML)
|
||||
|
||||
def test_queue_page_includes_clear_failed_bulk_action(self):
|
||||
self.assertIn('id="clearFailedBtn"', APP.QUEUE_HTML)
|
||||
self.assertIn('/api/queue/clear-failed', APP.QUEUE_HTML)
|
||||
self.assertIn('Removed failed jobs', APP.QUEUE_HTML)
|
||||
|
||||
def test_search_page_queues_selected_title_without_result_index(self):
|
||||
self.assertIn('query: state.selected.title,', APP.INDEX_HTML)
|
||||
self.assertNotIn('index: state.selected.index,', APP.INDEX_HTML)
|
||||
|
||||
Reference in New Issue
Block a user