Improve offline coverage for data boundaries
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user