| 1 | // Een vreemde note mag nooit de hele pagina meenemen.
|
|---|
| 2 | //
|
|---|
| 3 | // Drie posts van een remote server droegen media_json = "[]": een JSON-STRING met
|
|---|
| 4 | // daarin [], niet een array. De try/catch eromheen vangt kapotte json, maar niet
|
|---|
| 5 | // geldige json van het verkeerde type: JSON.parse('"[]"') geeft netjes de string
|
|---|
| 6 | // "[]" terug, en een string heeft geen .filter. Daarmee lag /news plat op beta.
|
|---|
| 7 | //
|
|---|
| 8 | // Wat er van een andere server binnenkomt is niet van ons. De vorm moet dus
|
|---|
| 9 | // afgedwongen worden op het moment van gebruik, niet aangenomen.
|
|---|
| 10 | import { test } from 'node:test';
|
|---|
| 11 | import assert from 'node:assert/strict';
|
|---|
| 12 | import ejs from 'ejs';
|
|---|
| 13 | import path from 'path';
|
|---|
| 14 |
|
|---|
| 15 | const VIEWS = path.resolve('src/views');
|
|---|
| 16 | const PARTIAL = path.join(VIEWS, 'partials/note-body.ejs');
|
|---|
| 17 |
|
|---|
| 18 | // Alles wat note-body van een rij verwacht, met lege waarden. Per test overschrijven
|
|---|
| 19 | // we alleen media_json, want daar gaat het hier om.
|
|---|
| 20 | function rij(extra) {
|
|---|
| 21 | return {
|
|---|
| 22 | content: '<p>hoi</p>', media_json: null, emoji_json: null, quote_json: null,
|
|---|
| 23 | embed_json: null, nsfw: 0, cw: null, poll_json: null, link_json: null,
|
|---|
| 24 | ...extra,
|
|---|
| 25 | };
|
|---|
| 26 | }
|
|---|
| 27 |
|
|---|
| 28 | async function render(nb) {
|
|---|
| 29 | return ejs.renderFile(PARTIAL, {
|
|---|
| 30 | nb,
|
|---|
| 31 | noteQuote: () => null,
|
|---|
| 32 | emojiHtml: (html) => String(html || ''),
|
|---|
| 33 | thumb: (u) => String(u || ''),
|
|---|
| 34 | t: (k) => k,
|
|---|
| 35 | formatDate: (d) => String(d),
|
|---|
| 36 | formatDateTime: (d) => String(d),
|
|---|
| 37 | }, { async: true, views: [VIEWS] });
|
|---|
| 38 | }
|
|---|
| 39 |
|
|---|
| 40 | test('een media_json die een STRING is sloopt de pagina niet', async () => {
|
|---|
| 41 | // Precies wat er op beta stond.
|
|---|
| 42 | const html = await render(rij({ media_json: '"[]"' }));
|
|---|
| 43 | assert.match(html, /hoi/, 'de tekst van de post hoort er gewoon te staan');
|
|---|
| 44 | });
|
|---|
| 45 |
|
|---|
| 46 | test('een media_json die een OBJECT is sloopt de pagina niet', async () => {
|
|---|
| 47 | const html = await render(rij({ media_json: '{"url":"https://a.example/x.png"}' }));
|
|---|
| 48 | assert.match(html, /hoi/);
|
|---|
| 49 | });
|
|---|
| 50 |
|
|---|
| 51 | test('een media_json die een GETAL is sloopt de pagina niet', async () => {
|
|---|
| 52 | const html = await render(rij({ media_json: '42' }));
|
|---|
| 53 | assert.match(html, /hoi/);
|
|---|
| 54 | });
|
|---|
| 55 |
|
|---|
| 56 | test('kapotte json blijft ook gewoon werken', async () => {
|
|---|
| 57 | const html = await render(rij({ media_json: '{niet eens json' }));
|
|---|
| 58 | assert.match(html, /hoi/);
|
|---|
| 59 | });
|
|---|
| 60 |
|
|---|
| 61 | test('en een NORMALE lijst wordt nog steeds getoond', async () => {
|
|---|
| 62 | const html = await render(rij({
|
|---|
| 63 | media_json: JSON.stringify([{ url: 'https://a.example/plaatje.png', type: 'image/png' }]),
|
|---|
| 64 | }));
|
|---|
| 65 | assert.match(html, /plaatje\.png/, 'de fix mag geen media wegpoetsen die wel klopt');
|
|---|
| 66 | });
|
|---|