test(be): every dependency override goes through override_dep

22 test files set `app.dependency_overrides[...]` by hand and tore down with a blanket `.clear()`
in a `finally`, which wipes every override rather than the test's own and stops fixtures composing.
They now take the `override_dep` fixture (helpers get it passed in), whose teardown restores each
key's prior value; no clear() carried meaning between two phases of a test. A convention test fails
any test file that writes `dependency_overrides` directly.
This commit is contained in:
2026-09-19 17:26:07 +02:00
parent dc902d2c0e
commit 8759b5860d
23 changed files with 537 additions and 529 deletions
+11 -14
View File
@@ -42,7 +42,7 @@ def _seed(db, *, status: str, position: int):
return it, user
def _clear(db, user, it, monkeypatch) -> list[tuple]:
def _clear(db, user, it, monkeypatch, override_dep) -> list[tuple]:
"""Drive the endpoint with the Plex link satisfied and the background push recorded."""
pushes: list[tuple] = []
monkeypatch.setattr(state, "_configured_cache", True) # pass the instance-setup request gate
@@ -52,32 +52,29 @@ def _clear(db, user, it, monkeypatch) -> list[tuple]:
"push_state_to_plex",
lambda user_id, item_id, rating_key, action, *rest: pushes.append((rating_key, action)),
)
app.dependency_overrides[get_db] = lambda: db
app.dependency_overrides[current_user] = lambda: user
try:
resp = TestClient(app).post(f"/api/plex/item/{it.rating_key}/state", json={"status": "new"})
assert resp.status_code == 200, resp.text
finally:
app.dependency_overrides.clear()
override_dep(get_db, lambda: db)
override_dep(current_user, lambda: user)
resp = TestClient(app).post(f"/api/plex/item/{it.rating_key}/state", json={"status": "new"})
assert resp.status_code == 200, resp.text
return pushes
def test_clearing_an_in_progress_item_tells_plex(db, monkeypatch):
def test_clearing_an_in_progress_item_tells_plex(db, monkeypatch, override_dep):
# The regression: status "new" + a position IS the in-progress shape, and it must push.
it, user = _seed(db, status="new", position=92)
assert _clear(db, user, it, monkeypatch) == [("98614", "unwatched")]
assert _clear(db, user, it, monkeypatch, override_dep) == [("98614", "unwatched")]
assert db.query(PlexState).count() == 0
def test_clearing_a_watched_item_still_tells_plex(db, monkeypatch):
def test_clearing_a_watched_item_still_tells_plex(db, monkeypatch, override_dep):
# The case the old guard did cover — kept, so the fix cannot narrow into a new hole.
it, user = _seed(db, status="watched", position=0)
assert _clear(db, user, it, monkeypatch) == [("98614", "unwatched")]
assert _clear(db, user, it, monkeypatch, override_dep) == [("98614", "unwatched")]
def test_unhiding_touches_plex_not_at_all(db, monkeypatch):
def test_unhiding_touches_plex_not_at_all(db, monkeypatch, override_dep):
# `hidden` is a Siftlode-only concept "with no Plex analogue, so it never touches Plex" — the
# endpoint's own docstring. The old status-only guard pushed here anyway, un-marking an item on
# Plex that the user had merely hidden.
it, user = _seed(db, status="hidden", position=0)
assert _clear(db, user, it, monkeypatch) == []
assert _clear(db, user, it, monkeypatch, override_dep) == []