Fix two more test bugs surfaced by the full integration run
CI / lint (push) Canceled after 0s
CI / typecheck (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / integration-tests (push) Canceled after 0s
CI / container-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s

1. test_ingestion_cache_invalidation.py: the job was created through
   the test's db_session fixture, whose commit() only ends a savepoint
   that gets rolled back at teardown (see tests/conftest.py) -- it's
   never a real commit. _run_ingestion looks the job up through its
   own session_scope() (a genuinely separate connection), which could
   never see it, so the very first _require_job call raised "job
   vanished mid-run" every time. Worse, test_failed_ingestion_does_not_
   invalidate_the_cache still passed, coincidentally -- it expected a
   RuntimeError and got one, just the wrong one, masking the bug.
   Fixed by having _make_job create the job through session_scope()
   itself, matching test_ingestion_retry.py's existing pattern.

2. Same class of bug as the video-collision fix in the last commit:
   FAKE_MOVIE's fixed imdb_id ("tt0133093"), not just its video, also
   collides across two different fake movies sharing it unmodified --
   uq_external_id_source is a real unique constraint on
   (provider_id, entity_type, external_id). Fixed by also overriding
   imdb_id on the second movie in both affected tests.

All caught by running the actual integration suite against Postgres --
these paths were previously only collect-only'd locally (no local DB).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
NixReaper
2026-09-05 20:17:02 -05:00
co-authored by Claude Sonnet 5
parent 29fffc8919
commit 0a50e0ffb6
3 changed files with 38 additions and 27 deletions
+6 -5
View File
@@ -188,16 +188,17 @@ async def test_movie_recommendations_only_include_already_ingested_movies(
external id (section 15: never fabricate a stub for an unseen entity),
and GET .../recommendations must return them in TMDb's ranked order."""
# videos overridden to empty: FAKE_MOVIE's embedded video has a fixed
# provider_video_id, and two different movies both ingesting it would
# collide on the real uq_video_provider_source unique constraint --
# a video id is only ever attached to one entity, unlike genres/companies
# which are legitimately shared.
# videos and imdb_id overridden: FAKE_MOVIE's embedded video and imdb_id
# are both fixed identifiers, and two different movies both ingesting
# them unmodified would collide on the real uq_video_provider_source /
# uq_external_id_source unique constraints -- each belongs to exactly
# one entity, unlike genres/companies which are legitimately shared.
sequel_payload = {
**FAKE_MOVIE,
"id": 604,
"title": "The Matrix Reloaded",
"videos": {"results": []},
"imdb_id": "tt0234215",
}
await ingest_movie(db_session, FakeTMDbProvider(sequel_payload), "604")
await db_session.flush()