4b6817381b
Benchmark image — build + push to ECR (any adapter) / build + push (push) Waiting to run
CI / quality (ubuntu-latest) (push) Waiting to run
CI / test (tools-runtime) (push) Waiting to run
CI / test (e2e-general) (push) Waiting to run
CI / test (cli-runtime) (push) Waiting to run
CI / test (e2e-provider-and-openclaw) (push) Waiting to run
CI / test (integrations-and-misc) (push) Waiting to run
CI / coverage-report (push) Blocked by required conditions
CI / test-kubernetes (push) Waiting to run
CI / should-run-thorough (push) Waiting to run
CI / test-thorough (cloudwatch-demo) (push) Blocked by required conditions
CI / test-thorough (flink-ecs) (push) Blocked by required conditions
CI / test-thorough (upstream-lambda) (push) Blocked by required conditions
CI / test-thorough (prefect-ecs-fargate) (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Blocked by required conditions
Release / publish-release (push) Blocked by required conditions
Release / publish-main-release (push) Blocked by required conditions
Release / prepare (push) Waiting to run
Release / verify (push) Blocked by required conditions
Release / build-python-dist (push) Blocked by required conditions
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Blocked by required conditions
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Blocked by required conditions
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Blocked by required conditions
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Blocked by required conditions
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Waiting to run
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Waiting to run
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Waiting to run
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
"""Coverage for the ``python -m surfaces.cli.wizard`` entrypoint."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import click
|
|
import pytest
|
|
|
|
from surfaces.cli.wizard import __main__ as wizard_main
|
|
|
|
|
|
def test_main_initialises_sentry_and_emits_cli_invoked(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
init_calls: list[int] = []
|
|
captured: list[dict[str, object] | None] = []
|
|
|
|
monkeypatch.setattr(wizard_main, "init_sentry", lambda **_kw: init_calls.append(1))
|
|
monkeypatch.setattr(wizard_main, "shutdown_analytics", lambda **_kw: None)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"capture_first_run_if_needed",
|
|
lambda: captured.append({"_marker": "install"}),
|
|
)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"capture_cli_invoked",
|
|
lambda properties=None: captured.append(properties),
|
|
)
|
|
monkeypatch.setattr(wizard_main, "run_wizard", lambda: 0)
|
|
monkeypatch.setattr(wizard_main, "install_questionary_escape_cancel", lambda: None)
|
|
|
|
exit_code = wizard_main.main()
|
|
|
|
assert exit_code == 0
|
|
assert init_calls == [1]
|
|
install_marker, properties = captured
|
|
assert install_marker == {"_marker": "install"}
|
|
assert properties is not None
|
|
assert properties["entrypoint"] == "python -m surfaces.cli.wizard"
|
|
assert properties["command_path"] == "python -m surfaces.cli.wizard wizard"
|
|
assert properties["command_family"] == "wizard"
|
|
|
|
|
|
def test_main_shuts_down_analytics_without_blocking_flush(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
flush_calls: list[bool] = []
|
|
|
|
monkeypatch.setattr(wizard_main, "init_sentry", lambda **_kw: None)
|
|
monkeypatch.setattr(wizard_main, "capture_first_run_if_needed", lambda: None)
|
|
monkeypatch.setattr(wizard_main, "capture_cli_invoked", lambda *_args, **_kwargs: None)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"shutdown_analytics",
|
|
lambda **kw: flush_calls.append(bool(kw.get("flush"))),
|
|
)
|
|
monkeypatch.setattr(wizard_main, "install_questionary_escape_cancel", lambda: None)
|
|
|
|
def _raise() -> int:
|
|
raise RuntimeError("wizard exploded")
|
|
|
|
monkeypatch.setattr(wizard_main, "run_wizard", _raise)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
wizard_main.main()
|
|
|
|
assert flush_calls == [False]
|
|
|
|
|
|
def test_main_treats_abort_as_clean_cancel(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
flush_calls: list[bool] = []
|
|
|
|
monkeypatch.setattr(wizard_main, "init_sentry", lambda **_kw: None)
|
|
monkeypatch.setattr(wizard_main, "capture_first_run_if_needed", lambda: None)
|
|
monkeypatch.setattr(wizard_main, "capture_cli_invoked", lambda *_args, **_kwargs: None)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"shutdown_analytics",
|
|
lambda **kw: flush_calls.append(bool(kw.get("flush"))),
|
|
)
|
|
monkeypatch.setattr(wizard_main, "install_questionary_escape_cancel", lambda: None)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"run_wizard",
|
|
lambda: (_ for _ in ()).throw(click.Abort()),
|
|
)
|
|
|
|
exit_code = wizard_main.main()
|
|
|
|
assert exit_code == 0
|
|
assert flush_calls == [False]
|
|
|
|
|
|
def test_main_treats_keyboard_interrupt_as_clean_cancel(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
flush_calls: list[bool] = []
|
|
|
|
monkeypatch.setattr(wizard_main, "init_sentry", lambda **_kw: None)
|
|
monkeypatch.setattr(wizard_main, "capture_first_run_if_needed", lambda: None)
|
|
monkeypatch.setattr(wizard_main, "capture_cli_invoked", lambda *_args, **_kwargs: None)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"shutdown_analytics",
|
|
lambda **kw: flush_calls.append(bool(kw.get("flush"))),
|
|
)
|
|
monkeypatch.setattr(wizard_main, "install_questionary_escape_cancel", lambda: None)
|
|
monkeypatch.setattr(
|
|
wizard_main,
|
|
"run_wizard",
|
|
lambda: (_ for _ in ()).throw(KeyboardInterrupt()),
|
|
)
|
|
|
|
exit_code = wizard_main.main()
|
|
|
|
assert exit_code == 0
|
|
assert flush_calls == [False]
|