You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.3 KiB
Python
94 lines
3.3 KiB
Python
"""Integration test: --renormalize-oracle-fallback applies the normalizer in DB.
|
|
|
|
Drives ``_apply_oracle_renormalization()`` against the test session so the
|
|
helper executes against a real Postgres while the surrounding transaction
|
|
rolls back at the end of the test.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import datetime as dt
|
|
|
|
import pytest
|
|
from sqlalchemy import select
|
|
|
|
|
|
@pytest.mark.integration
|
|
@pytest.mark.asyncio
|
|
async def test_renormalize_updates_oracle_fallback_event_type(db_session):
|
|
from apps.pipeline.event_parser.main import _apply_oracle_renormalization
|
|
from libs.db.models import Document, Event, IssuerMaster, SymbolMaster
|
|
|
|
issuer = IssuerMaster(
|
|
issuer_id="ISSUER::RNRM::0000000001",
|
|
issuer_name="Renormalize Test Co.",
|
|
ticker="RNRM",
|
|
)
|
|
db_session.add(issuer)
|
|
|
|
symbol = SymbolMaster(
|
|
symbol_id="SYM::RNRM::XNYS",
|
|
issuer_id="ISSUER::RNRM::0000000001",
|
|
ticker="RNRM",
|
|
venue="XNYS",
|
|
)
|
|
db_session.add(symbol)
|
|
|
|
doc = Document(
|
|
document_id="DOC::test::ISSUER::RNRM::2026-04-01::RNRMACC001",
|
|
source_name="sec",
|
|
form_type="8-K",
|
|
filing_date=dt.date(2026, 4, 1),
|
|
accession_no="RNRMACC001",
|
|
parsed_status="succeeded",
|
|
)
|
|
db_session.add(doc)
|
|
await db_session.flush()
|
|
|
|
# Three rows covering: a stale Oracle synonym (earnings_result),
|
|
# an aggregation case (shareholder_vote), and an already-aligned row
|
|
# that must NOT change.
|
|
targets = [
|
|
("EVT::test::earnings_result::0", "earnings_result", "earnings_release"),
|
|
("EVT::test::shareholder_vote::0", "shareholder_vote", "other_material_event"),
|
|
("EVT::test::other_material_event::0", "other_material_event", "other_material_event"),
|
|
# Honest pass-through case — unmapped Oracle vocab stays as-is.
|
|
("EVT::test::financial_obligation::0", "financial_obligation", "financial_obligation"),
|
|
]
|
|
|
|
for evt_id, raw_type, _expected in targets:
|
|
db_session.add(
|
|
Event(
|
|
event_id=evt_id,
|
|
primary_document_id=doc.document_id,
|
|
symbol_id="SYM::RNRM::XNYS",
|
|
event_type=raw_type,
|
|
event_direction="unknown",
|
|
event_date=dt.date(2026, 4, 1),
|
|
filed_at_utc=dt.datetime(2026, 4, 1, 22, 0, tzinfo=dt.UTC),
|
|
parser_version="oracle-fallback-rule-1.0.0",
|
|
status="pending",
|
|
)
|
|
)
|
|
await db_session.flush()
|
|
|
|
stats = await _apply_oracle_renormalization(db_session)
|
|
|
|
assert stats["seen"] >= 4
|
|
# 2 of our 4 fixture rows should flip.
|
|
assert stats["updated"] >= 2
|
|
# Both already-aligned and pass-through rows count as skipped.
|
|
assert stats["skipped"] >= 2
|
|
assert stats["errors"] == 0
|
|
|
|
transitions = stats["transitions"]
|
|
assert transitions.get("earnings_result -> earnings_release", 0) >= 1
|
|
assert transitions.get("shareholder_vote -> other_material_event", 0) >= 1
|
|
|
|
# Verify the actual row state in the DB matches expectations.
|
|
for evt_id, _raw_type, expected in targets:
|
|
row = await db_session.execute(select(Event).where(Event.event_id == evt_id))
|
|
evt = row.scalar_one()
|
|
assert evt.event_type == expected, (
|
|
f"{evt_id}: expected {expected}, got {evt.event_type}"
|
|
)
|