Changeset d14bf1c in Klonkt for test/feed-wait.test.js


Ignore:
Timestamp:
08/07/2026 09:14:32 AM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
44c9f3f
Parents:
f2a7181
git-author:
Robin <roboburr@…> (08/07/2026 09:14:20 AM)
git-committer:
roboburr <roboburr@…> (08/07/2026 09:14:32 AM)
Message:

De merksteen wordt een koppeltabel in plaats van een afleiding (shaer-n05)

Barts onderbuik, en hij had gelijk. De merksteen leunde op MAX(rowid) over vier
tabellen: een TOEVALLIGE eigenschap, geen feit dat ergens is opgeschreven.
Dezelfde fout als reacties uitlezen uit ap_timeline.liked, en met dezelfde soort
gebreken -- hij zag aangroei maar geen verandering, en hij kon achteruit lopen.

Nu ap_feed_state: een rij per bericht per tijdlijn, met een oplopende rev en een
kind (new | updated | deleted). Dat beantwoordt drie vragen die anders drie eigen
oplossingen zouden krijgen: is er iets veranderd sinds N, WAT is er veranderd, en
is dit bericht bewerkt. Die derde maakt de "bewerkt"-markering uit shaer-of7
straks een leesactie in plaats van een bouwsel.

Een STAND en geen logboek: vijf keer bewerken blijft één rij, dus er groeit niets
en er valt niets te snoeien. Mijn eerste test ging uit van een log en viel daar
terecht over.

Bijgehouden door TRIGGERS, om dezelfde reden dat er geen emitter is: een trigger
zit in de database, dus geen codepad kan hem vergeten. De teller staat in een
eigen tabel en niet in MAX(rev), want die zou terugzakken zodra de hoogste rij
verdwijnt -- en dan denkt een client dat er niets gebeurd is.

DE VAL WAAR DIT BIJNA IN LIEP: een like schrijft ap_timeline.liked en een 🔁
schrijft .boosted. Zonder afbakening zou je eigen like het bericht als BEWERKT
merken en elke wachtende client wekken. Vandaar de UPDATE OF-kolomlijsten; die
zijn niet decoratief.

Nagemeten wat ik wilde zien voordat dit erin ging: een INSERT OR IGNORE die niets
doet vuurt geen trigger, en de trigger op ap_interactions joint correct via posts
naar sites (die tabel draagt zelf geen slug).

De cursor is nu een getal in plaats van "23.2.8.2". Een client met een oude
cursor krijgt meteen antwoord met de nieuwe; dat heelt zichzelf.

16 tests in feed-wait. Suite 544/544.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/feed-wait.test.js

    rf2a7181 rd14bf1c  
    5757    assert.notEqual(AP.feedCursor('me'), voor, `${naam} hoort de merksteen te bewegen`);
    5858  }
     59});
     60
     61test('een BEWERKING beweegt hem ook', () => {
     62  // De reden dat de merksteen niet meer op MAX(rowid) leunt. Een Update schrijft
     63  // dezelfde rij, dus de rowid bleef staan en een wachtende client sliep door.
     64  db.prepare("INSERT INTO ap_timeline (id, slug, author_uri, content) VALUES ('bw','me','https://r.test/u/a','<p>oud</p>')").run();
     65  const voor = AP.feedCursor('me');
     66  db.prepare("UPDATE ap_timeline SET content = '<p>nieuw</p>' WHERE id = 'bw'").run();
     67  assert.notEqual(AP.feedCursor('me'), voor);
     68});
     69
     70test('en een VERWIJDERING, ook als het niet de laatste is', () => {
     71  db.prepare("INSERT INTO ap_timeline (id, slug, author_uri, content) VALUES ('later','me','https://r.test/u/a','<p>x</p>')").run();
     72  const voor = AP.feedCursor('me');
     73  db.prepare("DELETE FROM ap_timeline WHERE id = 'bw'").run();
     74  assert.notEqual(AP.feedCursor('me'), voor, 'anders blijft een verwijderde post staan tot je toevallig ververst');
     75});
     76
     77test('maar een LIKE of BOOST van jezelf niet', () => {
     78  // De val waar dit bijna in liep: een like schrijft ap_timeline.liked en een 🔁
     79  // schrijft .boosted. Zonder de UPDATE OF-kolomlijst zou je eigen like het
     80  // bericht als BEWERKT merken en elke wachtende client wekken.
     81  const voor = AP.feedCursor('me');
     82  db.prepare("UPDATE ap_timeline SET liked = 1 WHERE id = 'later'").run();
     83  db.prepare("UPDATE ap_timeline SET boosted = 1 WHERE id = 'later'").run();
     84  db.prepare("UPDATE ap_interactions SET acted_like = 1 WHERE post_id = 'p1'").run();
     85  assert.equal(AP.feedCursor('me'), voor, 'je eigen reactie is geen nieuws');
     86});
     87
     88test('een INSERT OR IGNORE die niets doet beweegt hem niet', () => {
     89  const voor = AP.feedCursor('me');
     90  db.prepare("INSERT OR IGNORE INTO ap_timeline (id, slug, author_uri, content) VALUES ('later','me','https://r.test/u/a','<p>x</p>')").run();
     91  assert.equal(AP.feedCursor('me'), voor);
     92});
     93
     94test('de teller loopt nooit achteruit', () => {
     95  // Met MAX(rowid) zakte hij terug zodra de nieuwste rij verdween, en dan denkt
     96  // een client dat er niets gebeurd is.
     97  const hoog = parseInt(AP.feedCursor('me'), 10);
     98  db.prepare('DELETE FROM ap_timeline WHERE slug = ?').run('me');
     99  assert.ok(parseInt(AP.feedCursor('me'), 10) >= hoog);
     100});
     101
     102test('en hij vertelt WAT er veranderd is', () => {
     103  // Dit is wat een revisieteller niet kan en deze tabel gratis meegeeft: de
     104  // "bewerkt"-markering hoeft er later geen eigen bouwsel voor te worden.
     105  const stand = (uri) => (AP.feedChangesSince('me', 0).find((r) => r.object_uri === uri) || {}).kind;
     106
     107  db.prepare("INSERT INTO ap_timeline (id, slug, author_uri, content) VALUES ('vers','me','https://r.test/u/a','<p>x</p>')").run();
     108  assert.equal(stand('vers'), 'new');
     109
     110  db.prepare("UPDATE ap_timeline SET content = '<p>anders</p>' WHERE id = 'vers'").run();
     111  assert.equal(stand('vers'), 'updated');
     112
     113  db.prepare("DELETE FROM ap_timeline WHERE id = 'vers'").run();
     114  assert.equal(stand('vers'), 'deleted');
     115});
     116
     117test('het is een STAND en geen logboek: bewerkt-en-toen-weg leest als weg', () => {
     118  // Een rij per bericht, niet een rij per gebeurtenis. Vijf keer bewerken blijft
     119  // één rij, en dat is waarom er niets te snoeien valt. Mijn eerste test ging uit
     120  // van een log en viel daar terecht over.
     121  const alles = AP.feedChangesSince('me', 0);
     122  const perUri = new Set(alles.map((r) => r.object_uri));
     123  assert.equal(alles.length, perUri.size, 'geen enkel bericht komt twee keer voor');
    59124});
    60125
Note: See TracChangeset for help on using the changeset viewer.