runbook-tutorials/tests/test_legacy.py
tegwick 535836054a
All checks were successful
Work Records / validate (push) Successful in 21s
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 17s
Add runbook pack spec, validator, legacy launcher, and workplans RBT-WP-0002..0006
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: sonnet
Assistant-Process: 295952@bnt-lap001
Assistant-Session: e93f64ad-516c-46eb-9666-aad8d300c477
2026-09-29 00:24:05 +02:00

46 lines
1.4 KiB
Python

import socket
import sys
import textwrap
import pytest
import yaml
from rtut import legacy, pack as P
def free_port():
s = socket.socket(); s.bind(("127.0.0.1", 0)); p = s.getsockname()[1]; s.close(); return p
def make_repo(tmp_path, command, url, cwd="."):
d = tmp_path / "runbooks" / "old"
d.mkdir(parents=True)
(d / "pack.yaml").write_text(yaml.safe_dump({
"spec": "runbook-pack/v0.1", "id": "t.old", "title": "Old console", "owner": "t",
"exercise_status": "unexercised", "engine": "legacy-command",
"legacy": {"command": command, "cwd": cwd, "url": url}}))
return P.load(d / "pack.yaml")
def test_launch_and_stop(tmp_path):
port = free_port()
pk = make_repo(tmp_path, [sys.executable, "-m", "http.server", str(port), "--bind", "127.0.0.1"],
f"http://127.0.0.1:{port}")
proc = legacy.launch(pk, timeout=10)
try:
assert proc.poll() is None
finally:
proc.terminate(); proc.wait(5)
def test_timeout_when_console_never_answers(tmp_path):
pk = make_repo(tmp_path, [sys.executable, "-c", "import time; time.sleep(30)"],
f"http://127.0.0.1:{free_port()}")
with pytest.raises(TimeoutError):
legacy.launch(pk, timeout=1)
def test_cwd_escape_refused(tmp_path):
pk = make_repo(tmp_path, ["true"], "", cwd="../..")
with pytest.raises(ValueError):
legacy.launch(pk)