From 3fad7b1e0a483d33582dc4a13aeb1912e9b5683a Mon Sep 17 00:00:00 2001 From: Nicolas Varrot Date: Fri, 13 Feb 2026 07:56:54 +0000 Subject: [PATCH] test: expand exportChat coverage with tool_result and edge case tests --- coverage/coverage-summary.json | 4 +- src/lib/__tests__/exportChat.test.ts | 74 ++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/coverage/coverage-summary.json b/coverage/coverage-summary.json index ab4b3d2..ae60195 100644 --- a/coverage/coverage-summary.json +++ b/coverage/coverage-summary.json @@ -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}} } diff --git a/src/lib/__tests__/exportChat.test.ts b/src/lib/__tests__/exportChat.test.ts index c8e113b..2d3063e 100644 --- a/src/lib/__tests__/exportChat.test.ts +++ b/src/lib/__tests__/exportChat.test.ts @@ -81,4 +81,78 @@ describe('messagesToMarkdown', () => { expect(md).toContain('
💭 Thinking'); 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('
📋 Result (exec)'); + 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('
📋 Result'); + }); + + 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!'); + }); }); +