import { describe, expect, it } from 'vitest'; import { betaSelectionHref, canTest, mapLabel, parseBetaSelection, scriptStatus, type LibraryScript } from '../../src/lib/script-library.js'; const script: LibraryScript = { id: 1, name: 'HUD', target_rel_path: 'hud.gsc', scope_type: null, scope_value: null, current_version_id: null, currentVersion: null, versionCount: 1, servers: [], runningBetaId: null, latestVersion: { id: 10, version: 1, sha256: 'abc', size: 12, state: 'untested', uploaded_at: '2026-09-18' } }; describe('script library state', () => { it.each([ ['untested', 'untested'], ['tested', 'tested'], ['test-failed', 'failed'] ] as const)('preserves %s for a never-promoted version', (state, expected) => { expect( scriptStatus({ ...script, latestVersion: { ...script.latestVersion!, state } }) ).toBe(expected); }); it('distinguishes an active beta, a promoted release, and a newer upload', () => { expect(scriptStatus({ ...script, runningBetaId: 5 })).toBe('testing'); expect(canTest({ ...script, runningBetaId: 5 })).toBe(false); expect(scriptStatus({ ...script, current_version_id: 10 })).toBe('promoted'); expect(canTest({ ...script, current_version_id: 10 })).toBe(false); expect(scriptStatus({ ...script, current_version_id: 9 })).toBe('untested'); expect(canTest({ ...script, current_version_id: 9 })).toBe(true); expect(scriptStatus({ ...script, latestVersion: null })).toBe('empty'); }); it('does not describe shared T6 engine maps as a single variant', () => { expect(mapLabel('zombie_moon')).toBe('Moon'); expect(mapLabel('zm_transit')).toMatch(/variants/); expect(mapLabel('custom_map')).toBe('custom_map'); }); }); describe('beta selection links', () => { it('round-trips exact versions in a multi-script selection', () => { const picks = [ { scriptId: 4, versionId: 20 }, { scriptId: 7, versionId: 25 } ]; expect( parseBetaSelection(new URL(betaSelectionHref(picks), 'http://localhost').searchParams) ).toEqual(picks); }); it('preserves existing plugin import links', () => { expect(parseBetaSelection(new URLSearchParams('pluginId=8&versionId=32'))).toEqual([ { scriptId: 8, versionId: 32 } ]); }); it.each([ 'artifact=0:1', 'artifact=1:NaN', 'artifact=1:2junk', 'artifact=1:2&artifact=1:3', 'artifact=9007199254740992:1', 'pluginId=8' ])('rejects malformed or ambiguous selections: %s', (query) => { expect(() => parseBetaSelection(new URLSearchParams(query))).toThrow(); }); });