From 1b17b39b5de8d864b7165d2863bf61e1c53e7eba Mon Sep 17 00:00:00 2001 From: Manus Date: Mon, 17 Aug 2026 20:20:44 +0000 Subject: [PATCH] refactor: fiabiliser le portail dynamique recette --- index.html | 189 ++++++++++++++++++++--------------- test/portal-contract.test.js | 21 ++++ 2 files changed, 129 insertions(+), 81 deletions(-) create mode 100644 test/portal-contract.test.js diff --git a/index.html b/index.html index a2da238..614923c 100644 --- a/index.html +++ b/index.html @@ -375,111 +375,138 @@ diff --git a/test/portal-contract.test.js b/test/portal-contract.test.js new file mode 100644 index 0000000..e1a3671 --- /dev/null +++ b/test/portal-contract.test.js @@ -0,0 +1,21 @@ +/* + * Contrat de non-régression du portail dynamique. + * Il bloque les marqueurs de conflit, les doublons de configuration + * et le mélange des URLs recette/production. + */ +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const html = fs.readFileSync(path.join(__dirname, '..', 'index.html'), 'utf8'); + +assert.equal(/^(<<<<<<<|=======|>>>>>>>)/m.test(html), false, 'aucun marqueur de conflit Git ne doit être livré'); +assert.equal((html.match(/var DASHBOARD_APPS_URL/g) || []).length, 1, 'une seule URL API applications doit être déclarée'); +assert.equal((html.match(/var DASHBOARD_STATUS_URL/g) || []).length, 1, 'une seule URL API statuts doit être déclarée'); +assert.match(html, /var ENV = 'recette';/, 'la version recette doit déclarer explicitement son environnement'); +assert.match(html, /app\.urls\[ENV\]/, 'les liens doivent être sélectionnés depuis l’environnement déclaré'); +assert.match(html, /app\.category !== 'INFRA'/, 'les tuiles INFRA doivent être filtrées côté portail'); +assert.match(html, /var STATUS_REFRESH_MS = 30000;/, 'le délai de grisage doit être explicite'); +assert.match(html, /setInterval\(fetchAndApplyStatuses, STATUS_REFRESH_MS\)/, 'le grisage doit être réactualisé périodiquement'); + +console.log('OK portal-contract');