Files
Portfolio/src/app/shared/command-palette/commands.spec.ts
Antonio Ledebuhr 7813499ee3 signature: add systems map, command palette and motion primitives
Ship the Signature UX as standalone, SSR-safe pieces: bilingual copy, a dual SVG/list systems map, a Map-backed command palette in the shell, opt-in reveal and metric primitives, and a leak-free decorative canvas.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 17:37:25 +02:00

80 lines
2.6 KiB
TypeScript

import { APP_LOCALES } from '../../core/i18n/locale';
import {
COMMAND_IDS,
COMMANDS,
normalizeCommandInput,
parseCommand,
suggestCommands,
type CommandId,
} from './commands';
describe('command parsing', () => {
it('collapses whitespace and lowercases input', () => {
expect(normalizeCommandInput(' Services AI ')).toBe('services ai');
expect(normalizeCommandInput('HELP')).toBe('help');
});
it('resolves every CommandId from its canonical input and aliases in both locales', () => {
for (const command of COMMANDS) {
const canonical = parseCommand(command.input);
expect(canonical).toEqual({ kind: 'command', definition: command });
for (const locale of APP_LOCALES) {
for (const alias of command.aliases[locale]) {
expect(parseCommand(alias)).toEqual({ kind: 'command', definition: command });
}
}
}
expect(COMMANDS.map((command) => command.id)).toEqual([...COMMAND_IDS]);
});
it('treats hostile and prototype inputs as unknown without side effects', () => {
const prototypeNames = Object.getOwnPropertyNames(Object.prototype);
const hostile = [
'rm -rf /',
'eval(1+1)',
'new Function()',
'<script>alert(1)</script>',
'__proto__',
'constructor',
'toString',
'hasOwnProperty',
];
for (const input of hostile) {
expect(parseCommand(input)).toEqual({ kind: 'unknown', input });
}
expect(parseCommand('')).toEqual({ kind: 'empty' });
expect(parseCommand(' ')).toEqual({ kind: 'empty' });
expect(Object.getOwnPropertyNames(Object.prototype)).toEqual(prototypeNames);
expect(Object.prototype).not.toHaveProperty('polluted');
});
it('returns an equal result for the same input across repeated calls', () => {
const samples = ['help', 'services ai', ' ', 'unknown-token', '__proto__'];
for (const sample of samples) {
expect(parseCommand(sample)).toEqual(parseCommand(sample));
}
});
it('suggests commands in a stable COMMAND_IDS order and filters by prefix', () => {
const emptyDe = suggestCommands('', 'de').map((command) => command.id);
const emptyEn = suggestCommands('', 'en').map((command) => command.id);
const expectedIds: CommandId[] = [...COMMAND_IDS];
expect(emptyDe).toEqual(expectedIds);
expect(emptyEn).toEqual(expectedIds);
expect(suggestCommands('c', 'en').map((command) => command.id)).toEqual([
'cv',
'contact',
'clear',
'close',
]);
expect(suggestCommands('lei', 'de').map((command) => command.id)).toEqual(['servicesAi']);
expect(suggestCommands('c', 'de')).toEqual(suggestCommands('c', 'de'));
});
});