Improve offline coverage for data boundaries

This commit is contained in:
Yuxuan Yan
2026-06-16 17:42:20 +08:00
parent 31baa18ce5
commit b5c8c0b8da
5 changed files with 587 additions and 0 deletions
+118
View File
@@ -425,3 +425,121 @@ def test_cli_error_paths_are_clear_for_bad_user_inputs(tmp_path):
"--symbol", "sh999999",
])
assert "Symbol 'sh999999' not found" in alphaview_missing_symbol.output
def test_cli_list_and_legacy_feature_paths(tmp_path):
runner = CliRunner()
daily_bars = make_generated_daily_bars(n_sessions=3, include_missing=False)
minute_bars = make_generated_minute_bars(daily_bars)
daily_path = tmp_path / "daily_bars.pq"
minute_path = tmp_path / "minute_bars.pq"
daily_bars.to_parquet(daily_path, index=False)
minute_bars.to_parquet(minute_path, index=False)
derived_list = _invoke_ok(runner, ["derived", "list"])
feature_list = _invoke_ok(runner, ["feature", "list"])
assert "minute_daily_summary" in derived_list.output
assert "minute_daily_summary" in feature_list.output
feature_dir = tmp_path / "features"
feature_compute = _invoke_ok(runner, [
"feature",
"compute",
"--minute-path",
str(minute_path),
"--daily-path",
str(daily_path),
"--feature-type",
"minute_daily_summary",
"--feature-name",
"legacy_summary",
"--output-dir",
str(feature_dir),
])
feature_path = feature_dir / "legacy_summary.pq"
assert "Loaded minute bars:" in feature_compute.output
assert "Loaded daily data:" in feature_compute.output
assert "Saved feature:" in feature_compute.output
assert feature_path.exists()
no_input = _invoke_error(runner, [
"derived",
"compute",
"--derived-type",
"minute_daily_summary",
"--derived-name",
"missing_inputs",
"--output-dir",
str(tmp_path / "derived"),
])
assert "At least one of --daily-path or --minute-path is required" in no_input.output
missing_minute = _invoke_error(runner, [
"derived",
"compute",
"--daily-path",
str(daily_path),
"--derived-type",
"minute_daily_summary",
"--derived-name",
"daily_only",
"--output-dir",
str(tmp_path / "derived"),
])
assert "minute_daily_summary requires minute input" in missing_minute.output
malformed_feature_param = _invoke_error(runner, [
"feature",
"compute",
"--minute-path",
str(minute_path),
"--feature-type",
"minute_daily_summary",
"--feature-name",
"bad_param",
"--param",
"not-an-assignment",
"--output-dir",
str(tmp_path / "features_bad"),
])
assert "--param must be name=value" in malformed_feature_param.output
unknown_feature = _invoke_error(runner, [
"feature",
"compute",
"--minute-path",
str(minute_path),
"--feature-type",
"does_not_exist",
"--feature-name",
"bad_feature",
"--output-dir",
str(tmp_path / "features_unknown"),
])
assert "Unknown feature-type" in unknown_feature.output
def test_cli_pqcat_row_modes(tmp_path):
runner = CliRunner()
daily_bars = make_generated_daily_bars(n_sessions=3, include_missing=False)
daily_path = tmp_path / "daily_bars.pq"
daily_bars.to_parquet(daily_path, index=False)
head_result = _invoke_ok(runner, [
"pqcat",
str(daily_path),
"--head",
"2",
"--columns",
"symbol_id,close",
])
tail_result = _invoke_ok(runner, [
"pqcat",
str(daily_path),
"--tail",
"1",
])
assert "symbol_id" in head_result.output
assert "close" in head_result.output
assert "date" in tail_result.output