62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
/*
|
||
* 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 });
|
||
}
|