source: Klonkt/test/guardian-longpoll.test.js@ 6fab3f3

main
Last change on this file since 6fab3f3 was 6fab3f3, checked in by roboburr <roboburr@…>, 4 weeks ago

Een lange poll voor alles wat de Guardian te verwerken krijgt (Barts opdracht, 9-8)

Het paneel tikte elke 45 seconden, ongeacht of er iets gebeurd was. Nu hangt er
een verzoek open tot er iets IS. Dat is niet alleen zuiniger -- het is vooral
sneller: een hulproep stond eerst tot drie kwart minuut te wachten op de klok.

WAKKER OP ALLES, en dat is de kern van de opdracht. De guardianship-module zendt
veertien soorten gebeurtenissen uit; die gingen tot nu toe alleen naar push, en
push kiest bewust een handvol. De tien soorten zonder pushtekst -- een stem op
een lapse, een uitkomst, een review -- zag je pas bij de volgende tik. Wie maak
je WAKKER en wat moet een openstaand scherm WETEN zijn twee verschillende
vragen, en ze hadden hetzelfde antwoord.

Naast die bus wekt ook de tijdlijn (onNews): de berichten van je wards staan in
ditzelfde scherm. En de twee paden die niet via notify() lopen -- een
hulpmarkering van een mede-guardian, en een poortverzoek van een kind -- wekken
nu zelf.

EERST KIJKEN, DAN WACHTEN. Veranderde er iets tussen het vorige antwoord en dit
verzoek, dan is de merksteen al anders en gaat het antwoord meteen de deur uit.
Zou je eerst gaan wachten, dan blijft nieuws dat net in dat gaatje viel 25
seconden liggen -- en bij een hulpvraag is dat de verkeerde vertraging.

Het tikje blijft als vangnet, maar op vijf minuten in plaats van 45 seconden:
valt er een wekker weg (een pad dat niet wekt, een herstart midden in een
verzoek), dan mag het scherm niet voorgoed stilstaan. Met de ETag kost zo'n tik
meestal een lege 304.

EEN NAAD DIE IK EERST NIET KON RAKEN. Het wekken zat verstopt in de deps-literal,
en de mutatie die het weghaalde bleef groen -- mijn toetsen dekten alleen de bus.
onGuardianshipEvent is nu een functie met een naam, precies zoals
guardianEventPush dat al was, en de mutatie is nu rood. Een lange poll die niet
wekt is niet te onderscheiden van een trage server, en dat is het soort fout dat
niemand meldt.

Tien toetsen. Suite 770/770.

  • Property mode set to 100644
File size: 3.6 KB
Line 
1// De wekker onder het Guardian-paneel (Barts opdracht, 9-8).
2//
3// Het paneel tikte elke 45 seconden, ongeacht of er iets gebeurd was. Nu hangt
4// er een verzoek open tot er iets is dat de guardian moet verwerken.
5//
6// Wat hier bewaakt wordt is de BUS, niet de route: dat elke soort gebeurtenis
7// wekt, dat een wachter maar EEN keer gewekt wordt, en dat een wachter die zich
8// afmeldt ook echt weg is. Een lange poll die niet wekt is niet te onderscheiden
9// van een trage server -- en dat is precies het soort fout dat niemand meldt.
10//
11// Run: npm test
12import { test } from 'node:test';
13import assert from 'node:assert/strict';
14
15process.env.DATABASE_PATH = ':memory:';
16const AP = await import('../src/services/ActivityPubService.js');
17
18test('een wachter wordt gewekt', () => {
19 let gewekt = 0;
20 AP.onGuardian('kind', () => { gewekt += 1; });
21 AP.wakeGuardian('kind');
22 assert.equal(gewekt, 1);
23});
24
25test('en daarna vergeten: een tweede wek doet niets', () => {
26 // Het antwoord dat volgt is de nieuwe waarheid; de client komt terug met een
27 // nieuwe wachter. Bleef hij staan, dan zou een burst van tien gebeurtenissen
28 // tien antwoorden op hetzelfde verzoek proberen te schrijven.
29 let gewekt = 0;
30 AP.onGuardian('kind2', () => { gewekt += 1; });
31 AP.wakeGuardian('kind2');
32 AP.wakeGuardian('kind2');
33 assert.equal(gewekt, 1);
34});
35
36test('afmelden werkt', () => {
37 // Hangt de client op, dan moet de wachter weg. Anders lekt elke afgebroken
38 // verbinding een callback, en bij een lange poll is dat elke 25 seconden een.
39 let gewekt = 0;
40 const af = AP.onGuardian('kind3', () => { gewekt += 1; });
41 af();
42 AP.wakeGuardian('kind3');
43 assert.equal(gewekt, 0);
44});
45
46test('wekken raakt alleen de eigen guardian', () => {
47 let a = 0; let b = 0;
48 AP.onGuardian('oma', () => { a += 1; });
49 AP.onGuardian('opa', () => { b += 1; });
50 AP.wakeGuardian('oma');
51 assert.equal(a, 1);
52 assert.equal(b, 0);
53});
54
55test('meerdere schermen van dezelfde guardian worden allemaal gewekt', () => {
56 // Telefoon en laptop naast elkaar. Zou alleen de laatste wachter gewekt
57 // worden, dan blijft het andere scherm stil staan.
58 let n = 0;
59 AP.onGuardian('duo', () => { n += 1; });
60 AP.onGuardian('duo', () => { n += 1; });
61 AP.wakeGuardian('duo');
62 assert.equal(n, 2);
63});
64
65test('een wachter die stukgaat breekt de rest niet', () => {
66 // Een kapotte callback mag nooit de andere schermen laten hangen.
67 let goed = 0;
68 AP.onGuardian('stuk', () => { throw new Error('boem'); });
69 AP.onGuardian('stuk', () => { goed += 1; });
70 AP.wakeGuardian('stuk');
71 assert.equal(goed, 1);
72});
73
74test('wekken zonder wachters is geen fout', () => {
75 assert.doesNotThrow(() => AP.wakeGuardian('niemand'));
76});
77
78test('ELKE guardianship-gebeurtenis wekt, ook die geen melding waard is', () => {
79 // De kern van Barts opdracht: push kiest bewust een handvol soorten, het
80 // scherm hoort ze allemaal te weten. Dit gaat door de ECHTE handler heen --
81 // een eerdere versie toetste alleen de bus, en toen bleef de mutatie die het
82 // wekken uit onEvent haalde gewoon groen.
83 const ev = { kind: 'lapse_vote', lapse: 'x', by: 'y', state: 'recorded' };
84 assert.equal(AP.guardianEventPush('kind9', ev), null, 'deze soort geeft geen melding');
85
86 let gewekt = 0;
87 AP.onGuardian('kind9', () => { gewekt += 1; });
88 AP.onGuardianshipEvent('kind9', ev);
89 assert.equal(gewekt, 1, 'en toch wordt het paneel gewekt');
90});
91
92test('een gebeurtenis die WEL een melding is, wekt ook', () => {
93 let gewekt = 0;
94 AP.onGuardian('kind10', () => { gewekt += 1; });
95 AP.onGuardianshipEvent('kind10', { kind: 'committed', ward: 'https://w/x' });
96 assert.equal(gewekt, 1);
97});
Note: See TracBrowser for help on using the repository browser.