11 lines
2.8 KiB
JavaScript
11 lines
2.8 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import vm from 'node:vm';
|
|
import {readFileSync} from 'node:fs';
|
|
function fixture(){const fields=new Map(),get=id=>{if(!fields.has(id))fields.set(id,{value:'',checked:false,disabled:false,hidden:false,files:[],addEventListener(type,fn){this[type]=fn;},removeAttribute(key){delete this[key];}});return fields.get(id);};const policy={brand:{name:'Example',color:'#123456',logoDataUrl:'data:image/png;base64,synthetic'},startPage:{title:'Team',subtitle:'Hello',newsEnabled:true,feedUrl:'https://news.example/feed'}};const context=vm.createContext({$:get,policy,fill(){},draft:()=>({brand:{name:'Edited',color:'#abcdef'},browser:{}}),applyOperatorPermissions(){},independentApprovalRequired:true,currentPrincipal:null,task:fn=>fn,updateDraftStatus(){},Uint8Array});vm.runInContext(readFileSync(new URL('../apps/server/public/branding-admin.js',import.meta.url),'utf8'),context);return {context,get};}
|
|
test('company draft retains logo during name edits and removes it explicitly',()=>{const {context,get}=fixture();assert.equal(context.draft().brand.logoDataUrl,'data:image/png;base64,synthetic');assert.equal(context.draft().brand.name,'Edited');assert.equal(context.draft().startPage.feedUrl,'https://news.example/feed');get('brand-logo-remove').click();assert.equal(context.draft().brand.logoDataUrl,undefined);assert.equal(get('brand-logo-preview').hidden,true);get('startpage-news-enabled').checked=false;get('startpage-feed-url').value='';assert.equal(context.draft().startPage.newsEnabled,false);assert.equal(context.draft().startPage.feedUrl,undefined);});
|
|
test('auditors cannot edit company policy; independent operators can prepare drafts',()=>{const {context,get}=fixture();context.applyOperatorPermissions({role:'auditor',permissions:['policy.read']});assert.equal(get('brand-logo-file').disabled,true);assert.equal(get('startpage-feed-url').disabled,true);context.applyOperatorPermissions({role:'operator',permissions:['policy.prepare']});assert.equal(get('brand-logo-file').disabled,false);});
|
|
test('logo decode rejects unsupported, oversized and forged PNG inputs before rasterization',async()=>{const {context}=fixture();await assert.rejects(context.encodeCompanyLogo({type:'image/svg+xml',size:10}),/PNG/);await assert.rejects(context.encodeCompanyLogo({type:'image/png',size:131073}),/128 KiB/);await assert.rejects(context.encodeCompanyLogo({type:'image/png',size:8,arrayBuffer:async()=>new Uint8Array(8).buffer}),/not a PNG/);});
|
|
import {StartPageSchema} from '../packages/core/branding.mjs';
|
|
test('admin start-page draft uses the signed policy root rather than unsupported browser settings',()=>{const {context}=fixture(),p=context.draft();assert.equal(p.browser.startPage,undefined);assert.equal(StartPageSchema.parse(p.startPage).feedUrl,'https://news.example/feed');});
|