source: Klonkt/test/standard-shapes.test.js@ 0db3c72

main
Last change on this file since 0db3c72 was 0db3c72, checked in by Robin <roboburr@…>, 4 weeks ago

Standaardvormen naast het dialect: AS2 en FEP waar die bestaan

shaer-nmw. De client-legs spraken Klonkt-dialect waar de standaard het al
regelt. Nu dragen ze de standaardvorm ERNAAST:

  • attributedTo als ingesloten Person (naam, preferredUsername, icon, url, FEP-9098 emoji in tag) in plaats van alleen shaer:author;
  • een boost is een echte Announce met zijn actor, niet shaer:booster;
  • FEP-044f quote als de geciteerde Note zelf, met eigen attributedTo;
  • AS2 preview (Page met url, name, image) voor de linkkaart.

Weten we niets van de persoon, dan blijft attributedTo de kale URI: een leeg
object zou beweren dat we hem kennen.

De shaer:-velden blijven voorlopig staan. Ze weghalen is de tweede helft van
de bead en kan pas als de apps in het veld zijn bijgewerkt.

De toets is niet "onze app snapt het" maar of een GENERIEKE AP-lezer er iets
aan heeft; test/standard-shapes.test.js kijkt daarom naar geen enkel
shaer:-veld.

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

  • Property mode set to 100644
File size: 3.9 KB
Line 
1// Standaardvormen in plaats van eigen dialect (shaer-nmw).
2//
3// Robins waarschuwing: geen Klonkt/Shaer-dialect schrijven waar AS2 of een FEP
4// het al regelt. Deze toetsen zijn het criterium uit die bead -- niet "onze app
5// snapt het", maar: HEEFT EEN GENERIEKE AP-LEZER ER IETS AAN. Daarom kijken ze
6// alleen naar standaardvelden en nooit naar een shaer:-property.
7//
8// In-memory SQLite. Run: npm test
9import { test } from 'node:test';
10import assert from 'node:assert/strict';
11
12process.env.DATABASE_PATH = ':memory:';
13process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
14
15const dbMod = await import('../src/config/database.js');
16dbMod.initializeDatabase();
17const AP = await import('../src/services/ActivityPubService.js');
18
19test('attributedTo draagt de actor als object, zodat elke client een byline heeft', () => {
20 const uit = AP.actorObject('https://elders/u/tante', {
21 name: 'Tante Til', handle: '@til@elders', icon: 'https://elders/til.png',
22 url: 'https://elders/@til', emojis: { ':zwaai:': 'https://elders/zwaai.png' },
23 });
24 assert.equal(uit.id, 'https://elders/u/tante');
25 assert.equal(uit.type, 'Person');
26 assert.equal(uit.name, 'Tante Til');
27 // De LOKALE naam, zoals AS2 hem bedoelt; de handle leidt een lezer af uit
28 // preferredUsername plus de host van de id.
29 assert.equal(uit.preferredUsername, 'til');
30 assert.deepEqual(uit.icon, { type: 'Image', url: 'https://elders/til.png' });
31 // FEP-9098 hoort in tag, niet in een eigen emoji-kaart.
32 assert.equal(uit.tag[0].type, 'Emoji');
33 assert.equal(uit.tag[0].name, ':zwaai:');
34});
35
36test('weten we niets van de persoon, dan blijft attributedTo de kale URI', () => {
37 // Een leeg object zou beweren dat we hem kennen. Een URI is eerlijk en is
38 // bovendien wat elke AP-server verwacht.
39 assert.equal(AP.actorObject('https://elders/u/onbekend', undefined), 'https://elders/u/onbekend');
40 assert.equal(AP.actorObject('https://elders/u/onbekend', {}), 'https://elders/u/onbekend');
41});
42
43test('een linkkaart is een AS2 preview met url, name en image', () => {
44 const embed = JSON.stringify({
45 url: 'https://nieuws.example/artikel', title: 'Een mooi artikel',
46 author: { name: 'De Krant' }, media: [{ url: 'https://nieuws.example/p.jpg' }],
47 });
48 const p = AP.previewObject(embed, { playback: false });
49 assert.equal(p.type, 'Page');
50 assert.equal(p.url, 'https://nieuws.example/artikel');
51 assert.equal(p.name, 'Een mooi artikel');
52 assert.deepEqual(p.image, { type: 'Image', url: 'https://nieuws.example/p.jpg' });
53 assert.equal(p.attributedTo.name, 'De Krant');
54 // De spelerpagina blijft van ons: die hangt aan de guardian-poort en heeft
55 // geen AS2-tegenhanger. Dicht = niet aanwezig.
56 assert.ok(!p['shaer:playerUrl']);
57});
58
59test('een quote is de geciteerde Note zelf (FEP-044f), met ingesloten auteur', () => {
60 const snapshot = JSON.stringify({
61 url: 'https://elders/notes/1',
62 author: { name: 'Til', handle: '@til@elders', icon: 'https://elders/til.png' },
63 content: '<p>hallo</p>', published: '2026-08-01T10:00:00Z',
64 media: [{ url: 'https://elders/foto.jpg', type: 'image/jpeg' }],
65 });
66 const q = AP.quoteObject(snapshot);
67 assert.equal(q.type, 'Note');
68 assert.equal(q.id, 'https://elders/notes/1');
69 assert.equal(q.content, '<p>hallo</p>');
70 assert.equal(q.published, '2026-08-01T10:00:00Z');
71 // De auteur van het citaat is zelf ook een ingesloten actor, niet een
72 // losse naam-kaart.
73 assert.equal(q.attributedTo.type, 'Person');
74 assert.equal(q.attributedTo.name, 'Til');
75 assert.equal(q.attributedTo.preferredUsername, 'til');
76 assert.deepEqual(q.attachment, [{ type: 'Document', mediaType: 'image/jpeg', url: 'https://elders/foto.jpg' }]);
77});
78
79test('niets te tonen levert niets op, geen leeg omhulsel', () => {
80 assert.equal(AP.previewObject(null), undefined);
81 assert.equal(AP.previewObject('{}'), undefined);
82 assert.equal(AP.quoteObject(null), undefined);
83 assert.equal(AP.quoteObject('rommel'), undefined);
84});
Note: See TracBrowser for help on using the repository browser.