Changeset 709dc6f in Klonkt for test/outgoing-follow-gate.test.js


Ignore:
Timestamp:
08/09/2026 04:59:31 PM (4 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
89d3c06
Parents:
e62eee4
Message:

Twee richtingen, twee poorten: shaer:following naast shaer:follows

In de catalogus stond één rij voor twee mechanismen. Het paneel telde
listReviewsByDirection(slug, 'incoming') en zette dat getal onder
shaer:follows, dus een guardian las "3 wachtend" en wist niet of er drie
vreemden bij zijn kind wilden of dat zijn kind drie keer had gevraagd of het
iemand mocht volgen. Dat zijn niet dezelfde zorg, en sinds shaer-p729 bestaan
ze allebei echt.

Nu twee poorten, en het verschil ertussen is opzet. §5.3 EIST dat een Follow
naar een ward langs de guardians gaat: shaer:follows blijft dus fixed. Over de
andere richting zegt de FEP niets — wat je verder gated is expliciet aan de
implementatie gelaten — dus shaer:following is onze keuze, en dan hoort hij ook
echt losgelaten te kunnen worden. Verstelbaar, met gate_following als kolom en
dezelfde automatiek als de rest: onbeslist is dicht voor een ward en open voor
ieder ander. Een kind dat erin groeit hoeft niet eeuwig te blijven vragen.

Geen eigen ownFollowsAllowed(): wardGateAllowed() is er al en zegt er zelf bij
dat het één implementatie hoort te zijn. Een derde kopie zou precies de tweede
plek zijn die er anders over kan gaan denken.

De labels zijn nog aan de clients: de server geeft de feature-naam door, de
Guardian PWA en Shaer moeten er nog woorden bij kiezen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/outgoing-follow-gate.test.js

    re62eee4 r709dc6f  
    152152  assert.notEqual(uit && uit.held, true);
    153153});
     154
     155// ── shaer:following als eigen poort (shaer-p729) ──────────────────────────
     156// De uitgaande kant stond als één rij met de inkomende in het paneel, en dan
     157// telt een guardian de ene richting en hoort niets over de andere. Nu twee
     158// poorten. Het VERSCHIL tussen die twee is opzet: §5.3 eist dat een Follow
     159// NAAR een ward langs de guardians gaat, dus die staat vast aan. Over deze
     160// richting zegt de FEP niets, dus die is van ons -- en dan hoort hij ook echt
     161// losgelaten te kunnen worden.
     162
     163test('onbeslist betekent dicht voor een ward, net als bij de andere poorten', async () => {
     164  const wim = site('wim');
     165  guards('wim', local('mum'));
     166  const held = await AP.gateOutgoingFollow(wim, 'https://elders.example/users/nieuw');
     167  assert.ok(held, 'niemand heeft er iets over besloten, dus vragen we');
     168});
     169
     170test('de guardians kunnen de poort openzetten, en dan vraagt het kind niets meer', async () => {
     171  const zoe = site('zoe');
     172  guards('zoe', local('mum'));
     173  db.prepare('UPDATE sites SET gate_following = 1 WHERE slug = ?').run('zoe');
     174  const zoeSite = db.prepare('SELECT * FROM sites WHERE slug = ?').get('zoe');
     175  assert.equal(await AP.gateOutgoingFollow(zoeSite, 'https://elders.example/users/nieuw'), null,
     176    'een kind dat erin gegroeid is hoeft niet eeuwig te blijven vragen');
     177});
     178
     179test('en weer dicht is ook een besluit', async () => {
     180  const zoeSite = db.prepare('SELECT * FROM sites WHERE slug = ?').get('zoe');
     181  db.prepare('UPDATE sites SET gate_following = 0 WHERE slug = ?').run('zoe');
     182  const dicht = db.prepare('SELECT * FROM sites WHERE slug = ?').get('zoe');
     183  assert.ok(await AP.gateOutgoingFollow(dicht, 'https://elders.example/users/weer'),
     184    'terugdraaien kan: de poort is reversible');
     185  assert.equal(zoeSite.gate_following, 1, '(en de oude rij was echt open)');
     186});
     187
     188test('de twee richtingen tellen apart in het paneel', async () => {
     189  const queues = await import('../src/services/guardianship/queues.js');
     190  const rows = queues.wardGates('mum', local('kid'));
     191  const namen = rows.map((r) => r.feature);
     192  assert.ok(namen.includes('shaer:follows'), 'wie het kind wil volgen');
     193  assert.ok(namen.includes('shaer:following'), 'en wie het kind wil volgen -- andersom');
     194  const uit = rows.find((r) => r.feature === 'shaer:following');
     195  assert.equal(uit.adjustable, true, 'deze mag verzet worden');
     196  const inn = rows.find((r) => r.feature === 'shaer:follows');
     197  assert.equal(inn.adjustable, false, 'en deze niet: §5.3 laat er geen ruimte voor');
     198});
Note: See TracChangeset for help on using the changeset viewer.