2026-05-29 12:26:34 +02:00
|
|
|
"""Tests for HeartbeatCheck."""
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
from ha_diag.checks.heartbeat import HeartbeatCheck
|
|
|
|
|
from ha_diag.models import HAEventType, Severity
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _make_client(api_status=None, side_effect=None):
|
|
|
|
|
client = MagicMock()
|
|
|
|
|
if side_effect:
|
|
|
|
|
client.get_api_status = AsyncMock(side_effect=side_effect)
|
|
|
|
|
else:
|
|
|
|
|
client.get_api_status = AsyncMock(return_value=api_status)
|
|
|
|
|
return client
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
2026-05-29 13:41:55 +02:00
|
|
|
async def test_heartbeat_ok_returns_empty_list():
|
2026-05-29 12:26:34 +02:00
|
|
|
client = _make_client(api_status={"message": "API running."})
|
|
|
|
|
check = HeartbeatCheck(client)
|
2026-05-29 13:41:55 +02:00
|
|
|
results = await check.run()
|
|
|
|
|
assert results == []
|
2026-05-29 12:26:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
|
async def test_heartbeat_connection_error():
|
|
|
|
|
client = _make_client(side_effect=ConnectionError("refused"))
|
|
|
|
|
check = HeartbeatCheck(client)
|
2026-05-29 13:41:55 +02:00
|
|
|
results = await check.run()
|
|
|
|
|
assert len(results) == 1
|
|
|
|
|
assert results[0].healthy is False
|
|
|
|
|
assert results[0].event_type == HAEventType.ha_websocket_dead
|
|
|
|
|
assert results[0].severity == Severity.error
|
|
|
|
|
assert "refused" in results[0].message
|
2026-05-29 12:26:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
|
async def test_heartbeat_unexpected_response():
|
|
|
|
|
client = _make_client(api_status={"unexpected": "key"})
|
|
|
|
|
check = HeartbeatCheck(client)
|
2026-05-29 13:41:55 +02:00
|
|
|
results = await check.run()
|
|
|
|
|
assert len(results) == 1
|
|
|
|
|
assert results[0].event_type == HAEventType.ha_websocket_dead
|
2026-05-29 12:26:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
|
async def test_heartbeat_timeout():
|
|
|
|
|
client = _make_client(side_effect=TimeoutError("timed out"))
|
|
|
|
|
check = HeartbeatCheck(client)
|
2026-05-29 13:41:55 +02:00
|
|
|
results = await check.run()
|
|
|
|
|
assert len(results) == 1
|
|
|
|
|
assert results[0].event_type == HAEventType.ha_websocket_dead
|
|
|
|
|
assert "timed out" in results[0].message
|
2026-05-29 12:26:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_heartbeat_check_name():
|
2026-05-29 13:41:55 +02:00
|
|
|
check = HeartbeatCheck(MagicMock())
|
2026-05-29 12:26:34 +02:00
|
|
|
assert check.name == "heartbeat"
|