9b95e15cbc
Fichiers hors périmètre ou dupliqués : - suppression des 5 .md dupliqués à la racine (copies md5-identiques de docs/api/ et docs/entities/) - suppression de JANITOR_main.js / JANITOR_entities.json (application Electron sans lien avec le serveur MCP) - suppression de temp/*.json (dumps de workflows versionnés par accident) et ajout de temp/ au .gitignore - suppression de claude_desktop_config_ssh.json : mots de passe en clair et variables ORACLE_* d'une architecture abandonnée - AD_API_TEST_RESULTS.md -> docs/ad-api-validation.md (credentials du snippet remplacés par des variables d'environnement) - suppression d'IMPLEMENTATION_SUMMARY.md, doublon du précédent - queries api.php -> docs/reference-queries-api.php (renommage seul) Code mort : - suppression de src/resources/documentation.js : la resource docs:// n'a jamais été branchée dans src/index.js - suppression de src/config/constants.js : module entièrement inutilisé, requis par wms-query-service.js mais dont aucune constante n'était lue. Emporte RESOURCE_URIS.WORKFLOWS_CATEGORIES, URI déclarée jamais servie. - log-service.js : suppression de findRecentErrors, readFullLog et getLogStats, exportées mais exposées par aucun outil MCP - suppression de LOG_FILE_PATTERN (lue depuis .env, jamais appliquée : le scan filtre sur .log en dur), y compris dans .env.example - log-service.js : préfixe [Logs] sur les messages, comme les autres modules Secrets : - test-ad-api.ps1 -> scripts/test-ad-api.ps1, credentials passés en paramètres ou par WMS_USERNAME / WMS_PASSWORD au lieu d'être en dur Build et test : - @yao-pkg/pkg en devDependency, cible node22-win-x64 : npm run build échouait faute de pkg, et node20 n'a pas de binaire prébuilt (bascule sur une compilation de Node qui échoue sans toolchain MSVC) - index.js : le .env est lu à côté de l'exécutable quand le serveur est packagé. Avec un chemin statique, pkg embarquait le .env dans le snapshot, figeant les credentials dans le binaire. - scripts/test-connection.js : npm test pointait sur un fichier absent. Smoke test en lecture seule (OAuth, QueryExecute, QueryScalarExecute, API AD), par profil ou sur tous. Vérifié après nettoyage : 23 outils et 6 resources répondent au handshake MCP, npm test passe 4/4 contre le WMS. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
106 lines
3.0 KiB
JavaScript
106 lines
3.0 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Smoke test de connectivite WMS.
|
|
*
|
|
* npm test -> teste le profil DEFAULT_WMS_PROFILE
|
|
* npm test -- LIMAGRAIN -> teste le profil nomme
|
|
* npm test -- --all -> teste tous les profils declares dans WMS_PROFILES
|
|
*
|
|
* Verifie, pour chaque profil : chargement du profil, OAuth, QueryExecute,
|
|
* QueryScalarExecute et l'API AD. N'ecrit rien dans le WMS.
|
|
*/
|
|
|
|
const path = require('path');
|
|
require('dotenv').config({ path: path.join(__dirname, '..', '.env') });
|
|
|
|
const profileManager = require('../src/config/profile-manager');
|
|
const apiService = require('../src/services/api-service').getInstance();
|
|
|
|
function ok(label, detail) {
|
|
console.log(` OK ${label}${detail ? ` - ${detail}` : ''}`);
|
|
}
|
|
|
|
function ko(label, error) {
|
|
console.log(` FAIL ${label} - ${error.message}`);
|
|
}
|
|
|
|
async function step(label, fn) {
|
|
try {
|
|
ok(label, await fn());
|
|
return true;
|
|
} catch (error) {
|
|
ko(label, error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async function testProfile(name) {
|
|
console.log(`\n=== Profil ${name} ===`);
|
|
profileManager.switchTo(name);
|
|
const profile = profileManager.getCurrent();
|
|
console.log(` host=${profile.host} tenant=${profile.tenant} saas=${profile.saas}`);
|
|
|
|
let passed = 0;
|
|
const total = 4;
|
|
|
|
if (await step('OAuth', async () => {
|
|
await apiService.authenticate();
|
|
return `token obtenu (age max ~${process.env.TOKEN_MAX_AGE || 1190}s)`;
|
|
})) passed++;
|
|
|
|
if (await step('QueryExecute', async () => {
|
|
const rows = await apiService.executeQuery('Context.Products.OrderBy(z => z.Id)', { take: 1 });
|
|
return `${Array.isArray(rows) ? rows.length : 0} ligne(s)`;
|
|
})) passed++;
|
|
|
|
if (await step('QueryScalarExecute', async () => {
|
|
const count = await apiService.executeScalarQuery('Context.Products.Count()');
|
|
return `${count} produit(s)`;
|
|
})) passed++;
|
|
|
|
if (await step('AD API (Validator)', async () => {
|
|
const res = await apiService.post('/Validator/GetByApplication',
|
|
[profile.application, profile.tenant, 10, 0], true);
|
|
return `${res?.entities?.length ?? 0} element(s)`;
|
|
})) passed++;
|
|
|
|
console.log(` -> ${passed}/${total} tests reussis`);
|
|
return passed === total;
|
|
}
|
|
|
|
async function main() {
|
|
profileManager.loadProfiles();
|
|
const available = profileManager.listProfiles();
|
|
|
|
if (available.length === 0) {
|
|
console.error('Aucun profil charge. Verifiez WMS_PROFILES et <NAME>_HOST/USERNAME/PASSWORD/TENANT dans .env');
|
|
process.exit(1);
|
|
}
|
|
|
|
const arg = process.argv[2];
|
|
let targets;
|
|
if (arg === '--all') {
|
|
targets = available;
|
|
} else if (arg) {
|
|
targets = [arg];
|
|
} else {
|
|
targets = [profileManager.getCurrentName() || available[0]];
|
|
}
|
|
|
|
let allOk = true;
|
|
for (const name of targets) {
|
|
try {
|
|
allOk = (await testProfile(name)) && allOk;
|
|
} catch (error) {
|
|
console.log(`\n=== Profil ${name} ===\n FAIL ${error.message}`);
|
|
allOk = false;
|
|
}
|
|
}
|
|
|
|
console.log(`\n${allOk ? 'Tous les profils testes sont operationnels.' : 'Au moins un test a echoue (voir ci-dessus).'}`);
|
|
process.exit(allOk ? 0 : 1);
|
|
}
|
|
|
|
main();
|