| 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
|
|---|
| 14 | import { test } from 'node:test';
|
|---|
| 15 | import assert from 'node:assert/strict';
|
|---|
| 16 |
|
|---|
| 17 | process.env.DATABASE_PATH = ':memory:';
|
|---|
| 18 | process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
|
|---|
| 19 |
|
|---|
| 20 | const dbMod = await import('../src/config/database.js');
|
|---|
| 21 | dbMod.initializeDatabase();
|
|---|
| 22 | const AP = await import('../src/services/ActivityPubService.js');
|
|---|
| 23 |
|
|---|
| 24 | // De vorm zoals europeanpirates.eu hem stuurt, ingekort.
|
|---|
| 25 | const 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 |
|
|---|
| 34 | test('zonder sensitive is een summary geen waarschuwing', () => {
|
|---|
| 35 | assert.equal(AP.contentWarning(ARTIKEL), null);
|
|---|
| 36 | });
|
|---|
| 37 |
|
|---|
| 38 | test('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 |
|
|---|
| 45 | test('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 |
|
|---|
| 53 | test('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 |
|
|---|
| 64 | test('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 | });
|
|---|