source: Klonkt/test/summary-not-a-warning.test.js

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

Een samenvatting is geen waarschuwing

Barts melding, 13-8: posts van europeanpirates.eu (WordPress + ActivityPub)
kwamen in Shaer binnen achter een content warning terwijl sensitive niet
gezet is -- en de tekst van die waarschuwing was de eerste alinea van de post
zelf, afgekapt. Precies de excerpt die WordPress voor Mastodon meestuurt.

In AS2 IS summary een samenvatting: "a natural language summarization of the
object". Dat Mastodon dat veld hergebruikt als waarschuwing is Mastodons
conventie, en die zet er sensitive bij. Zonder sensitive is het dus gewoon een
samenvatting, en die als waarschuwing tonen verbergt een post achter zijn eigen
tekst -- niemand ziet wat er staat en de waarschuwing waarschuwt nergens voor.

contentWarning() zet die regel op EEN plek; alle zes de plekken die summary als
cw wegschreven gebruiken hem nu.

TWEEDE FOUT, zichtbaar geworden door de eerste te repareren: de titel ging
verloren. timelineFields hield alleen content over, dus name verdween en het
artikel zou als kale body zijn binnengekomen. Een niet-Note-object krijgt zijn
titel nu als kop -- dezelfde greep die resolveRemoteNote al deed, dus de
tijdlijn en het antwoordpad zeggen eindelijk hetzelfde.

En selfHealTimeline bouwde zijn inhoud zelf op in plaats van via timelineFields.
Een zelfherstel dat een andere vorm oplevert dan de inname repareert naar een
derde toestand; nu dezelfde bouwer, en SELFHEAL_VERSION 22 laat het lopen. Op
dev meteen 34 van de 52 rijen hersteld.

Niet WordPress-specifiek: van de drie rijen met een valse waarschuwing kwamen er
twee van bartoverkamp.nl. 913/913 groen.

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

  • Property mode set to 100644
File size: 3.0 KB
Line 
1// Een samenvatting is geen waarschuwing (Barts melding, 13-8).
2//
3// Posts van europeanpirates.eu (WordPress + ActivityPub) kwamen in Shaer binnen
4// achter een content warning, terwijl `sensitive` niet gezet is. De tekst van
5// die "waarschuwing" was de eerste alinea van de post zelf, afgekapt -- de
6// excerpt die WordPress voor Mastodon meestuurt.
7//
8// In AS2 IS summary een samenvatting: "a natural language summarization of the
9// object". Mastodon hergebruikt dat veld als waarschuwing en zet er sensitive
10// bij. Zonder sensitive is het dus gewoon een samenvatting, en die als
11// waarschuwing tonen verbergt de post achter zijn eigen tekst.
12//
13// In-memory SQLite. Run: npm test
14import { test } from 'node:test';
15import assert from 'node:assert/strict';
16
17process.env.DATABASE_PATH = ':memory:';
18process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
19
20const dbMod = await import('../src/config/database.js');
21dbMod.initializeDatabase();
22const AP = await import('../src/services/ActivityPubService.js');
23
24// De vorm zoals europeanpirates.eu hem stuurt, ingekort.
25const ARTIKEL = {
26 id: 'https://europeanpirates.eu/?p=5978',
27 type: 'Article',
28 name: 'The Ad Blocker You Chose is Being Removed for You',
29 summary: 'On 31 August 2026, the Chrome Web Store removes the last extensions built on Manifest V2, the older rulebook that...',
30 content: '<p>On 31 August 2026, the Chrome Web Store <a href="https://example.test">removes</a> the last extensions.</p>',
31 url: 'https://europeanpirates.eu/the-ad-blocker-you-chose-is-being-removed-for-you/',
32};
33
34test('zonder sensitive is een summary geen waarschuwing', () => {
35 assert.equal(AP.contentWarning(ARTIKEL), null);
36});
37
38test('met sensitive is hij dat wel, en dan is de tekst de waarschuwing', () => {
39 assert.equal(
40 AP.contentWarning({ ...ARTIKEL, sensitive: true }),
41 ARTIKEL.summary,
42 );
43});
44
45test('sensitive zonder tekst blijft leeg -- de vlag doet het werk', () => {
46 // Mastodon staat toe dat je alleen de media als gevoelig markeert. Dan is er
47 // niets te lezen en versluiert de vlag; een lege waarschuwing verzinnen zou
48 // een label zonder inhoud opleveren.
49 assert.equal(AP.contentWarning({ sensitive: true }), null);
50 assert.equal(AP.contentWarning({ sensitive: true, summary: ' ' }), null);
51});
52
53test('de titel van een artikel gaat niet verloren', () => {
54 // Zonder dit kwam een WordPress-post binnen als kale body: de titel zit in
55 // `name` en die gooiden we weg, terwijl de excerpt ten onrechte als
56 // waarschuwing dienstdeed. Allebei fout, en allebei zichtbaar in een post
57 // die er onherkenbaar uitzag.
58 const uit = AP.timelineFields(ARTIKEL);
59 assert.ok(uit.html.includes('The Ad Blocker You Chose is Being Removed for You'),
60 'de kop staat erin');
61 assert.ok(uit.html.includes('removes'), 'en de body ook');
62});
63
64test('een gewone Note verandert niet', () => {
65 const note = { id: 'x', type: 'Note', content: '<p>hoi</p>' };
66 assert.equal(AP.timelineFields(note).html, '<p>hoi</p>');
67 assert.equal(AP.contentWarning(note), null);
68});
Note: See TracBrowser for help on using the repository browser.