From b6a08ce4e5ff316d23c1c732c13bb4438aae53a3 Mon Sep 17 00:00:00 2001 From: dw-0 Date: Sat, 11 Jul 2026 00:29:53 +0200 Subject: [PATCH] test(instance_manager): add unit tests for instance manager --- kiauh/core/instance_manager/tests/__init__.py | 0 .../tests/test_instance_manager.py | 109 ++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 kiauh/core/instance_manager/tests/__init__.py create mode 100644 kiauh/core/instance_manager/tests/test_instance_manager.py diff --git a/kiauh/core/instance_manager/tests/__init__.py b/kiauh/core/instance_manager/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/kiauh/core/instance_manager/tests/test_instance_manager.py b/kiauh/core/instance_manager/tests/test_instance_manager.py new file mode 100644 index 00000000..3b4b1555 --- /dev/null +++ b/kiauh/core/instance_manager/tests/test_instance_manager.py @@ -0,0 +1,109 @@ +from __future__ import annotations + +import subprocess +from pathlib import Path +from typing import List + +import pytest +from core.instance_manager.instance_manager import InstanceManager +from tests.helpers.fake_backends import FakeCommandRunner + + +class FakeInstance: + def __init__(self, name: str, log_dir: Path | None = None) -> None: + self.service_file_path = Path(f"/etc/systemd/system/{name}.service") + self.log_file_name = "klipper.log" + self.base = type("Base", (), {"log_dir": log_dir})() + + +def _runner_for(*commands: List[str]) -> FakeCommandRunner: + """Return a strict FakeCommandRunner with success responses for commands.""" + responses = { + tuple(cmd): subprocess.CompletedProcess( + args=cmd, returncode=0, stdout="", stderr="" + ) + for cmd in commands + } + return FakeCommandRunner(responses) + + +class TestInstanceManager: + def test_start_records_command(self, monkeypatch: pytest.MonkeyPatch) -> None: + cmd = ["sudo", "systemctl", "start", "klipper.service"] + fake = _runner_for(cmd) + monkeypatch.setattr("core.backends.command_runner", fake) + + instance = FakeInstance("klipper") + InstanceManager.start(instance) + + assert fake.calls[0][0] == cmd + + def test_stop_records_command(self, monkeypatch: pytest.MonkeyPatch) -> None: + cmd = ["sudo", "systemctl", "stop", "klipper.service"] + fake = _runner_for(cmd) + monkeypatch.setattr("core.backends.command_runner", fake) + + instance = FakeInstance("klipper") + InstanceManager.stop(instance) + + assert fake.calls[0][0] == cmd + + def test_restart_records_command(self, monkeypatch: pytest.MonkeyPatch) -> None: + cmd = ["sudo", "systemctl", "restart", "klipper.service"] + fake = _runner_for(cmd) + monkeypatch.setattr("core.backends.command_runner", fake) + + instance = FakeInstance("klipper") + InstanceManager.restart(instance) + + assert fake.calls[0][0] == cmd + + def test_enable_records_command(self, monkeypatch: pytest.MonkeyPatch) -> None: + cmd = ["sudo", "systemctl", "enable", "klipper.service"] + fake = _runner_for(cmd) + monkeypatch.setattr("core.backends.command_runner", fake) + + instance = FakeInstance("klipper") + InstanceManager.enable(instance) + + assert fake.calls[0][0] == cmd + + def test_disable_records_command(self, monkeypatch: pytest.MonkeyPatch) -> None: + cmd = ["sudo", "systemctl", "disable", "klipper.service"] + fake = _runner_for(cmd) + monkeypatch.setattr("core.backends.command_runner", fake) + + instance = FakeInstance("klipper") + InstanceManager.disable(instance) + + assert fake.calls[0][0] == cmd + + def test_start_all_iterates_instances( + self, monkeypatch: pytest.MonkeyPatch + ) -> None: + commands = [ + ["sudo", "systemctl", "start", "klipper-1.service"], + ["sudo", "systemctl", "start", "klipper-2.service"], + ] + fake = _runner_for(*commands) + monkeypatch.setattr("core.backends.command_runner", fake) + + instances = [FakeInstance("klipper-1"), FakeInstance("klipper-2")] + InstanceManager.start_all(instances) + + recorded = [call[0] for call in fake.calls] + assert recorded == commands + + def test_stop_all_iterates_instances(self, monkeypatch: pytest.MonkeyPatch) -> None: + commands = [ + ["sudo", "systemctl", "stop", "klipper-a.service"], + ["sudo", "systemctl", "stop", "klipper-b.service"], + ] + fake = _runner_for(*commands) + monkeypatch.setattr("core.backends.command_runner", fake) + + instances = [FakeInstance("klipper-a"), FakeInstance("klipper-b")] + InstanceManager.stop_all(instances) + + recorded = [call[0] for call in fake.calls] + assert recorded == commands