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:
@@ -100,14 +100,11 @@ def _seed(db):
|
||||
return {"user": user}
|
||||
|
||||
|
||||
def _get(db, user, monkeypatch, path):
|
||||
def _get(db, user, monkeypatch, override_dep, path):
|
||||
monkeypatch.setattr(state, "_configured_cache", True)
|
||||
app.dependency_overrides[get_db] = lambda: db
|
||||
app.dependency_overrides[current_user] = lambda: user
|
||||
try:
|
||||
return TestClient(app).get(path)
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
override_dep(get_db, lambda: db)
|
||||
override_dep(current_user, lambda: user)
|
||||
return TestClient(app).get(path)
|
||||
|
||||
|
||||
def _ids(body):
|
||||
@@ -115,55 +112,75 @@ def _ids(body):
|
||||
|
||||
|
||||
class TestFieldScopedSearch:
|
||||
def test_everywhere_matches_every_facet(self, db, monkeypatch):
|
||||
def test_everywhere_matches_every_facet(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=all").json()
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=all"
|
||||
).json()
|
||||
# title (mt), cast (mp), summary (ms) all land in the item grid; the episode is grouped out
|
||||
assert _ids(body) == ["mp", "ms", "mt"]
|
||||
assert [e["title"] for e in body["episodes"]] == ["Zephyr Episode"]
|
||||
|
||||
def test_field_all_is_identical_to_default(self, db, monkeypatch):
|
||||
def test_field_all_is_identical_to_default(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
default = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr").json()
|
||||
scoped = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=all").json()
|
||||
default = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr"
|
||||
).json()
|
||||
scoped = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=all"
|
||||
).json()
|
||||
assert _ids(default) == _ids(scoped) == ["mp", "ms", "mt"]
|
||||
assert default["total"] == scoped["total"]
|
||||
assert [e["id"] for e in default["episodes"]] == [e["id"] for e in scoped["episodes"]]
|
||||
|
||||
def test_title_scope_narrows_to_title_match(self, db, monkeypatch):
|
||||
def test_title_scope_narrows_to_title_match(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=title").json()
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=title"
|
||||
).json()
|
||||
assert _ids(body) == ["mt"]
|
||||
assert body["total"] == 1
|
||||
assert body["episodes"] == [] # non-episode field scopes suppress the episode section
|
||||
|
||||
def test_people_scope_narrows_to_cast_match(self, db, monkeypatch):
|
||||
def test_people_scope_narrows_to_cast_match(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=people").json()
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=people"
|
||||
).json()
|
||||
assert _ids(body) == ["mp"]
|
||||
|
||||
def test_summary_scope_narrows_to_description_match(self, db, monkeypatch):
|
||||
def test_summary_scope_narrows_to_description_match(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=summary").json()
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=summary"
|
||||
).json()
|
||||
assert _ids(body) == ["ms"]
|
||||
|
||||
def test_episode_scope_empties_grid_and_returns_episode(self, db, monkeypatch):
|
||||
def test_episode_scope_empties_grid_and_returns_episode(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=episode").json()
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=episode"
|
||||
).json()
|
||||
assert body["items"] == []
|
||||
assert body["total"] == 0
|
||||
assert [e["title"] for e in body["episodes"]] == ["Zephyr Episode"]
|
||||
|
||||
def test_episode_scope_needs_shows_in_scope(self, db, monkeypatch):
|
||||
def test_episode_scope_needs_shows_in_scope(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=episode&scope=movie"
|
||||
db,
|
||||
s["user"],
|
||||
monkeypatch,
|
||||
override_dep,
|
||||
"/api/plex/library?q=zephyr&field=episode&scope=movie",
|
||||
).json()
|
||||
# movie-only scope has no show libraries -> no episodes to surface, and the grid stays empty
|
||||
assert body["items"] == []
|
||||
assert body["episodes"] == []
|
||||
|
||||
def test_unknown_field_falls_back_to_everywhere(self, db, monkeypatch):
|
||||
def test_unknown_field_falls_back_to_everywhere(self, db, monkeypatch, override_dep):
|
||||
s = _seed(db)
|
||||
body = _get(db, s["user"], monkeypatch, "/api/plex/library?q=zephyr&field=bogus").json()
|
||||
body = _get(
|
||||
db, s["user"], monkeypatch, override_dep, "/api/plex/library?q=zephyr&field=bogus"
|
||||
).json()
|
||||
assert _ids(body) == ["mp", "ms", "mt"]
|
||||
|
||||
Reference in New Issue
Block a user