43 lines
3.1 KiB
TypeScript
43 lines
3.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);
|
|
});
|
|
|
|
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');
|
|
});
|