from __future__ import annotations import threading import unittest from unittest.mock import Mock, patch from backend import launcher class _FakeServer: def __init__(self, *, started: bool = False) -> None: self.started = started class LauncherTests(unittest.TestCase): def test_wait_for_server_start_returns_true_when_uvicorn_started(self) -> None: server = _FakeServer(started=True) finished = threading.Event() self.assertTrue(launcher.wait_for_server_start(server, finished)) def test_wait_for_server_start_returns_false_when_startup_finishes_early(self) -> None: server = _FakeServer(started=False) finished = threading.Event() finished.set() with patch.object(launcher, "SERVER_READY_TIMEOUT_SECONDS", 0.3): with patch.object(launcher, "SERVER_READY_POLL_INTERVAL_SECONDS", 0.05): self.assertFalse(launcher.wait_for_server_start(server, finished)) def test_open_browser_skips_when_backend_never_starts(self) -> None: browser_open = Mock() server = _FakeServer(started=False) finished = threading.Event() with patch.object(launcher, "wait_for_server_start", return_value=False): with patch.object(launcher.webbrowser, "open", browser_open): launcher.open_browser("http://127.0.0.1:8000", server, finished) browser_open.assert_not_called() def test_resolve_server_port_delegates_to_shared_runtime(self) -> None: with patch.object(launcher.server_runtime, "resolve_server_port", return_value=8123) as resolver: self.assertEqual(launcher.resolve_server_port(), 8123) resolver.assert_called_once_with(launcher.DEFAULT_HOST, logger=launcher.logger) if __name__ == "__main__": unittest.main()