fix(plex): E30 review round 3 — a dead headshot breaks the Plex-failing streak, 410 held by a test

This commit is contained in:
2026-10-01 10:43:59 +02:00
parent 9454717f47
commit 08e62bbb16
3 changed files with 21 additions and 8 deletions
+18 -6
View File
@@ -117,13 +117,15 @@ def test_the_batch_stores_the_hungarian_biography(db):
class _Plex:
"""A PlexClient stand-in. `down`: urls Plex does not answer for (True: none); `dead`: urls Plex
answers "not found" for (a dead CDN file); `status`: an error status Plex answers every url with."""
answers `gone` for (a dead CDN file: "not found"); `status`: an error status Plex answers every
other url with."""
def __init__(self, down=False, dead=(), status=None):
def __init__(self, down=False, dead=(), status=None, gone=404):
self.asked: list[tuple[str, int | None]] = []
self.down = down
self.dead = set(dead)
self.status = status
self.gone = gone
def __enter__(self):
return self
@@ -135,7 +137,7 @@ class _Plex:
self.asked.append((url, width))
if self.down is True or (self.down and url in self.down):
raise plex_people.PlexError("down") from httpx.ConnectError("refused")
code = 404 if url in self.dead else self.status
code = self.gone if url in self.dead else self.status
if code:
req = httpx.Request("GET", url)
status = httpx.HTTPStatusError(
@@ -236,13 +238,23 @@ def test_plex_failing_between_successes_does_not_end_the_run(db, cache_dir, plex
assert plex_people.warm_portraits(db, 100) == {"cached": 4, "failed": 4}
def test_dead_headshots_are_left_alone_and_the_rest_still_land(db, cache_dir, plex_on):
def test_plex_failing_between_dead_files_does_not_end_the_run(db, cache_dir, plex_on):
_faces(db, 8)
plex_on["plex"] = _Plex( # down, dead, down, dead, …: Plex answers in between
down={CDN + f"{i}.jpg" for i in (0, 2, 4, 6)}, dead={CDN + f"{i}.jpg" for i in (1, 3, 5, 7)}
)
assert plex_people.warm_portraits(db, 100) == {"cached": 0, "failed": 8}
assert len(plex_on["plex"].asked) == 8
@pytest.mark.parametrize("gone", [404, 410])
def test_dead_headshots_are_left_alone_and_the_rest_still_land(db, cache_dir, plex_on, gone):
_faces(db, 8)
dead = {CDN + f"{i}.jpg" for i in range(6)} # more dead files than any failure limit
plex_on["plex"] = _Plex(dead=dead)
plex_on["plex"] = _Plex(dead=dead, gone=gone)
assert plex_people.warm_portraits(db, 100) == {"cached": 2, "failed": 6}
plex_on["plex"] = again = _Plex(dead=dead)
plex_on["plex"] = again = _Plex(dead=dead, gone=gone)
assert plex_people.warm_portraits(db, 100) == {"cached": 0}
assert again.asked == [] # dead ones marked, live ones cached: nothing to ask for