source: Klonkt/test/help-c2s.test.js@ 86e6a45

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

De apps krijgen de hulpstaat, en kunnen afhandelen (shaer-lgo)

Barts melding: afgehandelde hulpverzoeken blijven zichtbaar in de Shaer
GuardianshipView, en kan het afhandelen daar ook?

DIE TWEE ZIJN HETZELFDE PROBLEEM. De apps lazen hulpvragen uit de FEED -- losse
notes met een helpRequest-vlag -- en kregen de staat helemaal niet. Ze konden dus
niet weten of er al iemand op af was, en dan is een afgehandeld verzoek laten
staan nog het eerlijkste dat een app kan doen. Klonkt bewaarde de staat wel; hij
reisde alleen nergens heen.

Nu een queue help op de actor, met de staat PLAT erin: open, wie hem oppakte,
wie hem afsloot en wanneer. Een app hoeft hem niet af te leiden en kan hem dus
ook niet anders afleiden dan het paneel -- helpItemsFor is een plek, net als
wardGates. Twee berekeningen zouden twee guardians een ander beeld geven van
hetzelfde kind, en bij een reddingsboei is dat het gevaarlijkste dat er mis kan
gaan.

AFHANDELEN HOEFDE GEEN NIEUWE VORM. De markering IS al een gewone directe note
met shaer:helpPickup of shaer:helpHandled, precies zoals de zwaai. De outbox
herkent hem nu, dus de app stuurt letterlijk wat de PWA stuurt en het reist over
dezelfde bezorging naar de mede-guardians. Geen tweede weg.

Wel LOKAAL boeken, en daar staat een toets op: zonder dat zag de guardian die de
knop indrukt zijn eigen markering pas als hij bij zichzelf terugkwam, en die weg
bestaat niet.

Oppikken blijft OPEN. De faalstand hier is "iedereen denkt dat het geregeld is",
en die is gevaarlijker dan geen markering.

De AS2-toets ving dat help nog niet gedeclareerd stond op de actor -- precies
waarvoor die toets er is. Suite 718/718; zonder de lokale boeking valt er een om.

  • Property mode set to 100644
File size: 3.5 KB
RevLine 
[86e6a45]1// Een hulpvraag oppikken en afsluiten vanuit de app (shaer-lgo, Barts melding 8-8).
2//
3// De apps lazen hulpvragen uit de FEED en kregen de staat niet mee. Ze wisten dus
4// niet of er al iemand op af was, en een afgehandeld verzoek bleef gewoon staan.
5//
6// Wat hier bewaakt wordt: de app loopt door dezelfde markering en dezelfde staat
7// als het paneel. Twee berekeningen zouden twee guardians een ander beeld geven
8// van hetzelfde kind -- en bij een reddingsboei is dat het gevaarlijkste dat er
9// mis kan gaan.
10//
11// In-memory SQLite. Run: npm test
12import { test } from 'node:test';
13import assert from 'node:assert/strict';
14
15process.env.DATABASE_PATH = ':memory:';
16process.env.PUBLIC_BASE_URL = 'https://oma.test';
17
18const dbMod = await import('../src/config/database.js');
19const db = dbMod.default;
20dbMod.initializeDatabase();
21const AP = await import('../src/services/ActivityPubService.js');
22const queues = await import('../src/services/guardianship/queues.js');
23const rel = await import('../src/services/guardianship/relations.js');
24
25db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
26 .run('u1', 'u1', 'u1@t', 'x', 'god');
27db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'oma', 'Oma', 'u1');
28const site = () => db.prepare('SELECT * FROM sites WHERE id = ?').get('s1');
29const user = { id: 'u1', username: 'u1' };
30const KIND = 'https://elders.test/ap/users/kind';
31const BOEI = 'https://elders.test/ap/notes/boei-1';
32rel.commitWardForGuardian('oma', KIND, { handle: '@kind' });
33db.prepare(`INSERT INTO ap_mentions (slug, object_uri, actor_uri, actor_handle, content, help_request)
34 VALUES (?,?,?,?,?,1)`).run('oma', BOEI, KIND, '@kind', '<p>help</p>');
35
36const marker = (kind) => ({
37 type: 'Create',
38 object: {
39 type: 'Note',
40 content: '<p>.</p>',
41 to: [KIND],
42 [kind === 'handled' ? 'shaer:helpHandled' : 'shaer:helpPickup']: BOEI,
43 },
44});
45
46test('een verse hulpvraag staat OPEN', () => {
47 const h = queues.helpItemsFor('oma').find((x) => x.object_uri === BOEI);
48 assert.equal(h.state.open, true);
49 assert.equal(h.state.handled, null);
50});
51
52test('oppikken vanuit de app landt in dezelfde staat als het paneel', async () => {
53 await AP.ingestOutboxActivity(site(), user, marker('pickup'));
54 const h = queues.helpItemsFor('oma').find((x) => x.object_uri === BOEI);
55 assert.equal(h.state.pickedUpBy.length, 1);
56 // Nog steeds open: oppikken is geen afhandelen. De faalstand hier is
57 // "iedereen denkt dat het geregeld is", en die is gevaarlijker dan geen
58 // markering.
59 assert.equal(h.state.open, true);
60});
61
62test('afsluiten vanuit de app sluit hem ook echt', async () => {
63 await AP.ingestOutboxActivity(site(), user, marker('handled'));
64 const h = queues.helpItemsFor('oma').find((x) => x.object_uri === BOEI);
65 assert.equal(h.state.open, false);
66 assert.ok(h.state.handled, 'met wie het deed erbij');
67});
68
69test('de collectie voor de apps draagt de staat plat mee', () => {
70 // Een app hoeft hem niet af te leiden, en kan hem dus ook niet anders
71 // afleiden dan het paneel.
72 const coll = queues.helpCollection('https://x/queues/help', 'oma');
73 const item = coll.orderedItems.find((i) => i.id === BOEI);
74 assert.equal(item['shaer:open'], false);
75 assert.ok(item['shaer:handledBy']);
76 assert.equal(item['shaer:helpRequest'], true);
77});
78
79test('een note zonder markering blijft een gewoon bericht', async () => {
80 const uit = await AP.ingestOutboxActivity(site(), user, {
81 type: 'Create', object: { type: 'Note', content: '<p>hoi</p>', to: [KIND] },
82 });
83 assert.notEqual(uit.status, 400);
84});
Note: See TracBrowser for help on using the repository browser.