File size: 4,387 Bytes
f440f03
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""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,
    }