Lands Gosalyn's round 3 candidate,a2c72ac95(commit candidate, basec771a36f4), approved by Webby (29979, rev 2731). 21 paths: the new packages/library (src, tests, fixtures, package.json, README), scripts/stack-copy.sh (packages/library/src in COPY_PATHS), packages/cli/tests/stack-copy.test.mjs, scripts/mosaic and agents/gosalyn/work/queue-212/BUILD.md. The 21-path patch-id, ea84d3e35470, equals the candidate's. Evidence: Gosalyn's slot run on round 3: 20 files 451 pass, 0 fail; test-queue 28/0 (gosalyn-0086). Landing gate (Sage, 08:51-09:03Z, base4ced5e63d) on a tree that also held row 197's 32 paths: GATE_PASSED, node tests 981 pass 0 fail (library 39, cli 681, control-board 38, harness 16, webui 51, plus the scripts/test-*.sh node suites), selftests 429 passed 0 failed. Row 212 lands alone (mos-1162); row 197 waits for an r6 after its lane proof stopped. No 212 path changed betweenc771a36f4and this commit's parent. `queue review verify-commit 212` -> ok row 212 round 3:a2c72ac95matches the commit candidate (21 paths).
81 lines
5.0 KiB
JavaScript
81 lines
5.0 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { renderItems, UNREADABLE } from '../src/index.mjs';
|
|
|
|
const A = 'a'.repeat(40), B = 'b'.repeat(40);
|
|
const cite = (path, lines, quote, commit = A) => ({ path, commit, lines, quote });
|
|
const options = {
|
|
scopeOf: path => path.includes('/Playground/') ? 'playground' : path.endsWith('.md') ? 'canon' : undefined,
|
|
changed: ({ path, commit }) => path === 'Book One/Characters/Mara Vell.md' && commit === A,
|
|
};
|
|
const render = items => renderItems(JSON.stringify({ items }), options);
|
|
|
|
// One snapshot per item kind: the plain text both channels show.
|
|
const SNAPSHOTS = {
|
|
fact: [{ kind: 'fact', text: 'Tomas is the ferryman.', cites: [cite('Book One/Characters/Tomas.md', [3, 3], 'the ferryman', B)] }],
|
|
finding: [{ kind: 'finding', text: 'Eye colour differs.', cites: [cite('Book One/Chapters/Chapter 01.md', [41, 41], 'her grey eyes'),
|
|
cite('Book One/Characters/Mara Vell.md', [9, 10], 'green eyes')] }],
|
|
correction: [{ kind: 'correction', text: 'Chapter 1 says grey.', from: 'green eyes', to: 'grey eyes',
|
|
cites: [cite('Book One/Characters/Mara Vell.md', [9, 9], 'green eyes', B)] }],
|
|
question: [{ kind: 'question', text: 'Is the harbor north of the town?', cites: [cite('Book One/Places/Harbor Town.md', [2, 4], 'the harbor', B)] }],
|
|
idea: [{ kind: 'idea', text: 'A storm could close the harbor.', cites: [cite('Book One/Playground/What If.md', [5, 5], 'a storm', B),
|
|
{ url: 'https://example.invalid/tides', quote: 'spring tides' }] }],
|
|
};
|
|
const EXPECTED = {
|
|
fact: '1. Fact: Tomas is the ferryman.\n [canon] Book One/Characters/Tomas.md:3 @bbbbbbb "the ferryman"',
|
|
finding: '1. Finding: Eye colour differs.\n [canon] Book One/Chapters/Chapter 01.md:41 @aaaaaaa "her grey eyes"\n'
|
|
+ ' [canon] Book One/Characters/Mara Vell.md:9-10 @aaaaaaa "green eyes" (changed since)',
|
|
correction: '1. Correction: Chapter 1 says grey.\n From: "green eyes"\n To: "grey eyes"\n'
|
|
+ ' [canon] Book One/Characters/Mara Vell.md:9 @bbbbbbb "green eyes"',
|
|
question: '1. Question: Is the harbor north of the town?\n [canon] Book One/Places/Harbor Town.md:2-4 @bbbbbbb "the harbor"',
|
|
idea: '1. Idea: A storm could close the harbor.\n [playground] Book One/Playground/What If.md:5 @bbbbbbb "a storm"\n'
|
|
+ ' [web] https://example.invalid/tides "spring tides"',
|
|
};
|
|
|
|
for (const kind of Object.keys(SNAPSHOTS)) {
|
|
test(`renderItems snapshot: ${kind}`, () => {
|
|
const out = render(SNAPSHOTS[kind]);
|
|
assert.equal(out.kind, 'items');
|
|
assert.equal(out.text, EXPECTED[kind]);
|
|
assert.equal(out.items[0].kind, kind);
|
|
});
|
|
}
|
|
|
|
test('renderItems numbers several items and takes a parsed body as well as a string', () => {
|
|
const items = [...SNAPSHOTS.fact, ...SNAPSHOTS.question];
|
|
const out = renderItems({ items }, options);
|
|
assert.equal(out.text, `${EXPECTED.fact}\n${EXPECTED.question.replace(/^1\./, '2.')}`);
|
|
assert.deepEqual(out.items[1].cites[0], { badge: 'canon', path: 'Book One/Places/Harbor Town.md', commit: B, lines: [2, 4],
|
|
ref: 'Book One/Places/Harbor Town.md:2-4 @bbbbbbb', quote: 'the harbor', changed: false });
|
|
});
|
|
|
|
test('without options a path cite has no badge and is never marked changed', () => {
|
|
assert.equal(renderItems({ items: SNAPSHOTS.finding }).text,
|
|
'1. Finding: Eye colour differs.\n Book One/Chapters/Chapter 01.md:41 @aaaaaaa "her grey eyes"\n'
|
|
+ ' Book One/Characters/Mara Vell.md:9-10 @aaaaaaa "green eyes"');
|
|
});
|
|
|
|
const NOTICE_SNAPSHOTS = { 'no-cited-answer': 'No cited answer', 'no-answer': 'No answer', 'turn-failed': 'The turn failed' };
|
|
for (const [notice, text] of Object.entries(NOTICE_SNAPSHOTS)) {
|
|
test(`renderItems snapshot: notice ${notice}`, () => {
|
|
assert.deepEqual(renderItems(JSON.stringify({ items: [], notice }), options), { kind: 'notice', notice, text });
|
|
});
|
|
}
|
|
|
|
test('a body without the reply shape shows a fixed line and none of its text', () => {
|
|
const secret = 'free prose the guard would refuse';
|
|
const bodies = [secret, JSON.stringify(secret), '{"items": [], "notice": "other"}', JSON.stringify({ items: [], notice: 'no-answer', extra: secret }),
|
|
JSON.stringify({ items: [] }), JSON.stringify({ items: [{ kind: 'story', text: secret, cites: [] }] }),
|
|
JSON.stringify({ items: [{ kind: 'fact', text: secret }] }), JSON.stringify({ items: SNAPSHOTS.fact, prose: secret }),
|
|
JSON.stringify({ items: [{ kind: 'correction', text: secret, cites: [] }] }),
|
|
JSON.stringify({ items: [{ kind: 'fact', text: secret, cites: [cite('a.md', [2, 1], 'q')] }] }),
|
|
JSON.stringify({ items: [{ kind: 'fact', text: secret, cites: [{ path: 'a.md', commit: 'abc', lines: [1, 1], quote: 'q' }] }] }),
|
|
JSON.stringify({ items: [{ kind: 'fact', text: secret, cites: [{ url: 'https://x.invalid', path: 'a.md', quote: 'q' }] }] }),
|
|
null, 42, '[]'];
|
|
for (const body of bodies) {
|
|
const out = renderItems(body, options);
|
|
assert.deepEqual(out, { kind: 'unreadable', text: UNREADABLE }, String(body));
|
|
assert.ok(!JSON.stringify(out).includes(secret));
|
|
}
|
|
});
|