import { describe, expect, it } from 'vitest'; import { createShareUrl, normaliseShareState, parseShareState, serializeShareState, type ShareViewState, } from './shareState'; describe('shareState', () => { it('serializes viewer state deterministically', () => { const state: ShareViewState = { machineId: 'v8-engine', camera: { position: [1.23456, -2, 3], preset: 'isometric', }, explode: 1.5, hiddenParts: ['valve', 'piston', 'piston'], partOpacity: { z: 0.33333, a: 2, 'bad id': 0.5, }, selectedPartId: 'crankshaft', labels: true, wireframe: true, crossSection: { enabled: true, axis: 'x', offset: 0.25, }, }; expect(serializeShareState(state)).toBe( 'clip=x%3A0.25&cp=1.2346%2C-2%2C3&ex=1.5&hide=piston%2Cvalve&labels=1&m=v8-engine&op=a%3A1%2Cz%3A0.333&part=crankshaft&preset=isometric&wire=1', ); }); it('parses a serialized state back to its normalised representation', () => { const query = 'clip=x%3A0.25&cp=1.2346%2C-2%2C3&ex=1.5&hide=piston%2Cvalve&labels=1&m=v8-engine&op=a%3A1%2Cz%3A0.333&part=crankshaft&preset=isometric&wire=1'; expect(parseShareState(query)).toEqual({ machineId: 'v8-engine', camera: { position: [1.2346, -2, 3], preset: 'isometric', }, explode: 1.5, hiddenParts: ['piston', 'valve'], partOpacity: { a: 1, z: 0.333, }, selectedPartId: 'crankshaft', labels: true, wireframe: true, crossSection: { enabled: true, axis: 'x', offset: 0.25, }, }); }); it('clamps unsafe numbers and removes invalid identifiers', () => { expect( normaliseShareState({ machineId: 'bad id', explode: 999, camera: { zoom: -1, target: [Infinity, 0, 0], }, visibleParts: ['valid-part', '../bad'], animation: { rpm: 100_000, timeScale: 12, step: -2, }, }), ).toEqual({ explode: 10, visibleParts: ['valid-part'], animation: { rpm: 50000, timeScale: 3, step: 0, }, }); }); it('creates canonical share URLs without preserving stale state parameters by default', () => { const url = createShareUrl( { machineId: 'gear-pump', explode: 0.25, }, { baseUrl: 'https://mechanica.example/viewer?old=1&m=stale#parts', }, ); expect(url).toBe('https://mechanica.example/viewer?ex=0.25&m=gear-pump#parts'); }); it('can preserve unrelated query parameters while replacing share state keys', () => { const url = createShareUrl( { machineId: 'worm-gear-drive', }, { baseUrl: 'https://mechanica.example/viewer?utm=campaign&m=stale', preserveExistingParams: true, }, ); expect(url).toBe('https://mechanica.example/viewer?m=worm-gear-drive&utm=campaign'); }); });