fix(market-data): 完善 Tushare 全量同步配置

This commit is contained in:
yuxuanhui
2026-08-06 22:45:18 +08:00
parent afdc5ca909
commit 039a81fe57
6 changed files with 119 additions and 7 deletions
@@ -1,12 +1,19 @@
from datetime import date
from decimal import Decimal
import pytest
from zhixing_server.modules.market_data.domain.fingerprint import (
SnapshotChange,
compare_snapshots,
snapshot_fingerprint,
)
from zhixing_server.modules.market_data.domain.models import Bar, Stock, SyncWindow
from zhixing_server.modules.market_data.domain.models import (
Bar,
DailyBasic,
Stock,
SyncWindow,
)
from zhixing_server.modules.market_data.domain.rules import filter_current_hs_a_stocks
@@ -34,6 +41,30 @@ def test_window_uses_inclusive_calendar_boundary() -> None:
assert window.contains(date(2018, 2, 28))
def test_daily_basic_maps_nan_to_none_but_rejects_infinite_values() -> None:
row = DailyBasic.from_mapping(
{
"ts_code": "000001.SZ",
"trade_date": "20240102",
"pe": float("nan"),
"pb": "NaN",
}
)
assert row.pe is None
assert row.pb is None
for infinite_value in (float("inf"), float("-inf")):
with pytest.raises(ValueError, match="must be finite"):
DailyBasic.from_mapping(
{
"ts_code": "000001.SZ",
"trade_date": "20240102",
"pe": infinite_value,
}
)
def test_universe_keeps_current_non_st_hs_a_stocks() -> None:
stocks = (
Stock("000001.SZ", "平安银行", exchange="SZSE", list_status="L"),
@@ -0,0 +1,46 @@
from datetime import date
import pytest
import tushare as ts # pyright: ignore[reportMissingTypeStubs]
from zhixing_server.modules.market_data.domain.models import SyncWindow
from zhixing_server.modules.market_data.infrastructure.tushare import TushareAdapter
def test_from_token_reuses_api_client_for_pro_bar(
monkeypatch: pytest.MonkeyPatch,
) -> None:
created_client = object()
calls: list[dict[str, object]] = []
def fake_pro_api(token: str) -> object:
assert token
return created_client
def fake_pro_bar(**kwargs: object) -> list[dict[str, object]]:
calls.append(kwargs)
return [
{
"ts_code": "000001.SZ",
"trade_date": "20240102",
"close": "10",
}
]
monkeypatch.setattr(ts, "pro_api", fake_pro_api)
monkeypatch.setattr(ts, "pro_bar", fake_pro_bar)
adapter = TushareAdapter.from_token(
"test-token",
request_interval_seconds=0,
)
bars = adapter.fetch_bars(
"000001.SZ",
SyncWindow(start=date(2024, 1, 2), end=date(2024, 1, 2)),
)
assert bars[0].ts_code == "000001.SZ"
assert calls
assert calls[0]["api"] is created_client
assert calls[0]["adj"] == "qfq"