test: expand exportChat coverage with tool_result and edge case tests

This commit is contained in:
Nicolas Varrot
2026-02-13 07:56:54 +00:00
parent bb9393c138
commit 3fad7b1e0a
2 changed files with 76 additions and 2 deletions

View File

@@ -1,4 +1,4 @@
{"total": {"lines":{"total":261,"covered":55,"skipped":0,"pct":21.07},"statements":{"total":303,"covered":62,"skipped":0,"pct":20.46},"functions":{"total":53,"covered":5,"skipped":0,"pct":9.43},"branches":{"total":155,"covered":45,"skipped":0,"pct":29.03},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":"Unknown"}}
{"total": {"lines":{"total":261,"covered":69,"skipped":0,"pct":26.43},"statements":{"total":303,"covered":78,"skipped":0,"pct":25.74},"functions":{"total":53,"covered":9,"skipped":0,"pct":16.98},"branches":{"total":155,"covered":53,"skipped":0,"pct":34.19},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":"Unknown"}}
,"/home/marlburrow/pinchchat/src/lib/credentials.ts": {"lines":{"total":9,"covered":0,"skipped":0,"pct":0},"functions":{"total":3,"covered":0,"skipped":0,"pct":0},"statements":{"total":11,"covered":0,"skipped":0,"pct":0},"branches":{"total":6,"covered":0,"skipped":0,"pct":0}}
,"/home/marlburrow/pinchchat/src/lib/exportChat.ts": {"lines":{"total":41,"covered":26,"skipped":0,"pct":63.41},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":41,"covered":26,"skipped":0,"pct":63.41},"branches":{"total":26,"covered":18,"skipped":0,"pct":69.23}}
,"/home/marlburrow/pinchchat/src/lib/gateway.ts": {"lines":{"total":81,"covered":0,"skipped":0,"pct":0},"functions":{"total":26,"covered":0,"skipped":0,"pct":0},"statements":{"total":102,"covered":0,"skipped":0,"pct":0},"branches":{"total":48,"covered":0,"skipped":0,"pct":0}}
@@ -8,6 +8,6 @@
,"/home/marlburrow/pinchchat/src/lib/notificationSound.ts": {"lines":{"total":27,"covered":0,"skipped":0,"pct":0},"functions":{"total":3,"covered":0,"skipped":0,"pct":0},"statements":{"total":28,"covered":0,"skipped":0,"pct":0},"branches":{"total":9,"covered":0,"skipped":0,"pct":0}}
,"/home/marlburrow/pinchchat/src/lib/relativeTime.ts": {"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}}
,"/home/marlburrow/pinchchat/src/lib/sessionName.ts": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":18,"covered":17,"skipped":0,"pct":94.44}}
,"/home/marlburrow/pinchchat/src/lib/systemEvent.ts": {"lines":{"total":14,"covered":0,"skipped":0,"pct":0},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":16,"covered":0,"skipped":0,"pct":0},"branches":{"total":8,"covered":0,"skipped":0,"pct":0}}
,"/home/marlburrow/pinchchat/src/lib/systemEvent.ts": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":16,"covered":16,"skipped":0,"pct":100},"branches":{"total":8,"covered":8,"skipped":0,"pct":100}}
,"/home/marlburrow/pinchchat/src/lib/utils.ts": {"lines":{"total":4,"covered":0,"skipped":0,"pct":0},"functions":{"total":3,"covered":0,"skipped":0,"pct":0},"statements":{"total":4,"covered":0,"skipped":0,"pct":0},"branches":{"total":1,"covered":0,"skipped":0,"pct":0}}
}

View File

@@ -81,4 +81,78 @@ describe('messagesToMarkdown', () => {
expect(md).toContain('<details><summary>💭 Thinking</summary>');
expect(md).toContain('Let me think...');
});
it('renders tool_result blocks with name in details', () => {
const md = messagesToMarkdown([makeMessage({
role: 'assistant',
content: '',
blocks: [{ type: 'tool_result', name: 'exec', content: 'file1.txt\nfile2.txt' }],
})]);
expect(md).toContain('<details><summary>📋 Result (exec)</summary>');
expect(md).toContain('file1.txt\nfile2.txt');
});
it('renders tool_result blocks without name', () => {
const md = messagesToMarkdown([makeMessage({
role: 'assistant',
content: '',
blocks: [{ type: 'tool_result', content: 'some output' }],
})]);
expect(md).toContain('<details><summary>📋 Result</summary>');
});
it('skips tool_result blocks with no content', () => {
const md = messagesToMarkdown([makeMessage({
role: 'assistant',
content: '',
blocks: [{ type: 'tool_result', name: 'exec', content: '' }],
})]);
expect(md).not.toContain('📋 Result');
});
it('truncates long tool_result content to 5000 chars', () => {
const longContent = 'x'.repeat(6000);
const md = messagesToMarkdown([makeMessage({
role: 'assistant',
content: '',
blocks: [{ type: 'tool_result', content: longContent }],
})]);
// The content inside the code block should be sliced to 5000
const codeBlockMatch = md.match(/```\n([\s\S]*?)\n```/);
expect(codeBlockMatch).toBeTruthy();
expect(codeBlockMatch![1].length).toBe(5000);
});
it('renders tool_use blocks without input json when input is empty', () => {
const md = messagesToMarkdown([makeMessage({
role: 'assistant',
content: '',
blocks: [{ type: 'tool_use', name: 'read', input: {} }],
})]);
expect(md).toContain('`read`');
expect(md).not.toContain('```json');
});
it('omits session label heading when not provided', () => {
const md = messagesToMarkdown([]);
expect(md).not.toMatch(/^# /);
});
it('renders multiple blocks in sequence', () => {
const md = messagesToMarkdown([makeMessage({
role: 'assistant',
content: '',
blocks: [
{ type: 'text', text: 'Starting...' },
{ type: 'tool_use', name: 'exec', input: { command: 'ls' } },
{ type: 'tool_result', name: 'exec', content: 'output' },
{ type: 'text', text: 'Done!' },
],
})]);
expect(md).toContain('Starting...');
expect(md).toContain('`exec`');
expect(md).toContain('📋 Result (exec)');
expect(md).toContain('Done!');
});
});