read.markets/tests
Giorgio Gilestro a113a7f3ce test+fix: make the suite run cleanly in the test container
Five fixes uncovered by actually running the suite in docker-compose.test.yml:

1. (real prod bug) PATCH /api/settings/digest mutated principal.user which
   require_token had loaded in a now-closed session — the commit on the
   handler's session persisted nothing. Re-fetch the user via the active
   session before writing.

2. Portable PK type. SQLite only auto-fills `INTEGER PRIMARY KEY`; plain
   BIGINT requires explicit values. Define a `_PK` alias of
   `BigInteger().with_variant(Integer(), "sqlite")` and use it for all 10
   autoincrement primary keys in app/models.py. No prod-schema change
   (MariaDB still gets BIGINT).

3. job_lifecycle's MariaDB GET_LOCK / RELEASE_LOCK is now gated behind
   `dialect.name == "mysql"`, so the test SQLite engine doesn't trip on
   the missing function. Single-process test runs can't race themselves.

4. tests/test_news_window.py seeded Headline rows without `fingerprint`,
   which is NOT NULL — added an `fp-{title}` value per row.

5. tests/test_email_digest_job.py now also patches `llm_configured` to
   True so the job doesn't short-circuit on the missing API key.

6. (test container hygiene) Drop `COPY tests ./tests` from the test stage
   in the Dockerfile — .dockerignore excludes `tests/` (correct: prod
   image must not bake tests), and docker-compose.test.yml bind-mounts
   ./tests at run time anyway.

Suite now: 198 passed, 5 skipped, 1 pre-existing failure
(test_default_groups_present — Phase G dropped the "pie" group from
config/default.toml but the assertion wasn't updated; unrelated to this
branch).
2026-05-26 00:11:18 +02:00
..
fixtures phase B (1/4): CSV parser + InstrumentMap (T212 shortcode → Yahoo ticker) 2026-05-16 10:53:08 +01:00
conftest.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
test_access.py phase D milestones 1+2: referral system + paid-access gate 2026-05-21 23:25:35 +01:00
test_api_helpers.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
test_branding_consistency.py ui: light theme by default (dark is opt-in) 2026-05-22 21:51:23 +01:00
test_cli.py phase D milestones 1+2: referral system + paid-access gate 2026-05-21 23:25:35 +01:00
test_config_loading.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
test_csv_import.py sync: encrypted cloud backup for portfolios + settings UX rework 2026-05-23 16:15:54 +02:00
test_digest_prompts.py digest: factor tone clause; kw-only digest helper; empty-data test 2026-05-25 23:00:07 +02:00
test_email_digest_job.py test+fix: make the suite run cleanly in the test container 2026-05-26 00:11:18 +02:00
test_email_render.py email: render_digest_email — multipart digest template 2026-05-25 23:02:05 +02:00
test_email_service.py brand: rename product to "Read the Markets" (read.markets) 2026-05-22 19:39:38 +01:00
test_email_unsubscribe.py email: tighten unsubscribe — test isolation, accurate comments, tighter assertion 2026-05-25 23:10:29 +02:00
test_glossary.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
test_instrument_map.py phase B (1/4): CSV parser + InstrumentMap (T212 shortcode → Yahoo ticker) 2026-05-16 10:53:08 +01:00
test_market_parsing.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
test_news_parsing.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
test_news_tagging.py news: auto-tag headlines + market-aware cadence + filter UI 2026-05-21 23:25:03 +01:00
test_news_window.py test+fix: make the suite run cleanly in the test container 2026-05-26 00:11:18 +02:00
test_openrouter_prompt.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
test_otp_service.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
test_pending_cookie.py phase D milestones 1+2: referral system + paid-access gate 2026-05-21 23:25:35 +01:00
test_portfolio_analysis.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
test_portfolio_sync_api.py sync: detect orphaned blobs (pepper rotation) + fix AESGCM arg order 2026-05-25 12:49:11 +02:00
test_portfolio_sync_service.py sync: encrypted cloud backup for portfolios + settings UX rework 2026-05-23 16:15:54 +02:00
test_referral.py phase D milestones 1+2: referral system + paid-access gate 2026-05-21 23:25:35 +01:00
test_settings_digest_api.py settings: digest opt-in + tone (PATCH /api/settings/digest + UI) 2026-05-25 23:23:03 +02:00
test_universe_unlinkability.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
test_verify_subscribe.py beta-launch: respect returning-user opt-out + show digest job in ops LEDs 2026-05-25 23:33:53 +02:00