Add selective Postfix SRS installation and management
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user