7.84.13 — barre v0.3.0 : liens Hub du menu compte (HUB-1) #48

Merged
bruno merged 3 commits from hub1-barre-v030 into main 2026-11-04 19:49:06 -05:00
9 changed files with 163 additions and 21 deletions
+8
View File
@@ -1,3 +1,11 @@
## v7.84.13 (2026-11-04) — Barre commune v0.3.0 : liens Hub du menu compte (HUB-1)
- **Barre d'apps v0.3.0 vendangée (dracodev-commons, branche `hub-menu-compte-v0-3-0`, PR commons #9)** : `static/css/draco-barre.css` et `static/js/vendor/draco-barre.js` remplacés verbatim par la v0.3.0 ; fragment `app/templates/_draco_bar.html` porté (note de vendange + `urls.hub` dans la configuration), le reste de l'intégration Flowdeck inchangé.
- **Menu compte** : liens **Télécharger**, **À Propos**, **Aides** et **Profil** (devenu un lien vers `<hub>/profil`, plus un relais) construits par le JS vendangé depuis la base Hub résolue ; « Déconnexion » reste relayée à l'hôte, inchangée.
- **URL Hub par le même mécanisme que les autres** : `app/services/draco_urls.py` gagne la clé `hub` (défaut officiel `https://hub.dracodev.net` ; explicite `HUB_URL` / `settings.hub_url` ; dérivation par l'hôte de la requête — motif fermé étendu à `hub` — et par l'hôte de l'agent : `hub-dev` en dev), exposée dans `draco_urls.toutes()` et passée au gabarit en `urls.hub`. Les consommateurs par listes de clés (CORS, CSP, recherche fédérée) ne sont pas affectés : le Hub n'y entre pas.
- **Cache** : le bump 7.84.12 → 7.84.13 change aussi `asset_version`, donc les navigateurs ne garderont pas l'ancienne barre.
- Tests : `tests/test_draco_urls_devprod.py` (résolution Hub : défaut, dérivations, explicite) et `tests/test_draco_bar_texte.py` (marqueurs v0.3.0 du JS vendangé et du gabarit) étendus.
## v7.84.11 (2026-11-04) — Recherche fédérée : ShaarIt, 5e source de « Rechercher partout » ## v7.84.11 (2026-11-04) — Recherche fédérée : ShaarIt, 5e source de « Rechercher partout »
- **`static/js/recherche.js` re-vendangé depuis dracodev-commons v0.2.1** (source canonique `ui/recherche/`, contrat `contrats/recherche-federee.md`) : ShaarIt devient une source de la page `/recherche` comme les autres — bases prod/dev, onglet, normaliseur (lien profond canonique `{base}shaare/<shorturl>`, contexte « Bookmark · privé · tags », repli recherche native `/?q=`). Le fichier reste **strictement identique** chez les cinq hôtes. - **`static/js/recherche.js` re-vendangé depuis dracodev-commons v0.2.1** (source canonique `ui/recherche/`, contrat `contrats/recherche-federee.md`) : ShaarIt devient une source de la page `/recherche` comme les autres — bases prod/dev, onglet, normaliseur (lien profond canonique `{base}shaare/<shorturl>`, contexte « Bookmark · privé · tags », repli recherche native `/?q=`). Le fichier reste **strictement identique** chez les cinq hôtes.
+1 -1
View File
@@ -1 +1 @@
7.84.12 7.84.13
+2
View File
@@ -157,6 +157,7 @@ class Settings(BaseSettings):
# TIKTAK_URL=https://tiktak-dev.dracodev.net # TIKTAK_URL=https://tiktak-dev.dracodev.net
# KANBANTE_URL=https://kanbante-dev.dracodev.net # KANBANTE_URL=https://kanbante-dev.dracodev.net
# SHAARIT_URL=https://shaarit-dev.dracodev.net # SHAARIT_URL=https://shaarit-dev.dracodev.net
# HUB_URL=https://hub-dev.dracodev.net
# FLOWDECK_URL=https://flowdeck-dev.dracodev.net # FLOWDECK_URL=https://flowdeck-dev.dracodev.net
draco_sso_url: str = "https://og.dracodev.net" # ObsiGate (émettrice SSO) draco_sso_url: str = "https://og.dracodev.net" # ObsiGate (émettrice SSO)
# ── Coffre ObsiGate, côté consommateur Flowdeck (Phase 4, issue #22) ── # ── Coffre ObsiGate, côté consommateur Flowdeck (Phase 4, issue #22) ──
@@ -170,6 +171,7 @@ class Settings(BaseSettings):
tiktak_url: str = "https://tiktak.dracodev.net" tiktak_url: str = "https://tiktak.dracodev.net"
kanbante_url: str = "https://kanbante.dracodev.net" kanbante_url: str = "https://kanbante.dracodev.net"
shaarit_url: str = "https://shaarit.dracodev.net" shaarit_url: str = "https://shaarit.dracodev.net"
hub_url: str = "https://hub.dracodev.net"
# URL publique de CETTE instance ; vide = dérivée de # URL publique de CETTE instance ; vide = dérivée de
# OAUTH_REDIRECT_URI, puis d'APP_BASE_URL (si non locale), puis du # OAUTH_REDIRECT_URI, puis d'APP_BASE_URL (si non locale), puis du
# nom officiel. # nom officiel.
+12 -1
View File
@@ -98,6 +98,7 @@ OFFICIELLES = {
"kanbante": "https://kanbante.dracodev.net", "kanbante": "https://kanbante.dracodev.net",
"shaarit": "https://shaarit.dracodev.net", "shaarit": "https://shaarit.dracodev.net",
"flowdeck": "https://flowdeck.dracodev.net", "flowdeck": "https://flowdeck.dracodev.net",
"hub": "https://hub.dracodev.net",
"gitea": "https://git.dracodev.net", "gitea": "https://git.dracodev.net",
} }
@@ -123,6 +124,7 @@ _SLUGS_SOEURS = {
"tiktak": "tiktak", "tiktak": "tiktak",
"kanbante": "kanbante", "kanbante": "kanbante",
"shaarit": "shaarit", "shaarit": "shaarit",
"hub": "hub",
} }
# Hôte de l'agent : agent<SUFFIXE>.dracodev.net (SUFFIXE = ``-dev``…). # Hôte de l'agent : agent<SUFFIXE>.dracodev.net (SUFFIXE = ``-dev``…).
@@ -133,7 +135,7 @@ _MOTIF_HOTE_AGENT = re.compile(r"^agent(-[a-z0-9-]+)?\.dracodev\.net$")
# de TOUTE l'installation — jamais un suffixe inventé depuis un # de TOUTE l'installation — jamais un suffixe inventé depuis un
# hôte arbitraire : hors motif (autre domaine, LAN, IP), None. # hôte arbitraire : hors motif (autre domaine, LAN, IP), None.
_MOTIF_HOTE_PUBLIC = re.compile( _MOTIF_HOTE_PUBLIC = re.compile(
r"^(og|flowdeck|tiktak|kanbante|agent)(-[a-z0-9-]+)?\.dracodev\.net$") r"^(og|flowdeck|tiktak|kanbante|agent|hub)(-[a-z0-9-]+)?\.dracodev\.net$")
# Slugs pour la résolution par l'hôte de la requête (l'agent inclus). # Slugs pour la résolution par l'hôte de la requête (l'agent inclus).
_SLUGS_TOUTES = {**_SLUGS_SOEURS, "agent": "agent"} _SLUGS_TOUTES = {**_SLUGS_SOEURS, "agent": "agent"}
@@ -282,6 +284,14 @@ def shaarit_url() -> str:
return _resoudre_soeur("SHAARIT_URL", "shaarit_url", "shaarit") return _resoudre_soeur("SHAARIT_URL", "shaarit_url", "shaarit")
def hub_url() -> str:
"""Hub (barre v0.3.0, HUB-1) : même résolution que les sœurs —
il n'a pas d'onglet, sa base sert les liens du menu compte
(Télécharger, À Propos, Aides, Profil) via ``urls.hub`` de la
configuration de la barre."""
return _resoudre_soeur("HUB_URL", "hub_url", "hub")
def gitea_url() -> str: def gitea_url() -> str:
return _resoudre("GITEA_URL", "gitea_url", "gitea") return _resoudre("GITEA_URL", "gitea_url", "gitea")
@@ -366,6 +376,7 @@ def toutes() -> dict[str, str]:
"kanbante": kanbante_url(), "kanbante": kanbante_url(),
"shaarit": shaarit_url(), "shaarit": shaarit_url(),
"flowdeck": flowdeck_url(), "flowdeck": flowdeck_url(),
"hub": hub_url(),
"gitea": gitea_url(), "gitea": gitea_url(),
} }
+12 -3
View File
@@ -1,8 +1,11 @@
{# Barre d'apps commune dracodev — Fusion ACC-1.1 (issue #17). {# Barre d'apps commune dracodev — Fusion ACC-1.1 (issue #17).
Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.2.0 Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.3.0
(ui/barre-apps/, commit 70c837a de la branche (ui/barre-apps/, branche hub-menu-compte-v0-3-0 de la PR commons
shaarit-phase3-barre-contrats) : ne pas modifier la structure ici ; #9 — HUB-1, fusion #115) : ne pas modifier la structure ici ;
toute évolution passe par une nouvelle version de commons. toute évolution passe par une nouvelle version de commons.
v0.3.0 : menu compte — liens Hub Télécharger / À Propos / Aides
et Profil devenu lien (base draco_urls().hub passée en urls.hub
de la configuration ci-dessous) ; « Déconnexion » reste relayée.
CSS/JS : /static/css/draco-barre.css, /static/js/vendor/draco-barre.js. CSS/JS : /static/css/draco-barre.css, /static/js/vendor/draco-barre.js.
v7.82.0 (dev/prod) : les href des onglets ne sont plus figés — v7.82.0 (dev/prod) : les href des onglets ne sont plus figés —
l'hôte les injecte depuis sa config (draco_urls(), noms officiels l'hôte les injecte depuis sa config (draco_urls(), noms officiels
@@ -105,6 +108,12 @@
repli si le module ne charge pas). */ repli si le module ne charge pas). */
window.DRACO_BAR_CONFIG = { window.DRACO_BAR_CONFIG = {
current: "flowdeck", current: "flowdeck",
/* Barre v0.3.0 (HUB-1) : le Hub n'a pas d'onglet — sa base
(draco_urls().hub : HUB_URL explicite, hôte de la requête,
dérivation par l'agent, défaut officiel) alimente les
liens du menu compte (Télécharger, À Propos, Aides,
Profil) via urls.hub. */
urls: { hub: "{{ draco_urls().hub }}/" },
domain: (function () { try { return localStorage.getItem("draco_domain") || "pro"; } catch (e) { return "pro"; } })(), domain: (function () { try { return localStorage.getItem("draco_domain") || "pro"; } catch (e) { return "pro"; } })(),
counts: {}, counts: {},
onAction: function (act, el) { onAction: function (act, el) {
+4
View File
@@ -20,6 +20,10 @@
le clair via data-theme="light" héritait quand même du sombre le clair via data-theme="light" héritait quand même du sombre
système (piège constaté dans les copies vendangées de système (piège constaté dans les copies vendangées de
Kanbante/Flowdeck ; les re-vendanges de la v0.2.0 le corrigent). Kanbante/Flowdeck ; les re-vendanges de la v0.2.0 le corrigent).
v0.3.0 (HUB-1) : aucun style nouveau — les liens du Hub du menu
compte (Télécharger, À Propos, Aides, Profil) réutilisent
.draco-menu-item (déjà ancre-compatible : text-decoration none)
et le séparateur .draco-menu-sep du menu des applications.
Jetons repris du prototype validé Console v7.2. Jetons repris du prototype validé Console v7.2.
Thème : clair par défaut, sombre via [data-theme="dark"] sur <html> Thème : clair par défaut, sombre via [data-theme="dark"] sur <html>
ou prefers-color-scheme si l'app intégratrice ne force rien ou prefers-color-scheme si l'app intégratrice ne force rien
+86 -15
View File
@@ -14,6 +14,21 @@
* contrat que les autres apps), entrée APP_LABELS ; l'onglet * contrat que les autres apps), entrée APP_LABELS ; l'onglet
* (data-app="shaarit", après Kanbante, avant agent) est repris * (data-app="shaarit", après Kanbante, avant agent) est repris
* automatiquement par la construction du menu de la marque. * automatiquement par la construction du menu de la marque.
* v0.3.0 (carte HUB-1, fusion #115) : le Hub, point central de la
* suite — nouvelle clé d'URL « hub » (jeton {{URL_HUB}} côté hôte,
* DRACO_BAR_CONFIG.urls.hub), défaut officiel
* https://hub.dracodev.net/, dérivation -dev hub-dev comme les
* sœurs. Le menu compte gagne trois vrais liens (patron
* buildAppsMenu : <a href>, classe draco-menu-item) — Télécharger
* → <hub>/telecharger, À Propos → <hub>/a-propos, Aides →
* <hub>/aide — et « Profil » devient lui aussi un lien, vers
* <hub>/profil (il n'est plus relayé aux hôtes : un seul Profil,
* celui du Hub). « Déconnexion » reste l'action relayée
* (data-compte-act="deconnexion" / onAction), inchangée.
* refreshMenuHrefs() resynchronise aussi les liens du Hub à
* l'ouverture des menus. Le Hub n'a pas d'onglet dans la barre :
* comme spark, sa clé est résolue et exposée via DRACO_BAR.urls,
* sans étape « href rendu » (voir « URL » ci-dessous).
* *
* Aucun gestionnaire inline : un seul écouteur délégué sur le document * Aucun gestionnaire inline : un seul écouteur délégué sur le document
* (patron validé par le prototype — les onclick du HTML généré sont * (patron validé par le prototype — les onclick du HTML généré sont
@@ -33,7 +48,8 @@
* kanbante: "https://kanbante.dracodev.net/", * kanbante: "https://kanbante.dracodev.net/",
* shaarit: "https://shaarit.dracodev.net/", * shaarit: "https://shaarit.dracodev.net/",
* agent: "https://agent.dracodev.net/", * agent: "https://agent.dracodev.net/",
* spark: "https://spark.dracodev.net/" * spark: "https://spark.dracodev.net/",
* hub: "https://hub.dracodev.net/"
* }, * },
* onAction: function (act, el) { … } // l'app relaie les actions * onAction: function (act, el) { … } // l'app relaie les actions
* } // qu'elle ne connaît pas * } // qu'elle ne connaît pas
@@ -67,6 +83,12 @@
* la marque et DRACO_BAR.urls. Même résolution pour shaarit (v0.2.0) : * la marque et DRACO_BAR.urls. Même résolution pour shaarit (v0.2.0) :
* explicite > dérivation -dev shaarit-dev > href rendu * explicite > dérivation -dev shaarit-dev > href rendu
* ({{URL_SHAARIT}}) > défaut officiel. * ({{URL_SHAARIT}}) > défaut officiel.
* Cas hub (v0.3.0) : PAS d'onglet, donc pas d'étape « href rendu » —
* explicite (DRACO_BAR_CONFIG.urls.hub, alimenté par le jeton
* {{URL_HUB}} remplacé côté serveur par l'hôte) > dérivation -dev
* hub-dev sur hôte -dev > défaut officiel
* https://hub.dracodev.net/. La base résolue sert les quatre liens
* du menu compte (telecharger, a-propos, aide, profil).
* Actions émises (data-act) : rail, palette, domaine (data-dom), * Actions émises (data-act) : rail, palette, domaine (data-dom),
* alertes, spark, rappel-entete. L'app intégratrice décide de chacune * alertes, spark, rappel-entete. L'app intégratrice décide de chacune
* (ouvrir la palette, le panneau Spark, changer de domaine…). * (ouvrir la palette, le panneau Spark, changer de domaine…).
@@ -141,6 +163,14 @@
* mais le menu affiche l'identité même sans gestionnaire hôte. * mais le menu affiche l'identité même sans gestionnaire hôte.
* Accessibilité : vrais <button>, aria-haspopup / aria-expanded, * Accessibilité : vrais <button>, aria-haspopup / aria-expanded,
* role="menu" / "menuitem", fermeture par Échap et clic extérieur. * role="menu" / "menuitem", fermeture par Échap et clic extérieur.
* Menu compte (v0.3.0) — Profil n'est PLUS relayé : c'est un lien
* vers <hub>/profil, comme Télécharger / À Propos / Aides (liens
* Hub, data-hub-link, href resynchronisés à chaque ouverture via
* refreshCompteHrefs / refreshMenuHrefs). Seule « Déconnexion »
* reste relayée à l'hôte (data-compte-act="deconnexion"), inchangée.
* Les hôtes qui traitaient onAction("profil") (Kanbante → /profile)
* voient ce comportement remplacé par le lien Hub — décision du
* plan Hub : un seul Profil, celui du Hub.
*/ */
(function () { (function () {
"use strict"; "use strict";
@@ -155,7 +185,8 @@
kanbante: "https://kanbante.dracodev.net/", kanbante: "https://kanbante.dracodev.net/",
shaarit: "https://shaarit.dracodev.net/", shaarit: "https://shaarit.dracodev.net/",
agent: "https://agent.dracodev.net/", agent: "https://agent.dracodev.net/",
spark: "https://spark.dracodev.net/" spark: "https://spark.dracodev.net/",
hub: "https://hub.dracodev.net/"
}; };
/* Dérivation -dev (v0.1.6) — appliquée UNIQUEMENT quand l'hôte courant /* Dérivation -dev (v0.1.6) — appliquée UNIQUEMENT quand l'hôte courant
@@ -168,7 +199,8 @@
tiktak: "https://tiktak-dev.dracodev.net/", tiktak: "https://tiktak-dev.dracodev.net/",
kanbante: "https://kanbante-dev.dracodev.net/", kanbante: "https://kanbante-dev.dracodev.net/",
shaarit: "https://shaarit-dev.dracodev.net/", shaarit: "https://shaarit-dev.dracodev.net/",
agent: "https://agent-dev.dracodev.net/" agent: "https://agent-dev.dracodev.net/",
hub: "https://hub-dev.dracodev.net/"
}; };
var APP_LABELS = { var APP_LABELS = {
@@ -307,6 +339,28 @@
menu.querySelectorAll(".draco-apps-item").forEach(function (a) { menu.querySelectorAll(".draco-apps-item").forEach(function (a) {
if (a.dataset.app && resolvedUrls[a.dataset.app]) a.setAttribute("href", resolvedUrls[a.dataset.app]); if (a.dataset.app && resolvedUrls[a.dataset.app]) a.setAttribute("href", resolvedUrls[a.dataset.app]);
}); });
/* v0.3.0 : les liens du Hub (menu compte) sont resynchronisés
* eux aussi à l'ouverture d'un menu, pour refléter setUrls et
* la dérivation -dev même s'ils ont été construits avant. */
refreshCompteHrefs();
}
/* Liens du Hub dans le menu compte (v0.3.0) : chemin → libellé.
* « Profil » est le quatrième lien (vers <hub>/profil) ; il
* remplace l'ancien item relayé « profil ». */
var HUB_LINKS = [
["telecharger", "Télécharger"],
["a-propos", "À Propos"],
["aide", "Aides"],
["profil", "Profil"]
];
function hubHref(path) {
return withSlash(resolvedUrls.hub || DEFAULT_URLS.hub) + path;
}
function refreshCompteHrefs() {
if (!compteMenu) return;
compteMenu.querySelectorAll("[data-hub-link]").forEach(function (a) {
a.setAttribute("href", hubHref(a.getAttribute("data-hub-link")));
});
} }
function togglePopup(menu, btn, force) { function togglePopup(menu, btn, force) {
if (!menu) return; if (!menu) return;
@@ -429,10 +483,14 @@
if (!appsMenu.hidden) lastOpener = brand; if (!appsMenu.hidden) lastOpener = brand;
} }
/* Menu compte (v0.1.6) — en-tête d'identité + Profil / Déconnexion /* Menu compte (v0.1.6 ; v0.3.0 pour les liens) — en-tête
* relayés à l'hôte. L'en-tête est rafraîchi à chaque ouverture, pour * d'identité, puis les liens du Hub (Télécharger, À Propos,
* refléter un title posé après coup par l'hôte (ex. ObsiGate, qui * Aides, Profil — vrais <a href>, même patron que le menu des
* remplit l'avatar depuis /api/auth/me après chargement). */ * applications), un séparateur, puis « Déconnexion » relayée à
* l'hôte. L'en-tête et les href sont rafraîchis à chaque
* ouverture, pour refléter un title posé après coup par l'hôte
* (ex. ObsiGate, qui remplit l'avatar depuis /api/auth/me après
* chargement) et la résolution d'URL la plus récente. */
function buildCompteMenu() { function buildCompteMenu() {
if (!bar || !avatarBtn || compteMenu) return; if (!bar || !avatarBtn || compteMenu) return;
compteMenu = document.createElement("div"); compteMenu = document.createElement("div");
@@ -443,15 +501,26 @@
var head = document.createElement("div"); var head = document.createElement("div");
head.className = "draco-compte-nom"; head.className = "draco-compte-nom";
compteMenu.appendChild(head); compteMenu.appendChild(head);
[["profil", "Profil"], ["deconnexion", "Déconnexion"]].forEach(function (pair) { HUB_LINKS.forEach(function (pair) {
var b = document.createElement("button"); var a = document.createElement("a");
b.type = "button"; a.className = "draco-menu-item";
b.className = "draco-menu-item"; a.href = hubHref(pair[0]);
b.setAttribute("data-compte-act", pair[0]); a.setAttribute("data-hub-link", pair[0]);
b.setAttribute("role", "menuitem"); a.setAttribute("role", "menuitem");
b.textContent = pair[1]; a.textContent = pair[1];
compteMenu.appendChild(b); compteMenu.appendChild(a);
}); });
var sep = document.createElement("div");
sep.className = "draco-menu-sep";
sep.setAttribute("aria-hidden", "true");
compteMenu.appendChild(sep);
var b = document.createElement("button");
b.type = "button";
b.className = "draco-menu-item";
b.setAttribute("data-compte-act", "deconnexion");
b.setAttribute("role", "menuitem");
b.textContent = "Déconnexion";
compteMenu.appendChild(b);
bar.appendChild(compteMenu); bar.appendChild(compteMenu);
} }
function refreshCompteMenu() { function refreshCompteMenu() {
@@ -459,6 +528,7 @@
var head = compteMenu.querySelector(".draco-compte-nom"); var head = compteMenu.querySelector(".draco-compte-nom");
var name = displayName(); var name = displayName();
if (head) head.textContent = name || "Compte"; if (head) head.textContent = name || "Compte";
refreshCompteHrefs();
} }
function toggleCompteMenu(force) { function toggleCompteMenu(force) {
buildCompteMenu(); buildCompteMenu();
@@ -555,6 +625,7 @@
resolvedUrls = resolveUrls(); resolvedUrls = resolveUrls();
window.DRACO_BAR.urls = resolvedUrls; window.DRACO_BAR.urls = resolvedUrls;
applyUrls(resolvedUrls); applyUrls(resolvedUrls);
refreshCompteHrefs();
} }
}; };
+19
View File
@@ -53,6 +53,25 @@ def test_barre_v020_onglet_shaarit_et_garde_data_theme():
assert 'shaarit: "https://shaarit-dev.dracodev.net/"' in js assert 'shaarit: "https://shaarit-dev.dracodev.net/"' in js
def test_barre_v030_liens_hub_menu_compte():
"""Barre v0.3.0 (commons, HUB-1 / fusion #115) : JS vendangé avec
la clé hub (défaut + dérivation hub-dev) et les liens du menu
compte ; le gabarit passe draco_urls().hub en urls.hub."""
js = (ROOT / "static/js/vendor/draco-barre.js").read_text()
assert 'hub: "https://hub.dracodev.net/"' in js
assert 'hub: "https://hub-dev.dracodev.net/"' in js
assert '"telecharger", "Télécharger"' in js
assert '"a-propos", "À Propos"' in js
assert '"aide", "Aides"' in js
assert '"profil", "Profil"' in js
assert "data-hub-link" in js
assert 'data-compte-act", "profil"' not in js
assert 'data-compte-act", "deconnexion"' in js
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
rendu = _hors_commentaires(gabarit)
assert 'urls: { hub: "{{ draco_urls().hub }}/" }' in rendu
def test_barre_intacte_apres_suppression(): def test_barre_intacte_apres_suppression():
"""Le 5e onglet Console Spark et la marque survivent a la suppression.""" """Le 5e onglet Console Spark et la marque survivent a la suppression."""
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text() gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
+19 -1
View File
@@ -12,7 +12,7 @@ import pytest
from app.services import draco_urls from app.services import draco_urls
VARS = ("DRACO_SSO_URL", "DRACO_AGENT_URL", "TIKTAK_URL", "KANBANTE_URL", VARS = ("DRACO_SSO_URL", "DRACO_AGENT_URL", "TIKTAK_URL", "KANBANTE_URL",
"SHAARIT_URL", "FLOWDECK_URL", "OAUTH_REDIRECT_URI", "SHAARIT_URL", "HUB_URL", "FLOWDECK_URL", "OAUTH_REDIRECT_URI",
"AGENT_EVENEMENTS_URL") "AGENT_EVENEMENTS_URL")
@@ -63,6 +63,24 @@ def test_shaarit_defaut_derivation_et_explicite(monkeypatch, avec_hote):
assert draco_urls.shaarit_url() == "https://bm.example.net" assert draco_urls.shaarit_url() == "https://bm.example.net"
def test_hub_defaut_derivation_et_explicite(monkeypatch, avec_hote):
# Barre v0.3.0 (HUB-1) : le Hub suit le même mécanisme que les
# autres sœurs — défaut officiel, dérivation -dev (agent connu
# puis hôte de la requête), explicite prioritaire. Pas d'onglet :
# sa base sert les liens du menu compte via urls.hub.
assert draco_urls.hub_url() == "https://hub.dracodev.net"
assert draco_urls.toutes()["hub"] == "https://hub.dracodev.net"
monkeypatch.setenv(
"AGENT_EVENEMENTS_URL",
"https://agent-dev.dracodev.net/api/v1/evenements")
assert draco_urls.hub_url() == "https://hub-dev.dracodev.net"
monkeypatch.delenv("AGENT_EVENEMENTS_URL")
avec_hote("flowdeck-dev.dracodev.net")
assert draco_urls.hub_url() == "https://hub-dev.dracodev.net"
monkeypatch.setenv("HUB_URL", "https://hub.example.net/")
assert draco_urls.hub_url() == "https://hub.example.net"
def test_flowdeck_url_derivée_oauth_redirect(monkeypatch): def test_flowdeck_url_derivée_oauth_redirect(monkeypatch):
monkeypatch.setenv( monkeypatch.setenv(
"OAUTH_REDIRECT_URI", "https://flowdeck-dev.dracodev.net/auth/callback") "OAUTH_REDIRECT_URI", "https://flowdeck-dev.dracodev.net/auth/callback")