#!/usr/bin/env python3 """Isolated byte-exact managed-block removal tests; no Postfix services used. Run from repository: python3 tests/test_deactivation_managed_block_mock.py """ import re import subprocess import tempfile import unittest from pathlib import Path SOURCE = Path(__file__).resolve().parents[1] / "deactivate-srs.sh" NAME = "remove_managed_block" BEGIN = "# BEGIN OOPEN-SRS-MANAGED" END = "# END OOPEN-SRS-MANAGED" BLOCK = "\n" + BEGIN + "\n# managed block\n" + END + "\n" def extract_function(): source = SOURCE.read_text(encoding="utf-8") m = re.search(rf"^{NAME}\(\) \{{\n.*?^\}}", source, re.M | re.S) if not m: raise RuntimeError(f"Missing {NAME}() in {SOURCE}") return m.group(0) class ManagedBlockMockTests(unittest.TestCase): @classmethod def setUpClass(cls): cls.function = extract_function() def run_remove(self, data, begin=BEGIN, end=END): with tempfile.TemporaryDirectory(prefix="srs-managed-block-") as temp: path = Path(temp) / "main.cf" path.write_bytes(data) # Call the real Bash function, which executes its embedded Python. script = (self.function + "\n" + 'remove_managed_block "$1" "$2" "$3"\n') result = subprocess.run( ["bash", "-c", script, "bash", str(path), begin, end], capture_output=True, text=True, timeout=10, ) return result, path.read_bytes() def test_exact_restoration_for_zero_to_five_existing_blank_lines(self): for blanks in range(6): with self.subTest(original_blank_lines=blanks): original = b"myhostname = e.mx.oopen.de\n" + b"\n" * blanks result, after = self.run_remove(original + BLOCK.encode()) self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(after, original) def test_empty_file_is_restored(self): result, after = self.run_remove(BLOCK.encode()) self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(after, b"") def test_missing_begin_marker_does_not_modify_file(self): original = b"myhostname = e.mx.oopen.de\n" + ("\n# wrong begin\n" + END + "\n").encode() result, after = self.run_remove(original) self.assertNotEqual(result.returncode, 0) self.assertEqual(after, original) def test_duplicate_begin_marker_does_not_modify_file(self): original = ("myhostname = e.mx.oopen.de\n" + BLOCK + BLOCK).encode() result, after = self.run_remove(original) self.assertNotEqual(result.returncode, 0) self.assertEqual(after, original) def test_reversed_markers_does_not_modify_file(self): original = (END + "\n" + BEGIN + "\n").encode() result, after = self.run_remove(original) self.assertNotEqual(result.returncode, 0) self.assertEqual(after, original) if __name__ == "__main__": unittest.main(verbosity=2)