fix: refresh same-day OHLCV bars
This commit is contained in:
@@ -6,6 +6,8 @@ from datetime import date, timedelta
|
||||
|
||||
import pytest
|
||||
|
||||
from app.models.ohlcv import OHLCVRecord
|
||||
from app.models.settings import IngestionProgress
|
||||
from app.models.ticker import Ticker
|
||||
from app.providers.protocol import OHLCVData
|
||||
from app.services import ingestion_service as svc
|
||||
@@ -18,9 +20,12 @@ async def session():
|
||||
yield s
|
||||
|
||||
|
||||
async def _add_ticker(session, symbol: str) -> None:
|
||||
session.add(Ticker(symbol=symbol))
|
||||
async def _add_ticker(session, symbol: str) -> Ticker:
|
||||
ticker = Ticker(symbol=symbol)
|
||||
session.add(ticker)
|
||||
await session.commit()
|
||||
await session.refresh(ticker)
|
||||
return ticker
|
||||
|
||||
|
||||
def _bars(symbol: str, n: int) -> list[OHLCVData]:
|
||||
@@ -51,6 +56,50 @@ async def test_happy_path_ingests_bars(session):
|
||||
assert result.records_ingested == 3
|
||||
|
||||
|
||||
async def test_incremental_fetch_overlaps_latest_session_and_updates_partial_bar(session):
|
||||
"""Once today exists, a live refresh must fetch and overwrite it again."""
|
||||
ticker = await _add_ticker(session, "LIVE")
|
||||
today = date.today()
|
||||
session.add_all([
|
||||
OHLCVRecord(
|
||||
ticker_id=ticker.id,
|
||||
date=today - timedelta(days=i),
|
||||
open=100.0,
|
||||
high=101.0,
|
||||
low=99.0,
|
||||
close=100.0,
|
||||
volume=1000,
|
||||
)
|
||||
for i in range(200)
|
||||
])
|
||||
session.add(IngestionProgress(ticker_id=ticker.id, last_ingested_date=today))
|
||||
await session.commit()
|
||||
|
||||
provider = MockMarketDataProvider(ohlcv_data=[
|
||||
OHLCVData(
|
||||
ticker="LIVE",
|
||||
date=today,
|
||||
open=100.0,
|
||||
high=124.0,
|
||||
low=99.0,
|
||||
close=123.0,
|
||||
volume=2000,
|
||||
)
|
||||
])
|
||||
result = await svc.fetch_and_ingest(session, provider, "LIVE")
|
||||
|
||||
assert provider.calls == [{
|
||||
"ticker": "LIVE",
|
||||
"start_date": today,
|
||||
"end_date": today,
|
||||
}]
|
||||
assert result.status == "complete"
|
||||
assert result.records_ingested == 1
|
||||
records = await svc.price_service.query_ohlcv(session, "LIVE", today, today)
|
||||
assert records[0].close == 123.0
|
||||
assert records[0].volume == 2000
|
||||
|
||||
|
||||
async def test_empty_fetch_with_existing_history_is_up_to_date(session):
|
||||
# Covered ticker, just no new bars in the window → complete, not no_data.
|
||||
await _add_ticker(session, "BBB")
|
||||
|
||||
Reference in New Issue
Block a user