tests/test_create_repository_set_adapter.py

import subprocess
import tempfile
import unittest
import zipfile
from pathlib import Path


SCRIPT = Path(__file__).parents[1] / "bin" / "create-repository-set.py"


class CreateRepositorySetAdapterTest(unittest.TestCase):
    def test_creates_complete_set_atomically(self):
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            tool = root / "tool.py"
            tool.write_text(
                """import sys,zipfile
from pathlib import Path
source=Path(sys.argv[1]); output=Path(sys.argv[2])
with zipfile.ZipFile(output,'w') as archive:
    archive.writestr(source.name + '/README.md','fixture')
""",
                encoding="utf-8",
            )
            first = root / "first"; first.mkdir()
            second = root / "second"; second.mkdir()
            output = root / "result"
            result = subprocess.run(
                [
                    "python3", str(SCRIPT), "--tool", str(tool),
                    "--repository", f"first={first}",
                    "--repository", f"second={second}",
                    "--output-dir", str(output),
                ],
                check=False,
            )
            self.assertEqual(result.returncode, 0)
            self.assertEqual(sorted(path.name for path in output.iterdir()), ["first.zip", "second.zip"])
            self.assertTrue(all(zipfile.is_zipfile(path) for path in output.iterdir()))

    def test_rejects_existing_output_without_change(self):
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            source = root / "source"; source.mkdir()
            output = root / "result"; output.mkdir()
            sentinel = output / "sentinel"; sentinel.write_text("keep", encoding="utf-8")
            result = subprocess.run(
                [
                    "python3", str(SCRIPT), "--tool", str(root / "missing.py"),
                    "--repository", f"source={source}", "--output-dir", str(output),
                ],
                check=False,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
            )
            self.assertNotEqual(result.returncode, 0)
            self.assertEqual(sentinel.read_text(encoding="utf-8"), "keep")


if __name__ == "__main__":
    unittest.main()