Files
rustpad/tests/mention-navigation-test.mjs
T
2026-10-12 12:19:33 +02:00

38 lines
2.7 KiB
JavaScript

import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
const autocomplete = readFileSync('static/js/mention-autocomplete.js', 'utf8')
.replace(/^import \{ t \} from "@rustpad\/i18n";$/m, 'const t = (key, params, fallback) => fallback;');
const autocompleteModule = await import('data:text/javascript;base64,' + Buffer.from(autocomplete).toString('base64'));
const navigation = readFileSync('static/js/mention-navigation.js', 'utf8')
.replace(/^import \{ t \} from "@rustpad\/i18n";$/m, 'const t = (key, params, fallback) => fallback;')
.replace(/^import \{ normalizeMentionUsers \} from "@rustpad\/mention-autocomplete";$/m,
`const normalizeMentionUsers = ${autocompleteModule.normalizeMentionUsers.toString()};`);
const { collectMentionOccurrences } = await import('data:text/javascript;base64,' + Buffer.from(navigation).toString('base64'));
const users = [
{nickname:'Dominik',color:'#1256aa',email:'private@example.org'},
{nickname:'dOMINIK',color:'#abc123'},
{nickname:'Dora',color:'#dd00dd'},
{nickname:'Ala+Dev',color:'#123abc'},
];
function matches(source, options) { return collectMentionOccurrences(source, users, options); }
function valid(source, options) { return matches(source, options).map(mention => source.slice(mention.start, mention.end)); }
assert.deepEqual(valid('Tu @Dominik, @Dora oraz @dominik.'), ['@Dominik', '@Dora', '@dominik']);
assert.deepEqual(valid('Przykład @DominiK @Ala+Dev, @Dominik'), ['@DominiK', '@Ala+Dev', '@Dominik']);
assert.deepEqual(valid('john@Dominik.org a@Dora @@Dominik @Dominika @Other'), []);
assert.deepEqual(valid('`@Dominik` i @Dora [@Dominik](https://example.org) oraz https://example.org/@Dora'), ['@Dora']);
assert.deepEqual(valid('[file=secret@Dominik,key] i [image=image@Dora] oraz @Dominik'), ['@Dominik']);
assert.deepEqual(valid('```sh\n@Dominik\n```\nPo @Dora\n~~~\n@Dora\n~~~\n@Dominik'), ['@Dora', '@Dominik']);
assert.deepEqual(valid(' ```js\n@Dominik\n ```\n@Dominik'), ['@Dominik']);
assert.deepEqual(valid('````rust\n@Dominik\n```\n@Dora\n````\n@Dora'), ['@Dora']);
assert.deepEqual(valid('@Dora', { markdown:false }), ['@Dora']);
assert.deepEqual(valid('```\n@Dominik\n```', { markdown:false }), ['@Dominik']);
const source = '🙂 @Dominik\nDrugi @Dora i @Dominik';
const items = matches(source);
assert.deepEqual(items.map(item=>item.start), [source.indexOf('@Dominik'),source.indexOf('@Dora'),source.lastIndexOf('@Dominik')]);
assert.deepEqual(items.map(item=>item.sourceLine), [1,2,2]);
assert.ok(items.every(item => !Object.hasOwn(item, 'email')));
assert.equal(collectMentionOccurrences('Hej @Dominik', []).length, 0);
console.log('PASS: mention navigation positions, permissions, Markdown exclusions, UTF-16, code fences');