source: Klonkt/test/messages-thread-order.test.js

main
Last change on this file was cb1bd82, checked in by Robin <roboburr@…>, 2 weeks ago

Berichten-toetsen: layout eruit, overlap samengevoegd (zes worden twee)

Robins maat, 25-8: niet elke verandering behoefde een toets, en zeker
niet de toetsen die tegen de LAYOUT aan toetsen. Een toets die vastlegt
waar iets staat breekt bij de eerstvolgende verschuiving zonder dat er
iets stuk is.

Weg: de positietoets voor de antwoordrij (puur layout) en de
positie-assert van de zwaai-markering (kop voor bubbels -- ook layout).
Samengevoegd: volgorde en bron-onaangeroerd deelden al een render, en de
drie zwaai-gevallen (ontvangen, geen, eigen) zijn een regel met drie
kanten, geen drie toetsen.

Wat blijft zijn de twee BESLISSINGEN: binnen een gesprek leest het van
nieuw naar oud zonder de gedeelde array te draaien, en de
zwaai-markering volgt alleen een ontvangen zwaai. Tegenbewijs tegen de
partial van voor beide veranderingen (3e7dde2): daar vallen ze allebei,
dus ze bijten nog. Volle suite 1232 groen.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1// Twee beslissingen over Berichten (Robins besluit, 25-8), en niet meer dan
2// dat: binnen een gesprek leest het van NIEUW naar OUD, en een ONTVANGEN zwaai
3// zet een markering op de draad. Waar de dingen op de pagina STAAN wordt hier
4// met opzet niet getoetst -- dat is layout, en een toets daarop breekt bij de
5// eerstvolgende verschuiving zonder dat er iets stuk is.
6//
7// Dit rendert de echte partial. EJS-fouten bestaan alleen tijdens het renderen:
8// een verkeerde variabelenaam of een scheve `<% %>` valt hier om en nergens
9// anders in de suite.
10import { test } from 'node:test';
11import assert from 'node:assert/strict';
12import ejs from 'ejs';
13import path from 'node:path';
14import { fileURLToPath } from 'node:url';
15
16const partial = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'src', 'views', 'partials', 'msg-item.ejs');
17
18// De helpers die de pagina normaal meegeeft. Ze geven hun invoer terug, zodat
19// wat er in het antwoord staat uit de PARTIAL komt en niet uit een stub.
20const helpers = { t: (k) => k, avatar: (u) => u, emojiName: (n) => n, formatDateTime: (d) => String(d), canMutate: false, seen: 0 };
21
22// De naam is het herkenningspunt: de inhoud loopt via note-body, dat eigen
23// velden leest. De kop draagt alleen `people`, dus deze drie namen kunnen
24// alleen uit de bubbels zelf komen.
25function draad(extra = {}) {
26 return {
27 type: 'thread', key: 'k1', post: null, count: 3, people: [{ name: 'Bart' }],
28 created_at: '2026-08-25T10:00:00Z',
29 messages: [
30 { type: 'mention', name: 'OUDSTE', handle: '@a', created_at: '2026-08-25T09:00:00Z' },
31 { type: 'mention', name: 'MIDDELSTE', handle: '@b', created_at: '2026-08-25T09:30:00Z' },
32 { type: 'mention', name: 'NIEUWSTE', handle: '@c', wave: true, created_at: '2026-08-25T10:00:00Z' },
33 ],
34 ...extra,
35 };
36}
37
38const render = (n) => ejs.renderFile(partial, { ...helpers, n });
39
40test('binnen een gesprek leest het van nieuw naar oud, zonder de bron te draaien', async () => {
41 const d = draad();
42 const html = await render(d);
43 const nieuw = html.indexOf('NIEUWSTE'), midden = html.indexOf('MIDDELSTE'), oud = html.indexOf('OUDSTE');
44 assert.ok(nieuw > -1 && midden > -1 && oud > -1, 'alle drie de berichten staan er');
45 assert.ok(nieuw < midden && midden < oud, `nieuwste eerst, kreeg N=${nieuw} M=${midden} O=${oud}`);
46 // En de DOORGEGEVEN array blijft oplopend: groupConversations sorteert zo en
47 // de rest van de pagina rekent daarop (`_tnew` en `_tto` lezen dezelfde
48 // array). Draaide de partial het origineel om, dan werkt dat door naar alles
49 // wat er daarna naar kijkt.
50 assert.deepEqual(d.messages.map((m) => m.name), ['OUDSTE', 'MIDDELSTE', 'NIEUWSTE']);
51});
52
53test('de zwaai-markering volgt alleen een ONTVANGEN zwaai', async () => {
54 // Wel een ontvangen zwaai: markering.
55 assert.ok((await render(draad())).includes('msg-thread-wave'), 'een ontvangen zwaai markeert de draad');
56 // Geen zwaai: geen markering.
57 const stil = draad();
58 stil.messages = stil.messages.map((m) => ({ ...m, wave: false }));
59 assert.equal((await render(stil)).includes('msg-thread-wave'), false, 'geen zwaai, geen teken');
60 // Een zwaai die JIJ stuurde: ook geen markering, dat is geen uitnodiging
61 // aan jezelf.
62 const eigen = draad({ messages: [{ type: 'sent', to_handle: '@bart@pruts.nl', wave: true, created_at: '2026-08-25T10:00:00Z' }] });
63 assert.equal((await render(eigen)).includes('msg-thread-wave'), false, 'een eigen zwaai zet geen teken');
64});
Note: See TracBrowser for help on using the repository browser.