78 lines
4.0 KiB
JavaScript
78 lines
4.0 KiB
JavaScript
'use strict';
|
|
const test = require('node:test');
|
|
const assert = require('node:assert');
|
|
const U = require('./wsutil.js');
|
|
|
|
test('shellQuote keeps a path one literal word', () => {
|
|
assert.strictEqual(U.shellQuote('/srv/a b'), "'/srv/a b'");
|
|
assert.strictEqual(U.shellQuote("/x/it's"), "'/x/it'\\''s'");
|
|
assert.strictEqual(U.shellQuote('/x/$HOME;rm'), "'/x/$HOME;rm'");
|
|
assert.strictEqual(U.shellQuoteAll(['/a', '/b c']), "'/a' '/b c'");
|
|
});
|
|
|
|
const m1 = {kind: 'agent', id: 'm1', label: 'web'};
|
|
const m2 = {kind: 'agent', id: 'm2', label: 'db'};
|
|
const s1 = {kind: 'ssh', id: 'm1|root@h:22', label: 'root@h'};
|
|
const item = {source: m1, paths: ['/etc/x'], dir: '/etc'};
|
|
|
|
test('dropAction: files into a file pane is a transfer', () => {
|
|
assert.deepStrictEqual(U.dropAction(item, {kind: 'files', source: m2, dir: '/tmp'}), {kind: 'transfer'});
|
|
assert.deepStrictEqual(U.dropAction(item, {kind: 'folder', source: m1, dir: '/var'}), {kind: 'transfer'});
|
|
});
|
|
test('dropAction: into its own folder does nothing', () => {
|
|
assert.deepStrictEqual(U.dropAction(item, {kind: 'files', source: m1, dir: '/etc'}), {kind: 'none'});
|
|
});
|
|
test('dropAction: terminal of the same place pastes, of another is denied', () => {
|
|
assert.deepStrictEqual(U.dropAction(item, {kind: 'term', source: m1}), {kind: 'paste'});
|
|
const d = U.dropAction(item, {kind: 'term', source: m2});
|
|
assert.strictEqual(d.kind, 'deny');
|
|
assert.strictEqual(d.reason, 'Нельзя: файл на web, а терминал на db');
|
|
assert.strictEqual(U.dropAction({source: s1, paths: ['/a'], dir: '/'}, {kind: 'term', source: s1}).kind, 'paste');
|
|
});
|
|
test('fmtSize', () => {
|
|
assert.strictEqual(U.fmtSize(10), '10 B');
|
|
assert.strictEqual(U.fmtSize(2048), '2.0 K');
|
|
});
|
|
|
|
test('dropAction: other SSH user on the same host is another place', () => {
|
|
const a = {kind: 'ssh', id: 'm1|root@h:22', label: 'root@h'};
|
|
const b = {kind: 'ssh', id: 'm1|bob@h:22', label: 'bob@h'};
|
|
assert.strictEqual(U.dropAction({source: a, paths: ['/x'], dir: '/'}, {kind: 'term', source: b}).kind, 'deny');
|
|
});
|
|
|
|
test('scope: nothing new runs after it ended', async () => {
|
|
const s = U.scope();
|
|
let n = 0;
|
|
s.end();
|
|
s.timeout(() => n++, 1);
|
|
s.interval(() => n++, 1);
|
|
await new Promise(r => setTimeout(r, 20));
|
|
assert.strictEqual(n, 0);
|
|
});
|
|
|
|
test('parseActions: run, read, ls and write blocks with or without a machine', () => {
|
|
const text = 'Сделаю так:\n```run web\nuptime\n```\nи\n```read db:/etc/hosts\n```\n```ls /var/log\n```\n```write web:/tmp/a b.txt\nline 1\nline 2\n```\n```bash\nnot an action\n```\n```run\ndf -h\n```';
|
|
assert.deepStrictEqual(U.parseActions(text), [
|
|
{kind: 'run', machine: 'web', path: '', body: 'uptime'},
|
|
{kind: 'read', machine: 'db', path: '/etc/hosts', body: ''},
|
|
{kind: 'ls', machine: '', path: '/var/log', body: ''},
|
|
{kind: 'write', machine: 'web', path: '/tmp/a b.txt', body: 'line 1\nline 2'},
|
|
{kind: 'run', machine: '', path: '', body: 'df -h'}
|
|
]);
|
|
// A block still being written is not an action yet.
|
|
assert.strictEqual(U.parseActions('```run\nls').length, 0);
|
|
});
|
|
|
|
test('md: the common marks, everything else escaped', () => {
|
|
assert.strictEqual(U.md('**жирный** и *курсив*, `ls -la <x>`'),
|
|
'<p><b>жирный</b> и <i>курсив</i>, <code>ls -la <x></code></p>');
|
|
assert.strictEqual(U.md('# Итог\n- раз\n- два\n\n1. первое\n2. второе'),
|
|
'<h4>Итог</h4><ul><li>раз</li><li>два</li></ul><ol><li>первое</li><li>второе</li></ol>');
|
|
assert.strictEqual(U.md('[док](https://ex.com/a?b=1&c=2) и [плохо](javascript:alert(1))'),
|
|
'<p><a href="https://ex.com/a?b=1&c=2" target="_blank" rel="noopener">док</a> и плохо</p>');
|
|
assert.strictEqual(U.md('> цитата\n\nстрока 1\nстрока 2'), '<blockquote>цитата</blockquote><p>строка 1<br>строка 2</p>');
|
|
assert.strictEqual(U.md('<script>x</script>'), '<p><script>x</script></p>');
|
|
// Inside code nothing is marked up.
|
|
assert.strictEqual(U.md('`**a**`'), '<p><code>**a**</code></p>');
|
|
});
|