Files
Thesisly/tests/sample-page.test.mjs

27 lines
1.6 KiB
JavaScript

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']);
});