Add Jellyfin handoff progress job
This commit is contained in:
+25
-9
@@ -31,7 +31,11 @@ APP = importlib.util.module_from_spec(SPEC)
|
||||
assert SPEC.loader is not None
|
||||
SPEC.loader.exec_module(APP)
|
||||
IMPORT_RUNTIME_WAS_DEFERRED = (
|
||||
APP.CONFIG is None and APP.WATCHLIST is None and APP.DOWNLOAD_QUEUE is None and APP.WATCHLIST_REFRESH is None
|
||||
APP.CONFIG is None
|
||||
and APP.WATCHLIST is None
|
||||
and APP.DOWNLOAD_QUEUE is None
|
||||
and APP.WATCHLIST_REFRESH is None
|
||||
and APP.WATCHLIST_JELLYFIN_SYNC is None
|
||||
)
|
||||
APP.initialize_runtime(start_workers=False)
|
||||
APP.reset_runtime(wait=True)
|
||||
@@ -2586,6 +2590,7 @@ class StartupBehaviorTests(unittest.TestCase):
|
||||
current_queue = APP.DOWNLOAD_QUEUE
|
||||
current_refresh = APP.WATCHLIST_REFRESH
|
||||
current_auto_refresh = APP.WATCHLIST_AUTO_REFRESH
|
||||
current_jellyfin_sync = APP.WATCHLIST_JELLYFIN_SYNC
|
||||
with mock.patch.object(APP, "shutdown_runtime", return_value=False):
|
||||
with self.assertRaises(RuntimeError):
|
||||
APP.reset_runtime(wait=True)
|
||||
@@ -2595,6 +2600,7 @@ class StartupBehaviorTests(unittest.TestCase):
|
||||
self.assertIs(APP.DOWNLOAD_QUEUE, current_queue)
|
||||
self.assertIs(APP.WATCHLIST_REFRESH, current_refresh)
|
||||
self.assertIs(APP.WATCHLIST_AUTO_REFRESH, current_auto_refresh)
|
||||
self.assertIs(APP.WATCHLIST_JELLYFIN_SYNC, current_jellyfin_sync)
|
||||
finally:
|
||||
APP.reset_runtime(wait=True)
|
||||
APP.initialize_runtime(start_workers=False)
|
||||
@@ -2663,6 +2669,7 @@ class StartupBehaviorTests(unittest.TestCase):
|
||||
self.assertIsNone(APP.DOWNLOAD_QUEUE)
|
||||
self.assertIsNone(APP.WATCHLIST_REFRESH)
|
||||
self.assertIsNone(APP.WATCHLIST_AUTO_REFRESH)
|
||||
self.assertIsNone(APP.WATCHLIST_JELLYFIN_SYNC)
|
||||
finally:
|
||||
APP.initialize_runtime(start_workers=False)
|
||||
|
||||
@@ -2679,6 +2686,7 @@ class HandlerRouteTests(unittest.TestCase):
|
||||
self.assertIsNone(APP.DOWNLOAD_QUEUE.worker)
|
||||
self.assertIsNone(APP.WATCHLIST_REFRESH.worker)
|
||||
self.assertIsNone(APP.WATCHLIST_AUTO_REFRESH.worker)
|
||||
self.assertIsNone(APP.WATCHLIST_JELLYFIN_SYNC.worker)
|
||||
finally:
|
||||
APP.reset_runtime(wait=True)
|
||||
APP.initialize_runtime(start_workers=False)
|
||||
@@ -3115,23 +3123,31 @@ class HandlerRouteTests(unittest.TestCase):
|
||||
self.assertEqual(handler.json_payload, payload)
|
||||
self.assertEqual(handler.json_status, HTTPStatus.OK)
|
||||
|
||||
def test_jellyfin_sync_post_returns_summary_payload(self):
|
||||
def test_jellyfin_sync_status_route_returns_json(self):
|
||||
handler = DummyHandler("/api/config/jellyfin/sync-status")
|
||||
payload = {"running": True, "job": {"id": "job-1", "status": "running"}}
|
||||
handler.handler_context = mock.Mock(get_jellyfin_sync_status=mock.Mock(return_value=payload))
|
||||
APP.Handler.do_GET(handler)
|
||||
self.assertEqual(handler.json_payload, payload)
|
||||
self.assertEqual(handler.json_status, HTTPStatus.OK)
|
||||
|
||||
def test_jellyfin_sync_post_returns_job_payload(self):
|
||||
body = b'{"download_dir":"/tmp/example","jellyfin_sync_enabled":true,"jellyfin_tv_dir":"/tmp/jellyfin-tv","jellyfin_movie_dir":"/tmp/jellyfin-movies"}'
|
||||
handler = DummyHandler("/api/config/jellyfin/sync", body=body, content_length=len(body))
|
||||
payload = {"message": "Moved 1 watchlist entry to Jellyfin libraries.", "moved": 1, "total": 2, "items": []}
|
||||
payload = {"message": "Jellyfin handoff started.", "created": True, "job": {"id": "job-1", "status": "pending"}}
|
||||
handler.handler_context = mock.Mock(
|
||||
get_config_snapshot=mock.Mock(return_value={}),
|
||||
run_jellyfin_sync=mock.Mock(return_value=payload),
|
||||
start_jellyfin_sync=mock.Mock(return_value=payload),
|
||||
http_error=APP.HttpError,
|
||||
)
|
||||
APP.Handler.do_POST(handler)
|
||||
self.assertEqual(handler.json_payload, payload)
|
||||
self.assertEqual(handler.json_status, HTTPStatus.OK)
|
||||
self.assertEqual(handler.json_status, HTTPStatus.ACCEPTED)
|
||||
|
||||
def test_jellyfin_sync_post_merges_partial_payload_with_saved_config(self):
|
||||
body = b'{"jellyfin_sync_enabled":true}'
|
||||
handler = DummyHandler("/api/config/jellyfin/sync", body=body, content_length=len(body))
|
||||
payload = {"message": "Moved 0 watchlist entries to Jellyfin libraries.", "moved": 0, "total": 0, "items": []}
|
||||
payload = {"message": "Jellyfin handoff already queued.", "created": False, "job": {"id": "job-1", "status": "pending"}}
|
||||
handler.handler_context = mock.Mock(
|
||||
get_config_snapshot=mock.Mock(
|
||||
return_value={
|
||||
@@ -3143,11 +3159,11 @@ class HandlerRouteTests(unittest.TestCase):
|
||||
"jellyfin_movie_dir": "/tmp/jellyfin-movies",
|
||||
}
|
||||
),
|
||||
run_jellyfin_sync=mock.Mock(return_value=payload),
|
||||
start_jellyfin_sync=mock.Mock(return_value=payload),
|
||||
)
|
||||
APP.Handler.do_POST(handler)
|
||||
self.assertEqual(handler.json_status, HTTPStatus.OK)
|
||||
handler.handler_context.run_jellyfin_sync.assert_called_once_with(
|
||||
self.assertEqual(handler.json_status, HTTPStatus.ACCEPTED)
|
||||
handler.handler_context.start_jellyfin_sync.assert_called_once_with(
|
||||
{
|
||||
"download_dir": "/tmp/example",
|
||||
"mode": "sub",
|
||||
|
||||
Reference in New Issue
Block a user