from __future__ import annotations from pathlib import Path from cmvr_edge_ai.application import ( create_default_capability_registry, create_default_model_registry, create_default_registry, ) from cmvr_edge_ai.cli import _create_uvicorn_server, main from cmvr_edge_ai.config import load_config from cmvr_edge_ai.server.application import EdgeAIServerApplication PROJECT_ROOT = Path(__file__).resolve().parents[2] SERVER_CONFIG = PROJECT_ROOT / "configs" / "server_detect.yaml" def test_cli_serve_uses_the_server_owned_configuration( monkeypatch, ) -> None: # type: ignore[no-untyped-def] observed: dict[str, object] = {} async def fake_serve(config, registry, capabilities, log_level): # type: ignore[no-untyped-def] observed.update( config=config, registry=registry, capabilities=capabilities, log_level=log_level, ) return 0 monkeypatch.setattr("cmvr_edge_ai.cli._serve_application", fake_serve) monkeypatch.setattr("cmvr_edge_ai.cli.configure_logging", lambda *_: None) assert ( main( [ "serve", "--config", str(SERVER_CONFIG), "--log-level", "WARNING", ] ) == 0 ) config = observed["config"] assert config.server.enabled is True # type: ignore[union-attr] assert set(config.server.routes) == { # type: ignore[union-attr] "detect.mobile_phone", "detect.ppe", } assert observed["log_level"] == "WARNING" def test_uvicorn_server_inherits_bind_limits_from_server_config() -> None: config = load_config(SERVER_CONFIG) models = create_default_model_registry(discover_entry_points=False) application = EdgeAIServerApplication( config, create_default_registry( discover_entry_points=False, model_registry=models, ), create_default_capability_registry( discover_entry_points=False, model_registry=models, ), ) server = _create_uvicorn_server(application, "INFO") assert server.config.host == "127.0.0.1" assert server.config.port == 8081 assert server.config.access_log is False assert server.config.lifespan == "off" def test_uvicorn_server_receives_configured_tls_files(tmp_path: Path) -> None: config = load_config(SERVER_CONFIG) assert config.server is not None certfile = tmp_path / "server.crt" keyfile = tmp_path / "server.key" certfile.write_text("test certificate", encoding="utf-8") keyfile.write_text("test key", encoding="utf-8") config.server.http.tls_certfile = certfile config.server.http.tls_keyfile = keyfile models = create_default_model_registry(discover_entry_points=False) application = EdgeAIServerApplication( config, create_default_registry( discover_entry_points=False, model_registry=models, ), create_default_capability_registry( discover_entry_points=False, model_registry=models, ), ) server = _create_uvicorn_server(application, "INFO") assert server.config.ssl_certfile == str(certfile) assert server.config.ssl_keyfile == str(keyfile)