Files
r-zakarya f112de508b feat(notes): commandes sur plusieurs lignes recollees en une seule
Fin de ligne en \ (bash), ` (PowerShell) ou ^ (cmd) : la ligne suivante
est rattachee, et la commande part sur une ligne - un retour a la ligne
tape dans un terminal la lancerait a moitie ecrite. Teste.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 19:08:08 +01:00

72 lines
2.4 KiB
JavaScript

// Decoupe d'une note de commandes (js/app.js parseCommandNote).
const test = require('node:test');
const assert = require('node:assert/strict');
const { loadApp } = require('./harness.js');
const T = loadApp().__test;
const plain = (x) => JSON.parse(JSON.stringify(x));
test('groupes "# titre", une commande par ligne, lignes vides ignorees', () => {
const r = T.parseCommandNote('# Prod\r\nssh a@1\n\n ssh a@2 \n# Base\npsql -h x\n');
assert.deepEqual(plain(r), [
{ group: 'Prod', cmd: 'ssh a@1' },
{ group: 'Prod', cmd: 'ssh a@2' },
{ group: 'Base', cmd: 'psql -h x' },
]);
});
test('commandes avant tout titre : groupe vide', () => {
assert.equal(T.parseCommandNote('ls -la\n# G\npwd')[0].group, '');
});
test('"## titre" et "#" seul', () => {
const r = T.parseCommandNote('## Deux\na\n#\nb');
assert.equal(r[0].group, 'Deux');
assert.equal(r[1].group, '');
});
test('masque : premier mot, milieu masque, 3 derniers caracteres', () => {
assert.equal(T.maskCommand('ssh admin@10.0.0.11'), 'ssh ' + '•'.repeat(12) + '.11');
assert.equal(T.maskCommand('psql -h 10.0.0.20'), 'psql ' + '•'.repeat(9) + '.20');
});
test('masque : fin courte masquee en entier, pas d\'espace', () => {
assert.equal(T.maskCommand('ls -la'), 'ls •••');
assert.equal(T.maskCommand('hostname'), '•••••ame');
assert.equal(T.maskCommand(''), '');
});
test('lignes continuees (\\, `, ^) : une seule commande, sur une ligne', () => {
const note = [
'# D',
'docker run -d \\',
' -p 8080:80 \\',
' nginx',
'Get-Item a `',
' -Force',
'dir ^',
' /s',
].join('\n');
const r = T.parseCommandNote(note);
assert.deepEqual(plain(r).map(x => x.cmd), [
'docker run -d -p 8080:80 nginx',
'Get-Item a -Force',
'dir /s',
]);
assert.equal(r[0].group, 'D');
});
test('continuation coupee par une ligne vide ou la fin du texte', () => {
assert.deepEqual(plain(T.parseCommandNote('a \\\n\nb')).map(x => x.cmd), ['a', 'b']);
assert.deepEqual(plain(T.parseCommandNote('a \\')).map(x => x.cmd), ['a']);
});
test('un "#" apres une continuation fait partie de la commande', () => {
assert.equal(T.parseCommandNote('echo \\\n#x')[0].cmd, 'echo #x');
});
test('texte vide ou absent', () => {
assert.equal(T.parseCommandNote('').length, 0);
assert.equal(T.parseCommandNote(null).length, 0);
});