42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { mentionsQueryFromUserOption, normalizeHandle } from '../src/lib/normalize-handle.js';
|
|
|
|
describe('normalizeHandle', () => {
|
|
it('accepts bare handle', () => {
|
|
expect(normalizeHandle('steipete')).toBe('steipete');
|
|
});
|
|
|
|
it('accepts @handle and trims whitespace', () => {
|
|
expect(normalizeHandle(' @steipete ')).toBe('steipete');
|
|
});
|
|
|
|
it('rejects empty input', () => {
|
|
expect(normalizeHandle('')).toBeNull();
|
|
expect(normalizeHandle(' ')).toBeNull();
|
|
expect(normalizeHandle(null)).toBeNull();
|
|
});
|
|
|
|
it('rejects invalid characters and too-long handles', () => {
|
|
expect(normalizeHandle('@stei-pete')).toBeNull();
|
|
expect(normalizeHandle('@steipete!')).toBeNull();
|
|
expect(normalizeHandle('a'.repeat(16))).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('mentionsQueryFromUserOption', () => {
|
|
it('returns null query when option omitted', () => {
|
|
expect(mentionsQueryFromUserOption(undefined)).toEqual({ query: null, error: null });
|
|
});
|
|
|
|
it('returns normalized @query for valid handle', () => {
|
|
expect(mentionsQueryFromUserOption('@steipete')).toEqual({ query: '@steipete', error: null });
|
|
expect(mentionsQueryFromUserOption(' steipete ')).toEqual({ query: '@steipete', error: null });
|
|
});
|
|
|
|
it('returns error for invalid handle', () => {
|
|
const result = mentionsQueryFromUserOption('@stei-pete');
|
|
expect(result.query).toBeNull();
|
|
expect(result.error).toMatch(/Invalid --user handle/);
|
|
});
|
|
});
|