"""Desktop-lagret (rpa/desktop.py) - testar det som går utan en riktig GUI: lat import, tydliga fel när pywinauto/pyautogui saknas, close-mode-städning.""" import pytest from rpa import desktop, schema def test_desktop_module_guards_optional_imports(): """rpa/desktop.py måste importeras rent även utan pywinauto/pyautogui - modulnamnen finns alltid (som None om paketen saknas).""" assert hasattr(desktop, "pywinauto") assert hasattr(desktop, "pyautogui") import rpa.flow_engine as fe assert "desktop_click" in fe._DESKTOP_STEPS and len(fe._DESKTOP_STEPS) == 12 def test_methods_raise_desktop_unavailable_without_backends(monkeypatch): monkeypatch.setattr(desktop, "pywinauto", None) monkeypatch.setattr(desktop, "Application", None) monkeypatch.setattr(desktop, "Desktop", None) monkeypatch.setattr(desktop, "pyautogui", None) d = desktop.DesktopSession(log=lambda _m: None) with pytest.raises(desktop.DesktopUnavailable): d.launch("notepad.exe") with pytest.raises(desktop.DesktopUnavailable): d.click_xy(1, 2) with pytest.raises(desktop.DesktopUnavailable): d.wait_for_window("x") def test_close_leaves_or_kills_launched(monkeypatch): killed = [] class FakeApp: def kill(self, soft=False): # noqa: ARG002 killed.append(True) d = desktop.DesktopSession(log=lambda _m: None) d.launched = [FakeApp(), FakeApp()] d.close(kill_launched=False) assert killed == [] d.close(kill_launched=True) assert killed == [True, True] def test_all_engine_desktop_steps_are_in_schema(): """Drift-vakt (även täckt av test_schema, men här som lokal check).""" import rpa.flow_engine as fe assert fe._DESKTOP_STEPS == {s["type"] for s in schema.STEP_TYPES if s["type"].startswith("desktop_")} def test_inspect_raises_cleanly_without_pywinauto(monkeypatch): from rpa import desktop_inspect def unavailable(): raise desktop_inspect.InspectUnavailable("pywinauto saknas") monkeypatch.setattr(desktop_inspect, "_desktop", unavailable) with pytest.raises(desktop_inspect.InspectUnavailable): desktop_inspect.list_windows() with pytest.raises(desktop_inspect.InspectUnavailable): desktop_inspect.inspect_window("x")