Changeset 75f2897 in Klonkt for test/thread.test.js


Ignore:
Timestamp:
08/10/2026 07:33:52 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
aae5881
Parents:
0db3c72
Message:

Het dialect eruit waar de standaard het al draagt

shaer-nmw, tweede helft. shaer:author, shaer:booster, shaer:quote en
shaer:embed gaan van alle C2S-legs af: outbox-vriendenleg, tijdlijn,
berichten, antwoorden, eigen verzonden notes, de composer-kaart en de thread.
De standaardvormen uit de vorige commit dragen ze nu alleen.

De thread-leg had de standaardvorm nog niet en kreeg hem hier: de byline van
een antwoord zit in de ingesloten attributedTo, en de emoji-poort knipt in de
tag van die actor in plaats van in een eigen emoji-kaart ernaast.

Twee dingen die stil hadden kunnen breken:

  • filterThreadToCircle vergeleek n.attributedTo als string. Nu dat een object is zou hij ALLES wegfilteren: een ward met een lege thread en nergens een foutmelding. Loopt nu door actorUriOf.
  • de composer-kaart las op beide clients alleen de oude velden; die had ik in ronde een gemist. De preview zou leeg zijn gebleven.

Wat blijft: shaer:liked en shaer:boosted (per-lezer-interactiestatus, AS2 heeft
er niets voor) en de FEP-633c-termen, die bewust van ons zijn.

Nieuwe wachten: de C2S-leg door de echte route op afwezig dialect -- op de
SLEUTEL, want 'shaer:quote' zit ook in shaer:quoteCards en dat is een poort die
blijft -- en de thread-route, die tot nu toe geen route-dekking had.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/thread.test.js

    r0db3c72 r75f2897  
    5252];
    5353
     54// De echte fetch, voordat de stub hem overneemt: de route-test onderaan doet
     55// een ECHT verzoek aan een testserver op localhost, en dat mag de stub niet
     56// beantwoorden met zijn 404.
     57const echteFetch = globalThis.fetch;
     58
    5459globalThis.fetch = async (url) => {
    5560  const u = String(url);
     
    6974  assert.equal(uit.notes.length, 2);
    7075  // Oudste eerst: een gesprek lees je van boven naar beneden.
    71   assert.equal(uit.notes[0]['shaer:author'].name, 'tante');
    72   assert.equal(uit.notes[1]['shaer:author'].name, 'vreemde');
     76  assert.equal(uit.notes[0].attributedTo.name, 'tante');
     77  assert.equal(uit.notes[1].attributedTo.name, 'vreemde');
    7378  // De sanitizer heeft het script eruit gehaald, de tekst mag blijven.
    7479  assert.ok(!uit.notes[1].content.includes('<script'), 'script weggeschoond');
     
    96101  const kring = AP.filterThreadToCircle('pupil', uit.notes);
    97102  assert.equal(kring.notes.length, 1);
    98   assert.equal(kring.notes[0]['shaer:author'].name, 'tante');
     103  // Ook de zeef zelf leest de ingesloten actor: een kale vergelijking op
     104  // attributedTo zou hier stil ALLES wegfilteren.
     105  assert.equal(kring.notes[0].attributedTo.name, 'tante');
    99106  // De vreemde is er, en dat mag gezegd: geteld, niet stil weggelaten.
    100107  assert.equal(kring.hidden, 1);
     
    143150  globalThis.fetch = vorige;
    144151});
     152
     153// ── Door de route heen, want daar wordt de vorm beslist ──────────────
     154//
     155// De byline van een antwoord verhuisde naar de ingesloten attributedTo
     156// (shaer-nmw). Deze leg had geen route-dekking, en juist hier zit de
     157// emoji-poort die IN die byline knipt -- knipt hij in het oude veld, dan
     158// gebeurt er stil niets meer.
     159test('de thread-route geeft de byline in attributedTo, en de emoji-poort knipt daarin', async (t) => {
     160  const crypto = await import('crypto');
     161  const express = (await import('express')).default;
     162  const routes = (await import('../src/routes/activitypub.js')).default;
     163
     164  const bearer = 'test-token-' + 'c'.repeat(24);
     165  db.prepare('INSERT INTO oauth_tokens (token_hash, client_id, user_id, site_slug, scope) VALUES (?,?,?,?,?)')
     166    .run(crypto.createHash('sha256').update(bearer).digest('base64url'), 'c', 'u1', 'kind', 'read write');
     167
     168  const app = express();
     169  app.use(routes);
     170  const server = app.listen(0);
     171  t.after(() => server.close());
     172  await new Promise((r) => server.once('listening', r));
     173  const haal = async () => (await (await echteFetch(
     174    `http://127.0.0.1:${server.address().port}/ap/users/kind/thread?object=${encodeURIComponent(BRON)}`,
     175    { headers: { Authorization: `Bearer ${bearer}` } })).json());
     176
     177  const doc = await haal();
     178  assert.ok(!JSON.stringify(doc).includes('"shaer:author":'), 'geen dialect meer op deze leg');
     179  const vanTante = doc.orderedItems.find((n) => n.id.endsWith('/replies/2'));
     180  assert.equal(vanTante.attributedTo.name, 'tante', 'de byline zit in attributedTo');
     181  assert.equal(vanTante.attributedTo.preferredUsername, 'tante');
     182  assert.ok((vanTante.tag || []).some((x) => x.type === 'Emoji'), 'open poort: de emoji van het antwoord blijft');
     183
     184  // Poort dicht: FEP-9098 zit in de tag van de ingesloten actor, dus daar
     185  // hoort geknipt te worden -- en het antwoord zelf houdt zijn eigen emoji
     186  // niet meer over.
     187  db.prepare("UPDATE sites SET gate_custom_emoji = 0 WHERE slug = 'kind'").run();
     188  db.prepare("INSERT INTO ap_guardianships (slug, other_uri, role, status) VALUES ('kind', ?, 'guardian', 'accepted')")
     189    .run('https://203.0.113.20/users/tante');
     190  const dicht = await haal();
     191  const na = dicht.orderedItems.find((n) => n.id.endsWith('/replies/2'));
     192  assert.ok(!(na.tag || []).some((x) => x.type === 'Emoji'), 'dichte poort: geen emoji meer');
     193  assert.ok(!na.attributedTo.tag, 'ook niet in de byline');
     194});
Note: See TracChangeset for help on using the changeset viewer.