feat(service-storage-harness): slice 1 — harness + qbit store + client + integration

ServiceDataHarness (services/service_data.py): lifecycle-only registry of
per-concern storage — DB provisioning, idempotent migrations (ALTER TABLE
duplicate-column-name caught per-statement), cascade_delete(service_id).
QbittorrentSampleStore: append/window/prune (MAX_SAMPLES=120) in
qbittorrent.db. QbittorrentClient: cookie-login Web API client (403 re-login,
/sync/maindata). Integration registered with 3 widget kinds (totals/active/
speed). Harness initialized in main.py lifespan.

Backend: 314 pytest pass (21 new), ruff clean.
This commit is contained in:
Developer
2026-07-09 08:22:36 +00:00
parent 9a251db23c
commit e7bd0afdd1
9 changed files with 685 additions and 1 deletions
+3 -1
View File
@@ -57,7 +57,7 @@ def client(tmp_path):
# ---------------------------------------------------------------------------
def test_registry_contains_seven_service_types():
def test_registry_contains_eight_service_types():
assert set(SERVICE_DEFINITIONS) == {
"prometheus",
"alertmanager",
@@ -66,6 +66,7 @@ def test_registry_contains_seven_service_types():
"ssh_tasks",
"backups",
"authentik",
"qbittorrent",
}
@@ -173,6 +174,7 @@ def test_list_service_types(client):
"jellyfin",
"nextcloud",
"prometheus",
"qbittorrent",
"ssh_tasks",
}