import { test } from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { samplePage } from '../src/lib/sample-page.mjs'; const papers=JSON.parse(readFileSync(new URL('../src/data/papers.json',import.meta.url))).papers; test('sample cursor traversal reaches every record and reverses without duplication',()=>{ for(const sort of ['recent','title']) { let cursor='',previous=[];const seen=[]; do { const page=samplePage(papers,{sort,cursor,pageSize:8}); if(previous.length) assert.deepEqual(samplePage(papers,{sort,cursor:page.previousCursor,pageSize:8}).items.map(p=>p.id),previous); previous=page.items.map(p=>p.id);seen.push(...previous);cursor=page.nextCursor; }while(cursor); assert.equal(seen.length,20);assert.equal(new Set(seen).size,20); } }); test('sample cursors reject cross-filter reuse and malformed input',()=>{ const page=samplePage(papers,{}); for(const filters of [{q:'graph'},{topic:'cs.LG'},{sort:'title'},{searchIn:'author'},{pageSize:9}]) assert.throws(()=>samplePage(papers,{...filters,cursor:page.nextCursor})); for(const cursor of ['!','invalid', 'a'.repeat(32769)]) assert.throws(()=>samplePage(papers,{cursor})); }); test('sample title ties and IDs beyond Number precision have deterministic order',()=>{ const rows=['9007199254740993','9007199254740992','1'].map(id=>({...papers[0],id,title:'Same title'})); assert.deepEqual(samplePage(rows,{sort:'title'}).items.map(p=>p.id),['1','9007199254740992','9007199254740993']); assert.deepEqual(samplePage(rows,{}).items.map(p=>p.id),['9007199254740993','9007199254740992','1']); });