Files
heygo/tests/aliases.test.ts
T

55 lines
1.8 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { ALIAS_MAX_LENGTH, normalizeAlias, validateAlias } from '../worker/lib/aliases';
describe('alias normalization', () => {
it('lowercases aliases', () => {
expect(normalizeAlias('Claude')).toBe('claude');
});
it('trims aliases', () => {
expect(normalizeAlias(' claude ')).toBe('claude');
});
it('keeps hyphen and underscore', () => {
expect(normalizeAlias('my_link-1')).toBe('my_link-1');
});
});
describe('alias validation', () => {
it('rejects empty string with exact error', () => {
expect(validateAlias('')).toEqual({ ok: false, error: 'Alias is required' });
expect(validateAlias(' ')).toEqual({ ok: false, error: 'Alias is required' });
});
it('rejects invalid characters with exact error', () => {
for (const alias of ['a/b', 'a.b', 'a b', '中文']) {
expect(validateAlias(alias)).toEqual({
ok: false,
error: 'Alias may contain only letters, numbers, underscore, and hyphen',
});
}
});
it('rejects aliases starting with hyphen or underscore', () => {
expect(validateAlias('-alias')).toEqual({
ok: false,
error: 'Alias may contain only letters, numbers, underscore, and hyphen',
});
expect(validateAlias('_alias')).toEqual({
ok: false,
error: 'Alias may contain only letters, numbers, underscore, and hyphen',
});
});
it('accepts length 100 and rejects length 101', () => {
const validAlias = 'a'.repeat(ALIAS_MAX_LENGTH);
const tooLongAlias = 'a'.repeat(ALIAS_MAX_LENGTH + 1);
expect(validateAlias(validAlias)).toEqual({ ok: true, value: validAlias });
expect(validateAlias(tooLongAlias)).toEqual({
ok: false,
error: 'Alias must be 100 characters or fewer',
});
});
});