| """Tests core-python FastAPI app startup un healthcheck pieejamībai.""" |
|
|
| from __future__ import annotations |
|
|
| import importlib |
| import sys |
|
|
| from fastapi import FastAPI |
| from fastapi.testclient import TestClient |
|
|
|
|
| def _clear_modules(*module_names: str) -> None: |
| for module_name in module_names: |
| sys.modules.pop(module_name, None) |
|
|
|
|
| def _restore_module(module_name: str, module: object | None) -> None: |
| if module is None: |
| sys.modules.pop(module_name, None) |
| else: |
| sys.modules[module_name] = module |
|
|
|
|
| def test_api_router_falls_back_when_optional_module_import_fails(monkeypatch) -> None: |
| real_import_module = importlib.import_module |
| previous_api_module = sys.modules.get("maris_core.api") |
| previous_vision_module = sys.modules.get("maris_core.vision.analyze") |
|
|
| def fake_import_module(name: str, package: str | None = None): |
| if name == "maris_core.vision.analyze": |
| raise ModuleNotFoundError("No module named 'numpy'", name="numpy") |
| return real_import_module(name, package) |
|
|
| try: |
| monkeypatch.setattr(importlib, "import_module", fake_import_module) |
| _clear_modules("maris_core.api", "maris_core.vision.analyze") |
|
|
| api_module = importlib.import_module("maris_core.api") |
| app = FastAPI() |
| app.include_router(api_module.router, prefix="/v1") |
| client = TestClient(app) |
|
|
| personas_response = client.get("/v1/personas") |
| vision_response = client.get("/v1/vision") |
|
|
| assert personas_response.status_code == 200 |
| assert vision_response.status_code == 503 |
| assert "maris_core.vision.analyze" in vision_response.json()["detail"] |
| finally: |
| _restore_module("maris_core.api", previous_api_module) |
| _restore_module("maris_core.vision.analyze", previous_vision_module) |
|
|
|
|
| def test_healthcheck_stays_available_when_optional_route_import_fails(monkeypatch) -> None: |
| real_import_module = importlib.import_module |
| previous_main_module = sys.modules.get("maris_core.__main__") |
| previous_api_module = sys.modules.get("maris_core.api") |
| previous_vision_module = sys.modules.get("maris_core.vision.analyze") |
|
|
| def fake_import_module(name: str, package: str | None = None): |
| if name == "maris_core.vision.analyze": |
| raise ModuleNotFoundError("No module named 'numpy'", name="numpy") |
| return real_import_module(name, package) |
|
|
| try: |
| monkeypatch.setattr(importlib, "import_module", fake_import_module) |
| _clear_modules("maris_core.__main__", "maris_core.api", "maris_core.vision.analyze") |
|
|
| main_module = importlib.import_module("maris_core.__main__") |
| client = TestClient(main_module.app) |
|
|
| response = client.get("/health") |
|
|
| assert response.status_code == 200 |
| assert response.json() == {"status": "ok", "service": "maris-core-python"} |
| finally: |
| _restore_module("maris_core.__main__", previous_main_module) |
| _restore_module("maris_core.api", previous_api_module) |
| _restore_module("maris_core.vision.analyze", previous_vision_module) |
|
|
|
|
| def test_ready_reports_warming_up_until_text_model_is_loaded() -> None: |
| _clear_modules("maris_core.__main__") |
| main_module = importlib.import_module("maris_core.__main__") |
| client = TestClient(main_module.app) |
|
|
| monkeypatch_payload = { |
| "ready": False, |
| "state": "warming_up", |
| } |
| main_module.get_text_model_readiness = lambda start_loading=True: monkeypatch_payload |
|
|
| response = client.get("/ready") |
|
|
| assert response.status_code == 503 |
| assert response.json() == { |
| "status": "not_ready", |
| "service": "maris-core-python", |
| "ready": False, |
| "text_model": monkeypatch_payload, |
| } |
|
|
|
|
| def test_ready_reports_ok_when_text_model_is_fully_warm() -> None: |
| _clear_modules("maris_core.__main__") |
| main_module = importlib.import_module("maris_core.__main__") |
| client = TestClient(main_module.app) |
|
|
| monkeypatch_payload = { |
| "ready": True, |
| "state": "ready", |
| } |
| main_module.get_text_model_readiness = lambda start_loading=True: monkeypatch_payload |
|
|
| response = client.get("/ready") |
|
|
| assert response.status_code == 200 |
| assert response.json() == { |
| "status": "ok", |
| "service": "maris-core-python", |
| "ready": True, |
| "text_model": monkeypatch_payload, |
| } |
|
|