4b6817381b
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
CI / coverage-report (push) Has been cancelled
CI / test-kubernetes (push) Has been cancelled
CI / should-run-thorough (push) Has been cancelled
CI / test-thorough (cloudwatch-demo) (push) Has been cancelled
CI / test-thorough (flink-ecs) (push) Has been cancelled
CI / test-thorough (upstream-lambda) (push) Has been cancelled
CI / test-thorough (prefect-ecs-fargate) (push) Has been cancelled
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Has been cancelled
Benchmark image — build + push to ECR (any adapter) / build + push (push) Has been cancelled
CI / quality (ubuntu-latest) (push) Has been cancelled
CI / test (tools-runtime) (push) Has been cancelled
CI / test (e2e-general) (push) Has been cancelled
CI / test (cli-runtime) (push) Has been cancelled
CI / test (e2e-provider-and-openclaw) (push) Has been cancelled
CI / test (integrations-and-misc) (push) Has been cancelled
Release / verify (push) Has been cancelled
Release / build-python-dist (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Has been cancelled
Release / publish-release (push) Has been cancelled
Release / publish-main-release (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Has been cancelled
Release / prepare (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Has been cancelled
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Has been cancelled
96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
"""Tests for the optional positional ``ALERT_FILE`` argument on
|
|
``opensre investigate``.
|
|
|
|
Before this change, ``opensre investigate alert.json`` failed with
|
|
``Error: Got unexpected extra argument (alert.json)``. The positional
|
|
shortcut is treated as equivalent to ``-i alert.json``; an explicit
|
|
``-i`` flag wins when both are passed.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from click.testing import CliRunner
|
|
|
|
from surfaces.cli.commands.general import investigate_command
|
|
|
|
|
|
def _write_minimal_alert(tmp_path: Path) -> Path:
|
|
"""Write a syntactically valid alert payload tests can pass through the CLI."""
|
|
alert = tmp_path / "alert.json"
|
|
alert.write_text(
|
|
'{"alert_name": "test", "pipeline_name": "etl", "severity": "warning"}',
|
|
encoding="utf-8",
|
|
)
|
|
return alert
|
|
|
|
|
|
def test_positional_alert_file_is_accepted(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
|
|
"""``opensre investigate <path>`` must not error with 'unexpected extra argument'."""
|
|
captured: dict[str, str | None] = {}
|
|
|
|
def _capture_load_payload(*, input_path: str | None, **_kwargs: object) -> dict[str, str]:
|
|
captured["input_path"] = input_path
|
|
return {"alert_name": "test"}
|
|
|
|
monkeypatch.setattr(
|
|
"surfaces.cli.investigation.payload.load_payload",
|
|
_capture_load_payload,
|
|
)
|
|
monkeypatch.setattr(
|
|
"surfaces.cli.investigation.run_investigation_cli",
|
|
lambda **_kwargs: {"report": "ok", "root_cause": "ok"},
|
|
)
|
|
monkeypatch.setattr(
|
|
"surfaces.cli.investigation.run_investigation_cli_streaming",
|
|
lambda **_kwargs: {"report": "ok", "root_cause": "ok"},
|
|
)
|
|
monkeypatch.setattr("surfaces.cli.write_json", lambda *_args, **_kw: None)
|
|
|
|
alert = _write_minimal_alert(tmp_path)
|
|
result = CliRunner().invoke(investigate_command, [str(alert)])
|
|
|
|
assert "unexpected extra argument" not in result.output, result.output
|
|
assert captured["input_path"] == str(alert)
|
|
|
|
|
|
def test_explicit_input_flag_wins_when_both_provided(
|
|
monkeypatch: pytest.MonkeyPatch, tmp_path: Path
|
|
) -> None:
|
|
"""When both positional and ``-i`` are passed, ``-i`` takes precedence."""
|
|
captured: dict[str, str | None] = {}
|
|
|
|
def _capture_load_payload(*, input_path: str | None, **_kwargs: object) -> dict[str, str]:
|
|
captured["input_path"] = input_path
|
|
return {"alert_name": "test"}
|
|
|
|
monkeypatch.setattr(
|
|
"surfaces.cli.investigation.payload.load_payload",
|
|
_capture_load_payload,
|
|
)
|
|
monkeypatch.setattr(
|
|
"surfaces.cli.investigation.run_investigation_cli",
|
|
lambda **_kwargs: {"report": "ok", "root_cause": "ok"},
|
|
)
|
|
monkeypatch.setattr(
|
|
"surfaces.cli.investigation.run_investigation_cli_streaming",
|
|
lambda **_kwargs: {"report": "ok", "root_cause": "ok"},
|
|
)
|
|
monkeypatch.setattr("surfaces.cli.write_json", lambda *_args, **_kw: None)
|
|
|
|
positional = _write_minimal_alert(tmp_path)
|
|
explicit = tmp_path / "explicit.json"
|
|
explicit.write_text(
|
|
'{"alert_name": "explicit", "pipeline_name": "etl", "severity": "warning"}',
|
|
encoding="utf-8",
|
|
)
|
|
|
|
CliRunner().invoke(
|
|
investigate_command,
|
|
[str(positional), "-i", str(explicit)],
|
|
)
|
|
|
|
assert captured["input_path"] == str(explicit)
|