import {test} from 'node:test'; import assert from 'node:assert/strict'; import {embedSvgMedia} from '../src/lib/layout-images.ts'; const id='a05dc841-240a-5a3a-b01b-d589fc21cd36'; test('SVG export fetches each internal media once with the caller authentication',async()=>{ const original=globalThis.fetch;let calls=0; try{ globalThis.fetch=async(url,options)=>{calls++;assert.equal(url,'http://waterfall-wiki:3000/api/media/'+id);assert.equal(options.headers.cookie,'session=fixture');assert.equal(options.redirect,'error');return new Response(Buffer.from('fixture'),{headers:{'content-type':'image/png'}});}; const svg=await embedSvgMedia({headers:{cookie:'session=fixture'}},``); assert.equal(calls,1);assert.equal((svg.match(/data:image\/png;base64,Zml4dHVyZQ==/g)||[]).length,2);assert.ok(!svg.includes('/api/media/')); }finally{globalThis.fetch=original;} }); test('SVG export rejects unavailable or non-image objects',async()=>{ const original=globalThis.fetch; try{for(const response of [new Response('missing',{status:404}),new Response('',{headers:{'content-type':'image/svg+xml'}})]){ globalThis.fetch=async()=>response;await assert.rejects(()=>embedSvgMedia({headers:{}},``),/模板图片不可访问/); }}finally{globalThis.fetch=original;} }); test('SVG exports without managed images do not access storage',async()=>{ assert.equal(await embedSvgMedia({headers:{}},'Title'),'Title'); }); test('SVG export uses the configured isolated Wiki origin',async()=>{ const original=globalThis.fetch,previous=process.env.STUDIO_WIKI_ORIGIN; try{process.env.STUDIO_WIKI_ORIGIN='http://127.0.0.1:19000';globalThis.fetch=async url=>{assert.equal(url,'http://127.0.0.1:19000/api/media/'+id);return new Response('fixture',{headers:{'content-type':'image/png'}})};assert.ok((await embedSvgMedia({headers:{}},``)).includes('data:image/png;base64,'));} finally{globalThis.fetch=original;if(previous===undefined)delete process.env.STUDIO_WIKI_ORIGIN;else process.env.STUDIO_WIKI_ORIGIN=previous;} });