""" Selección del plugin de plataforma Qt. Esto decide si el agente arranca o no en un servidor. El caso que motivó las pruebas: en Windows, `--headless` no hacía nada —la función salía de inmediato en `win32`—, así que la tarea programada ONSTART, que corre como SYSTEM en la sesión 0 y sin escritorio interactivo, arrancaba con el plugin 'windows' e intentaba crear una ventana real. En Linux el mismo modo funcionaba porque el unit de systemd fija QT_QPA_PLATFORM=offscreen por fuera, y esa asimetría escondió el defecto: la bandera parecía cubierta en las dos plataformas. """ import runner def test_headless_fuerza_offscreen_en_windows(monkeypatch): # La regresión: la tarea ONSTART pasa --headless y necesita que sirva de algo. monkeypatch.setattr(runner.sys, "platform", "win32") monkeypatch.delenv("QT_QPA_PLATFORM", raising=False) assert runner._ensure_qt_platform(headless=True) == "offscreen" assert runner.os.environ["QT_QPA_PLATFORM"] == "offscreen" def test_headless_fuerza_offscreen_en_linux(monkeypatch): monkeypatch.setattr(runner.sys, "platform", "linux") monkeypatch.delenv("QT_QPA_PLATFORM", raising=False) monkeypatch.setenv("DISPLAY", ":0") # Con --headless da igual que haya display: lo pidió el llamador. assert runner._ensure_qt_platform(headless=True) == "offscreen" def test_windows_sin_headless_conserva_el_plugin_nativo(monkeypatch): # Quien abre la app con doble clic quiere su ventana. En Windows no existen DISPLAY ni # WAYLAND_DISPLAY, así que tomar su ausencia como señal mandaría a offscreen a todos. monkeypatch.setattr(runner.sys, "platform", "win32") monkeypatch.delenv("QT_QPA_PLATFORM", raising=False) monkeypatch.delenv("DISPLAY", raising=False) monkeypatch.delenv("WAYLAND_DISPLAY", raising=False) assert runner._ensure_qt_platform(headless=False) == "" assert "QT_QPA_PLATFORM" not in runner.os.environ def test_linux_sin_display_cae_a_offscreen(monkeypatch): monkeypatch.setattr(runner.sys, "platform", "linux") monkeypatch.delenv("QT_QPA_PLATFORM", raising=False) monkeypatch.delenv("DISPLAY", raising=False) monkeypatch.delenv("WAYLAND_DISPLAY", raising=False) assert runner._ensure_qt_platform(headless=False) == "offscreen" def test_una_eleccion_explicita_manda_sobre_headless(monkeypatch): # El instalador fija QT_QPA_PLATFORM para el bootstrap; un override del operador tiene que # sobrevivir, o depurar un arranque en un servidor ajeno se vuelve imposible. monkeypatch.setattr(runner.sys, "platform", "win32") monkeypatch.setenv("QT_QPA_PLATFORM", "minimal") assert runner._ensure_qt_platform(headless=True) == "minimal" assert runner.os.environ["QT_QPA_PLATFORM"] == "minimal" def test_la_bandera_headless_existe_en_el_parser(): # La tarea programada y el unit de systemd la pasan; si desaparece, argparse aborta el # arranque con código 2 y el agente no levanta en ningún servidor. args = runner.parse_args(["--start-engine", "--headless"]) assert args.headless is True assert args.start_engine is True