source: Klonkt/test/guardian-gate-panel.test.js@ ed5e7ab

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

Het gate-paneel: een rij per gate, met het soort en de drempel (shaer-ahy.1)

Een guardian zag twee knoppen en moest zelf uitzoeken wat er verder voor dit kind
gold. Wat niet verstelbaar is stond nergens -- terwijl dat de helft is van het
antwoord op "wat mag dit kind".

EEN BRON VAN WAARHEID. GATE_CATALOGUE in gated.js is nu de lijst van gates die
deze Klonkt kent. Wat gated wordt is een ontwerpkeuze van de implementatie: de
FEP levert het mechanisme (voorstel, tally, settle) en een paar voorbeelden, niet
de lijst. Een gate erbij is daarmee een regel data en geen nieuw stuk scherm.

HET SOORT STAAT ERBIJ, want ze werken niet hetzelfde:

setting een stand, aan of uit, terug te draaien
perRequest geen stand maar een stroom beslissingen (5.3 volgverzoeken)
handover draagt gezag OVER, onomkeerbaar zodra de ward hem gebruikt

Die derde bestaat nog niet (shaer-90v), maar de rij kan hem al dragen -- inclusief
"niet terug te draaien", zodat dat er niet later ingebouwd hoeft te worden.

Volgverzoeken staan er nu ook in, met het aantal dat wacht. Ze zijn niet te
verzetten (altijd aan voor een ward, 5.3) en juist daarom horen ze zichtbaar te
zijn.

TWEE DINGEN DIE HET PANEEL NIET VERZINT. Een onbekende stand is ONBEKEND en niet
uit: bij een ward op een andere server staat die kolom daar. En zonder bekend
aantal guardians komt er geen drempel op het scherm -- nul of een gok leest als
een feit, en dit is precies waar een guardian op afgaat voordat hij iets
voorstelt.

De trap uit shaer-ahy blijft: afspelen is pas te bewegen als linkvoorbeelden
aanstaan. Met dezelfde uitzondering als voorheen -- onbekend telt niet als dicht,
want dat kostte ooit een hele voorstelronde.

Terugval ingebouwd: serveert een oudere Klonkt de catalogus nog niet, dan
verschijnen de twee knoppen zoals ze waren in plaats van een leeg vak.

9 tests op gateRows, dat pure stuk waar de regels in zitten. nl/en/de. Suite
565/565. Niet gedekt: de weergave zelf, dat is client-JS.

  • Property mode set to 100644
File size: 3.7 KB
Line 
1// Het gate-paneel per ward (shaer-ahy.1).
2//
3// Wat gated wordt is een ontwerpkeuze van de implementatie -- de FEP levert het
4// mechanisme en een paar voorbeelden, niet de lijst. GATE_CATALOGUE is die lijst
5// op een plek, en gateRows maakt er de rijen van die het paneel toont.
6//
7// De regels die hier bewaakt worden zijn geen opmaak maar betekenis: een gate
8// die je niet kunt verzetten hoort tOch zichtbaar te zijn, onbekend is niet uit,
9// en er wordt geen drempel verzonnen die we niet kennen.
10//
11// Run: npm test
12
13import { test } from 'node:test';
14import assert from 'node:assert/strict';
15
16process.env.DATABASE_PATH = ':memory:';
17const gated = await import('../src/services/guardianship/gated.js');
18
19const rij = (rows, f) => rows.find((r) => r.feature === f);
20
21test('elke gate uit de catalogus krijgt een rij, ook de vaste', () => {
22 // Een paneel dat alleen verstelbare dingen toont verzwijgt de helft van wat er
23 // voor dit kind geldt.
24 const rows = gated.gateRows({});
25 assert.equal(rows.length, gated.GATE_CATALOGUE.length);
26 assert.ok(rij(rows, 'shaer:follows'), 'volgverzoeken zijn altijd gated en horen er tOch te staan');
27 assert.equal(rij(rows, 'shaer:follows').adjustable, false, 'maar niet te verzetten');
28});
29
30test('het soort staat erbij, want ze werken niet hetzelfde', () => {
31 const rows = gated.gateRows({});
32 assert.equal(rij(rows, 'shaer:externalEmbeds').kind, 'setting');
33 assert.equal(rij(rows, 'shaer:follows').kind, 'perRequest');
34});
35
36test('de drempel volgt het aantal guardians', () => {
37 const drie = gated.gateRows({ guardianCount: 3 });
38 assert.deepEqual(rij(drie, 'shaer:externalEmbeds').threshold, { need: 2, of: 3 });
39 const een = gated.gateRows({ guardianCount: 1 });
40 assert.deepEqual(rij(een, 'shaer:externalEmbeds').threshold, { need: 1, of: 1 });
41});
42
43test('een ONBEKEND aantal guardians levert GEEN drempel op', () => {
44 // Bij een ward elders wordt die set op diens eigen server bijgehouden. Een
45 // verzonnen getal leest als een feit, en dit is precies waar een guardian op
46 // afgaat voordat hij iets voorstelt.
47 const rows = gated.gateRows({ guardianCount: null });
48 assert.equal(rij(rows, 'shaer:externalEmbeds').threshold, null);
49});
50
51test('afspelen is dicht zolang zien UIT staat', () => {
52 const rows = gated.gateRows({ settings: { 'shaer:externalEmbeds': false } });
53 const p = rij(rows, 'shaer:externalPlayback');
54 assert.equal(p.adjustable, false);
55 assert.equal(p.blockedBy, 'shaer:externalEmbeds');
56});
57
58test('maar ONBEKEND is niet hetzelfde als uit', () => {
59 // Verbergen bij onbekend betekende ooit dat een guardian elders afspelen nooit
60 // kon voorstellen -- daar ging een hele voorstelronde de verkeerde gate in.
61 const rows = gated.gateRows({ settings: { 'shaer:externalEmbeds': null } });
62 const p = rij(rows, 'shaer:externalPlayback');
63 assert.equal(p.adjustable, true);
64 assert.equal(p.blockedBy, undefined);
65});
66
67test('een lopend voorstel hangt aan zijn eigen gate', () => {
68 const rows = gated.gateRows({
69 proposals: [{ feature: 'shaer:externalPlayback', value: true, status: 'open' }],
70 });
71 assert.equal(rij(rows, 'shaer:externalPlayback').proposal.status, 'open');
72 assert.equal(rij(rows, 'shaer:externalEmbeds').proposal, undefined);
73});
74
75test('wat er wacht staat bij de gate waar het op wacht', () => {
76 const rows = gated.gateRows({ waiting: { 'shaer:follows': 2 } });
77 assert.equal(rij(rows, 'shaer:follows').waiting, 2);
78});
79
80test('omkeerbaarheid staat per gate genoteerd', () => {
81 // Nu is alles omkeerbaar. Zodra independence erbij komt (shaer-90v) is dat het
82 // niet, en dan moet het paneel dat kunnen zeggen zonder verbouwing.
83 for (const r of gated.gateRows({})) assert.equal(typeof r.reversible, 'boolean');
84});
Note: See TracBrowser for help on using the repository browser.