mirror of
https://github.com/azaion/detections.git
synced 2026-04-22 22:06:32 +00:00
86b8f076b7
- Modified the health endpoint to return "None" for AI availability when inference is not initialized, improving clarity on system status. - Enhanced the test documentation to include handling of skipped tests, emphasizing the need for investigation before proceeding. - Updated test assertions to ensure proper execution order and prevent premature engine initialization. - Refactored test cases to streamline performance testing and improve readability, removing unnecessary complexity. These changes aim to enhance the robustness of the health check and improve the overall testing framework.
81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
import time
|
|
|
|
import pytest
|
|
|
|
_DETECT_TIMEOUT = 60
|
|
|
|
|
|
def _get_health(http_client):
|
|
r = http_client.get("/health")
|
|
r.raise_for_status()
|
|
return r.json()
|
|
|
|
|
|
def _assert_active_ai(data):
|
|
assert data["status"] == "healthy"
|
|
assert data["aiAvailability"] not in ("None", "Downloading")
|
|
|
|
|
|
@pytest.mark.cpu
|
|
class TestHealthEngineStep01PreInit:
|
|
def test_ft_p_01_pre_init_health(self, http_client):
|
|
t0 = time.monotonic()
|
|
data = _get_health(http_client)
|
|
assert time.monotonic() - t0 < 2.0
|
|
assert data["status"] == "healthy"
|
|
assert data["aiAvailability"] == "None", (
|
|
f"engine already initialized (aiAvailability={data['aiAvailability']}); "
|
|
"pre-init tests must run before any test that triggers warm_engine"
|
|
)
|
|
assert data.get("errorMessage") is None
|
|
|
|
|
|
@pytest.mark.cpu
|
|
@pytest.mark.slow
|
|
class TestHealthEngineStep02LazyInit:
|
|
def test_ft_p_14_lazy_initialization(self, http_client, image_small):
|
|
before = _get_health(http_client)
|
|
assert before["aiAvailability"] == "None", (
|
|
f"engine already initialized (aiAvailability={before['aiAvailability']}); "
|
|
"lazy-init test must run before any test that triggers warm_engine"
|
|
)
|
|
files = {"file": ("lazy.jpg", image_small, "image/jpeg")}
|
|
r = http_client.post("/detect", files=files, timeout=_DETECT_TIMEOUT)
|
|
r.raise_for_status()
|
|
body = r.json()
|
|
assert isinstance(body, list)
|
|
after = _get_health(http_client)
|
|
_assert_active_ai(after)
|
|
|
|
|
|
@pytest.mark.cpu
|
|
@pytest.mark.slow
|
|
class TestHealthEngineStep03Warmed:
|
|
@pytest.fixture(autouse=True)
|
|
def _warm(self, warm_engine):
|
|
pass
|
|
|
|
def test_ft_p_02_post_init_health(self, http_client):
|
|
data = _get_health(http_client)
|
|
_assert_active_ai(data)
|
|
assert data.get("errorMessage") is None
|
|
|
|
def test_ft_p_15_onnx_cpu_detect(self, http_client, image_small):
|
|
files = {"file": ("onnx.jpg", image_small, "image/jpeg")}
|
|
r = http_client.post("/detect", files=files, timeout=_DETECT_TIMEOUT)
|
|
r.raise_for_status()
|
|
body = r.json()
|
|
assert isinstance(body, list)
|
|
if body:
|
|
d = body[0]
|
|
for k in (
|
|
"centerX",
|
|
"centerY",
|
|
"width",
|
|
"height",
|
|
"classNum",
|
|
"label",
|
|
"confidence",
|
|
):
|
|
assert k in d
|