From 7dc804be2b55ec3da7ad741ccd1dd8e472f7f868 Mon Sep 17 00:00:00 2001 From: Dennis Thiessen Date: Fri, 7 Aug 2026 18:22:11 +0200 Subject: [PATCH] test(dolt): anchor the real-clone smoke test to the clone, not the wall clock The test built the importer with today=date.today() while running against a fixed local clone with do_pull=False, so its forward horizon shrank by a day per real day. It has now decayed past the initial-load gate -- 19d against the 21d MIN_FORWARD_HORIZON_DAYS floor -- and would have kept failing, worse each day. Anchors today to the clone's own calendar (max reporting date across the seeded dot-free symbols, minus 35 days, mirroring the ~35d horizon the importer's own comment cites) and uses that date in the forward-calendar assertion. Also surfaces run.error_details on failure, which is how the cause was found. Test-only. MIN_FORWARD_HORIZON_DAYS and the importer are untouched: production pulls fresh data on every run and was never affected by this. Co-Authored-By: Claude Opus 5 --- tests/unit/test_dolt_earnings_importer.py | 24 +++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_dolt_earnings_importer.py b/tests/unit/test_dolt_earnings_importer.py index aea6521..79846ec 100644 --- a/tests/unit/test_dolt_earnings_importer.py +++ b/tests/unit/test_dolt_earnings_importer.py @@ -12,7 +12,7 @@ from __future__ import annotations import os import shutil import tempfile -from datetime import date +from datetime import date, timedelta from pathlib import Path import pytest @@ -252,13 +252,29 @@ async def test_real_clone_smoke(engine): # A few tickers spanning near + further-out reporters so the initial-load # forward-horizon gate (>= 21d) is satisfied on the fixed clone. await _seed_tickers(factory, ["AAPL", "MSFT", "NVDA", "JPM", "BRK.B"]) + + # "today" is anchored to the clone, NOT the wall clock. The clone is fixed + # and do_pull=False, so a wall-clock today makes this test decay: the + # forward horizon shrinks a day per real day and eventually trips the + # >= 21d gate (it did, at 19d). Anchoring keeps it time-stable. Production + # pulls fresh data and is unaffected. Dot-free symbols only, so the query + # needs no symbol normalisation. + rows = await dolt_client.query_csv( + _CLONE_DIR, + "SELECT MAX(`date`) AS max_date FROM earnings_calendar " + "WHERE act_symbol IN ('AAPL', 'MSFT', 'NVDA', 'JPM')", + binary=_DOLT_BIN, + ) + max_date = date.fromisoformat(rows[0]["max_date"]) + today = max_date - timedelta(days=35) # ~35d horizon, per the importer's note + imp = DoltEarningsImporter( - repo_dir=_CLONE_DIR, binary=_DOLT_BIN, today=date.today(), do_pull=False, dolt=dolt_client + repo_dir=_CLONE_DIR, binary=_DOLT_BIN, today=today, do_pull=False, dolt=dolt_client ) run = await run_import(imp, engine=engine) - assert run.status == STATUS_PROMOTED + assert run.status == STATUS_PROMOTED, run.error_details events = await _events(factory) assert events, "no earnings parsed from the real clone" - assert any(e.announce_date > date.today() for e in events), "no forward calendar" + assert any(e.announce_date > today for e in events), "no forward calendar" assert any(e.eps_actual is not None for e in events), "no calendar<->history pairing"