Ctrl K
ComunidadGuías…

tests/test_telegram_urls.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Régression : les URLs par défaut du bot pointent vers le service API.

Bug v1.3.5 : les défauts `http://127.0.0.1:8000/...` laissaient /dns,
/seeds, /backups, /model, /monitoring et /reload muets en production —
dans le conteneur telegram, 127.0.0.1 est SON propre loopback, où aucune
API n'écoute (« Impossible de sonder les résolveurs »). Toute nouvelle
constante d'URL du bot doit suivre le même contrat.
"""

import importlib
import sys
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))

import app.telegram as tg  # noqa: E402

# constante -> (endpoint attendu, variable d'environnement)
EXPECTED = {
    "API_URL": ("/api/chat", "VEKTOR_API_URL"),
    "STATUS_URL": ("/api/status", "VEKTOR_STATUS_URL"),
    "MODEL_URL": ("/api/model", "VEKTOR_MODEL_URL"),
    "SEEDS_URL": ("/api/seeds", "VEKTOR_SEEDS_URL"),
    "QB_URL": ("/api/qb/status", "VEKTOR_QB_URL"),
    "BACKUPS_URL": ("/api/backups", "VEKTOR_BACKUPS_URL"),
    "DNS_URL": ("/api/dns", "VEKTOR_DNS_URL"),
    "MONITORING_URL": ("/api/monitoring", "VEKTOR_MONITORING_URL"),
    "OPS_URL": ("/api/ops", "VEKTOR_OPS_URL"),
    "MAJLIST_URL": ("/api/majlist", "VEKTOR_MAJLIST_URL"),
    "PING_URL": ("/api/ping", "VEKTOR_PING_URL"),
    "RELOAD_URL": ("/api/reload-doc", "VEKTOR_RELOAD_URL"),
    "FORGET_URL": ("/api/forget", "VEKTOR_FORGET_URL"),
}


@pytest.mark.parametrize("attr", sorted(EXPECTED))
def test_default_urls_target_the_api_service(attr):
    endpoint, _env = EXPECTED[attr]
    url = getattr(tg, attr)
    assert url.endswith(endpoint), f"{attr}={url} : endpoint inattendu"
    host = url[: -len(endpoint)].rstrip("/")
    assert host.endswith("vektor-api:8000"), (
        f"{attr}={url} : l'hôte par défaut doit être le service Docker "
        "vektor-api (127.0.0.1 est le loopback du conteneur telegram, "
        "muet en production)"
    )
    assert "127.0.0.1" not in url and "localhost" not in url


def test_env_override_beats_default(monkeypatch):
    """L'environnement compose garde la priorité sur les défauts."""
    for _attr, (endpoint, env) in EXPECTED.items():
        monkeypatch.setenv(env, f"http://override:1234{endpoint}")
    try:
        importlib.reload(tg)
        for attr, (endpoint, _env) in EXPECTED.items():
            assert getattr(tg, attr) == f"http://override:1234{endpoint}"
    finally:
        for _attr, (_endpoint, env) in EXPECTED.items():
            monkeypatch.delenv(env, raising=False)
        importlib.reload(tg)