refactor: fiabiliser le dashboard de production
This commit is contained in:
61
src/backend/test/app-registry.test.js
Normal file
61
src/backend/test/app-registry.test.js
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Tests de non-régression du registre d'applications.
|
||||
* Le registre doit faire de app.json l'unique source de vérité des applications déployées.
|
||||
*/
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const os = require('node:os');
|
||||
const path = require('node:path');
|
||||
|
||||
const { discoverApps, refreshApps } = require('../src/app-registry');
|
||||
|
||||
function writeManifest(basePath, directory, manifest) {
|
||||
const appPath = path.join(basePath, directory);
|
||||
fs.mkdirSync(appPath, { recursive: true });
|
||||
fs.writeFileSync(path.join(appPath, 'app.json'), JSON.stringify(manifest), 'utf8');
|
||||
}
|
||||
|
||||
const sandbox = fs.mkdtempSync(path.join(os.tmpdir(), 'app-registry-'));
|
||||
|
||||
try {
|
||||
writeManifest(sandbox, 'contacts', {
|
||||
id: 'itinova-contacts',
|
||||
name: 'Itinova Contacts',
|
||||
category: 'ITINOVA',
|
||||
containerName: 'itinova-contacts',
|
||||
image: 'images/itinova-contacts.png',
|
||||
urls: {
|
||||
recette: 'https://contacts.recette.santinova-soft.org',
|
||||
prod: 'https://contacts.santinova-soft.org',
|
||||
},
|
||||
});
|
||||
|
||||
writeManifest(sandbox, 'invalide', {
|
||||
id: 'app-invalide',
|
||||
name: 'Application invalide',
|
||||
category: 'INCONNUE',
|
||||
urls: { recette: 'https://invalide.recette.santinova-soft.org' },
|
||||
});
|
||||
|
||||
const discovery = discoverApps({ appsBasePath: sandbox, environment: 'recette' });
|
||||
assert.equal(discovery.apps.length, 1, 'un manifeste invalide doit être exclu');
|
||||
assert.equal(discovery.errors.length, 1, 'une erreur explicite doit être retournée');
|
||||
|
||||
const app = discovery.apps[0];
|
||||
assert.equal(app.directory, 'contacts', 'le dossier doit être déduit du chemin du manifeste');
|
||||
assert.equal(app.healthCheckUrl, app.urls.recette, 'la vérification doit cibler l’environnement courant');
|
||||
assert.equal(app.containerName, 'itinova-contacts');
|
||||
|
||||
const config = {
|
||||
appsBasePath: sandbox,
|
||||
environment: 'recette',
|
||||
apps: [{ id: 'itinova-contacts', name: 'ancienne valeur statique' }],
|
||||
};
|
||||
const refresh = refreshApps(config);
|
||||
assert.equal(refresh.apps.length, 1, 'les applications non déployées ne doivent pas rester en cache');
|
||||
assert.equal(config.apps[0].name, 'Itinova Contacts', 'app.json doit prévaloir sur toute définition statique');
|
||||
|
||||
console.log('OK app-registry');
|
||||
} finally {
|
||||
fs.rmSync(sandbox, { recursive: true, force: true });
|
||||
}
|
||||
Reference in New Issue
Block a user