import { describe, test, expect, vi } from 'vitest'
import { render, screen, fireEvent } from '@testing-library/react'
import { ChatToolTrace } from './chat-tool-trace'
import type { ChatToolItem } from '../types'
describe('ChatToolTrace', () => {
const completeTool: ChatToolItem = {
id: '1',
name: 'add_marker',
status: 'complete',
reference: 'add_marker',
duration: 1.8,
inputArguments:
'{"latitude": 39.610861,\n"label": "Calle Toledo 1, Ciudad Real",\n"longitude": -4.2393630}',
output: '{ "success": true, "data": {} }',
}
const runningTool: ChatToolItem = {
id: '2',
name: 'execute_sql',
status: 'running',
}
const errorTool: ChatToolItem = {
id: '3',
name: 'execute_sql',
status: 'error',
reference: 'execute_sql',
duration: 1.8,
inputArguments: '{"datasetId": "abc123"}',
output: 'HTTP 400: Bad Request\n{"status":400,"error":"Syntax error"}',
}
test('renders "Tool executed" label for completed tools', () => {
render()
expect(screen.getByText('Tool executed')).toBeTruthy()
})
test('renders reference name when provided', () => {
render()
expect(screen.getByText('add_marker')).toBeTruthy()
})
test('renders duration when provided', () => {
render()
expect(screen.getByText('1.8s')).toBeTruthy()
})
test('renders Success status for completed tools', () => {
render()
expect(screen.getByText('Success')).toBeTruthy()
})
test('renders Error status for failed tools', () => {
render()
expect(screen.getByText('Error')).toBeTruthy()
})
test('is NOT expandable when status is running', () => {
const { container } = render()
expect(container.querySelector('button')).toBeNull()
})
test('renders input arguments code area', () => {
render()
expect(screen.getByText(/latitude/)).toBeTruthy()
})
test('renders output code area', () => {
render()
expect(screen.getByText(/success/)).toBeTruthy()
})
test('calls onExpandedChange callback', () => {
const onChange = vi.fn()
render()
const summary = screen.getByText('Tool executed').closest('button')
if (summary) fireEvent.click(summary)
expect(onChange).toHaveBeenCalled()
})
})