Files
mailsystem/tests/test_deactivation_managed_block_mock.py

80 lines
3.0 KiB
Python

#!/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)