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); }); import {editorDraftKey} from '../editor/startup.ts'; test('hosted drafts are isolated by publication path and bundled project ID',async()=>{ const a=defaultProject(true),b=defaultProject(true);a.id='a';b.id='b'; const opts={browserOnly:true,initialProject:a,draftScope:'/demo-a/'}; const key=editorDraftKey(opts);const saved=structuredClone(a);saved.name='Edited A'; const drafts=new Map([[key,saved]]);const draft=async(key:string)=>drafts.get(key)||null; assert.equal((await loadEditorProject(opts,{draft,request:neverRequest})).project.name,'Edited A'); assert.equal((await loadEditorProject({...opts,initialProject:b},{draft,request:neverRequest})).project.name,b.name); assert.equal((await loadEditorProject({...opts,draftScope:'/demo-b/'},{draft,request:neverRequest})).restored,false); assert.notEqual(editorDraftKey({browserOnly:true,initialProject:a},'https://host.test/one/'),editorDraftKey({browserOnly:true,initialProject:a},'https://host.test/two/')); assert.equal(editorDraftKey({}),'active'); });