source: Klonkt/test/page-modules.test.js

main
Last change on this file was 3ca7bdf, checked in by Robin <roboburr@…>, 5 weeks ago

De editpagina laadt zijn editor weer, en opslaan zonder module wist niets meer

Robins test at een post op: /posts/:slug/edit rendert dezelfde template als
/posts/new, maar alleen de nieuw-route kreeg bij shaer-bqr zijn pageJs. De
editpagina had dus data-js="chrome" -- geen editor, geen mediaprompts, en
een verborgen contentveld dat leeg rendert. Opslaan schreef dat lege veld
naar de database: strike-homerun verloor zo om 18:54 zijn inhoud (testpost
van 18:12, niets ouds verloren).

Drie lagen, van symptoom naar vangrail:

  1. de edit-route declareert pageJs 'post-edit playlist-editor'
  2. het verborgen veld rendert de BESTAANDE inhoud: laadt de module niet (oude cache, js uit), dan is opslaan een no-op in plaats van een wisser
  3. test/page-modules.test.js scheurt luid als een render van de editor zijn modules vergeet -- een brontekst-test, bewust, want het gedrag leeft in de browser en dit is de fout die twee keer beet

En dezelfde audit ving download: drie renders, en pageJs stond op het
FORMULIER in plaats van op ready -- de auto-start hoorde v66r shaer-bqr bij
de ready-tak en omzeilde nu de e-mailvraag. Verplaatst, en de module weigert
voortaan een lege fileUrl.

Co-Authored-By: Claude Opus 5 <noreply@…>

  • Property mode set to 100644
File size: 2.8 KB
Line 
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.
14import { test } from 'node:test';
15import assert from 'node:assert/strict';
16import { readFileSync } from 'node:fs';
17
18const posts = readFileSync(new URL('../src/routes/posts.js', import.meta.url), 'utf8');
19const download = readFileSync(new URL('../src/routes/download.js', import.meta.url), 'utf8');
20const 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).
23function 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
38test('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
47test('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
53test('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});
Note: See TracBrowser for help on using the repository browser.