summaryrefslogtreecommitdiff
path: root/shared/tests/test_healthcheck.py
blob: 6970a8ffd8553a0c8fbcb4c5d5258eb214337364 (plain)
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
"""Tests for health check server."""

import pytest
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"