Improve offline coverage for data boundaries
This commit is contained in:
@@ -91,6 +91,24 @@ def test_download_minute_batch_maps_and_parses_baostock_rows(monkeypatch):
|
||||
assert pd.api.types.is_numeric_dtype(df["volume"])
|
||||
|
||||
|
||||
def test_minute_frequency_and_timestamp_parsing_edge_cases():
|
||||
frequency, label = low_level_downloader._normalize_minute_frequency("15m")
|
||||
assert (frequency, label) == ("15", "15m")
|
||||
|
||||
with pytest.raises(ValueError, match="Unsupported minute frequency"):
|
||||
low_level_downloader._normalize_minute_frequency("1m")
|
||||
|
||||
parsed = low_level_downloader._parse_minute_datetime(
|
||||
pd.Series(["2024-01-02", "2024-01-02"]),
|
||||
pd.Series(["0935", "09:40:00"]),
|
||||
)
|
||||
|
||||
assert parsed.tolist() == [
|
||||
pd.Timestamp("2024-01-02 09:35:00"),
|
||||
pd.Timestamp("2024-01-02 09:40:00"),
|
||||
]
|
||||
|
||||
|
||||
def test_download_minute_batch_empty_result_yields_none(monkeypatch):
|
||||
monkeypatch.setattr(low_level_downloader.bs, "login", lambda: None)
|
||||
monkeypatch.setattr(low_level_downloader.bs, "logout", lambda: None)
|
||||
@@ -105,6 +123,61 @@ def test_download_minute_batch_empty_result_yields_none(monkeypatch):
|
||||
]
|
||||
|
||||
|
||||
def test_download_minute_batch_non_login_error_and_periodic_relogin(monkeypatch):
|
||||
responses = [
|
||||
_FakeResult([], error_code="1", error_msg="bad symbol"),
|
||||
_FakeResult([]),
|
||||
]
|
||||
login_count = 0
|
||||
logout_count = 0
|
||||
|
||||
def fake_login():
|
||||
nonlocal login_count
|
||||
login_count += 1
|
||||
|
||||
def fake_logout():
|
||||
nonlocal logout_count
|
||||
logout_count += 1
|
||||
|
||||
monkeypatch.setattr(low_level_downloader.bs, "login", fake_login)
|
||||
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 login_count == 2
|
||||
assert logout_count == 2
|
||||
|
||||
|
||||
def test_download_minute_batch_second_session_loss_yields_none(monkeypatch):
|
||||
responses = [
|
||||
_FakeResult([], error_code="10002007", error_msg="用户未登录"),
|
||||
_FakeResult([], error_code="10002007", error_msg="用户未登录"),
|
||||
]
|
||||
|
||||
monkeypatch.setattr(low_level_downloader.bs, "login", lambda: None)
|
||||
monkeypatch.setattr(low_level_downloader.bs, "logout", lambda: None)
|
||||
monkeypatch.setattr(
|
||||
low_level_downloader.bs,
|
||||
"query_history_k_data_plus",
|
||||
lambda **kwargs: responses.pop(0),
|
||||
)
|
||||
|
||||
assert list(download_minute_batch(["sh600000"], "2024-01-02", "2024-01-02")) == [
|
||||
("sh600000", None)
|
||||
]
|
||||
|
||||
|
||||
def test_download_minute_batch_rejects_unparsed_timestamps(monkeypatch):
|
||||
bad_rows = [[
|
||||
"2024-01-02",
|
||||
|
||||
Reference in New Issue
Block a user