Files
sanguo_vnpy_v2/tests/data/test_datareader.py
T
claude_dev a1048690c1 test: 前后端对齐—容器复跑验证+清理僵尸测试
- test_main: FastAPI 0.139 _IncludedRouter 不再 flatten,改用 TestClient 探测路由
- datareader: 文件名(sh600000_daily)/patch target(vnpy.trader.database) 对齐 lazy import 实现
- alpha_lab/analyzer/data_adapter: vnpy.alpha/alphalens 容器专用本地 skip
- 删 4 个测废弃 sanguo_web 的僵尸测试(-1267 行死代码)
- pytest.ini: asyncio_mode=auto
- frontend: package.json 加 test script(npm test 可跑)
- NAS 容器 309 passed 全绿验证(Python 3.10,本机 303+6skip)
2026-07-11 11:45:26 +08:00

76 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import pandas as pd
from unittest.mock import patch, MagicMock
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.setting import SETTINGS
from sanguo_data.config import DataConfig
from sanguo_data.datareader import read_parquet_daily, guess_exchange, read_db_daily
def test_read_parquet_daily_returns_bardata(tmp_path):
year_dir = tmp_path / "2026"
year_dir.mkdir()
df = pd.DataFrame({
"date": ["2026-01-05", "2026-01-06"],
"open": [10.0, 11.0], "high": [10.5, 11.5],
"low": [9.8, 10.8], "close": [10.2, 11.2],
"volume": [10000, 12000],
})
df.to_parquet(year_dir / "sh600000_daily.parquet") # 实现读 {prefix}{symbol}_daily.parquetline 24
cfg = DataConfig(
data_paths={"daily_dir": str(tmp_path)},
data_sources={}, validation={}, performance={},
)
bars = read_parquet_daily("600000", "2026-01-01", "2026-12-31", cfg)
assert len(bars) == 2
assert bars[0].symbol == "600000"
assert bars[0].open_price == 10.0
def test_read_parquet_daily_dir_key_raw(tmp_path):
"""dir_key='raw_dir':切换到 raw 目录读真实价(task #79 双源)。"""
raw_year = tmp_path / "2026"
raw_year.mkdir()
df = pd.DataFrame({
"date": ["2026-03-30"],
"open": [9.97], "high": [10.05], "low": [9.95],
"close": [10.01], "volume": [800000],
})
df.to_parquet(raw_year / "sh600000_daily.parquet") # 真实文件名:sh 前缀 + _daily
cfg = DataConfig(
data_paths={"raw_dir": str(tmp_path)},
data_sources={}, validation={}, performance={},
)
bars = read_parquet_daily("600000", "2026-01-01", "2026-12-31", cfg, dir_key="raw_dir")
assert len(bars) == 1
assert bars[0].close_price == 10.01
def test_guess_exchange_sh():
assert guess_exchange("600000").value == "SSE"
def test_guess_exchange_sz():
assert guess_exchange("000001").value == "SZSE"
def test_read_db_daily_configures_vnpy_settings():
"""Test that read_db_daily configures vnpy SETTINGS with correct database path."""
cfg = DataConfig(
data_paths={"vnpy_db": "/volume1/stock/sanguo_vnpy/data/quant_trading.db"},
data_sources={}, validation={}, performance={},
)
# Mock get_database to avoid actual database connection
mock_db = MagicMock()
mock_db.load_bar_data.return_value = [] # Return empty list to avoid data processing
# read_db_daily 内部 lazy importfrom vnpy.trader.database import get_database),
# 故 patch 源模块属性,非 sanguo_data.datareader(其上无 get_database
with patch('vnpy.trader.database.get_database', return_value=mock_db):
# Call read_db_daily
read_db_daily("600000", "2024-01-01", "2024-12-31", cfg)
# Assert that SETTINGS was configured correctly
assert SETTINGS["database.name"] == "sqlite", f"Expected database.name to be 'sqlite', got {SETTINGS.get('database.name')}"
assert SETTINGS["database.database"] == cfg.data_paths["vnpy_db"], f"Expected database.database to be {cfg.data_paths['vnpy_db']}, got {SETTINGS.get('database.database')}"