source: Klonkt/test/gate-request.test.js@ 3ccca13

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

De vraag van het kind staat apart van de wachtrij (shaer-8ru, vervolg)

Ik gooide het verzoek van de ward in dezelfde waiting-teller als de wachtende
volgverzoeken. Dat is fout: drie onbekenden die je kind willen volgen is iets
heel anders dan je kind dat een keer vraagt of muziek aan mag, en een gedeeld
getal maakt daar hetzelfde van -- dan leest de ene urgentie als de andere.

Nu een eigen veld requested op de poortrij, en in het paneel een eigen regel
onder de schakelaar in plaats van een getal in het statusveld: dit is het enige
op die rij dat van het KIND komt, en het hoort niet weg te vallen tussen de
drempels en de soorten. Drie talen.

Suite 714/714.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1// Een kind dat zelf om een poort vraagt (shaer-8ru, Barts opdracht 8-8).
2//
3// Tot nu toe liep alles over de guardians: zij zien de catalogus, zij stellen
4// voor, zij tellen. Het kind liep tegen een dichte deur en had geen woorden.
5//
6// De twee dingen die hier stil kunnen breken zijn allebei erg:
7// - een VRAAG die als STEM telt: dan opent een kind zijn eigen poort door
8// hard genoeg te vragen;
9// - een vraag die door de reddingsboei loopt: dan devalueert de boei tot
10// "het kind wil iets", en kijkt er op een dag niemand meer op als hij afgaat.
11//
12// In-memory SQLite. Run: npm test
13import { test } from 'node:test';
14import assert from 'node:assert/strict';
15
16process.env.DATABASE_PATH = ':memory:';
17process.env.PUBLIC_BASE_URL = 'https://oma.test';
18
19const dbMod = await import('../src/config/database.js');
20const db = dbMod.default;
21dbMod.initializeDatabase();
22const Guardianship = await import('../src/services/guardianship/index.js');
23const gatereq = await import('../src/services/guardianship/gatereq.js');
24const rel = await import('../src/services/guardianship/relations.js');
25const queues = await import('../src/services/guardianship/queues.js');
26
27db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
28 .run('u1', 'u1', 'u1@t', 'x', 'god');
29db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'oma', 'Oma', 'u1');
30const KIND = 'https://elders.test/ap/users/kind';
31rel.commitWardForGuardian('oma', KIND, { handle: '@kind' });
32
33test('een verzoek van een eigen ward wordt bewaard', () => {
34 gatereq.record('oma', KIND, 'shaer:images', 'https://elders.test/ap/notes/1');
35 const open = gatereq.listOpen('oma');
36 assert.equal(open.length, 1);
37 assert.equal(open[0].feature, 'shaer:images');
38});
39
40test('een VRAAG is geen STEM', () => {
41 // De grens van dit hele bead. Een verzoek mag nergens als voorstel of als
42 // stem opduiken: anders opent een kind zijn eigen poort door te vragen.
43 assert.equal(Guardianship.gated.listSent('oma', KIND).length, 0);
44 const rij = queues.wardGates('oma', KIND).find((g) => g.feature === 'shaer:images');
45 assert.equal(rij.proposal, undefined, 'geen voorstel');
46 assert.notEqual(rij.value, true, 'en zeker geen open poort');
47});
48
49test('de vraag staat BIJ de poort waar hij over gaat', () => {
50 // Niet in een aparte lijst die je apart moet openen, en dus vergeet.
51 const rij = queues.wardGates('oma', KIND).find((g) => g.feature === 'shaer:images');
52 assert.equal(rij.requested, 1);
53});
54
55test('en NIET op een hoop met de wachtrij', () => {
56 // Drie onbekenden die je kind willen volgen is iets heel anders dan je kind
57 // dat een keer vraagt of muziek aan mag. Een gedeeld getal maakt daar
58 // hetzelfde van, en dan leest de ene urgentie als de andere.
59 const rij = queues.wardGates('oma', KIND).find((g) => g.feature === 'shaer:images');
60 assert.equal(rij.waiting, undefined);
61});
62
63test('afgehandeld verdwijnt uit het zicht maar niet uit de geschiedenis', () => {
64 // Er wordt niets herschreven, er wordt toegevoegd -- zelfde regel als bij de
65 // hulpvraag: wat een kind gevraagd heeft hoort terug te vinden te zijn, ook
66 // als het antwoord nee was.
67 gatereq.markHandled('oma', KIND, 'shaer:images');
68 assert.equal(gatereq.listOpen('oma').length, 0);
69 const alles = db.prepare('SELECT * FROM ap_gate_requests WHERE ward_uri = ?').all(KIND);
70 assert.equal(alles.length, 1);
71 assert.ok(alles[0].handled_at, 'met een stempel erop');
72});
73
74test('een verzoek zonder feature is geen verzoek', () => {
75 assert.equal(gatereq.parseRequest({ content: 'hoi' }), null);
76 assert.equal(gatereq.parseRequest({ 'shaer:gateRequest': '' }), null);
77 assert.deepEqual(gatereq.parseRequest({ 'shaer:gateRequest': 'shaer:music' }), { feature: 'shaer:music' });
78});
79
80test('het verzoek draagt GEEN vrije tekst van het kind', () => {
81 // Dat is niet gierig maar precies de reden dat hij langs de messages-poort
82 // mag: anders is dit een kanaal om omheen die poort te praten.
83 const note = gatereq.requestNote({ id: 'x', me: 'https://k/u/kind', feature: 'shaer:music', to: ['https://oma.test/ap/users/oma'] });
84 assert.equal(note['shaer:gateRequest'], 'shaer:music');
85 assert.equal(note.content, '<p>Mag dit aan?</p>');
86});
87
88test('een verzoek is NIET de reddingsboei', () => {
89 // Ze door elkaar laten lopen devalueert de boei. Een verzoek draagt geen
90 // helpRequest-vlag, en een hulpvraag geen feature.
91 const note = gatereq.requestNote({ id: 'x', me: 'https://k/u/kind', feature: 'shaer:music', to: [] });
92 assert.equal(note['shaer:helpRequest'], undefined);
93 assert.equal(gatereq.parseRequest({ 'shaer:helpRequest': true }), null);
94});
Note: See TracBrowser for help on using the repository browser.