80 lines
3.0 KiB
Python
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)
|