Files
ObsiGate/tests/frontend/desktop-roots.test.mjs
T
bruno d2734dc8ce
CI / lint (push) Successful in 3m2s
CI / security (push) Successful in 2m2s
CI / test (push) Successful in 4m42s
CI / build (push) Successful in 1m52s
CI / e2e (push) Successful in 15m54s
feat: gestion desktop des vaults & dossiers — retrait par menu contextuel et ajout en configuration #159
2026-10-02 21:04:17 -04:00

76 lines
2.8 KiB
JavaScript

// Tests unitaires — gestion desktop des vaults & dossiers (#159)
// Helpers purs de frontend/js/desktop.js (module sans import, importable en Node).
//
// Usage: node tests/frontend/desktop-roots.test.mjs
import { strict as assert } from 'assert';
import {
resolveRootKind,
lastPathSegment,
removeRoot,
pickAndAddDir,
} from '../../frontend/js/desktop.js';
const vaults = [
{ name: 'Obsidian', path: 'C:/Users/x/voute_obsidian' },
{ name: 'Work', path: 'D:/work' },
];
const dirs = [{ name: 'Bruno-Download', path: 'C:/Users/x/Downloads' }];
function testResolveRootKind() {
assert.equal(resolveRootKind(vaults, dirs, 'Obsidian'), 'vault');
assert.equal(resolveRootKind(vaults, dirs, 'Bruno-Download'), 'dir');
assert.equal(resolveRootKind(vaults, dirs, 'inconnu'), null);
// Listes absentes (invoke en échec → undefined) : pas de crash.
assert.equal(resolveRootKind(undefined, undefined, 'Obsidian'), null);
// Un nom ne peut être que vault OU dir (les deux listes sont disjointes).
assert.equal(resolveRootKind(vaults, dirs, 'Work'), 'vault');
console.log(' ✓ resolveRootKind');
}
function testLastPathSegment() {
assert.equal(lastPathSegment('C:\\Obsidian_doc\\Obsidian-Sandbox'), 'Obsidian-Sandbox');
assert.equal(lastPathSegment('C:/vaults/perso/'), 'perso');
assert.equal(lastPathSegment('/home/bruno/vault'), 'vault');
assert.equal(lastPathSegment('/'), '');
assert.equal(lastPathSegment('C:\\'), 'C:');
console.log(' ✓ lastPathSegment');
}
async function testDesktopGating() {
// Hors desktop (pas de window.__TAURI__) : tout est un no-op silencieux —
// c'est ce qui protège l'app web (Docker) où la section est masquée.
assert.equal(await removeRoot('Obsidian', 'confirmer ?'), undefined);
assert.equal(await pickAndAddDir(), undefined);
assert.equal(await removeRoot('', 'x'), undefined);
console.log(' ✓ gating hors desktop');
}
// Le nom dérivé par pickAndAddDir/pickAndAddVault doit être un segment simple
// (jamais un chemin complet) : réutilisé telle quelle par add_dir/add_vault.
function testDerivedNameIsBasename() {
for (const p of ['C:\\Obsidian_doc\\Obsidian-Sandbox', '/home/bruno/Downloads/']) {
const name = lastPathSegment(p) || 'Dossier';
assert.ok(!name.includes('/') && !name.includes('\\'), `basename expected for ${p}`);
}
console.log(' ✓ derived name is a basename');
}
const tests = [
testResolveRootKind,
testLastPathSegment,
testDesktopGating,
testDerivedNameIsBasename,
];
let failed = 0;
for (const fn of tests) {
try {
await fn();
} catch (e) {
failed++;
console.error(` ✗ ${fn.name}: ${e.message}`);
}
}
console.log(failed === 0 ? `${tests.length} passed, 0 failed` : `${tests.length - failed} passed, ${failed} failed`);
process.exit(failed === 0 ? 0 : 1);