tests/test_morning.py
Rama main · réplica de lectura del repositorio original.
"""Tests du rapport matinal narratif."""
import httpx
import pytest
from app import morning
def _checks(*pairs):
return [{"name": n, "status": s} for n, s in pairs]
@pytest.mark.asyncio
async def test_morning_nuit_calme(monkeypatch):
async def fake_checks():
return _checks(("vzdump-backup", "up"), ("vektor-api", "up"), ("stream-guard", "up"))
async def fake_lvm():
return ["🟢 pve/backup-dumps : 77% — confortable, trim mensuel en place"]
monkeypatch.setattr(morning, "_hc_checks", fake_checks)
monkeypatch.setattr(morning, "_lvm_lines", fake_lvm)
report = await morning.morning_report()
assert "12" not in report
assert "3 checks" in report
assert "Rien à faire" in report
assert "77%" in report
@pytest.mark.asyncio
async def test_morning_avec_check_down(monkeypatch):
async def fake_checks():
return _checks(("vzdump-backup", "down"), ("vektor-api", "up"))
async def fake_lvm():
return []
monkeypatch.setattr(morning, "_hc_checks", fake_checks)
monkeypatch.setattr(morning, "_lvm_lines", fake_lvm)
report = await morning.morning_report()
assert "vzdump-backup" in report
assert "Commence par" in report
@pytest.mark.asyncio
async def test_morning_sur_seuil_critique(monkeypatch):
async def fake_checks():
return _checks(("x", "up"))
async def fake_lvm():
return ["🔴 pve/data : 95% — action requise (fstrim, purge, extension)"]
monkeypatch.setattr(morning, "_hc_checks", fake_checks)
monkeypatch.setattr(morning, "_lvm_lines", fake_lvm)
report = await morning.morning_report()
assert "action requise" in report
def test_extract_textfile_metrics():
raw = '\n'.join([
"# HELP x",
'lvm_thin_data_percent{pool="pve/backup-dumps"} 77.28',
'lvm_vg_free_bytes{vg="pve"} 0',
])
pools, vg_free = morning._parse_textfile(raw)
assert pools == {"pve/backup-dumps": 77.28}
assert vg_free == {"pve": 0.0}
def test_extract_textfile_metrics_garbage():
pools, vg_free = morning._parse_textfile("n'importe quoi")
assert pools == {} and vg_free == {}