from __future__ import annotations from pathlib import Path def _project_root() -> Path: # This test file lives in `/tests/`. return Path(__file__).resolve().parents[1] def _render_dashboard_service(*, vt: int = 1) -> str: template_path = ( _project_root() / "infrastructure/roles/dashboard/templates/dashboard.service.j2" ) template = template_path.read_text(encoding="utf-8") # Keep this test dependency-free (no Jinja2 import required). return ( template.replace("{{ dashboard_vt }}", str(vt)) .replace("{{ dashboard_script_dest }}", "/usr/local/bin/dashboard.sh") .replace("{{ dashboard_user }}", "pi") ) def test_dashboard_service_is_safe_for_multi_user_target() -> None: rendered = _render_dashboard_service(vt=1) # Avoid an ordering cycle with the target that wants the service. assert "After=multi-user.target" not in rendered assert "Wants=multi-user.target" not in rendered assert "WantedBy=multi-user.target" in rendered def test_dashboard_service_attaches_to_a_vt_and_passes_vt_to_script() -> None: rendered = _render_dashboard_service(vt=1) assert "TTYPath=/dev/tty1" in rendered assert "StandardInput=tty" in rendered assert "Environment=DASHBOARD_VT=1" in rendered def test_dashboard_service_does_not_use_su_by_default() -> None: rendered = _render_dashboard_service(vt=1) assert "su -l" not in rendered def test_dashboard_script_passes_vt_and_keeptty_to_xorg() -> None: script_path = _project_root() / "tools/dashboard.sh" script = script_path.read_text(encoding="utf-8") assert "DASHBOARD_VT" in script assert "vt${DASHBOARD_VT}" in script assert "-keeptty" in script