Files
notplanned/ventures/context-curator/tests/core.test.cjs
T

44 lines
3.4 KiB
JavaScript

const {test} = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const C = require('../core.js');
const source = fs.readFileSync(path.join(__dirname, '../sample.json'), 'utf8');
test('replaces precisely one span; preserves the source and all surrounding metadata', () => {
const input = C.parse(source); input.extra = {nested: ['metadata']}; input.messages[0].extra = {usage: 37};
const text = JSON.stringify(input); const snapshot = JSON.stringify(input);
for (let first = 0; first < input.messages.length; first++) {
for (let last = first; last < input.messages.length; last++) {
const {result, diff, packet} = C.curate(text, first, last, 'Finding.');
assert.deepEqual(result.messages.slice(0, first), input.messages.slice(0, first));
assert.deepEqual(result.messages.slice(first + 1), input.messages.slice(last + 1));
assert.deepEqual(result.extra, input.extra);
assert.deepEqual(result.messages[first].curator.replacedIds, input.messages.slice(first,last+1).map(m=>m.id));
input.messages.forEach((m,i)=>assert.ok(diff.split('\n').includes((i>=first&&i<=last?'- ':' ')+JSON.stringify(m))));
result.messages.forEach(m=>assert.ok(packet.includes(JSON.stringify(m,null,2))));
}
}
assert.equal(JSON.stringify(input), snapshot); assert.equal(text,snapshot);
});
test('rejects malformed JSON, unsupported schema, duplicate ids, oversized input and bad spans', () => {
for (const bad of ['{', '{}', '{"version":1,"messages":[]}', JSON.stringify({version:1,messages:[{id:'a',role:'bogus',content:''}]}), JSON.stringify({version:1,messages:[{id:'a',role:'user',content:3}]}), JSON.stringify({version:1,messages:[{id:'a',role:'user',content:''},{id:'a',role:'tool',content:''}]}), ' '.repeat(C.MAX_BYTES+1)]) assert.throws(()=>C.parse(bad));
for (const [first,last] of [[-1,1],[4,2],[0,99],[0.5,2]]) assert.throws(()=>C.curate(source,first,last,'Finding'));
assert.throws(()=>C.curate(source,0,1,' '));
});
test('unique replacement ids, UTF-8 accounting, negative savings and safe Markdown fences', () => {
const input = {version:1,messages:[{id:'curator-conclusion',role:'user',content:'é🫖\n```\n# injected'}]};
const text = JSON.stringify(input); const out = C.curate(text,0,0,'Long conclusion '.repeat(500)+'````');
assert.equal(out.result.messages[0].id,'curator-conclusion-1');
assert.equal(out.beforeBytes,Buffer.byteLength(text));
assert.ok(out.saved < 0); assert.ok(out.packet.includes('`````json'));
});
test('sample reduction is measured and generated artifacts are current', () => {
const out = C.curate(source,2,7,"Root cause: preview_cache is keyed only by article ID, has no expiry, and is not invalidated on save. Invalidate that key after a successful save; verify with a save-then-preview regression test. Database writes and browser caching were ruled out. Keep the API response unchanged.");
assert.ok(out.saved > 0);
console.log(`Sample: ${out.beforeBytes} -> ${out.afterBytes} bytes (${(100*out.saved/out.beforeBytes).toFixed(1)}% smaller)`);
const page = fs.readFileSync(path.join(__dirname,'../site/index.html'),'utf8');
assert.ok(page.includes(fs.readFileSync(path.join(__dirname,'../core.js'),'utf8')));
assert.ok(page.includes(fs.readFileSync(path.join(__dirname,'../site/app.js'),'utf8')));
assert.equal(fs.readFileSync(path.join(__dirname,'../site/sample.json'),'utf8'),source);
});