Files
core2026/tools/legacy-db-migration/test/transform.test.ts
T

32 lines
1.6 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { legacyUserId } from '../src/identity.js';
import { classifyGameStorage, mapLegacyRoles, parseInheritanceValue, parseStorageUserId } from '../src/transform.js';
describe('legacy database transforms', () => {
it('creates stable UUID-shaped user IDs without exposing the legacy sequence', () => {
expect(legacyUserId(42)).toBe(legacyUserId(42));
expect(legacyUserId(42)).not.toBe(legacyUserId(43));
expect(legacyUserId(42)).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/);
});
it('maps legacy grades and scoped ACL without granting a scoped operator superuser', () => {
expect(mapLegacyRoles(7, {})).toContain('superuser');
expect(mapLegacyRoles(5, {})).toEqual(['admin.users.create', 'admin.users.manage', 'user']);
expect(mapLegacyRoles(1, { che: ['reset', 'notice'] })).toEqual([
'admin.notice.manage:che:default',
'admin.reset.schedule:che:default',
'user',
]);
});
it('separates persistent storage projections from current-season state', () => {
expect(classifyGameStorage('inheritance_42', 'previous')).toBe('persistent-projected');
expect(classifyGameStorage('user_42', 'last_stat_reset')).toBe('persistent-projected');
expect(classifyGameStorage('game_env', 'year')).toBe('season-state');
expect(parseStorageUserId('inheritance_42', 'inheritance')).toBe(legacyUserId(42));
expect(parseInheritanceValue('123.5', 'fixture')).toBe(123.5);
expect(parseInheritanceValue([123.5, null], 'fixture')).toBe(123.5);
});
});