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.

84 lines
2.5 KiB
Python

"""Integration test: feature pipeline (event + mock price → feature snapshot)."""
import datetime as dt
import pytest
from pytest_httpx import HTTPXMock
@pytest.mark.integration
@pytest.mark.asyncio
async def test_feature_snapshot_created(db_session, httpx_mock: HTTPXMock, price_data_fixture, sample_parser_output):
"""Given a valid event + parse, feature snapshots should be created."""
from libs.db.models import (
Document,
Event,
EventParse,
IssuerMaster,
SymbolMaster,
)
from libs.features.builder import build_features_for_event
from libs.oracle_client.client import OracleClient
from libs.oracle_client.price import PriceService
# Mock price endpoint
httpx_mock.add_response(json=price_data_fixture)
# Setup DB records
issuer = IssuerMaster(issuer_id="ISSUER::0000320193", issuer_name="Apple Inc.", ticker="AAPL")
db_session.add(issuer)
symbol = SymbolMaster(
symbol_id="SYM::AAPL::XNYS",
issuer_id="ISSUER::0000320193",
ticker="AAPL",
venue="XNYS",
)
db_session.add(symbol)
doc = Document(
document_id="DOC::sec::ISSUER::0000320193::2026-01-29::ACC001",
source_name="sec",
form_type="8-K",
filing_date=dt.date(2026, 1, 29),
accession_no="ACC001",
parsed_status="succeeded",
)
db_session.add(doc)
await db_session.flush()
event = Event(
event_id="EVT::test::earnings_release::0",
primary_document_id=doc.document_id,
symbol_id="SYM::AAPL::XNYS",
event_type="earnings_release",
event_direction="bullish",
event_date=dt.date(2026, 1, 29),
parser_version="rule-1.0.0",
status="pending",
)
db_session.add(event)
await db_session.flush()
parse = EventParse(
event_id=event.event_id,
parser_kind="rule",
parser_version="rule-1.0.0",
schema_version="1.0.0",
output_json=sample_parser_output,
validation_status="valid",
)
db_session.add(parse)
await db_session.flush()
async with OracleClient("http://oracle:18001") as client:
price_svc = PriceService(client)
result = await build_features_for_event(db_session, event, price_svc)
assert result is not None
market_snap, event_snap = result
assert market_snap.snapshot_name == "market_v1"
assert event_snap.snapshot_name == "event_v1"
assert "reaction_day_return" in market_snap.feature_json
assert "guidance_direction_score" in event_snap.feature_json