import { describe, expect, it } from 'vitest';
import { BUILT_IN_PRESETS } from '~/presets/builtIn';
import { decodePreset, encodePreset } from '~/share/encodePreset';
describe('encodePreset / decodePreset', () => {
it('round-trips every built-in preset (force builtIn=false on output)', () => {
for (const preset of BUILT_IN_PRESETS) {
const token = encodePreset(preset);
expect(token.length).toBeGreaterThan(0);
const decoded = decodePreset(token);
expect(decoded).not.toBeNull();
expect(decoded?.id).toBe(preset.id);
expect(decoded?.name).toBe(preset.name);
expect(decoded?.builtIn).toBe(false);
expect(decoded?.params.agentCount).toBe(preset.params.agentCount);
expect(decoded?.params.species).toEqual(preset.params.species);
expect(decoded?.params.interactionMatrix).toEqual(preset.params.interactionMatrix);
}
});
it('produces URL-safe tokens (no +, /, =)', () => {
const preset = BUILT_IN_PRESETS[0];
if (!preset) throw new Error('no built-in presets');
const token = encodePreset(preset);
expect(token).not.toMatch(/[+/=]/);
});
it('returns null for garbage tokens', () => {
expect(decodePreset('')).toBeNull();
expect(decodePreset('not-a-real-token')).toBeNull();
expect(decodePreset('////')).toBeNull();
});
it('returns null when payload fails schema validation', () => {
// a valid msgpack blob that isn't a preset
const fakePreset = { hello: 'world' };
// We encode via the public function to reuse base64url plumbing, then
// mangle the type-check by piggy-backing on encodePreset with a cast.
const token = encodePreset(fakePreset as unknown as Parameters<typeof encodePreset>[0]);
expect(decodePreset(token)).toBeNull();
});
});