116 lines
5.3 KiB
Python
116 lines
5.3 KiB
Python
"""URLs publiques de l'écosystème par configuration — #223 (dev/prod).
|
|
|
|
Règle : aucun nom public de l'écosystème n'est figé dans le code
|
|
vivant. Défauts = noms **officiels** (production future) ; le dev
|
|
déclare ses noms en ``-dev`` dans son seul ``.env``
|
|
(``DRACO_*_URL`` / ``AGENT_EVENEMENTS_URL``). On vérifie ici la
|
|
config centralisée, la dérivation de l'URL d'événements du journal,
|
|
la reconnaissance des liens profonds des deux environnements et la
|
|
reconstruction des URL d'affichage des références croisées.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from backend import draco_config
|
|
|
|
|
|
@pytest.fixture()
|
|
def env_propre(monkeypatch):
|
|
"""Aucune variable d'URL d'écosystème posée (défauts officiels)."""
|
|
for nom in (
|
|
"DRACO_AGENT_URL", "DRACO_OBSIGATE_URL", "DRACO_FLOWDECK_URL",
|
|
"DRACO_TIKTAK_URL", "DRACO_KANBANTE_URL", "DRACO_GITEA_URL",
|
|
"AGENT_EVENEMENTS_URL",
|
|
):
|
|
monkeypatch.delenv(nom, raising=False)
|
|
return monkeypatch
|
|
|
|
|
|
def test_defauts_officiels_sans_dev(env_propre):
|
|
assert draco_config.agent_url() == "https://agent.dracodev.net"
|
|
assert draco_config.app_url("tiktak") == "https://tiktak.dracodev.net"
|
|
assert draco_config.app_url("obsigate") == "https://og.dracodev.net"
|
|
assert draco_config.app_url("flowdeck") == "https://flowdeck.dracodev.net"
|
|
assert draco_config.app_url("kanbante") == "https://kanbante.dracodev.net"
|
|
assert draco_config.app_url("gitea") == "https://git.dracodev.net"
|
|
for url in draco_config.urls_publiques().values():
|
|
assert "-dev" not in url
|
|
|
|
|
|
def test_agent_derive_des_evenements(env_propre):
|
|
"""Sans DRACO_AGENT_URL, l'origine suit AGENT_EVENEMENTS_URL —
|
|
la configuration réelle du poste (dev inclus)."""
|
|
env_propre.setenv(
|
|
"AGENT_EVENEMENTS_URL", "https://agent-dev.dracodev.net/api/v1/evenements")
|
|
assert draco_config.agent_url() == "https://agent-dev.dracodev.net"
|
|
assert draco_config.agent_origine() == "https://agent-dev.dracodev.net"
|
|
|
|
|
|
def test_agent_explicite_prime(env_propre):
|
|
env_propre.setenv(
|
|
"AGENT_EVENEMENTS_URL", "https://agent-dev.dracodev.net/api/v1/evenements")
|
|
env_propre.setenv("DRACO_AGENT_URL", "https://agent.example.net/")
|
|
assert draco_config.agent_url() == "https://agent.example.net"
|
|
|
|
|
|
def test_journal_url_suit_la_config(env_propre):
|
|
from backend import agent_journal
|
|
|
|
assert agent_journal._url() == "https://agent.dracodev.net/api/v1/evenements"
|
|
env_propre.setenv("DRACO_AGENT_URL", "https://agent-dev.dracodev.net")
|
|
assert agent_journal._url() == "https://agent-dev.dracodev.net/api/v1/evenements"
|
|
env_propre.setenv(
|
|
"AGENT_EVENEMENTS_URL", "https://autre.example.net/api/v1/evenements")
|
|
assert agent_journal._url() == "https://autre.example.net/api/v1/evenements"
|
|
|
|
|
|
# ------------------------------------------------------------ liens profonds
|
|
|
|
def test_parse_hotes_configures(env_propre):
|
|
"""Un lien collé depuis l'environnement dev (hôtes déclarés dans
|
|
son .env) est reconnu, comme un lien officiel."""
|
|
from backend.external_refs import parse_deep_link
|
|
|
|
env_propre.setenv("DRACO_TIKTAK_URL", "https://tiktak-dev.dracodev.net")
|
|
env_propre.setenv("DRACO_OBSIGATE_URL", "https://og-dev.dracodev.net")
|
|
assert parse_deep_link("https://tiktak-dev.dracodev.net/?task=5") == (
|
|
"tiktak", "task", "5", "TikTak · tâche 5")
|
|
assert parse_deep_link("https://og-dev.dracodev.net/#file=v:Dossier/Note.md") == (
|
|
"obsigate", "note", "v:Dossier/Note.md", "ObsiGate · Note.md")
|
|
# L'officiel reste reconnu en parallèle (lien venu de la prod).
|
|
assert parse_deep_link("https://tiktak.dracodev.net/?task=5") is not None
|
|
|
|
|
|
def test_url_affichage_reconstruite_depuis_config(env_propre, tmp_path):
|
|
"""#223 : la référence stockée garde son URL absolue d'origine
|
|
(aucune migration), mais l'URL **servie** est reconstruite depuis
|
|
la config courante."""
|
|
from backend.external_refs import add_ref, build_deep_link, list_refs
|
|
|
|
env_propre.setenv("OBSIGATE_EXTERNAL_REFS_DIR", str(tmp_path / "refs"))
|
|
assert build_deep_link("tiktak", "task", "42") == \
|
|
"https://tiktak.dracodev.net/?task=42"
|
|
assert build_deep_link("kanbante", "card", "Projets/obsigate#7") == \
|
|
"https://git.dracodev.net/Projets/obsigate/issues/7"
|
|
assert build_deep_link("obsigate", "note", "v:Dossier/Note.md") == \
|
|
"https://og.dracodev.net/#file=v:Dossier%2FNote.md"
|
|
|
|
env_propre.setenv("DRACO_TIKTAK_URL", "https://tiktak-dev.dracodev.net")
|
|
ref = add_ref("alice", "Vault", "N.md", "tiktak", "task", "42",
|
|
"https://tiktak.dracodev.net/?task=42", "TikTak · tâche 42")
|
|
assert ref["target_url"] == "https://tiktak.dracodev.net/?task=42" # stocké tel quel
|
|
servies = list_refs("alice", "Vault", "N.md")
|
|
assert servies[0]["target_url"] == "https://tiktak-dev.dracodev.net/?task=42"
|
|
|
|
|
|
# ------------------------------------------------------------ injection hôte
|
|
|
|
def test_index_injecte_draco_urls(client, env_propre):
|
|
"""L'hôte sert index.html avec window.DRACO_URLS issu de sa config."""
|
|
env_propre.setenv("DRACO_AGENT_URL", "https://agent-dev.dracodev.net")
|
|
resp = client.get("/")
|
|
assert resp.status_code == 200
|
|
assert "window.DRACO_URLS" in resp.text
|
|
assert '"agent": "https://agent-dev.dracodev.net"' in resp.text
|
|
assert '"tiktak": "https://tiktak.dracodev.net"' in resp.text
|