Changeset 6c4ff7e in Klonkt for test/fep1580-migration.test.js
- Timestamp:
- 08/13/2026 11:39:57 PM (4 weeks ago)
- Branches:
- main
- Children:
- 9529d7b
- Parents:
- fbfd7a1
- File:
-
- 1 edited
-
test/fep1580-migration.test.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
test/fep1580-migration.test.js
rfbfd7a1 r6c4ff7e 13 13 import { test, beforeEach } from 'node:test'; 14 14 import assert from 'node:assert/strict'; 15 import path from 'node:path'; 15 16 16 17 process.env.DATABASE_PATH = ':memory:'; … … 47 48 48 49 beforeEach(() => { 49 for (const t of ['ap_migration', 'ap_moves', 'ap_blocks', 'posts', 'ap_followers' ]) {50 for (const t of ['ap_migration', 'ap_moves', 'ap_blocks', 'posts', 'ap_followers', 'audio_tracks', 'media']) { 50 51 try { db.prepare(`DELETE FROM ${t}`).run(); } catch { /* tabel bestaat niet in deze build */ } 51 52 } … … 315 316 }); 316 317 318 test('de muziekbibliotheek komt mee, ook wat niet fedi_open is', async () => { 319 // Losse nummers staan NIET in de outbox: die hangen aan de tracks-collectie 320 // waar de actor via AS2 `streams` naar wijst. Zonder deze tak verhuist een 321 // muzieksite zijn berichten en laat hij zijn bibliotheek achter, en dat is 322 // precies wat er op soundfabrics.nl gebeurde. 323 const s = site({ aliases: [BRON] }); 324 const AUDIO = `${BRON}/audio/x.mp3`; 325 const bytes = Buffer.from('ID3-nep-geluid'); 326 const kaart = new Map([ 327 [BRON, { 328 id: BRON, type: 'Person', movedTo: IK, outbox: `${BRON}/outbox`, 329 streams: [`${BRON}/tracks`, `${BRON}/playlists`], 330 }], 331 [`${BRON}/outbox`, { type: 'OrderedCollection', orderedItems: [] }], 332 [`${BRON}/tracks`, { 333 type: 'OrderedCollection', 334 orderedItems: [{ 335 id: `${BRON}/tracks/t1`, type: 'Audio', name: 'Gesloten nummer', artist: 'Robo', 336 url: [{ type: 'Link', href: AUDIO, mediaType: 'audio/mpeg' }], 337 }], 338 }], 339 ]); 340 const geschreven = new Map(); 341 let getekend = false; 342 const r = await stil(() => Mig.ingestFromSource(s, { 343 deps: { 344 getJson: async (_slug, url) => kaart.get(url) || null, 345 noteId: (b, id) => `${b}/ap/notes/${id}`, 346 noteVisibility: AP.noteVisibility, 347 audioRoot: '/nep/audio', 348 // De handtekening is hier geen detail: de audio-route van de bron weigert 349 // een kale fetch, want die kan niet zien dat wij de doel-actor zijn. 350 signHeaders: () => { getekend = true; return { Signature: 'nep' }; }, 351 safeFetch: async (url, opts) => { 352 assert.equal(url, AUDIO); 353 assert.ok(opts.headers && opts.headers.Signature, 'de bytes worden ONDERTEKEND opgehaald'); 354 return { ok: true, arrayBuffer: async () => bytes, headers: { get: () => 'audio/mpeg' } }; 355 }, 356 fs: { mkdirSync() {}, writeFileSync: (p, b) => geschreven.set(p, b) }, 357 path, 358 }, 359 })); 360 assert.equal(r.tracksBinnen, 1); 361 assert.equal(r.tracksMislukt, 0); 362 assert.ok(getekend); 363 assert.equal(geschreven.size, 1, 'het bestand wordt echt weggeschreven'); 364 const [pad] = [...geschreven.keys()]; 365 assert.ok(pad.startsWith('/nep/audio/'), 'audio hoort in AUDIO_ROOT, niet in de mediamap'); 366 assert.ok(!pad.slice('/nep/audio/'.length).includes('/'), 'en er direct in, want de speler zoekt op bestandsnaam'); 367 const t = db.prepare('SELECT title, artist FROM audio_tracks').get(); 368 assert.equal(t.title, 'Gesloten nummer'); 369 }); 370 371 test('een nummer waarvan de bytes niet komen levert GEEN track op', async () => { 372 // Dezelfde regel als bij de zip. Een nummer dat in de lijst staat en 404't is 373 // erger dan een nummer dat ontbreekt. 374 const s = site({ aliases: [BRON] }); 375 const kaart = new Map([ 376 [BRON, { id: BRON, type: 'Person', movedTo: IK, outbox: `${BRON}/outbox`, streams: [`${BRON}/tracks`] }], 377 [`${BRON}/outbox`, { type: 'OrderedCollection', orderedItems: [] }], 378 [`${BRON}/tracks`, { 379 type: 'OrderedCollection', 380 orderedItems: [{ id: `${BRON}/tracks/t1`, type: 'Audio', name: 'Weg', url: `${BRON}/audio/weg.mp3` }], 381 }], 382 ]); 383 const r = await stil(() => Mig.ingestFromSource(s, { 384 deps: { 385 getJson: async (_slug, url) => kaart.get(url) || null, 386 noteId: (b, id) => `${b}/ap/notes/${id}`, 387 noteVisibility: AP.noteVisibility, 388 audioRoot: '/nep/audio', 389 signHeaders: () => ({ Signature: 'nep' }), 390 safeFetch: async () => ({ ok: false, status: 403 }), 391 fs: { mkdirSync() {}, writeFileSync() { throw new Error('mag niet gebeuren'); } }, 392 path, 393 }, 394 })); 395 assert.equal(r.tracksBinnen, 0); 396 assert.equal(r.tracksMislukt, 1); 397 assert.equal(db.prepare('SELECT COUNT(*) n FROM audio_tracks').get().n, 0); 398 }); 399 317 400 test('een niet-publiek bericht komt wel mee maar niet in de publieke tabel', async () => { 318 401 const s = site({ aliases: [BRON] });
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)