#!/usr/bin/env python3
from __future__ import annotations

import os
from pathlib import Path
import subprocess
import tempfile
import unittest

BIN = os.path.join(os.path.dirname(__file__), "..", "bin")


class StableActivationWrapperTests(unittest.TestCase):
    WRAPPERS = (
        ("overdeck-seat-scope-entry", "seat_scope_entry.py"),
        ("overdeck-seat-implementer-exec", "seat_implementer_exec.py"),
        ("overdeck-seat-tmux-mediator", "seat_tmux_mediator.py"),
        ("overdeck-seat-execution-client", "seat_execution_client.py"),
    )

    def test_all_privileged_wrappers_fail_closed_without_activation(self) -> None:
        for name, _module_name in self.WRAPPERS:
            with self.subTest(name=name):
                text = Path(os.path.join(BIN, name)).read_text(encoding="utf-8")
                self.assertNotIn("FALLBACK", text)
                self.assertNotIn('if _version else _BASE', text)
                self.assertNotIn('if _version else _FALLBACK_MODULE_PATH', text)
                self.assertIn("activation-invalid", text)

    def test_activated_wrappers_do_not_write_bytecode_into_release(self) -> None:
        version = "a" * 64
        for name, module_name in self.WRAPPERS:
            with self.subTest(name=name), tempfile.TemporaryDirectory() as tmp:
                base = Path(tmp) / "overdeck"
                release = base / "versions" / version
                release.mkdir(parents=True)
                (base / "seat-authority-active").write_text(f"{version}\n", encoding="ascii")
                (release / module_name).write_text(
                    "def main(argv):\n    return None\n",
                    encoding="utf-8",
                )
                wrapper = Path(tmp) / name
                source = Path(BIN, name).read_text(encoding="utf-8")
                wrapper.write_text(
                    source.replace('/usr/local/lib/overdeck', str(base)),
                    encoding="utf-8",
                )
                wrapper.chmod(0o755)
                env = os.environ.copy()
                env.pop("PYTHONDONTWRITEBYTECODE", None)
                env.pop("PYTHONPYCACHEPREFIX", None)

                proc = subprocess.run(
                    [str(wrapper)],
                    text=True,
                    capture_output=True,
                    check=False,
                    env=env,
                )

                self.assertEqual(proc.returncode, 0, proc.stderr)
                self.assertFalse((release / "__pycache__").exists())


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