teach/test/curriculum-wiki.test.js
Ramon 322147d3d1
All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 1m1s
feat: voeg curriculumwiki voor volwassenen toe (v0.4.37-beta)
2026-07-19 21:13:11 +02:00

65 lines
3.2 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {readFile} from 'node:fs/promises';
import {runInNewContext} from 'node:vm';
import {PERMISSIONS} from '../src/permissions.js';
test('curriculumdataset bevat negen leergebieden en alle veertig kerndoelen',async()=>{
const source=await readFile('public/js/curriculum.js','utf8');
const context={};
runInNewContext(source+';globalThis.__curriculum=CURRICULUM_PO_2026',context);
const data=JSON.parse(JSON.stringify(context.__curriculum));
assert.equal(data.id,'slo-po-2026');
assert.equal(data.edition,'2026-07');
assert.match(data.tule,/slo\.nl/);
assert.match(data.progressions,/slo\.nl/);
assert.equal(data.areas.length,9);
const goals=data.areas.flatMap(area=>area.goals);
assert.deepEqual(goals.map(goal=>goal.id),Array.from({length:40},(_,index)=>index+1));
for(const area of data.areas){
assert.ok(area.title&&area.description&&area.page,area.id);
for(const goal of area.goals){
assert.ok(goal.domain&&goal.summary,goal.id);
assert.ok(goal.parts.length>=1,goal.id);
assert.ok(['partial','support','open'].includes(goal.coverage),goal.id);
assert.ok(Array.isArray(goal.widgets),goal.id);
}
}
});
test('curriculumwiki is alleen zichtbaar voor alle volwassen rollen',async()=>{
assert.deepEqual(PERMISSIONS['curriculum.view'],['super','admin','teacher','parent']);
assert.ok(!PERMISSIONS['curriculum.view'].includes('pupil'));
const [client,wiki]=await Promise.all([
readFile('public/js/permissions.js','utf8'),
readFile('public/js/wiki.js','utf8')
]);
assert.match(client,/'curriculum\.view':\s*\['super', 'admin', 'teacher', 'parent'\]/);
assert.match(wiki,/visible:\(\)=>!!currentUser&&can\("curriculum\.view"\)/);
assert.match(wiki,/wikiButton\.addEventListener\("click",\(\)=>openSettings\("curriculum"\)\)/);
assert.doesNotMatch(wiki,/innerHTML\s*=/);
});
test('curriculumwiki is geladen, doorzoekbaar, responsief en tweetalig bediend',async()=>{
const [html,wiki,core,css,version]=await Promise.all([
readFile('public/index.html','utf8'),
readFile('public/js/wiki.js','utf8'),
readFile('public/js/core.js','utf8'),
readFile('public/css/teach.css','utf8'),
readFile('VERSION','utf8')
]);
assert.ok(html.indexOf('js/settings.js')<html.indexOf('js/curriculum.js'));
assert.ok(html.indexOf('js/curriculum.js')<html.indexOf('js/wiki.js'));
assert.ok(html.indexOf('js/wiki.js')<html.indexOf('js/app.js'));
assert.match(html,/id="btnWiki"[^>]*display:none/);
assert.match(html,/data-section="curriculum"/);
assert.match(wiki,/input\.type="search"/);
assert.match(wiki,/dataset\.area/);
for(const key of ['wikiTitle','wikiSub','wikiSearchPlaceholder','wikiCoveragePartial','wikiCoverageSupport','wikiCoverageOpen','wikiCarefulText']){
assert.equal((core.match(new RegExp(key+':','g'))||[]).length,2,key);
}
assert.match(css,/\.wiki-grid\{[^}]*grid-template-columns:repeat\(2/);
assert.match(css,/@media \(max-width:720px\)[\s\S]*?\.wiki-grid\{grid-template-columns:1fr\}/);
assert.ok(core.includes('document.getElementById("btnWiki").style.display = can("curriculum.view")'));
assert.ok(core.includes('const VERSION = "'+version.trim()+'"'));
});