| 1 | // De tweede weergave van een site: Lezen, Tijdlijn, of allebei (mobiel/desktop).
|
|---|
| 2 | //
|
|---|
| 3 | // Tijdlijn was geen KEUZE meer sinds Lezen hem verving, maar de renderkant is
|
|---|
| 4 | // nooit weggehaald: home.ejs stuurt alle drie de secties mee en de CSS kiest op
|
|---|
| 5 | // body[data-feed-view]. Dit maakt er weer een instelling van.
|
|---|
| 6 | //
|
|---|
| 7 | // Deze tests gaan door de ECHTE routes heen, en niet langs de SQL met een
|
|---|
| 8 | // handgemaakte rij. Reden: bij het bouwen zette ik een waarde in de INSERT
|
|---|
| 9 | // zonder de kolom (te weinig vraagtekens) en een kolom in de UPDATE zonder de
|
|---|
| 10 | // waarde -- waarbij alles erna een plek opschuift en show_search de waarde van
|
|---|
| 11 | // feed_alt_view kreeg. Geen van beide had een test langs de zijkant gevangen.
|
|---|
| 12 | import { test } from 'node:test';
|
|---|
| 13 | import assert from 'node:assert/strict';
|
|---|
| 14 |
|
|---|
| 15 | process.env.DATABASE_PATH = ':memory:';
|
|---|
| 16 | process.env.PUBLIC_BASE_URL = 'https://test.example';
|
|---|
| 17 | const dbMod = await import('../src/config/database.js');
|
|---|
| 18 | const db = dbMod.default;
|
|---|
| 19 | dbMod.initializeDatabase();
|
|---|
| 20 |
|
|---|
| 21 | db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
|
|---|
| 22 | .run('u1', 'baas', 'b@t.nl', 'x', 'god');
|
|---|
| 23 |
|
|---|
| 24 | const express = (await import('express')).default;
|
|---|
| 25 | const router = (await import('../src/routes/admin-sites.js')).default;
|
|---|
| 26 | const app = express();
|
|---|
| 27 | app.use(express.urlencoded({ extended: true }));
|
|---|
| 28 | app.use((req, _res, next) => { req.session = { user: { id: 'u1', role: 'god' } }; next(); });
|
|---|
| 29 | app.use('/admin/sites', router);
|
|---|
| 30 |
|
|---|
| 31 | const server = app.listen(0);
|
|---|
| 32 | server.unref(); // houdt de suite niet in leven als een test halverwege stopt
|
|---|
| 33 | const poort = server.address().port;
|
|---|
| 34 | // MET EEN TIJDSLIMIET, en dat is geen voorzorg maar een gemeten noodzaak: gaat er
|
|---|
| 35 | // in de route iets mis (een SQL-fout door een scheve parameterlijst), dan vangt
|
|---|
| 36 | // express dat in een async-handler niet af en komt er NOOIT een antwoord. Zonder
|
|---|
| 37 | // limiet hangt de hele suite dan op 124 in plaats van te falen -- precies wat er
|
|---|
| 38 | // gebeurde toen ik de controleproef deed. Een test die op de fout die hij moet
|
|---|
| 39 | // vangen blijft hangen, meldt niets.
|
|---|
| 40 | const post = async (pad, velden) => {
|
|---|
| 41 | try {
|
|---|
| 42 | return await fetch(`http://127.0.0.1:${poort}${pad}`, {
|
|---|
| 43 | method: 'POST', redirect: 'manual',
|
|---|
| 44 | headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|---|
| 45 | body: new URLSearchParams(velden).toString(),
|
|---|
| 46 | signal: AbortSignal.timeout(5000),
|
|---|
| 47 | });
|
|---|
| 48 | } catch (e) {
|
|---|
| 49 | assert.fail(`de route antwoordde niet op ${pad} (${e.name}) -- vrijwel altijd een `
|
|---|
| 50 | + 'worp in de handler, en bij dit formulier meestal een kolommenlijst die niet '
|
|---|
| 51 | + 'meer bij de waarden past');
|
|---|
| 52 | }
|
|---|
| 53 | };
|
|---|
| 54 | const siteVan = (slug) => db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug);
|
|---|
| 55 |
|
|---|
| 56 | test('de kolom bestaat en staat standaard op Lezen', async () => {
|
|---|
| 57 | const r = await post('/admin/sites/create', { slug: 'proef', title: 'Proef' });
|
|---|
| 58 | assert.ok(r.status === 302 || r.status === 200, 'aanmaken mag niet stranden, kreeg ' + r.status);
|
|---|
| 59 | const s = siteVan('proef');
|
|---|
| 60 | assert.ok(s, 'de site hoort aangemaakt te zijn');
|
|---|
| 61 | assert.equal(s.feed_alt_view, 'reader', 'een verse site biedt Lezen aan');
|
|---|
| 62 | });
|
|---|
| 63 |
|
|---|
| 64 | test('opslaan zet de tweede weergave, en raakt zijn buren niet', async () => {
|
|---|
| 65 | // show_search is de kolom die in de UPDATE direct NA feed_alt_view komt. Zette
|
|---|
| 66 | // je de kolom er wel bij en de waarde niet, dan kwam de checkbox-waarde in
|
|---|
| 67 | // feed_alt_view terecht en schoof al het andere op. Daarom staat hij hier.
|
|---|
| 68 | await post('/admin/sites/proef/save', {
|
|---|
| 69 | title: 'Proef', feed_alt_view: 'timeline', feed_view_default: 'reader',
|
|---|
| 70 | feed_view_switch: '1', show_search: '1', show_archive_link: '1',
|
|---|
| 71 | });
|
|---|
| 72 | const s = siteVan('proef');
|
|---|
| 73 | assert.equal(s.feed_alt_view, 'timeline');
|
|---|
| 74 | assert.equal(s.show_search, 1, 'de buurkolom mag niet meeschuiven');
|
|---|
| 75 | assert.equal(s.show_archive_link, 1, 'en die erachter ook niet');
|
|---|
| 76 | assert.equal(s.feed_view_switch, 1);
|
|---|
| 77 | });
|
|---|
| 78 |
|
|---|
| 79 | test('de standaardweergave volgt de tweede weergave, niet een vaste naam', () => {
|
|---|
| 80 | // Hier hing het scheef: het aanmaakpad schreef 'reader' en het opslaanpad
|
|---|
| 81 | // 'timeline', voor precies dezelfde keuze. De waarde betekende dus niet wat
|
|---|
| 82 | // er stond, en de client vertaalde dat stil terug.
|
|---|
| 83 | const s = siteVan('proef');
|
|---|
| 84 | assert.equal(s.feed_view_default, 'timeline',
|
|---|
| 85 | 'kiest de site Tijdlijn, dan opent hij daar ook in');
|
|---|
| 86 | });
|
|---|
| 87 |
|
|---|
| 88 | test('Grid als standaard blijft Grid, wat de tweede weergave ook is', async () => {
|
|---|
| 89 | await post('/admin/sites/proef/save', { title: 'Proef', feed_alt_view: 'auto', feed_view_default: 'grid' });
|
|---|
| 90 | const s = siteVan('proef');
|
|---|
| 91 | assert.equal(s.feed_alt_view, 'auto');
|
|---|
| 92 | assert.equal(s.feed_view_default, 'grid');
|
|---|
| 93 | });
|
|---|
| 94 |
|
|---|
| 95 | test('onzin in het formulier valt terug op Lezen', async () => {
|
|---|
| 96 | await post('/admin/sites/proef/save', { title: 'Proef', feed_alt_view: 'iets-anders', feed_view_default: 'reader' });
|
|---|
| 97 | assert.equal(siteVan('proef').feed_alt_view, 'reader');
|
|---|
| 98 | });
|
|---|
| 99 |
|
|---|
| 100 | // closeAllConnections EERST: fetch houdt de verbinding open (keep-alive), en dan
|
|---|
| 101 | // wacht server.close() tot in de eeuwigheid. Bij een geslaagde run valt dat niet
|
|---|
| 102 | // op; valt er een test om, dan hangt de hele suite. Zo overkwam het me bij de
|
|---|
| 103 | // controleproef -- de test die de fout moest aantonen, hing erop.
|
|---|
| 104 | // ── Elk bericht een eigen scherm in Lezen (Robin, 20-8) ─────────────────────
|
|---|
| 105 | // Zelfde reden als hierboven om door de ECHTE route te gaan: dit voegt een
|
|---|
| 106 | // kolom toe aan dezelfde UPDATE, en juist daar ging het eerder mis.
|
|---|
| 107 | test('de nieuwe kolom staat standaard uit', () => {
|
|---|
| 108 | const s = siteVan('proef');
|
|---|
| 109 | assert.equal(s.reader_full_page, 0, 'bestaande sites veranderen niet van gedrag');
|
|---|
| 110 | });
|
|---|
| 111 |
|
|---|
| 112 | test('aanzetten werkt, en de buren schuiven niet mee', async () => {
|
|---|
| 113 | await post('/admin/sites/proef/save', {
|
|---|
| 114 | title: 'Proef', feed_alt_view: 'timeline', feed_view_default: 'grid',
|
|---|
| 115 | feed_view_switch: '1', reader_full_page: '1', show_search: '1', show_archive_link: '1',
|
|---|
| 116 | });
|
|---|
| 117 | const s = siteVan('proef');
|
|---|
| 118 | assert.equal(s.reader_full_page, 1);
|
|---|
| 119 | // De kolommen rond de nieuwe in de UPDATE. Zet je de kolom er wel bij en de
|
|---|
| 120 | // waarde niet, dan schuift alles erna een plek op en is dit het eerste dat
|
|---|
| 121 | // omvalt.
|
|---|
| 122 | assert.equal(s.feed_alt_view, 'timeline', 'de kolom ervoor');
|
|---|
| 123 | assert.equal(s.show_search, 1, 'de kolom erna');
|
|---|
| 124 | assert.equal(s.show_archive_link, 1, 'en die daarachter');
|
|---|
| 125 | assert.equal(s.feed_view_switch, 1);
|
|---|
| 126 | });
|
|---|
| 127 |
|
|---|
| 128 | test('en weer uit', async () => {
|
|---|
| 129 | await post('/admin/sites/proef/save', { title: 'Proef', feed_alt_view: 'reader', feed_view_default: 'reader' });
|
|---|
| 130 | assert.equal(siteVan('proef').reader_full_page, 0, 'een niet-aangevinkt vakje zet hem uit');
|
|---|
| 131 | });
|
|---|
| 132 |
|
|---|
| 133 | test.after(() => { server.closeAllConnections?.(); server.close(); });
|
|---|