test: expand exportChat coverage with tool_result and edge case tests
This commit is contained in:
@@ -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/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/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}}
|
,"/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/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/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/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}}
|
,"/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}}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,4 +81,78 @@ describe('messagesToMarkdown', () => {
|
|||||||
expect(md).toContain('<details><summary>💭 Thinking</summary>');
|
expect(md).toContain('<details><summary>💭 Thinking</summary>');
|
||||||
expect(md).toContain('Let me think...');
|
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!');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user