foxygit / RPA-Remisser Log in
commits tags

/tests/test_desktop.py · 2.26 KB

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