from __future__ import annotations import json from datetime import date, datetime, timezone from app.models.data_import_run import DataImportRun from app.models.fundamental_snapshot import FundamentalSnapshot from app.models.sec_filing_gap import SecFilingGap from app.models.settings import SystemSetting from app.models.ticker import Ticker from app.services import fundamentals_quality_service async def test_latest_sec_validation_blocks_deferred_and_no_history_ciks( db_session, ): missing = Ticker(symbol="MISSING", cik="0000000001") no_history = Ticker(symbol="NEWREG", cik="0000000002") healthy = Ticker(symbol="HEALTHY", cik="0000000003") db_session.add_all([missing, no_history, healthy]) await db_session.flush() db_session.add( SystemSetting( key="fundamental_data_sec_dolt_cutover_enabled", value="true", ) ) db_session.add( DataImportRun( source="sec_facts", status="deferred", validation_json=json.dumps({ "missing_xbrl": [{"cik": missing.cik, "accession": "MISSING-Q"}], "no_xbrl_filings": [{"cik": no_history.cik}], }), started_at=datetime.now(timezone.utc), ) ) await db_session.flush() assert await fundamentals_quality_service.blocked_ticker_ids(db_session) == { missing.id, no_history.id, } async def test_sec_quality_gate_is_inactive_before_cutover(db_session): ticker = Ticker(symbol="SHADOW", cik="0000000042") db_session.add(ticker) await db_session.flush() now = datetime.now(timezone.utc) db_session.add( SecFilingGap( cik=ticker.cik, accession="SHADOW-Q", form="10-Q", index_date=date.today(), reason="not_in_companyfacts", first_seen_at=now, last_attempted_at=now, ) ) await db_session.flush() assert await fundamentals_quality_service.blocked_ticker_ids(db_session) == set() async def test_promoted_gap_is_blocked_during_queue_migration_bootstrap(db_session): ticker = Ticker(symbol="HIST", cik="0000000043") db_session.add_all([ ticker, SystemSetting( key="fundamental_data_sec_dolt_cutover_enabled", value="true", ), DataImportRun( source="sec_facts", status="promoted", validation_json=json.dumps({ "missing_xbrl": [{"cik": ticker.cik, "accession": "HIST-Q"}], }), started_at=datetime.now(timezone.utc), ), DataImportRun( source="sec_facts", status="promoted", validation_json=json.dumps({"missing_xbrl": []}), started_at=datetime.now(timezone.utc), ), ]) await db_session.flush() assert await fundamentals_quality_service.blocked_ticker_ids(db_session) == { ticker.id } db_session.add( FundamentalSnapshot( cik=ticker.cik, accession="HIST-Q", form="10-Q", filed_date=date.today(), accepted_at=datetime.now(timezone.utc), period_end=date.today(), fiscal_year=date.today().year, fiscal_period="Q2", ) ) await db_session.flush() assert await fundamentals_quality_service.blocked_ticker_ids(db_session) == set()