source: Klonkt/test/guardian-gate-push.test.js@ e5fc801

main
Last change on this file since e5fc801 was e5fc801, checked in by roboburr <roboburr@…>, 5 weeks ago

Gate-besluiten geven nu een melding in de Guardian PWA (shaer-fax fase 1)

De guardianship-module zendt VEERTIEN soorten gebeurtenissen uit. De push-brug
kende er vijf en deed if (!texts) return; alles daarbuiten viel stil weg. Daar
zaten juist de twee bij die er voor een guardian het meest toe doen:

gated_review een mede-guardian stelde iets voor en JOUW antwoord is nodig
gated_outcome er is besloten

Dat eerste is niet cosmetisch. FEP-633c 5.6 telt over de beschikbare guardians en
faalt gesloten: zonder melding hoort een guardian niet dat er op hem gewacht
wordt, loopt het venster leeg en verloopt het voorstel. Een drempel die niemand
ziet is geen drempel.

De melding zegt over wie het gaat, WELKE instelling, en of het aan of uit gezet
wordt -- er is meer dan een gate en ze betekenen heel verschillende dingen voor
een kind. De labels komen uit dezelfde i18n-sleutels als het Guardian-paneel,
zodat een melding en het scherm waar hij heen wijst hetzelfde woord gebruiken.
Een onbekende feature valt terug op het algemene woord in plaats van de melding
te laten vervallen: een guardian die niets hoort denkt dat er niets speelt.

De keuze WELKE gebeurtenis een mens wakker maakt is nu een aparte pure functie
(guardianEventPush) in plaats van verstopt in de bezorging. Dat is een beslissing
en hoort toetsbaar te zijn zonder web-push erbij te halen.

Teksten in nl, en en de. 7 tests, waaronder een die de vijf bestaande soorten
bewaakt -- deze brug is verbouwd. Gecontroleerd dat ze bijten: haal gated_review
uit de tabel en vier vallen om. Suite 551/551.

Dit is fase 1 van shaer-fax: de gratis variant via de Guardian PWA, zonder
abonnement en zonder derde partij. Geen native app nodig om dit te gebruiken.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1// Meldingen bij gated settings (shaer-fax, fase 1 -- de PWA eerst).
2//
3// De guardianship-module zendt VEERTIEN soorten gebeurtenissen uit; de
4// push-brug kende er vijf en deed `if (!texts) return`. Alles daarbuiten viel
5// stil weg -- inclusief de twee die er voor een guardian het meest toe doen:
6//
7// gated_review een mede-guardian heeft iets voorgesteld en JOUW antwoord is
8// nodig. Zonder melding loopt het venster leeg en verloopt het
9// voorstel. Een drempel die niemand ziet is geen drempel.
10// gated_outcome er is besloten.
11//
12// Getoetst wordt de BESLISSING (welke melding hoort hierbij), niet de bezorging.
13// Of web-push zelf werkt heeft zijn eigen leven.
14//
15// Run: npm test
16
17import { test } from 'node:test';
18import assert from 'node:assert/strict';
19
20process.env.DATABASE_PATH = ':memory:';
21process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
22
23const dbMod = await import('../src/config/database.js');
24const db = dbMod.default;
25dbMod.initializeDatabase();
26const AP = await import('../src/services/ActivityPubService.js');
27
28db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
29 .run('u1', 'g', 'g@test', 'x', 'god');
30db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'oma', 'Oma', 'u1');
31
32const KIND = 'https://kind.test/ap/users/kind';
33const push = (ev) => AP.guardianEventPush('oma', ev);
34
35test('een voorstel dat MIJN antwoord nodig heeft geeft een melding', () => {
36 const m = push({ kind: 'gated_review', feature: 'shaer:externalEmbeds', value: true, ward: KIND });
37 assert.ok(m, 'zonder dit weet een guardian niet dat er op hem gewacht wordt');
38 assert.equal(m.type, 'guardian');
39 assert.match(m.body, /kind/, 'de melding zegt over WIE het gaat');
40 assert.match(m.body, /linkvoorbeelden|link previews|Link-Vorschauen/i, 'en WELKE instelling');
41 assert.equal(m.url, '/guardian');
42});
43
44test('de stand staat erin, aan zowel als uit', () => {
45 const aan = push({ kind: 'gated_review', feature: 'shaer:externalEmbeds', value: true, ward: KIND });
46 const uit = push({ kind: 'gated_review', feature: 'shaer:externalEmbeds', value: false, ward: KIND });
47 assert.notEqual(aan.body, uit.body, 'anders lees je niet of iets AAN of UIT gezet wordt');
48});
49
50test('afspelen is niet hetzelfde als linkvoorbeelden', () => {
51 // Er is meer dan een gate, en ze betekenen heel verschillende dingen voor een
52 // kind. Een melding die dat niet zegt is nutteloos.
53 const a = push({ kind: 'gated_review', feature: 'shaer:externalEmbeds', value: true, ward: KIND });
54 const b = push({ kind: 'gated_review', feature: 'shaer:externalPlayback', value: true, ward: KIND });
55 assert.notEqual(a.body, b.body);
56});
57
58test('een besluit draagt de uitkomst', () => {
59 const af = push({ kind: 'gated_outcome', feature: 'shaer:externalPlayback', value: false, outcome: 'rejected', ward: KIND });
60 const aan = push({ kind: 'gated_outcome', feature: 'shaer:externalPlayback', value: false, outcome: 'accepted', ward: KIND });
61 assert.match(af.body, /afgewezen|rejected|abgelehnt/i);
62 assert.notEqual(af.body, aan.body);
63});
64
65test('een onbekende feature laat de melding NIET vervallen', () => {
66 // Liever een iets vager bericht dan geen bericht: een guardian die niets hoort
67 // denkt dat er niets speelt.
68 assert.ok(push({ kind: 'gated_review', feature: 'shaer:ietsNieuws', value: true, ward: KIND }));
69});
70
71test('een soort die we niet kennen blijft stil', () => {
72 // De vangnetregel blijft staan: liever geen melding dan een lege.
73 assert.equal(push({ kind: 'iets_heel_anders', ward: KIND }), null);
74});
75
76test('de bestaande soorten blijven werken', () => {
77 // Deze brug is verbouwd; wat er al doorheen ging moet er doorheen blijven gaan.
78 for (const kind of ['offer_received', 'offer_for_ward', 'committed', 'guardian_left', 'coguardian_left']) {
79 const m = push({ kind, ward: KIND, guardian: KIND, candidate: KIND });
80 assert.ok(m && m.title && m.body, `${kind} hoort een melding te geven`);
81 }
82});
Note: See TracBrowser for help on using the repository browser.