Changeset 3bbf73d in Klonkt for test/conversations.test.js
- Timestamp:
- 08/10/2026 02:43:16 PM (4 weeks ago)
- Branches:
- main
- Children:
- f0a33e1
- Parents:
- f549cf5
- File:
-
- 1 edited
-
test/conversations.test.js (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
test/conversations.test.js
rf549cf5 r3bbf73d 26 26 const VREEMDE = 'https://elders/u/vreemde'; 27 27 28 const binnen= (uri, van, stamp) =>28 const arrived = (uri, van, stamp) => 29 29 db.prepare(`INSERT INTO ap_mentions (slug, object_uri, actor_uri, actor_name, content, published) 30 30 VALUES ('kind', ?, ?, 'iemand', '<p>hoi</p>', ?)`).run(uri, van, stamp); 31 const verstuurd= (id, naar, stamp, visibility = 'direct') =>31 const sent = (id, naar, stamp, visibility = 'direct') => 32 32 db.prepare(`INSERT INTO ap_outbox (id, site_slug, post_id, to_actor, to_actors, content, visibility, created_at) 33 33 VALUES (?, 'kind', 'p1', ?, ?, '<p>terug</p>', ?, ?)`) … … 35 35 36 36 // Een DRUK gesprek met oma: genoeg om in de oude lezing de rest weg te drukken. 37 for (let i = 0; i < 80; i++) binnen(`https://elders/n/oma-${i}`, OMA, `2026-08-09T10:${String(i % 60).padStart(2, '0')}:00Z`);37 for (let i = 0; i < 80; i++) arrived(`https://elders/n/oma-${i}`, OMA, `2026-08-09T10:${String(i % 60).padStart(2, '0')}:00Z`); 38 38 // En een stil gesprek met tante, ouder dan al die drukte. 39 binnen('https://elders/n/tante-1', TANTE, '2026-08-01T09:00:00Z');40 verstuurd('mijn-1', TANTE, '2026-08-01T09:30:00Z');39 arrived('https://elders/n/tante-1', TANTE, '2026-08-01T09:00:00Z'); 40 sent('mijn-1', TANTE, '2026-08-01T09:30:00Z'); 41 41 // Een PUBLIEK antwoord aan een vreemde is geen gesprek. 42 verstuurd('mijn-publiek', VREEMDE, '2026-08-09T12:00:00Z', 'public');42 sent('mijn-publiek', VREEMDE, '2026-08-09T12:00:00Z', 'public'); 43 43 44 44 test('de oude lezing verliest tante achter een druk gesprek -- dat is de bug', () => { … … 49 49 50 50 test('een rij per tegenpartij, hoe druk de drukste ook is', () => { 51 const koppen= AP.conversationHeads('kind');52 assert.deepEqual( koppen.map((k) => k.other), [OMA, TANTE], 'nieuwste gesprek eerst, allebei aanwezig');51 const heads = AP.conversationHeads('kind'); 52 assert.deepEqual(heads.map((k) => k.other), [OMA, TANTE], 'nieuwste gesprek eerst, allebei aanwezig'); 53 53 }); 54 54 … … 58 58 59 59 test('het gesprek draagt beide kanten onder EEN limiet', () => { 60 const g= AP.conversationHistory('kind', TANTE, { limit: 60 });61 assert.equal( g.rijen.length, 2);62 assert.deepEqual( g.rijen.map((r) => r.richting), ['uit', 'in'], 'nieuwste eerst, mijn antwoord bovenaan');63 assert.equal( g.meer, false);60 const talk = AP.conversationHistory('kind', TANTE, { limit: 60 }); 61 assert.equal(talk.rows.length, 2); 62 assert.deepEqual(talk.rows.map((r) => r.direction), ['out', 'in'], 'nieuwste eerst, mijn antwoord bovenaan'); 63 assert.equal(talk.more, false); 64 64 }); 65 65 … … 67 67 // De 80 berichten van oma delen stempels (i % 60), en dat is met opzet: 68 68 // twee berichten in dezelfde seconde is bij DM's een gesprek, geen randgeval. 69 const eerste= AP.conversationHistory('kind', OMA, { limit: 30 });70 assert.equal( eerste.rijen.length, 30);71 assert.equal( eerste.meer, true, 'er is meer, en dat mag de client weten');69 const first = AP.conversationHistory('kind', OMA, { limit: 30 }); 70 assert.equal(first.rows.length, 30); 71 assert.equal(first.more, true, 'er is meer, en dat mag de client weten'); 72 72 73 const tweede = AP.conversationHistory('kind', OMA, { limit: 30, before: eerste.oudste});74 assert.equal( tweede.rijen.length, 30);75 // Geen overlap en geen gat: de tweede pagina begint waar de eersteophield.76 const ids = new Set( eerste.rijen.map((r) => r.ref));77 assert.ok( tweede.rijen.every((r) => !ids.has(r.ref)), 'geen dubbele');73 const second = AP.conversationHistory('kind', OMA, { limit: 30, before: first.oldest }); 74 assert.equal(second.rows.length, 30); 75 // Geen overlap en geen gat: de second pagina begint waar de first ophield. 76 const ids = new Set(first.rows.map((r) => r.ref)); 77 assert.ok(second.rows.every((r) => !ids.has(r.ref)), 'geen dubbele'); 78 78 79 const derde = AP.conversationHistory('kind', OMA, { limit: 30, before: tweede.oudste});80 assert.equal( derde.rijen.length, 20, 'de staart');81 assert.equal( derde.meer, false, 'en dan is het op');79 const third = AP.conversationHistory('kind', OMA, { limit: 30, before: second.oldest }); 80 assert.equal(third.rows.length, 20, 'de staart'); 81 assert.equal(third.more, false, 'en dan is het op'); 82 82 // Alles bij elkaar: precies 80, geen dubbele en niets overgeslagen. Met een 83 83 // cursor op alleen de stempel zou de grensseconde hier stil wegvallen. 84 const all es = new Set([...eerste.rijen, ...tweede.rijen, ...derde.rijen].map((r) => r.ref));85 assert.equal(all es.size, 80, 'elke berichtje precies een keer');84 const allRefs = new Set([...first.rows, ...second.rows, ...third.rows].map((r) => r.ref)); 85 assert.equal(allRefs.size, 80, 'elke berichtje precies een keer'); 86 86 }); 87 87 … … 101 101 t.after(() => server.close()); 102 102 await new Promise((r) => server.once('listening', r)); 103 const haal= async (pad) => {103 const get = async (pad) => { 104 104 const r = await fetch(`http://127.0.0.1:${server.address().port}${pad}`, 105 105 { headers: { Authorization: `Bearer ${bearer}` } }); … … 108 108 const slug = '/ap/users/kind'; 109 109 110 const g = await haal(`${slug}/conversations`);111 assert.equal( g.status, 200);112 assert.equal( g.body.totalItems, 2, 'oma en tante, en niet de publieke vreemde');110 const list = await get(`${slug}/conversations`); 111 assert.equal(list.status, 200); 112 assert.equal(list.body.totalItems, 2, 'oma en tante, en niet de publieke vreemde'); 113 113 // De byline zit in de ingesloten actor, net als overal sinds shaer-nmw. 114 assert.ok( g.body.orderedItems.every((i) => i.object.attributedTo));114 assert.ok(list.body.orderedItems.every((i) => i.object.attributedTo)); 115 115 116 const eerste = await haal(`${slug}/messages?with=${encodeURIComponent(OMA)}&limit=30`);117 assert.equal( eerste.body.orderedItems.length, 30);118 assert.ok( eerste.body.next, 'er is meer, en de standaardvorm zegt het');119 assert.ok( eerste.body.next.includes('limit=30'), 'de paginagrootte reist mee');116 const first = await get(`${slug}/messages?with=${encodeURIComponent(OMA)}&limit=30`); 117 assert.equal(first.body.orderedItems.length, 30); 118 assert.ok(first.body.next, 'er is meer, en de standaardvorm zegt het'); 119 assert.ok(first.body.next.includes('limit=30'), 'de paginagrootte reist mee'); 120 120 121 121 // De next-link volgen doet wat hij belooft: geen dubbele, en uiteindelijk op. 122 const pa d2 = eerste.body.next.replace(/^https?:\/\/[^/]+/, '');123 const tweede = await haal(pad2);124 const eersteIds = new Set(eerste.body.orderedItems.map((i) => i.object.id));125 assert.ok( tweede.body.orderedItems.every((i) => !eersteIds.has(i.object.id)), 'geen overlap');126 const derde = await haal(tweede.body.next.replace(/^https?:\/\/[^/]+/, ''));127 assert.equal( derde.body.orderedItems.length, 20);128 assert.equal( derde.body.next, undefined, 'op is op, en dat staat er ook');122 const path2 = first.body.next.replace(/^https?:\/\/[^/]+/, ''); 123 const second = await get(path2); 124 const firstIds = new Set(first.body.orderedItems.map((i) => i.object.id)); 125 assert.ok(second.body.orderedItems.every((i) => !firstIds.has(i.object.id)), 'geen overlap'); 126 const third = await get(second.body.next.replace(/^https?:\/\/[^/]+/, '')); 127 assert.equal(third.body.orderedItems.length, 20); 128 assert.equal(third.body.next, undefined, 'op is op, en dat staat er ook'); 129 129 130 130 // Een gesprek draagt beide kanten; het eigen antwoord aan tante hoort erbij. 131 const tante = await haal(`${slug}/messages?with=${encodeURIComponent(TANTE)}`);132 assert.equal( tante.body.orderedItems.length, 2);133 assert.ok( tante.body.orderedItems.some((i) => i.actor === 'https://klonkt.test/ap/users/kind'), 'mijn eigen kant zit erin');131 const withAunt = await get(`${slug}/messages?with=${encodeURIComponent(TANTE)}`); 132 assert.equal(withAunt.body.orderedItems.length, 2); 133 assert.ok(withAunt.body.orderedItems.some((i) => i.actor === 'https://klonkt.test/ap/users/kind'), 'mijn eigen kant zit erin'); 134 134 135 const stuk = await haal(`${slug}/messages?with=nonsens`);136 assert.equal( stuk.status, 400, 'geen actor-uri, geen gesprek');135 const broken = await get(`${slug}/messages?with=nonsens`); 136 assert.equal(broken.status, 400, 'geen actor-uri, geen gesprek'); 137 137 });
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)