tests/installer/test_catalog.py
Rama main · réplica de lectura del repositorio original.
"""Tests du catalogue declaratif des MCPs."""
import re
import pytest
from installer.core.catalog import CatalogError, load_catalog, resolve_placeholders
@pytest.fixture(scope="module")
def catalog():
return load_catalog()
def test_chargement_et_ids_uniques(catalog):
ids = [m.id for m in catalog]
assert len(ids) == len(set(ids))
assert {"fedora", "hue", "tv", "denon", "catt", "tracking"} <= set(ids)
def test_repos_ssh_amineutron(catalog):
"""Le catalogue doit cloner les depots qui recoivent les commits.
marouabah/* ne fait plus que rediriger vers amineutron/*, et pour hue la
redirection aboutit meme sur amineutron/hue-mcp-old (copie d'aout).
"""
for m in catalog:
if m.repo:
assert m.repo.startswith("[email protected]:amineutron/"), m.id
def test_aucune_ip_en_dur(catalog):
ip_re = re.compile(r"192\.168\.\d+\.\d+")
for m in catalog:
blob = repr((m.long_desc, m.notes, m.config, m.server, m.check,
m.fields, m.examples))
# 127.0.0.1 (tracking local) est legitime ; les IP LAN non.
assert not ip_re.search(blob), f"IP en dur dans '{m.id}'"
def test_exemples_vocaux_presents(catalog):
for m in catalog:
assert len(m.examples) >= 4, f"'{m.id}' : exemples vocaux manquants"
def test_champs_secrets_coherents(catalog):
tv = next(m for m in catalog if m.id == "tv")
secrets = {f.key for f in tv.fields if f.secret}
assert secrets == {"user", "pass"}
# Les cles secretes doivent rester null dans le bloc config
assert tv.config["tv"]["user"] is None
assert tv.config["tv"]["pass"] is None
def test_installable(catalog):
tracking = next(m for m in catalog if m.id == "tracking")
assert not tracking.installable
assert sum(1 for m in catalog if m.installable) == 5
def test_resolve_placeholders_strict():
assert resolve_placeholders({"a": "{x}/b"}, {"x": "1"}) == {"a": "1/b"}
with pytest.raises(KeyError):
resolve_placeholders("{manquant}", {})
def test_catalogue_invalide(tmp_path):
bad = tmp_path / "bad.yaml"
bad.write_text("mcps:\n - id: a\n name: a\n short_desc: x\n"
" long_desc: y\n runtime: cobol\n")
with pytest.raises(CatalogError):
load_catalog(bad)