headroom/e2e/_lib/__init__.py
JerrettDavis 3ca2ce08ae refactor(e2e): extract reusable harness into e2e/_lib
Centralize Docker / CI e2e test helpers so per-command suites can be
declarative and future commands (install, wrap, ...) can reuse the same
shim/PATH/assertion primitives without duplicating infrastructure.

The harness provides:

* Case dataclass describing one test as argv + shims + expected exit /
  stdout / stderr / files / custom callbacks
* make_shim() factory producing cross-platform executable shims (.sh on
  POSIX, .cmd on Windows) with noop / fail / record-args behaviors
* with_clean_path() context manager that isolates PATH to a minimal
  known-good value plus any extras supplied by the case
* agent_settings_path() locator mirroring headroom.cli.init so tests can
  assert the right file was written without touching private init state
* run_cases() for independent cases and run_case_sequence() for cases
  that must share scratch state (e.g. manifest-merge scenarios)

Shell / PowerShell shim-creation scripts are also shipped for CI steps
that need to drop a shim without spinning up Python first.

No behavior change in this commit - pure infrastructure. The init suite
and new subcommand suites consume the harness in follow-up commits.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 15:50:12 -05:00

35 lines
954 B
Python

"""Shared helpers for Docker / CI e2e tests.
This package centralizes utilities used by the per-command e2e harnesses
(`e2e/init/run.py`, future `e2e/install/run.py`, `e2e/wrap/run.py`, ...).
The goal is that each command test suite is a small declarative file that
imports from this package, so new commands can be covered with minimal
duplication.
"""
from __future__ import annotations
from .assertions import (
assert_exit,
assert_stderr_contains,
assert_stdout_contains,
read_agent_settings,
)
from .harness import Case, CaseContext, run_case_sequence, run_cases
from .path_env import with_clean_path
from .paths import agent_settings_path
from .shims import make_shim
__all__ = [
"Case",
"CaseContext",
"agent_settings_path",
"assert_exit",
"assert_stderr_contains",
"assert_stdout_contains",
"make_shim",
"read_agent_settings",
"run_case_sequence",
"run_cases",
"with_clean_path",
]