Files
Hydra-Engine/tests/test_storage.py
2026-03-30 13:19:11 +09:00

86 lines
2.7 KiB
Python

import pytest
from hydra.data.models import Candle
from hydra.data.storage.sqlite import SqliteStore
def test_store_exposes_close():
assert hasattr(SqliteStore, "close")
def make_candle(open_time: int, market="binance", symbol="BTC/USDT", tf="1m") -> Candle:
return Candle(
market=market, symbol=symbol, timeframe=tf,
open_time=open_time, open=50000.0, high=50100.0,
low=49900.0, close=50050.0, volume=1.5,
close_time=open_time + 59999,
)
@pytest.fixture
async def store(tmp_path):
s = SqliteStore(db_path=str(tmp_path / "test.db"))
await s.init()
try:
yield s
finally:
await s.close()
async def test_save_and_query(store):
candles = [make_candle(1_000_000 + i * 60_000) for i in range(5)]
await store.save(candles)
result = await store.query("binance", "BTC/USDT", "1m", limit=10)
assert len(result) == 5
assert result[0].open_time == 1_000_000
assert result[-1].open_time == 1_000_000 + 4 * 60_000
async def test_upsert_updates_close(store):
await store.save([make_candle(1_000_000)])
updated = Candle(
market="binance", symbol="BTC/USDT", timeframe="1m",
open_time=1_000_000, open=50000.0, high=50200.0,
low=49800.0, close=50150.0, volume=2.0,
close_time=1_059_999,
)
await store.save([updated])
result = await store.query("binance", "BTC/USDT", "1m")
assert len(result) == 1
assert result[0].close == 50150.0
async def test_get_last_time_empty(store):
assert await store.get_last_time("binance", "BTC/USDT", "1m") is None
async def test_get_last_time(store):
candles = [make_candle(1_000_000 + i * 60_000) for i in range(3)]
await store.save(candles)
result = await store.get_last_time("binance", "BTC/USDT", "1m")
assert result == 1_000_000 + 2 * 60_000
async def test_query_with_since(store):
candles = [make_candle(1_000_000 + i * 60_000) for i in range(5)]
await store.save(candles)
result = await store.query("binance", "BTC/USDT", "1m", since=1_000_000 + 2 * 60_000)
assert len(result) == 3
assert result[0].open_time == 1_000_000 + 2 * 60_000
async def test_get_symbols(store):
await store.save([make_candle(1_000_000, market="binance", symbol="BTC/USDT")])
await store.save([make_candle(1_000_000, market="upbit", symbol="BTC/KRW")])
symbols = await store.get_symbols()
assert len(symbols) == 2
markets = {s["market"] for s in symbols}
assert "binance" in markets
assert "upbit" in markets
async def test_close_is_idempotent(tmp_path):
store = SqliteStore(db_path=str(tmp_path / "test-close.db"))
await store.init()
await store.close()
await store.close()