"""Tests for health check server.""" import pytest import asyncio from prometheus_client import CollectorRegistry @pytest.fixture def registry(): return CollectorRegistry() def make_server(service_name="test-service", port=8080, registry=None): from shared.healthcheck import HealthCheckServer return HealthCheckServer(service_name, port=port, registry=registry) def test_init_defaults(registry): """HealthCheckServer initialises with service name and port.""" server = make_server("my-service", registry=registry) assert server.service_name == "my-service" assert server.port == 8080 assert server._checks == {} def test_register_check(registry): """register_check stores an async callable.""" server = make_server(registry=registry) async def check_redis(): return True server.register_check("redis", check_redis) assert "redis" in server._checks assert server._checks["redis"] is check_redis @pytest.mark.asyncio async def test_run_checks_all_pass(registry): """run_checks returns 'ok' when all checks pass.""" server = make_server(registry=registry) async def ok_check(): return True server.register_check("db", ok_check) server.register_check("redis", ok_check) result = await server.run_checks() assert result["status"] == "ok" assert result["service"] == "test-service" assert "uptime_seconds" in result assert result["checks"]["db"] == "ok" assert result["checks"]["redis"] == "ok" @pytest.mark.asyncio async def test_run_checks_one_fails(registry): """run_checks returns 'degraded' when a check fails.""" server = make_server(registry=registry) async def ok_check(): return True async def bad_check(): raise ConnectionError("down") server.register_check("db", ok_check) server.register_check("redis", bad_check) result = await server.run_checks() assert result["status"] == "degraded" assert result["checks"]["db"] == "ok" assert "fail" in result["checks"]["redis"] @pytest.mark.asyncio async def test_run_checks_false_is_fail(registry): """run_checks treats False return as failure.""" server = make_server(registry=registry) async def false_check(): return False server.register_check("cache", false_check) result = await server.run_checks() assert result["status"] == "degraded" assert result["checks"]["cache"] == "fail"