Changeset 75f2897 in Klonkt for test/standard-shapes.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/standard-shapes.test.js

    r0db3c72 r75f2897  
    8383  assert.equal(AP.quoteObject('rommel'), undefined);
    8484});
     85
     86// ── En dan het weghalen (shaer-nmw, tweede helft) ────────────────────
     87//
     88// Bewijzen dat de standaardvorm ERBIJ staat is de helft; de andere helft is dat
     89// het dialect er niet meer NAAST staat. Zonder deze wacht sluipt een
     90// shaer:author zo weer een nieuwe leg in en spreken we stilletjes weer onze
     91// eigen taal. Daarom door de echte route, want daar wordt de vorm beslist.
     92test('de C2S-leg spreekt geen dialect meer waar de standaard het regelt', async (t) => {
     93  const crypto = await import('crypto');
     94  const express = (await import('express')).default;
     95  const db = (await import('../src/config/database.js')).default;
     96  const routes = (await import('../src/routes/activitypub.js')).default;
     97
     98  db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
     99    .run('u1', 'u1', 'u1@t', 'x', 'god');
     100  db.prepare('INSERT INTO sites (id, slug, title, owner_id, is_primary) VALUES (?,?,?,?,1)')
     101    .run('s1', 'kind', 'kind', 'u1');
     102  db.prepare(`INSERT INTO ap_timeline (id, slug, author_uri, author_name, author_handle, author_icon,
     103              reblog_name, reblog_handle, content)
     104              VALUES ('https://elders/n1', 'kind', 'https://elders/u/til', 'Tante Til', '@til@elders',
     105                      'https://elders/til.png', 'Esmee', '@es@elders', '<p>hoi</p>')`).run();
     106
     107  const bearer = 'test-token-' + 'b'.repeat(24);
     108  db.prepare('INSERT INTO oauth_tokens (token_hash, client_id, user_id, site_slug, scope) VALUES (?,?,?,?,?)')
     109    .run(crypto.createHash('sha256').update(bearer).digest('base64url'), 'c', 'u1', 'kind', 'read write');
     110
     111  const app = express();
     112  app.use(routes);
     113  const server = app.listen(0);
     114  t.after(() => server.close());
     115  await new Promise((r) => server.once('listening', r));
     116  const doc = await (await fetch(`http://127.0.0.1:${server.address().port}/ap/users/kind/inbox`,
     117    { headers: { Authorization: `Bearer ${bearer}` } })).json();
     118
     119  const tekst = JSON.stringify(doc);
     120  // Op de SLEUTEL, niet op een stuk tekst: 'shaer:quote' zit ook in
     121  // shaer:quoteCards, en dat is een poortnaam die blijft. Een te grove zeef
     122  // zou hier rood staan om iets dat klopt -- of erger, groen om iets dat niet
     123  // klopt.
     124  for (const weg of ['shaer:author', 'shaer:booster', 'shaer:quote', 'shaer:embed']) {
     125    assert.ok(!tekst.includes(`"${weg}":`), `${weg} hoort weg te zijn`);
     126  }
     127  // Wat WEL mag blijven, en waarom: per-lezer-interactiestatus heeft in AS2
     128  // geen tegenhanger (Mastodon lost het in zijn eigen REST-API op), en de
     129  // FEP-633c-termen zijn bewust van ons en in standaardisatie.
     130  assert.ok(tekst.includes('shaer:liked'), 'interactiestatus blijft, die heeft geen standaard');
     131
     132  const item = doc.orderedItems.find((i) => i.object.id === 'https://elders/n1');
     133  assert.equal(item.type, 'Announce', 'een boost is de wrapper, niet een zijkanaal');
     134  assert.equal(item.object.attributedTo.name, 'Tante Til', 'en de byline zit in attributedTo');
     135  assert.equal(item.object.attributedTo.preferredUsername, 'til');
     136});
Note: See TracChangeset for help on using the changeset viewer.