Add audited response apply rehearsal

This commit is contained in:
Luna 2026-07-09 05:56:25 -07:00
parent 51d52b5229
commit 0b010df514
No known key found for this signature in database
11 changed files with 198 additions and 28 deletions

View file

@ -4,7 +4,7 @@ import json
import os
import tempfile
import unittest
from contextlib import redirect_stdout
from contextlib import redirect_stderr, redirect_stdout
from pathlib import Path
from enodia_sentinel import incident, respond
@ -155,6 +155,34 @@ class TestRespondPlan(unittest.TestCase):
finally:
os.environ.pop("ENODIA_LOG_DIR", None)
def test_apply_requires_dry_run_and_audits_rehearsal(self):
os.environ["ENODIA_LOG_DIR"] = str(self.tmp)
try:
with redirect_stdout(io.StringIO()):
self.assertEqual(main(["respond", "plan", self.iid]), 0)
plan_path = next((self.tmp / "response-plans").glob("*.json"))
err = io.StringIO()
with redirect_stderr(err):
code = main(["respond", "apply", str(plan_path)])
self.assertEqual(code, 2)
self.assertIn("not implemented", err.getvalue())
buf = io.StringIO()
with redirect_stdout(buf):
code = main(["respond", "apply", str(plan_path),
"--dry-run", "--json"])
self.assertEqual(code, 0)
output = json.loads(buf.getvalue())
self.assertFalse(output["executed"])
self.assertEqual(output["audit"]["event"], "response_apply_rehearsed")
self.assertEqual(output["plan"]["plan_path"], str(plan_path))
audit = (self.tmp / "response-audit.log").read_text().splitlines()
self.assertEqual(json.loads(audit[-1])["event"],
"response_apply_rehearsed")
finally:
os.environ.pop("ENODIA_LOG_DIR", None)
def test_cli_requires_incident_id(self):
os.environ["ENODIA_LOG_DIR"] = str(self.tmp)
try: