| 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 |
|
|---|
| 17 | import { test } from 'node:test';
|
|---|
| 18 | import assert from 'node:assert/strict';
|
|---|
| 19 |
|
|---|
| 20 | process.env.DATABASE_PATH = ':memory:';
|
|---|
| 21 | process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
|
|---|
| 22 |
|
|---|
| 23 | const dbMod = await import('../src/config/database.js');
|
|---|
| 24 | const db = dbMod.default;
|
|---|
| 25 | dbMod.initializeDatabase();
|
|---|
| 26 | const AP = await import('../src/services/ActivityPubService.js');
|
|---|
| 27 |
|
|---|
| 28 | db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
|
|---|
| 29 | .run('u1', 'g', 'g@test', 'x', 'god');
|
|---|
| 30 | db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'oma', 'Oma', 'u1');
|
|---|
| 31 |
|
|---|
| 32 | const KIND = 'https://kind.test/ap/users/kind';
|
|---|
| 33 | const push = (ev) => AP.guardianEventPush('oma', ev);
|
|---|
| 34 |
|
|---|
| 35 | test('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 |
|
|---|
| 44 | test('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 |
|
|---|
| 50 | test('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 |
|
|---|
| 58 | test('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 |
|
|---|
| 65 | test('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 |
|
|---|
| 71 | test('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 |
|
|---|
| 76 | test('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 | });
|
|---|