- Timestamp:
- 09/30/2026 06:41:45 AM (4 hours ago)
- Branches:
- main
- Children:
- 86cfa1a
- Parents:
- 3ceaef6
- File:
-
- 1 edited
-
test/search-fediverse.test.js (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
test/search-fediverse.test.js
r3ceaef6 r9eb6e1b 37 37 // teller: "is er überhaupt opgehaald" is de helft van wat deze toets bewaakt. 38 38 let gevraagd = []; 39 AP.resolveRemoteNote = async (uri) => { 39 let opties = []; 40 AP.resolveRemoteNote = async (uri, opts) => { 40 41 gevraagd.push(['note', uri]); 42 opties.push(opts || {}); 41 43 if (!uri.includes('/notes/')) return null; 42 44 return { … … 45 47 actor_handle: '@oma@elders.test', actor_name: 'Oma', actor_icon: '', 46 48 content: '<p>Een bericht van ver weg</p>', images: [], media: [], poll: null, 47 preview: 'Een bericht van ver weg', threadInboxes: [], localPostId: '', sensitive: false, cw: '', 49 preview: 'Een bericht van ver weg', threadInboxes: [], localPostId: '', 50 sensitive: uri.includes('/cw'), cw: uri.includes('/cw') ? 'Spinnen' : '', 48 51 }; 49 52 }; … … 176 179 // En de opmaak reist mee: die staat sinds deze ronde in een eigen partial, 177 180 // en een render zonder opmaak ziet er kapot uit zonder dat er iets faalt. 178 assert.ok(html.includes('. auth-interact-preview'), 'de opmaak van het blokontbreekt');181 assert.ok(html.includes('.rp-card'), 'de opmaak van de kaart ontbreekt'); 179 182 }); 180 183 … … 188 191 assert.ok(html.includes('@oma@elders.test')); 189 192 }); 193 194 // ── De live-preview onder de zoekbalk ─────────────────────────────────────── 195 // 196 // Plak je een link, dan laadt de uitklaplijst de post zelf. Deze route wordt bij 197 // elke toetsaanslag geraakt, en dat maakt de rechtencheck hier zwaarder dan op 198 // de pagina: zonder hem is dit een haalservice waarmee iedereen deze server op 199 // adressen naar keuze laat afsturen. 200 201 const preview = async (q) => { 202 gevraagd = []; opties = []; 203 const r = await fetch(`http://127.0.0.1:${poort}/search/remote?q=${encodeURIComponent(q)}`, { signal: AbortSignal.timeout(10000) }); 204 return { status: r.status, html: await r.text(), cache: r.headers.get('cache-control') }; 205 }; 206 207 test('de preview laadt de post zelf, ondertekend als de site', async () => { 208 const { status, html, cache } = await preview('https://elders.test/notes/1'); 209 assert.equal(status, 200); 210 assert.ok(html.includes('Een bericht van ver weg'), 'de inhoud hoort in de preview te staan'); 211 assert.ok(html.includes('@oma@elders.test')); 212 assert.equal(opties[0].asSlug, 'robo', 'een post voor volgers weigert een anonieme GET'); 213 // Wat iemand ziet hangt van zijn rechten en reacties af. 214 assert.match(cache || '', /no-store/); 215 }); 216 217 test('in de preview kun je waarderen en boosten, antwoorden gaat naar de volle pagina', async () => { 218 const { html } = await preview('https://elders.test/notes/1'); 219 for (const actie of ['/authorize_interaction/like', '/authorize_interaction/boost']) { 220 assert.ok(html.includes(`action="${actie}"`), `${actie} hoort in de preview te staan`); 221 } 222 // Een editor in een uitklaplijst is op een telefoon geen plek om te 223 // schrijven: de antwoordknop wijst naar de volle pagina, met het venster open. 224 assert.ok(!html.includes('action="/authorize_interaction"'), 'geen antwoordvenster in de preview'); 225 assert.ok(!html.includes('action="/authorize_interaction/report"'), 'melden gebeurt op de volle pagina'); 226 assert.ok(html.includes('/authorize_interaction?uri=https%3A%2F%2Felders.test%2Fnotes%2F1&reply=1'), 227 'de antwoordknop moet naar de volle pagina met het venster al open'); 228 }); 229 230 test('een profiel in de preview geeft de volgknop', async () => { 231 const { status, html } = await preview('https://elders.test/u/oma'); 232 assert.equal(status, 200); 233 assert.ok(html.includes('action="/authorize_interaction/follow"')); 234 }); 235 236 test('een bezoeker laat via de preview niets ophalen', async () => { 237 ingelogd = false; 238 try { 239 const { status, html } = await preview('https://elders.test/notes/1'); 240 // 204 en geen 403: voor een bezoeker is een geplakte link gewoon een 241 // zoekterm, en de zoekbalk valt dan terug op de gewone suggesties. 242 assert.equal(status, 204); 243 assert.deepEqual(gevraagd, [], 'zonder rechten hoort er geen enkel verzoek uit te gaan'); 244 assert.equal(html, ''); 245 } finally { 246 ingelogd = true; 247 } 248 }); 249 250 test('een zoekterm in de preview haalt niets op', async () => { 251 const { status } = await preview('soundfabrics.nl'); 252 assert.equal(status, 204); 253 assert.deepEqual(gevraagd, []); 254 }); 255 256 test('een inhoudswaarschuwing blijft dicht tot je ervoor kiest', async () => { 257 // De oude render toonde alles open, ook wat de schrijver achter een 258 // waarschuwing had gezet. 259 const { html } = await preview('https://elders.test/notes/cw'); 260 const cw = html.indexOf('<details class="rp-cw">'); 261 assert.ok(cw >= 0, 'de post hoort achter een waarschuwing te staan'); 262 assert.ok(html.indexOf('Spinnen', cw) > cw, 'met de tekst van de waarschuwing erop'); 263 assert.ok(html.indexOf('Een bericht van ver weg') > cw, 'en de inhoud erachter, niet ervoor'); 264 }); 265 266 test('de interactiepagina opent het antwoordvenster op verzoek, en haalt ondertekend op', async () => { 267 const pagina = async (extra) => { 268 opties = []; 269 const r = await fetch( 270 `http://127.0.0.1:${poort2}/authorize_interaction?uri=${encodeURIComponent('https://elders.test/notes/1')}${extra}`, 271 { signal: AbortSignal.timeout(10000) }, 272 ); 273 return r.text(); 274 }; 275 const dicht = await pagina(''); 276 assert.match(dicht, /<section class="rp-reply" id="rp-reply" hidden>/, 'zonder verzoek is het venster dicht'); 277 assert.equal(opties[0].asSlug, 'robo', 'ook hier ondertekend, anders "niet gevonden" voor een volgerspost'); 278 const open = await pagina('&reply=1'); 279 assert.match(open, /<section class="rp-reply" id="rp-reply">/, 'met ?reply=1 staat het open, ook zonder JS'); 280 assert.ok(open.includes('action="/authorize_interaction"'), 'en het venster heeft zijn formulier'); 281 }); 282
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)