Changeset 7e53594 in Klonkt for test/guardian-event-log.test.js


Ignore:
Timestamp:
08/10/2026 03:53:26 AM (4 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
0db3c72
Parents:
f06ed56
Message:

shaer:log: het logboek staat naast de wachtrijen, niet erin

De apps konden er niet bij. Het logboek zat achter /guardian/api/events, een
PWA-route, dus een ward kon niet lezen waarom haar eigen aanbod geweigerd was --
en dat is precies de helft die §4.2 eist.

Eigen sleutel op de actor, GET /ap/users/:slug/log, dezelfde eigenaar-only
bearer als de wachtrijen. Bewust niet onder shaer:queues: alles daar wacht op
een antwoord en dit is wat er al besloten is. Geschiedenis onderbrengen bij een
woord dat "wachtend" betekent maakt van twee dingen één, en dat is de fout die
deze module vandaag drie keer heeft opgeruimd.

type is 'shaer:Event' en geen AS2-werkwoord. De meeste soorten zijn er geen: een
lapse-stem of een opgepakte hulpvraag is geen Accept, en het zo noemen zou
netter lezen dan het is.

Clients vinden hem via het actor-document, niet via een pad dat ze zelf
verzinnen (shaer-qa0). De AS2-test viel netjes om tot shaer:log was aangemeld --
tweede keer vandaag dat die het vangt.

De daemon volgt (shaer-6d9): zolang die geen shaer:log serveert, liegt een
client die tegen beide praat over een van de twee.

Co-Authored-By: Claude Opus 5 <claude@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/guardian-event-log.test.js

    rf06ed56 r7e53594  
    7676  assert.doesNotThrow(() => AP.onGuardianshipEvent(null, { kind: 'setting' }));
    7777});
     78
     79// ── De collectie die de apps lezen (shaer:log) ────────────────────────────
     80// Het logboek staat NAAST shaer:queues. Alles daarin wacht op een antwoord; dit
     81// is wat er al besloten is. Een aparte sleutel dus, en een aparte vorm.
     82
     83test('de actor wijst het logboek aan, los van de wachtrijen', async () => {
     84  const G = await import('../src/services/guardianship/index.js');
     85  const props = G.guardianshipActorProps('https://test.example/ap/users/kid', 'kid');
     86  assert.equal(props['shaer:log'], 'https://test.example/ap/users/kid/log');
     87  assert.equal(props['shaer:queues'].log, undefined,
     88    'geen geschiedenis onder een woord dat "wachtend" betekent');
     89});
     90
     91test('elk item draagt zijn soort en zijn reden mee', async () => {
     92  const G = await import('../src/services/guardianship/index.js');
     93  const c = G.logCollection('https://test.example/ap/users/kid/log', 'kid',
     94    (s) => AP.listGuardianEvents(s, 50));
     95  assert.equal(c.type, 'OrderedCollection');
     96  const weigering = c.orderedItems.find((i) => i['shaer:kind'] === 'offer_rejected');
     97  assert.ok(weigering, 'de weigering staat erin');
     98  assert.equal(weigering['shaer:reason'], 'not_a_teapot',
     99    'MET de reden: daarvoor bestaat dit ding');
     100  assert.equal(weigering['shaer:candidate'], 'https://elders.example/users/tess');
     101  assert.ok(weigering.published, 'en wanneer');
     102  // Geen AS2-werkwoord: een lapse-stem of een opgepakte hulpvraag is geen
     103  // Accept, en het zo noemen zou netter lezen dan het is.
     104  assert.equal(weigering.type, 'shaer:Event');
     105});
     106
     107test('een leeg logboek is een lege collectie, geen fout', async () => {
     108  const G = await import('../src/services/guardianship/index.js');
     109  const c = G.logCollection('https://test.example/ap/users/niemand/log', 'niemand',
     110    (s) => AP.listGuardianEvents(s, 50));
     111  assert.equal(c.totalItems, 0);
     112  assert.deepEqual(c.orderedItems, []);
     113});
Note: See TracChangeset for help on using the changeset viewer.