""" Тесты консольной точки входа автономного инспекторского валидатора «iss_verifier». iss_verifier.py остаётся самодостаточным файлом без импортов из пакета iss_ledger_117 (инспектор копирует один файл в изолированный контур) — здесь IssLedger117 используется только чтобы подготовить тестовый журнал, сам тест этого импорта не требует. """ import contextlib import io import os import shutil import tempfile import unittest import iss_verifier from iss_ledger_117 import IssLedger117 class TestVerifierMainExitCodes(unittest.TestCase): def setUp(self): self.test_dir = tempfile.mkdtemp() self.ledger_path = os.path.join(self.test_dir, "verifier_audit.jsonl") ledger = IssLedger117(self.ledger_path) ledger.append( agent_id="test-agent", action="tool_call:sql", target="db.test", verdict="PERMIT", reason="ok", payload={"query": "SELECT 1"}, ) ledger.append( agent_id="test-agent", action="tool_call:bash", target="ls", verdict="BLOCK", reason="denied", payload="ls -la", ) def tearDown(self): shutil.rmtree(self.test_dir, ignore_errors=True) def _run_main(self, argv): """Запускает iss_verifier.main(argv), перехватывая SystemExit из verify_file().""" buf = io.StringIO() try: with contextlib.redirect_stdout(buf): return iss_verifier.main(argv) except SystemExit as e: return e.code def test_verifier_main_exit_codes(self): """usage (без аргументов) -> 1; целый журнал -> 0; подменённая запись -> 3.""" # 1. Без аргументов -- строка использования, код 1 self.assertEqual(self._run_main([]), 1) # 2. Целый журнал -- код 0 self.assertEqual(self._run_main([self.ledger_path]), 0) # 3. Подменённая запись (PERMIT -> BLOCK в первой строке) -- код 3 with open(self.ledger_path, "r", encoding="utf-8") as f: lines = f.readlines() lines[0] = lines[0].replace("PERMIT", "BLOCK") with open(self.ledger_path, "w", encoding="utf-8") as f: f.writelines(lines) self.assertEqual(self._run_main([self.ledger_path]), 3) def test_missing_file_returns_1(self): missing_path = os.path.join(self.test_dir, "does_not_exist.jsonl") self.assertEqual(self._run_main([missing_path]), 1) if __name__ == "__main__": unittest.main()