43 lines
2.9 KiB
JavaScript
43 lines
2.9 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import vm from 'node:vm';
|
|
import test from 'node:test';
|
|
import ts from 'typescript';
|
|
|
|
const modules = new Map();
|
|
function load(name) {
|
|
if(modules.has(name))return modules.get(name);
|
|
if(name.endsWith('.json'))return JSON.parse(fs.readFileSync(new URL(`../src/${name.slice(2)}`,import.meta.url),'utf8'));
|
|
const source=fs.readFileSync(new URL(`../src/${name.slice(2).replace(/\.js$/,'.ts')}`,import.meta.url),'utf8');
|
|
const code=ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022,esModuleInterop:true}}).outputText;
|
|
const module={exports:{}};modules.set(name,module.exports);
|
|
vm.runInNewContext(`(function(exports,require,module){${code}})`,{AbortController})(module.exports,load,module);
|
|
return module.exports;
|
|
}
|
|
const facade=load('./part-view-facade.js');
|
|
const {validWindowHostResult}=load('./web-window-contract.js');
|
|
const envelope=load('./facade-envelope.js');
|
|
function payload(owner='PartBox',command='Std_DockViewMenu') {
|
|
return {schema:'freecad-web/document-view/v1',owner,document:'workbench-document',command,
|
|
parameters:{host:{toolbar:'window-commands',panels:[{objectName:'modules',title:'Modules',visible:true}]}}};
|
|
}
|
|
test('only window-host commands accept a non-native workspace identifier',()=>{
|
|
for(const owner of ['PartBox','DocumentProbe']) {
|
|
const p=payload(owner);
|
|
assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),p)),true);
|
|
assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),{...p,command:'Std_DrawStyle'})),false);
|
|
assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),{...p,document:''})),false);
|
|
}
|
|
});
|
|
test('native window replies retain owner identity and command-specific shape',async()=>{
|
|
const p=payload(), result={command:p.command,documentId:p.document,items:[{objectName:'modules',title:'Modules',visible:true,enabled:true}]};
|
|
const reply={ok:true,schema:p.schema,owner:p.owner,document:p.document,command:p.command,result};
|
|
const call=value=>facade.handleDocumentView(p,new AbortController().signal,{ccall:()=>JSON.stringify(value)});
|
|
assert.equal(JSON.stringify(await call(reply)),JSON.stringify(result));
|
|
for(const mutation of [{owner:'DocumentProbe'},{document:'Another'}, {result:{...result,items:[]}},
|
|
{result:{...result,items:[result.items[0],result.items[0]]}}, {result:{...result,documentId:'Another'}}])
|
|
await assert.rejects(call({...reply,...mutation}),/Invalid native window/);
|
|
assert.equal(validWindowHostResult({command:'Std_ToggleToolBarLock',documentId:p.document,locked:false},'Std_ToggleToolBarLock',p.document),true);
|
|
assert.equal(validWindowHostResult({command:'Std_ToggleToolBarLock',documentId:p.document,locked:'false'},'Std_ToggleToolBarLock',p.document),false);
|
|
});
|