atagen

malice

public
Star0
Watch0
f40cf95cc4fee289a1a5e12f1c7c0ac70e3ec982
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/test/commands.test.ts

e4c64c36f105atagen2026-10-24 07:09 UTC1
import assert from 'node:assert/strict';
e4c64c36f105atagen2026-10-24 07:09 UTC2
import { test } from 'node:test';
e4c64c36f105atagen2026-10-24 07:09 UTC3
import { isKnownCommand, parseCommand, splitTarget, unescapeCommand } from '../src/lib/commands.ts';
e4c64c36f105atagen2026-10-24 07:09 UTC4
e4c64c36f105atagen2026-10-24 07:09 UTC5
const people = [
e4c64c36f105atagen2026-10-24 07:09 UTC6
  { user_id: '@alice:example.org', name: 'Alice Liddell', avatar: null },
e4c64c36f105atagen2026-10-24 07:09 UTC7
  { user_id: '@al:example.org', name: 'Alice', avatar: null },
e4c64c36f105atagen2026-10-24 07:09 UTC8
  { user_id: '@bob:example.org', name: 'Bob', avatar: null },
e4c64c36f105atagen2026-10-24 07:09 UTC9
  { user_id: '@bob2:example.org', name: 'Bob', avatar: null }
e4c64c36f105atagen2026-10-24 07:09 UTC10
];
e4c64c36f105atagen2026-10-24 07:09 UTC11
e4c64c36f105atagen2026-10-24 07:09 UTC12
test('parses a leading command and leaves text alone', () => {
e4c64c36f105atagen2026-10-24 07:09 UTC13
  assert.deepEqual(parseCommand('/kick  Bob  being rude '), { name: 'kick', args: 'Bob  being rude' });
e4c64c36f105atagen2026-10-24 07:09 UTC14
  assert.deepEqual(parseCommand('/leave'), { name: 'leave', args: '' });
e4c64c36f105atagen2026-10-24 07:09 UTC15
  assert.equal(parseCommand('hello /kick'), null);
e4c64c36f105atagen2026-10-24 07:09 UTC16
  assert.equal(parseCommand('//kick bob'), null);
e4c64c36f105atagen2026-10-24 07:09 UTC17
  assert.equal(unescapeCommand('//kick bob'), '/kick bob');
e4c64c36f105atagen2026-10-24 07:09 UTC18
  assert.equal(isKnownCommand('kick'), true);
e4c64c36f105atagen2026-10-24 07:09 UTC19
  assert.equal(isKnownCommand('shrug'), false);
e4c64c36f105atagen2026-10-24 07:09 UTC20
});
e4c64c36f105atagen2026-10-24 07:09 UTC21
e4c64c36f105atagen2026-10-24 07:09 UTC22
test('finds targets by id or the longest display name', () => {
e4c64c36f105atagen2026-10-24 07:09 UTC23
  assert.deepEqual(splitTarget('@carol:example.org 50', people), { user_id: '@carol:example.org', rest: '50' });
e4c64c36f105atagen2026-10-24 07:09 UTC24
  assert.deepEqual(splitTarget('Alice Liddell spam', people), { user_id: '@alice:example.org', rest: 'spam' });
e4c64c36f105atagen2026-10-24 07:09 UTC25
  assert.deepEqual(splitTarget('alice', people), { user_id: '@al:example.org', rest: '' });
e4c64c36f105atagen2026-10-24 07:09 UTC26
  assert.ok('error' in splitTarget('Bob', people));
e4c64c36f105atagen2026-10-24 07:09 UTC27
  assert.ok('error' in splitTarget('Zed', people));
e4c64c36f105atagen2026-10-24 07:09 UTC28
  assert.ok('error' in splitTarget('', people));
e4c64c36f105atagen2026-10-24 07:09 UTC29
});
05a48e9e7942atagen2026-10-24 09:32 UTC30
05a48e9e7942atagen2026-10-24 09:32 UTC31
test('a leading slash word opens the command list', async () => {
05a48e9e7942atagen2026-10-24 09:32 UTC32
  const { commandQueryAt, matchCommands } = await import('../src/lib/commands.ts');
05a48e9e7942atagen2026-10-24 09:32 UTC33
  assert.equal(commandQueryAt('/ki', 3), 'ki');
05a48e9e7942atagen2026-10-24 09:32 UTC34
  assert.equal(commandQueryAt('/', 1), '');
05a48e9e7942atagen2026-10-24 09:32 UTC35
  assert.equal(commandQueryAt('/kick bob', 9), null);
05a48e9e7942atagen2026-10-24 09:32 UTC36
  assert.equal(commandQueryAt('hi /ki', 6), null);
05a48e9e7942atagen2026-10-24 09:32 UTC37
  assert.deepEqual(matchCommands('un'), ['unban', 'unmute', 'unignore']);
05a48e9e7942atagen2026-10-24 09:32 UTC38
});