dograh/api/tests/test_active_calls.py
2026-06-28 13:51:55 +05:30

115 lines
3.5 KiB
Python

"""Unit tests for the per-worker active-call registry (deploy draining).
The registry backs GET /api/v1/health/active-calls, which scripts/rolling_update.sh
(and a k8s preStop hook) polls to wait for live calls to finish before stopping a
worker. The guarantees that matter for draining: register/unregister are
idempotent, and the count only reaches zero when every registered run is gone.
"""
from fastapi import FastAPI
from fastapi.testclient import TestClient
from api.routes import main as main_routes
from api.services.pipecat import active_calls
def setup_function():
# Module-level state — start each test from an empty registry.
active_calls._active_run_ids.clear()
def _make_active_calls_client(
monkeypatch,
configured_secret: str | None = "test-dograh-devops-secret",
) -> TestClient:
monkeypatch.setattr("api.constants.DOGRAH_DEVOPS_SECRET", configured_secret)
app = FastAPI()
app.add_api_route(
"/api/v1/health/active-calls",
main_routes.active_calls,
methods=["GET"],
response_model=main_routes.ActiveCallsResponse,
)
return TestClient(app)
def test_starts_empty():
assert active_calls.active_call_count() == 0
def test_register_counts_distinct_runs():
active_calls.register_active_call(1)
active_calls.register_active_call(2)
assert active_calls.active_call_count() == 2
def test_register_is_idempotent():
# Registering the same run twice must not double-count, or the count could
# never drain to zero.
active_calls.register_active_call(1)
active_calls.register_active_call(1)
assert active_calls.active_call_count() == 1
def test_unregister_removes_run():
active_calls.register_active_call(1)
active_calls.register_active_call(2)
active_calls.unregister_active_call(1)
assert active_calls.active_call_count() == 1
def test_unregister_unknown_run_is_a_noop():
# discard() semantics: unregistering a run that was never registered (or was
# already removed) is safe and cannot push the count negative.
active_calls.unregister_active_call(999)
assert active_calls.active_call_count() == 0
def test_full_lifecycle_drains_to_zero():
active_calls.register_active_call(42)
assert active_calls.active_call_count() == 1
active_calls.unregister_active_call(42)
assert active_calls.active_call_count() == 0
def test_active_calls_route_requires_configured_secret(monkeypatch):
client = _make_active_calls_client(monkeypatch, configured_secret=None)
response = client.get(
"/api/v1/health/active-calls",
headers={"X-Dograh-Devops-Secret": "test-dograh-devops-secret"},
)
assert response.status_code == 503
def test_active_calls_route_rejects_missing_secret_header(monkeypatch):
client = _make_active_calls_client(monkeypatch)
response = client.get("/api/v1/health/active-calls")
assert response.status_code == 403
def test_active_calls_route_rejects_wrong_secret(monkeypatch):
client = _make_active_calls_client(monkeypatch)
response = client.get(
"/api/v1/health/active-calls",
headers={"X-Dograh-Devops-Secret": "wrong"},
)
assert response.status_code == 403
def test_active_calls_route_returns_count_with_secret(monkeypatch):
active_calls.register_active_call(42)
client = _make_active_calls_client(monkeypatch)
response = client.get(
"/api/v1/health/active-calls",
headers={"X-Dograh-Devops-Secret": "test-dograh-devops-secret"},
)
assert response.status_code == 200
assert response.json() == {"active_calls": 1}