From de5e2ee435d325d4833b9f006641837c47690b7d Mon Sep 17 00:00:00 2001 From: abrichr Date: Tue, 28 Jul 2026 02:07:43 -0400 Subject: [PATCH] fix: refuse capture before recorder readiness --- openadapt_capture/cli.py | 4 +++- tests/test_cli_record.py | 48 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 tests/test_cli_record.py diff --git a/openadapt_capture/cli.py b/openadapt_capture/cli.py index 380b82d..70c7aa3 100644 --- a/openadapt_capture/cli.py +++ b/openadapt_capture/cli.py @@ -101,7 +101,9 @@ def record( send_profile=send_profile, window=window, ) as recorder: - recorder.wait_for_ready() + if not recorder.wait_for_ready(): + print("Recording did not become ready. No successful capture was saved.") + raise SystemExit(1) try: while recorder.is_recording: time.sleep(1) diff --git a/tests/test_cli_record.py b/tests/test_cli_record.py new file mode 100644 index 0000000..3dee62e --- /dev/null +++ b/tests/test_cli_record.py @@ -0,0 +1,48 @@ +"""Behavior tests for the public capture CLI recording path.""" + +from __future__ import annotations + +import pytest + +from openadapt_capture.cli import record + + +class _RecorderThatNeverBecomesReady: + """Small recorder double for startup-failure behavior.""" + + def __init__(self, *args, **kwargs): + self.event_count = 0 + self.exited = False + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, traceback): + self.exited = True + return False + + def wait_for_ready(self): + return False + + +def test_record_refuses_when_recorder_never_becomes_ready(monkeypatch, tmp_path, capsys): + import openadapt_capture.recorder as recorder_module + + recorder = None + + def recorder_factory(*args, **kwargs): + nonlocal recorder + recorder = _RecorderThatNeverBecomesReady(*args, **kwargs) + return recorder + + monkeypatch.setattr(recorder_module, "Recorder", recorder_factory) + + with pytest.raises(SystemExit) as raised: + record(str(tmp_path / "capture"), video=False) + + assert raised.value.code == 1 + assert recorder is not None and recorder.exited + output = capsys.readouterr().out + assert "did not become ready" in output + assert "Recorded 0 events" not in output + assert "Saved to:" not in output