openpencil/tests/engine/app/chat/tool-state.test.ts
Sergio Bernal b65b1bd481
fix(chat): treat MCP results with optional isError correctly
Merges the contributor fix with maintainer follow-up coverage. MCP results now treat omitted isError as success, scope detection to mcp__ tools, and preserve generic tool error handling.
2026-08-24 18:18:02 +03:00

65 lines
1.7 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { classifyToolState, isMCPToolName } from '@/components/chat/tool-state'
describe('classifyToolState', () => {
test('recognizes MCP tools by their names', () => {
expect(isMCPToolName('mcp__server__search')).toBe(true)
expect(isMCPToolName('get_nodes')).toBe(false)
})
test('treats omitted and false MCP isError as success', () => {
expect(
classifyToolState({
toolName: 'mcp__server__search',
state: 'output-available',
output: { content: [{ type: 'text', text: 'ok' }] }
})
).toBe('done')
expect(
classifyToolState({
toolName: 'mcp__server__search',
state: 'output-available',
output: { content: [], isError: false }
})
).toBe('done')
})
test('treats true MCP isError as an error', () => {
expect(
classifyToolState({
toolName: 'mcp__server__search',
state: 'output-available',
output: { content: [], isError: true }
})
).toBe('error')
})
test('does not classify non-MCP content objects as MCP results', () => {
expect(
classifyToolState({
toolName: 'get_nodes',
state: 'output-available',
output: { content: [] }
})
).toBe('done')
})
test('preserves generic error precedence', () => {
expect(
classifyToolState({
toolName: 'mcp__server__search',
state: 'output-available',
output: { content: [], error: 'failed' }
})
).toBe('error')
expect(
classifyToolState({
toolName: 'mcp__server__search',
state: 'output-error',
output: { content: [] }
})
).toBe('error')
})
})