1import assert from 'node:assert/strict'2import test from 'node:test'3import { createLauncherPreviewRenderer, previewKey } from '../src/launcher-previews.js'45const state = { type: 'd2', source: 'a -> b', options: { theme: 0 }, meta: { title: 'Example' } }67test('renders an HTTP preview once and caches its object URL', async () => {8 const requests = []9 const renderer = createLauncherPreviewRenderer({10 endpointFor: type => `https://${type}.example/render`,11 fetchImpl: async (url, init) => {12 requests.push({ url, init })13 return { ok: true, text: async () => '<svg viewBox="0 0 1 1"></svg>' }14 },15 createObjectURL: blob => `blob:${blob.type}`,16 transformSvg: rendered => rendered.body,17 })1819 const [first, second] = await Promise.all([renderer.render(state), renderer.render(state)])20 assert.equal(first, 'blob:image/svg+xml')21 assert.equal(second, first)22 assert.equal(requests.length, 1)23 assert.equal(requests[0].url, 'https://d2.example/render')24 assert.equal(JSON.parse(requests[0].init.body).source, state.source)25})2627test('accepts renderer SVGs with an XML declaration', async () => {28 const renderer = createLauncherPreviewRenderer({29 endpointFor: () => 'https://symbolator.example/render',30 fetchImpl: async () => ({ ok: true, text: async () => '<?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 1 1"></svg>' }),31 createObjectURL: () => 'blob:xml-svg',32 transformSvg: rendered => rendered.body,33 })3435 assert.equal(await renderer.render({ type: 'symbolator', source: 'module demo; endmodule' }), 'blob:xml-svg')36})3738test('rejects malformed renderer output and includes source in cache identity', async () => {39 const renderer = createLauncherPreviewRenderer({40 endpointFor: () => 'https://bad.example/render',41 fetchImpl: async () => ({ ok: true, text: async () => '<html></html>' }),42 transformSvg: rendered => rendered.body,43 })44 await assert.rejects(renderer.render({ type: 'bad', source: 'bad' }), /did not return an SVG/)45 assert.notEqual(previewKey(state), previewKey({ ...state, source: 'b -> c' }))46})