27 lines
1.6 KiB
JavaScript
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']);
|
|
});
|