| 1 | // Luisteraars: wie de BIBLIOTHEEK volgt (shaer-0nh).
|
|---|
| 2 | //
|
|---|
| 3 | // Het hele punt is een NEGATIEVE garantie: deze accounts krijgen de muziek en
|
|---|
| 4 | // NIET de gewone posts. Wie zich op een platenkast abonneert heeft niet om de
|
|---|
| 5 | // Krant gevraagd. Daarom een eigen tabel en geen vlag: zolang ze ergens anders
|
|---|
| 6 | // staan kan een postbezorging ze niet per ongeluk meenemen, en dat is een fout
|
|---|
| 7 | // die aan onze kant onzichtbaar zou zijn.
|
|---|
| 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://ons.test';
|
|---|
| 13 |
|
|---|
| 14 | const dbMod = await import('../src/config/database.js');
|
|---|
| 15 | const db = dbMod.default;
|
|---|
| 16 | dbMod.initializeDatabase();
|
|---|
| 17 | const { luisteraars } = await import('../src/services/music/index.js');
|
|---|
| 18 |
|
|---|
| 19 | db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
|
|---|
| 20 | .run('u1', 'u1', 'u1@t', 'x', 'god');
|
|---|
| 21 | db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s1', 'band', 'De Band', 'u1');
|
|---|
| 22 |
|
|---|
| 23 | const VER = 'https://open.audio/federation/actors/iemand';
|
|---|
| 24 |
|
|---|
| 25 | test('een luisteraar erbij, en volgen is idempotent', () => {
|
|---|
| 26 | assert.equal(luisteraars.voegToe('band', { actorUri: VER, inbox: `${VER}/inbox`, name: 'Iemand', handle: '@iemand@open.audio' }), true);
|
|---|
| 27 | assert.equal(luisteraars.telling('band'), 1);
|
|---|
| 28 | // Twee keer volgen is geen twee luisteraars -- remote servers sturen een
|
|---|
| 29 | // Follow gerust nog eens.
|
|---|
| 30 | luisteraars.voegToe('band', { actorUri: VER, inbox: `${VER}/inbox`, name: 'Iemand Anders' });
|
|---|
| 31 | assert.equal(luisteraars.telling('band'), 1);
|
|---|
| 32 | assert.equal(luisteraars.lijst('band')[0].name, 'Iemand Anders', 'en de laatste gegevens winnen');
|
|---|
| 33 | });
|
|---|
| 34 |
|
|---|
| 35 | test('ze staan NIET tussen de gewone volgers -- dat is de hele garantie', () => {
|
|---|
| 36 | const gewoon = db.prepare('SELECT COUNT(*) n FROM ap_followers WHERE slug = ?').get('band').n;
|
|---|
| 37 | assert.equal(gewoon, 0,
|
|---|
| 38 | 'een luisteraar in ap_followers zou de Krant bezorgen bij iemand die alleen muziek wilde');
|
|---|
| 39 | });
|
|---|
| 40 |
|
|---|
| 41 | test('weggaan werkt meteen', () => {
|
|---|
| 42 | assert.equal(luisteraars.verwijder('band', VER), true);
|
|---|
| 43 | assert.equal(luisteraars.telling('band'), 0);
|
|---|
| 44 | assert.equal(luisteraars.verwijder('band', VER), false, 'en twee keer weggaan is geen fout');
|
|---|
| 45 | });
|
|---|
| 46 |
|
|---|
| 47 | test('de inboxen worden ontdubbeld op de gedeelde inbox', () => {
|
|---|
| 48 | // Twee luisteraars op dezelfde instance horen EEN bezorging te krijgen.
|
|---|
| 49 | luisteraars.voegToe('band', { actorUri: `${VER}/a`, inbox: `${VER}/a/inbox`, sharedInbox: 'https://open.audio/inbox' });
|
|---|
| 50 | luisteraars.voegToe('band', { actorUri: `${VER}/b`, inbox: `${VER}/b/inbox`, sharedInbox: 'https://open.audio/inbox' });
|
|---|
| 51 | luisteraars.voegToe('band', { actorUri: 'https://elders.test/u/c', inbox: 'https://elders.test/u/c/inbox' });
|
|---|
| 52 | assert.deepEqual(luisteraars.inboxen('band').sort(),
|
|---|
| 53 | ['https://elders.test/u/c/inbox', 'https://open.audio/inbox']);
|
|---|
| 54 | });
|
|---|
| 55 |
|
|---|
| 56 | test('een luisteraar van een ANDERE site telt hier niet mee', () => {
|
|---|
| 57 | db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)').run('s2', 'ander', 'Ander', 'u1');
|
|---|
| 58 | luisteraars.voegToe('ander', { actorUri: VER, inbox: `${VER}/inbox` });
|
|---|
| 59 | assert.equal(luisteraars.telling('ander'), 1);
|
|---|
| 60 | assert.equal(luisteraars.isLuisteraar('band', VER), false);
|
|---|
| 61 | });
|
|---|