28 lines
2.2 KiB
JavaScript
28 lines
2.2 KiB
JavaScript
import {test} from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {embedSvgMedia} from '../../src/studio/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,(process.env.STUDIO_WIKI_ORIGIN || `http://127.0.0.1:${process.env.PORT || '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'}},`<svg><image href="/api/media/${id}"/><image href="/api/media/${id}"/></svg>`);
|
|
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('<svg/>',{headers:{'content-type':'image/svg+xml'}})]){
|
|
globalThis.fetch=async()=>response;await assert.rejects(()=>embedSvgMedia({headers:{}},`<image href="/api/media/${id}"/>`),/模板图片不可访问/);
|
|
}}finally{globalThis.fetch=original;}
|
|
});
|
|
test('SVG exports without managed images do not access storage',async()=>{
|
|
assert.equal(await embedSvgMedia({headers:{}},'<svg><text>Title</text></svg>'),'<svg><text>Title</text></svg>');
|
|
});
|
|
|
|
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:{}},`<image href="/api/media/${id}"/>`)).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;}
|
|
});
|