| 1 | // Route -> module-dekking (shaer-5s1, de beet van 7 augustus).
|
|---|
| 2 | //
|
|---|
| 3 | // Sinds shaer-bqr leeft het gedrag van een pagina in assets/js/mod/ en
|
|---|
| 4 | // declareert de ROUTE welke modules laden (pageJs). Dat is een naad die stil
|
|---|
| 5 | // scheurt: vergeet een route zijn pageJs, dan rendert de pagina foutloos maar
|
|---|
| 6 | // doet hij niets -- en bij de posteditor WIST een opslag dan de post, want
|
|---|
| 7 | // alleen de module vult het verborgen contentveld. Zo verloor de editpagina
|
|---|
| 8 | // op 7 augustus zijn editor: de nieuw-route kreeg pageJs bij de refactor, de
|
|---|
| 9 | // edit-route niet, en geen test die het zag.
|
|---|
| 10 | //
|
|---|
| 11 | // Dit is bewust een test op de BRONTEKST, niet op gedrag: het gedrag zit in
|
|---|
| 12 | // de browser (module + DOM) en buiten bereik van node:test. Een greep op de
|
|---|
| 13 | // routes is grof, maar hij scheurt luid op precies de fout die ons beet.
|
|---|
| 14 | import { test } from 'node:test';
|
|---|
| 15 | import assert from 'node:assert/strict';
|
|---|
| 16 | import { readFileSync } from 'node:fs';
|
|---|
| 17 |
|
|---|
| 18 | const posts = readFileSync(new URL('../src/routes/posts.js', import.meta.url), 'utf8');
|
|---|
| 19 | const download = readFileSync(new URL('../src/routes/download.js', import.meta.url), 'utf8');
|
|---|
| 20 | const editor = readFileSync(new URL('../src/views/pages/post-edit.ejs', import.meta.url), 'utf8');
|
|---|
| 21 |
|
|---|
| 22 | // Elke renderPage van een template, met zijn optieblok (tot de sluithaak).
|
|---|
| 23 | function renderCalls(src, tpl) {
|
|---|
| 24 | const out = [];
|
|---|
| 25 | const re = new RegExp(String.raw`renderPage\(req, res, '${tpl}'\s*,\s*\{`, 'g');
|
|---|
| 26 | let m;
|
|---|
| 27 | while ((m = re.exec(src))) {
|
|---|
| 28 | let depth = 1, i = m.index + m[0].length;
|
|---|
| 29 | for (; i < src.length && depth > 0; i++) {
|
|---|
| 30 | if (src[i] === '{') depth++;
|
|---|
| 31 | else if (src[i] === '}') depth--;
|
|---|
| 32 | }
|
|---|
| 33 | out.push(src.slice(m.index, i));
|
|---|
| 34 | }
|
|---|
| 35 | return out;
|
|---|
| 36 | }
|
|---|
| 37 |
|
|---|
| 38 | test('elke render van de posteditor declareert zijn modules', () => {
|
|---|
| 39 | const calls = renderCalls(posts, 'pages/post-edit');
|
|---|
| 40 | assert.equal(calls.length, 2, 'nieuw + edit; een derde render moet hier ook langs');
|
|---|
| 41 | for (const c of calls) {
|
|---|
| 42 | assert.match(c, /pageJs:\s*'post-edit playlist-editor'/,
|
|---|
| 43 | 'een posteditor zonder modules wist bij opslaan de post');
|
|---|
| 44 | }
|
|---|
| 45 | });
|
|---|
| 46 |
|
|---|
| 47 | test('het verborgen contentveld draagt de bestaande inhoud', () => {
|
|---|
| 48 | // Zonder module is opslaan dan een no-op in plaats van een wisser --
|
|---|
| 49 | // dit is de vangrail ONDER de test hierboven.
|
|---|
| 50 | assert.match(editor, /id="content-hidden" value="<%= post\.content \|\| '' %>"/);
|
|---|
| 51 | });
|
|---|
| 52 |
|
|---|
| 53 | test('de download-autostart hoort alleen bij de ready-staat', () => {
|
|---|
| 54 | const calls = renderCalls(download, 'pages/download');
|
|---|
| 55 | assert.equal(calls.length, 3, 'formulier, formulier-met-fout, ready');
|
|---|
| 56 | for (const c of calls) {
|
|---|
| 57 | if (/dlState: 'ready'/.test(c)) {
|
|---|
| 58 | assert.match(c, /pageJs: 'download'/, 'ready zonder module = geen auto-start');
|
|---|
| 59 | } else {
|
|---|
| 60 | assert.doesNotMatch(c, /pageJs/,
|
|---|
| 61 | 'de module op de formulier-staat omzeilt de e-mailvraag');
|
|---|
| 62 | }
|
|---|
| 63 | }
|
|---|
| 64 | });
|
|---|