import types import pytest from ariadne.k8s.exec import ExecError from ariadne.services import nextcloud_maintenance as maintenance def _settings(**overrides): base = { "nextcloud_namespace": "nextcloud", "nextcloud_exec_timeout_sec": 30.0, "nextcloud_url": "https://cloud.bstein.dev", } base.update(overrides) return types.SimpleNamespace(**base) def test_nextcloud_maintenance_requires_namespace(monkeypatch) -> None: monkeypatch.setattr(maintenance, "settings", _settings(nextcloud_namespace="")) with pytest.raises(RuntimeError, match="not configured"): maintenance.run_maintenance(types.SimpleNamespace()) def test_nextcloud_maintenance_handles_exec_error(monkeypatch) -> None: monkeypatch.setattr(maintenance, "settings", _settings()) class Executor: def exec(self, *args, **kwargs): raise ExecError("pod failed") service = types.SimpleNamespace(_executor=Executor()) assert maintenance.run_maintenance(service) == {"status": "error", "detail": "pod failed"} def test_nextcloud_maintenance_handles_generic_error(monkeypatch) -> None: monkeypatch.setattr(maintenance, "settings", _settings()) class Executor: def exec(self, *args, **kwargs): return None def fail_occ(_args): raise ValueError("occ failed") service = types.SimpleNamespace(_executor=Executor(), _occ=fail_occ) assert maintenance.run_maintenance(service) == {"status": "error", "detail": "occ failed"}