aboutsummaryrefslogtreecommitdiffstats
path: root/tools/topic-depth-test.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-30 18:03:33 +0000
committerAdam Soltys <[email protected]>2026-09-30 18:03:33 +0000
commit0570f48910ddc4ea10d27fb8ab7992fbd013a0b7 (patch)
treedbc1e5ece94bc71fcd8bb7e89f61043933c1992c /tools/topic-depth-test.js
parent95eaf11d116260b101c81346ba41810aacf49a7d (diff)
parentcfeacb1a7a10766565ed3eaab13154096478c837 (diff)
downloadcoinosv3-0570f48910ddc4ea10d27fb8ab7992fbd013a0b7.tar.gz
coinosv3-0570f48910ddc4ea10d27fb8ab7992fbd013a0b7.zip
Merge remote-tracking branch 'cs/prod'
Diffstat (limited to 'tools/topic-depth-test.js')
-rw-r--r--tools/topic-depth-test.js36
1 files changed, 36 insertions, 0 deletions
diff --git a/tools/topic-depth-test.js b/tools/topic-depth-test.js
new file mode 100644
index 0000000..9876224
--- /dev/null
+++ b/tools/topic-depth-test.js
@@ -0,0 +1,36 @@
+// A topic feed (#gardenstr) goes back as far as the relays remember: the
+// big relays prune, so topics also ask archive-keeping ones, and a page
+// whose posts were all filtered out (replies, muted, spam) is not the end.
+// Before: ~5 posts, then "You're all caught up".
+//
+// Run: bun tools/topic-depth-test.js
+import puppeteer from 'puppeteer-core';
+import { buildHtml } from '../build.js';
+const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
+let ok = true;
+const check = (n, c, d = '') => { console.log(` ${c ? '✓' : '✗'} ${n}${d ? ' — ' + d : ''}`); if (!c) ok = false; };
+const html = await buildHtml({ minify: true, pwa: false });
+const server = Bun.serve({ port: 5285, fetch: () => new Response(html, { headers: { 'content-type': 'text/html' } }) });
+const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome', headless: 'new', args: ['--no-sandbox'] });
+const page = await browser.newPage();
+try {
+ await page.setViewport({ width: 390, height: 844 });
+ await page.goto('http://localhost:5285/feed/t/gardenstr', { waitUntil: 'domcontentloaded' });
+ const count = () => page.evaluate(() => new Set([...document.querySelectorAll('.notes-feed [data-key]')].map((n) => n.getAttribute('data-key'))).size);
+ for (let i = 0; i < 60 && (await count()) < 3; i++) await sleep(500);
+ const first = await count();
+ check('the topic opens with posts', first >= 3, first + ' posts');
+ let seen = new Set(), ended = false;
+ const t0 = Date.now();
+ while (Date.now() - t0 < 90_000 && seen.size < 60) {
+ for (const k of await page.evaluate(() => [...document.querySelectorAll('.notes-feed [data-key]')].map((n) => n.getAttribute('data-key')))) seen.add(k);
+ ended = await page.evaluate(() => document.body.innerText.includes('all caught up'));
+ if (ended) break;
+ await page.evaluate(() => window.scrollTo(0, document.documentElement.scrollHeight));
+ await sleep(1500);
+ }
+ check('scrolling keeps finding older posts', seen.size >= 40, seen.size + ' posts' + (ended ? ', then "caught up"' : ''));
+ check('...without claiming to be caught up after a handful', !ended || seen.size >= 40);
+} finally { await browser.close(); server.stop(true); }
+console.log(ok ? '\n✅ a topic goes back' : '\n❌ failed');
+process.exit(ok ? 0 : 1);