30 lines
2.1 KiB
TypeScript
30 lines
2.1 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { loadEditorProject } from '../editor/startup.ts';
|
|
import { defaultProject } from '../engine/templates.ts';
|
|
const neverRequest: typeof fetch = async () => { throw Error('Unexpected network request'); };
|
|
test('hosted editor loads its bundled project without contacting a local engine', async()=>{
|
|
let requests=0;
|
|
const seed=defaultProject(true);seed.name='Bundled courtyard';
|
|
const result=await loadEditorProject({browserOnly:true,initialProject:seed},{request:async()=>{requests++;return new Response();},draft:async()=>null});
|
|
assert.equal(requests,0);assert.equal(result.project.name,seed.name);assert.equal(result.status,null);assert.equal(result.restored,false);
|
|
result.project.name='edited';assert.equal(seed.name,'Bundled courtyard');
|
|
});
|
|
test('hosted editor retains user edits across reloads instead of replacing them with its seed',async()=>{
|
|
const seed=defaultProject(true),saved=defaultProject(true);saved.name='User edits';
|
|
const result=await loadEditorProject({browserOnly:true,initialProject:seed},{request:neverRequest,draft:async()=>saved});
|
|
assert.equal(result.project.name,'User edits');assert.equal(result.restored,true);
|
|
});
|
|
test('unavailable or corrupt browser storage still opens the bundled project',async()=>{
|
|
const seed=defaultProject(true);seed.name='Seed';
|
|
for(const draft of [async()=>{throw Error('Storage unavailable');},async()=>({invalid:true} as any)]){
|
|
const result=await loadEditorProject({browserOnly:true,initialProject:seed},{request:neverRequest,draft});assert.equal(result.project.name,'Seed');
|
|
}
|
|
});
|
|
test('local editor still gives the connected Forma project priority over browser drafts',async()=>{
|
|
const project=defaultProject(true);project.name='Local engine project';
|
|
const status={forma:true,canUndo:true};
|
|
const result=await loadEditorProject({}, {request:async(url)=>Response.json(url==='/api/status'?status:{project}),draft:async()=>{throw Error('Must not read draft');}});
|
|
assert.equal(result.project.name,project.name);assert.deepEqual(result.status,status);
|
|
});
|