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

"""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}"
)