| 1 | // Long-poll on news (Robins verzoek, 31-7): the thread in the app holds a
|
|---|
| 2 | // request open; anything push-worthy wakes every waiter exactly once, and an
|
|---|
| 3 | // unsubscribed waiter is never woken. The route wires this to 200/204.
|
|---|
| 4 | import { test } from 'node:test';
|
|---|
| 5 | import assert from 'node:assert/strict';
|
|---|
| 6 |
|
|---|
| 7 | process.env.DATABASE_PATH = ':memory:';
|
|---|
| 8 | process.env.PUBLIC_BASE_URL = 'https://test.example';
|
|---|
| 9 |
|
|---|
| 10 | const dbMod = await import('../src/config/database.js');
|
|---|
| 11 | dbMod.initializeDatabase();
|
|---|
| 12 | const AP = await import('../src/services/ActivityPubService.js');
|
|---|
| 13 |
|
|---|
| 14 | test('news wakes every waiter once, and only for that account', () => {
|
|---|
| 15 | let a = 0, b = 0, other = 0;
|
|---|
| 16 | AP.onNews('kid', () => a++);
|
|---|
| 17 | AP.onNews('kid', () => b++);
|
|---|
| 18 | AP.onNews('ander', () => other++);
|
|---|
| 19 | AP.wakeNews('kid');
|
|---|
| 20 | assert.equal(a, 1); assert.equal(b, 1);
|
|---|
| 21 | assert.equal(other, 0, 'someone else\'s news is not yours');
|
|---|
| 22 | AP.wakeNews('kid');
|
|---|
| 23 | assert.equal(a, 1, 'a waiter fires once; the app re-arms with a new request');
|
|---|
| 24 | });
|
|---|
| 25 |
|
|---|
| 26 | test('an unsubscribed waiter stays silent', () => {
|
|---|
| 27 | let fired = 0;
|
|---|
| 28 | const off = AP.onNews('kid', () => fired++);
|
|---|
| 29 | off();
|
|---|
| 30 | AP.wakeNews('kid');
|
|---|
| 31 | assert.equal(fired, 0);
|
|---|
| 32 | });
|
|---|