Initial public release
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user