source: Klonkt/test/feed-alt-view.test.js

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

Lezen: elk bericht een eigen scherm wordt een keuze

Robins vraag (20-8): de lege ruimtes tussen berichten optioneel maken, en
specifiek voor Lezen.

Nieuwe kolom reader_full_page op sites, standaard UIT zodat bestaande
sites niet ineens anders lezen:

uit bericht na bericht, geen lege ruimte eronder
aan elk bericht vult minstens een scherm (min-height:100svh)

Dit stond eerst vast op AAN, is op 20-8 vast op UIT gezet omdat een kort
bericht een halve pagina leegte gaf onder "Replies and reactions", en hoort
dus eigenlijk bij de schrijver: lange stukken lezen prettiger in de stroom,
korte losse berichten juist als eigen scherm.

De keuze staat in Beheer -> Instellingen bij de andere feed-keuzes, en gaat
via een attribuut op body zodat CSS het werk doet.

OVER DE SQL, want daar ging het deze week twee keer mis: deze wijziging
voegt een kolom toe aan dezelfde UPDATE waar ik eerder een kolom zonder
waarde in zette, waarna show_search de waarde van zijn buurman kreeg en
alles erna een plek opschoof. De tests gaan daarom door de ECHTE route en
toetsen expliciet de buurkolommen. Controleproef gedaan: laat je de waarde
weg, dan vallen 6 van de 8 tests om.

style.css naar v83, MOD_V naar 21.

Suite 1172/1172.

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

  • Property mode set to 100644
File size: 6.5 KB
Line 
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.
12import { test } from 'node:test';
13import assert from 'node:assert/strict';
14
15process.env.DATABASE_PATH = ':memory:';
16process.env.PUBLIC_BASE_URL = 'https://test.example';
17const dbMod = await import('../src/config/database.js');
18const db = dbMod.default;
19dbMod.initializeDatabase();
20
21db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
22 .run('u1', 'baas', 'b@t.nl', 'x', 'god');
23
24const express = (await import('express')).default;
25const router = (await import('../src/routes/admin-sites.js')).default;
26const app = express();
27app.use(express.urlencoded({ extended: true }));
28app.use((req, _res, next) => { req.session = { user: { id: 'u1', role: 'god' } }; next(); });
29app.use('/admin/sites', router);
30
31const server = app.listen(0);
32server.unref(); // houdt de suite niet in leven als een test halverwege stopt
33const 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.
40const 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};
54const siteVan = (slug) => db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug);
55
56test('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
64test('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
79test('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
88test('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
95test('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.
107test('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
112test('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
128test('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
133test.after(() => { server.closeAllConnections?.(); server.close(); });
Note: See TracBrowser for help on using the repository browser.