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 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@ from __future__ import annotations
|
|||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
from datetime import date
|
from datetime import date, timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
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
|
# A few tickers spanning near + further-out reporters so the initial-load
|
||||||
# forward-horizon gate (>= 21d) is satisfied on the fixed clone.
|
# forward-horizon gate (>= 21d) is satisfied on the fixed clone.
|
||||||
await _seed_tickers(factory, ["AAPL", "MSFT", "NVDA", "JPM", "BRK.B"])
|
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(
|
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)
|
run = await run_import(imp, engine=engine)
|
||||||
|
|
||||||
assert run.status == STATUS_PROMOTED
|
assert run.status == STATUS_PROMOTED, run.error_details
|
||||||
events = await _events(factory)
|
events = await _events(factory)
|
||||||
assert events, "no earnings parsed from the real clone"
|
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"
|
assert any(e.eps_actual is not None for e in events), "no calendar<->history pairing"
|
||||||
|
|||||||
Reference in New Issue
Block a user