"""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")