import importlib.util import tempfile import unittest from pathlib import Path MODULE_PATH = Path(__file__).parents[2] / "autoinstall/offline/recover-python-profile-on-boot.py" SPEC = importlib.util.spec_from_file_location("recover_python_profile_on_boot", MODULE_PATH) MODULE = importlib.util.module_from_spec(SPEC) assert SPEC.loader SPEC.loader.exec_module(MODULE) class RecoverPythonProfileOnBootTests(unittest.TestCase): def test_absent_and_terminal_states_are_noop(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) self.assertEqual(MODULE.recover(root / "missing", root / "cp", root / "target")["action"], "none") def test_installing_state_rolls_back(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) target = root / "venv" target.mkdir() (target / "marker").write_text("old") checkpoint = root / "checkpoint" manifest = MODULE.installer.checkpoint_api.create(target, checkpoint, "op-1") journal = root / "journal.json" identity = dict(operation_id="op-1", profile="cpu-only", manifest_sha256="a" * 64) current = MODULE.journal_api.update(journal, expected_generation=0, state="profile_selected", checkpoint_id=None, **identity) current = MODULE.journal_api.update(journal, expected_generation=current["generation"], state="checkpoint_ready", checkpoint_id=manifest["inventory_sha256"], **identity) MODULE.journal_api.update(journal, expected_generation=current["generation"], state="installing", checkpoint_id=manifest["inventory_sha256"], **identity) (target / "marker").write_text("activated") result = MODULE.recover(journal, checkpoint, target) self.assertEqual(result["state"], "rolled_back") self.assertEqual((target / "marker").read_text(), "old") self.assertEqual(MODULE.recover(journal, checkpoint, target)["reason"], "terminal_rolled_back") if __name__ == "__main__": unittest.main()