Raise coverage threshold to 95% and expand test coverage
- pyproject.toml: fail_under 80 → 95 - test_alpha: +79 lines - test_cli_workflow: +226 lines - test_derived: +121 lines - test_downloader_contracts: +169 lines - test_features: +16 lines - test_minute_downloader: +81 lines - test_portfolio: +208 lines
This commit is contained in:
@@ -178,6 +178,37 @@ def test_download_minute_batch_second_session_loss_yields_none(monkeypatch):
|
||||
]
|
||||
|
||||
|
||||
def test_download_minute_batch_ignores_relogin_and_final_logout_failures(monkeypatch):
|
||||
responses = [
|
||||
_FakeResult([], error_code="1", error_msg="bad symbol"),
|
||||
_FakeResult([]),
|
||||
]
|
||||
logout_count = 0
|
||||
|
||||
def fake_logout():
|
||||
nonlocal logout_count
|
||||
logout_count += 1
|
||||
raise RuntimeError("logout failed")
|
||||
|
||||
monkeypatch.setattr(low_level_downloader.bs, "login", lambda: None)
|
||||
monkeypatch.setattr(low_level_downloader.bs, "logout", fake_logout)
|
||||
monkeypatch.setattr(
|
||||
low_level_downloader.bs,
|
||||
"query_history_k_data_plus",
|
||||
lambda **kwargs: responses.pop(0),
|
||||
)
|
||||
|
||||
assert list(
|
||||
download_minute_batch(
|
||||
["sh600000", "sz000001"],
|
||||
"2024-01-02",
|
||||
"2024-01-02",
|
||||
relogin_every=1,
|
||||
)
|
||||
) == [("sh600000", None), ("sz000001", None)]
|
||||
assert logout_count == 2
|
||||
|
||||
|
||||
def test_download_minute_batch_rejects_unparsed_timestamps(monkeypatch):
|
||||
bad_rows = [[
|
||||
"2024-01-02",
|
||||
@@ -244,6 +275,9 @@ def test_download_minute_universe_writes_frequency_month_partitions(tmp_path, mo
|
||||
preserved_minute["symbol_id"] = "sh600000"
|
||||
preserved_minute["symbol_name"] = "PF Bank"
|
||||
preserved_minute[MINUTE_BAR_COLUMNS].to_parquet(preserved, index=False)
|
||||
stale = tmp_path / "toy" / "frequency=5m" / "month=2024-01" / "stale.pq"
|
||||
stale.parent.mkdir(parents=True)
|
||||
preserved_minute.assign(frequency="5m")[MINUTE_BAR_COLUMNS].to_parquet(stale, index=False)
|
||||
|
||||
stats = download_minute_universe(
|
||||
universe="toy",
|
||||
@@ -257,6 +291,7 @@ def test_download_minute_universe_writes_frequency_month_partitions(tmp_path, mo
|
||||
dataset_path = Path(stats["dataset_path"])
|
||||
assert (dataset_path / "frequency=5m" / "month=2024-01").is_dir()
|
||||
assert preserved.exists()
|
||||
assert not stale.exists()
|
||||
out = pd.read_parquet(dataset_path / "frequency=5m")
|
||||
assert (set(MINUTE_BAR_COLUMNS) - {"frequency"}) <= set(out.columns)
|
||||
assert set(out["symbol_id"]) == {"sh600000"}
|
||||
@@ -286,3 +321,49 @@ def test_download_minute_universe_raises_when_all_symbols_empty(tmp_path, monkey
|
||||
end_date="2024-01-02",
|
||||
output_dir=str(tmp_path),
|
||||
)
|
||||
|
||||
|
||||
def test_download_minute_universe_progress_branch_at_100_symbols(tmp_path, monkeypatch):
|
||||
symbols = [f"sh6{i:05d}" for i in range(100)]
|
||||
minute = pd.DataFrame({
|
||||
"symbol": ["sh600000"],
|
||||
"datetime": [pd.Timestamp("2024-01-02 09:35:00")],
|
||||
"date": [pd.Timestamp("2024-01-02")],
|
||||
"time": ["09:35:00"],
|
||||
"frequency": ["5m"],
|
||||
"open": [10.0],
|
||||
"high": [11.0],
|
||||
"low": [9.0],
|
||||
"close": [10.5],
|
||||
"volume": [1000.0],
|
||||
"amount": [10500.0],
|
||||
"vwap": [10.5],
|
||||
"adjustflag": ["3"],
|
||||
})
|
||||
|
||||
monkeypatch.setattr(
|
||||
pipeline_downloader,
|
||||
"_resolve_universe",
|
||||
lambda universe, max_symbols=0: pd.DataFrame({
|
||||
"symbol_id": symbols,
|
||||
"symbol_name": symbols,
|
||||
}),
|
||||
)
|
||||
|
||||
def fake_batch(requested_symbols, start, end, frequency=5):
|
||||
assert requested_symbols == symbols
|
||||
for symbol in requested_symbols:
|
||||
yield symbol, minute.copy()
|
||||
|
||||
monkeypatch.setattr(pipeline_downloader, "download_minute_batch", fake_batch)
|
||||
|
||||
stats = download_minute_universe(
|
||||
universe="toy100",
|
||||
start_date="2024-01-02",
|
||||
end_date="2024-01-02",
|
||||
output_dir=str(tmp_path),
|
||||
chunk_size=200,
|
||||
)
|
||||
|
||||
assert stats["n_symbols"] == 100
|
||||
assert stats["n_rows"] == 100
|
||||
|
||||
Reference in New Issue
Block a user