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
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
|