| 1 | // Cirkel/boost-media: een geboostte video-only post (Loops) verloor zijn media —
|
|---|
| 2 | // upsertBoostedNote keek alleen naar note.images (afbeeldingen) en de refresh
|
|---|
| 3 | // overschreef bestaande media_json met []. Dekt de typed-media opslag, de
|
|---|
| 4 | // niet-clobberen-refresh en de images-fallback af.
|
|---|
| 5 | //
|
|---|
| 6 | // Run: npm test (= node --test)
|
|---|
| 7 |
|
|---|
| 8 | import { test } from 'node:test';
|
|---|
| 9 | import assert from 'node:assert/strict';
|
|---|
| 10 |
|
|---|
| 11 | process.env.DATABASE_PATH = ':memory:';
|
|---|
| 12 | process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
|
|---|
| 13 |
|
|---|
| 14 | const dbMod = await import('../src/config/database.js');
|
|---|
| 15 | const db = dbMod.default;
|
|---|
| 16 | const AP = await import('../src/services/ActivityPubService.js');
|
|---|
| 17 |
|
|---|
| 18 | dbMod.initializeDatabase();
|
|---|
| 19 |
|
|---|
| 20 | const VIDEO_MEDIA = JSON.stringify([{ url: 'https://cdn.test/clip.720p.mp4', type: 'video/mp4' }]);
|
|---|
| 21 |
|
|---|
| 22 | function mediaOf(id) {
|
|---|
| 23 | const r = db.prepare('SELECT media_json FROM ap_timeline WHERE slug = ? AND id = ?').get('me', id);
|
|---|
| 24 | return r ? r.media_json : null;
|
|---|
| 25 | }
|
|---|
| 26 |
|
|---|
| 27 | test('boost van een video-only post bewaart de video in media_json', () => {
|
|---|
| 28 | AP.upsertBoostedNote('me', {
|
|---|
| 29 | object_uri: 'https://loops.test/n/1', actor_uri: 'https://loops.test/u/a',
|
|---|
| 30 | actor_name: 'A', content: '<p>x</p>', media: VIDEO_MEDIA, images: [],
|
|---|
| 31 | });
|
|---|
| 32 | const m = JSON.parse(mediaOf('https://loops.test/n/1'));
|
|---|
| 33 | assert.equal(m.length, 1);
|
|---|
| 34 | assert.equal(m[0].type, 'video/mp4');
|
|---|
| 35 | });
|
|---|
| 36 |
|
|---|
| 37 | test('refresh met lege media clobbert een bestaande media_json NIET', () => {
|
|---|
| 38 | // rij bestaat al (met video); een re-upsert die niks resolvede mag hem niet wissen
|
|---|
| 39 | AP.upsertBoostedNote('me', {
|
|---|
| 40 | object_uri: 'https://loops.test/n/1', actor_uri: 'https://loops.test/u/a',
|
|---|
| 41 | actor_name: 'A', content: '<p>x2</p>', media: '[]', images: [],
|
|---|
| 42 | });
|
|---|
| 43 | const m = JSON.parse(mediaOf('https://loops.test/n/1'));
|
|---|
| 44 | assert.equal(m.length, 1, 'media_json is gewist door een lege refresh');
|
|---|
| 45 | assert.equal(m[0].type, 'video/mp4');
|
|---|
| 46 | });
|
|---|
| 47 |
|
|---|
| 48 | test('refresh met nieuwe media werkt de rij wel bij', () => {
|
|---|
| 49 | const newer = JSON.stringify([{ url: 'https://cdn.test/clip2.mp4', type: 'video/mp4' }]);
|
|---|
| 50 | AP.upsertBoostedNote('me', {
|
|---|
| 51 | object_uri: 'https://loops.test/n/1', actor_uri: 'https://loops.test/u/a',
|
|---|
| 52 | actor_name: 'A', content: '<p>x3</p>', media: newer, images: [],
|
|---|
| 53 | });
|
|---|
| 54 | assert.equal(JSON.parse(mediaOf('https://loops.test/n/1'))[0].url, 'https://cdn.test/clip2.mp4');
|
|---|
| 55 | });
|
|---|
| 56 |
|
|---|
| 57 | test('images-fallback (oude callers zonder note.media) blijft werken', () => {
|
|---|
| 58 | AP.upsertBoostedNote('me', {
|
|---|
| 59 | object_uri: 'https://old.test/n/2', actor_uri: 'https://old.test/u/b',
|
|---|
| 60 | actor_name: 'B', content: '<p>y</p>', images: ['https://old.test/img.jpg'],
|
|---|
| 61 | });
|
|---|
| 62 | const m = JSON.parse(mediaOf('https://old.test/n/2'));
|
|---|
| 63 | assert.equal(m[0].url, 'https://old.test/img.jpg');
|
|---|
| 64 | assert.equal(m[0].type, 'image/jpeg');
|
|---|
| 65 | });
|
|---|