"""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