Zum Inhalt

tests/share/encodePreset.test.ts

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();
  });
});