cmvr_edge_ai/tests/unit/test_server_cli.py

107 lines
3.3 KiB
Python

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)