Changeset 407353e in Klonkt for test


Ignore:
Timestamp:
09/23/2026 03:13:00 PM (4 hours ago)
Author:
Bart <bart@…>
Branches:
main
Parents:
0ad37a0
Message:

Een foto zonder woorden is een bericht (502 direct_failed)

deliverDirectNote begon met !String(text).trim() -> return null, en de inname
maakte van dat null een 502 direct_failed. Sinds de inname een bijlage-only
note doorlaat waren die twee lagen het oneens over wat een bericht is: wie een
foto op een gesprek liet vallen en niets typte kwam precies daar vast te
zitten. Het viel niet op in de tests, want dit was de enige plek waar de regel
stond en hij stond midden in een functie die netwerk doet.

Nu is het een eigen, pure regel -- text, html of bijlage -- met tests eromheen,
zoals de rest van deze laag het doet. Leeg blijft geweigerd: geen tekst, geen
opmaak en geen bijlage is niets.

En String(text) werd String(text || ''): zonder tekst stond er anders
letterlijk "undefined" in de body zodra een aanroeper het veld wegliet.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/c2s-direct.test.js

    r0ad37a0 r407353e  
    7777  assert.equal(like.status, 403);
    7878});
     79
     80// Een bijlage KAN het hele bericht zijn (shaer-6lcc).
     81//
     82// Twee lagen waren het oneens over wat een bericht is: de inname liet een
     83// note met alleen een bijlage door, en deliverDirectNote weigerde hem een
     84// laag lager op `!text.trim()`. Wie een foto op een gesprek liet vallen en
     85// niets typte kreeg daardoor "502 direct_failed".
     86test('een direct bericht met alleen een bijlage telt als inhoud', async () => {
     87  const { directNoteHasContent } = await import('../src/services/guardianship/delivery.js');
     88
     89  assert.equal(directNoteHasContent({ text: 'hallo' }), true);
     90  assert.equal(directNoteHasContent({ html: '<p>hallo</p>' }), true);
     91  assert.equal(directNoteHasContent({
     92    text: '',
     93    attachments: [{ url: '/media/reply-media/x.png', mediaType: 'image/png' }],
     94  }), true, 'een foto zonder woorden is een bericht');
     95  assert.equal(directNoteHasContent({
     96    text: '   \n  ',
     97    attachments: [{ url: '/media/reply-media/x.png', mediaType: 'image/png' }],
     98  }), true, 'witruimte is geen tekst, maar de bijlage draagt hem');
     99
     100  // En leeg blijft leeg: dit mag de deur niet uit.
     101  assert.equal(directNoteHasContent({}), false);
     102  assert.equal(directNoteHasContent({ text: '   ', html: '', attachments: [] }), false);
     103  assert.equal(directNoteHasContent(), false);
     104});
     105
     106// De inname en de bezorging horen dezelfde grens te trekken. Loopt er eentje
     107// weg, dan is dat precies de 502 hierboven, en die valt buiten de tests om.
     108test('inname en bezorging zijn het eens over een leeg bericht', async () => {
     109  const { directNoteHasContent } = await import('../src/services/guardianship/delivery.js');
     110  const src = (await import('fs')).readFileSync('src/services/ap-c2s.js', 'utf8');
     111  assert.ok(src.includes("error: 'empty_note'"), 'de inname heeft nog een lege-bericht-controle');
     112  // De inname laat een bijlage-only note door; de bezorging hoort dat ook te doen.
     113  assert.equal(directNoteHasContent({ text: '', attachments: [{ url: '/media/x.png' }] }), true);
     114});
Note: See TracChangeset for help on using the changeset viewer.