66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import {
|
|
agentProfileHref,
|
|
displayNameKey,
|
|
newAgentDisplayName,
|
|
publicProfileSlugBase,
|
|
} from './agents.js';
|
|
|
|
describe('display names', () => {
|
|
it('uses one normalized key for uniqueness checks', () => {
|
|
expect(displayNameKey('Aewyn')).toBe(displayNameKey('Aewyn'));
|
|
expect(displayNameKey('E\u0301lite')).toBe(displayNameKey('Élite'));
|
|
});
|
|
|
|
it('creates readable short-UID placeholders', () => {
|
|
expect(newAgentDisplayName(47)).toBe('Agent 47');
|
|
});
|
|
});
|
|
|
|
describe('publicProfileSlugBase', () => {
|
|
it('creates readable normalized slugs', () => {
|
|
expect(
|
|
publicProfileSlugBase(
|
|
' Aewyn Prime ',
|
|
'12345678-0000-4000-8000-000000000000',
|
|
),
|
|
).toBe('aewyn-prime');
|
|
expect(
|
|
publicProfileSlugBase(
|
|
'Élite 装備',
|
|
'12345678-0000-4000-8000-000000000000',
|
|
),
|
|
).toBe('élite-装備');
|
|
});
|
|
|
|
it('uses a stable fallback when a name has no letters or numbers', () => {
|
|
expect(
|
|
publicProfileSlugBase('⚡️', '12345678-0000-4000-8000-000000000000'),
|
|
).toBe('agent-12345678');
|
|
});
|
|
|
|
it('keeps UUID-shaped display names out of the legacy UUID namespace', () => {
|
|
expect(
|
|
publicProfileSlugBase(
|
|
'57a1160e-632f-4695-927f-7df03e20753f',
|
|
'12345678-0000-4000-8000-000000000000',
|
|
),
|
|
).toBe('agent-57a1160e-632f-4695-927f-7df03e20753f');
|
|
});
|
|
});
|
|
|
|
describe('agentProfileHref', () => {
|
|
it('prefers the public slug and safely encodes it', () => {
|
|
expect(
|
|
agentProfileHref(
|
|
{ id: 'uuid', publicSlug: 'élite 装備' },
|
|
'profile-comments',
|
|
),
|
|
).toBe('/agents/%C3%A9lite%20%E8%A3%85%E5%82%99#profile-comments');
|
|
});
|
|
|
|
it('falls back to the UUID for unmigrated records', () => {
|
|
expect(agentProfileHref({ id: 'uuid' })).toBe('/agents/uuid');
|
|
});
|
|
});
|