mirror of
https://github.com/langgenius/dify.git
synced 2026-05-03 00:48:04 +08:00
Co-authored-by: CodingOnStar <hanxujiang@dify.ai> Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com>
127 lines
4.1 KiB
TypeScript
127 lines
4.1 KiB
TypeScript
import type { Tool } from '@/app/components/tools/types'
|
|
import { render, screen } from '@testing-library/react'
|
|
import { describe, expect, it } from 'vitest'
|
|
import MCPToolItem from './tool-item'
|
|
|
|
describe('MCPToolItem', () => {
|
|
const createMockTool = (overrides = {}): Tool => ({
|
|
name: 'test-tool',
|
|
label: {
|
|
en_US: 'Test Tool',
|
|
zh_Hans: '测试工具',
|
|
},
|
|
description: {
|
|
en_US: 'A test tool description',
|
|
zh_Hans: '测试工具描述',
|
|
},
|
|
parameters: [],
|
|
...overrides,
|
|
} as unknown as Tool)
|
|
|
|
describe('Rendering', () => {
|
|
it('should render without crashing', () => {
|
|
const tool = createMockTool()
|
|
render(<MCPToolItem tool={tool} />)
|
|
expect(screen.getByText('Test Tool')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should display tool label', () => {
|
|
const tool = createMockTool()
|
|
render(<MCPToolItem tool={tool} />)
|
|
expect(screen.getByText('Test Tool')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should display tool description', () => {
|
|
const tool = createMockTool()
|
|
render(<MCPToolItem tool={tool} />)
|
|
expect(screen.getByText('A test tool description')).toBeInTheDocument()
|
|
})
|
|
})
|
|
|
|
describe('With Parameters', () => {
|
|
it('should not show parameters section when no parameters', () => {
|
|
const tool = createMockTool({ parameters: [] })
|
|
render(<MCPToolItem tool={tool} />)
|
|
expect(screen.queryByText('tools.mcp.toolItem.parameters')).not.toBeInTheDocument()
|
|
})
|
|
|
|
it('should render with parameters', () => {
|
|
const tool = createMockTool({
|
|
parameters: [
|
|
{
|
|
name: 'param1',
|
|
type: 'string',
|
|
human_description: {
|
|
en_US: 'A parameter description',
|
|
},
|
|
},
|
|
],
|
|
})
|
|
render(<MCPToolItem tool={tool} />)
|
|
// Tooltip content is rendered in portal, may not be visible immediately
|
|
expect(screen.getByText('Test Tool')).toBeInTheDocument()
|
|
})
|
|
})
|
|
|
|
describe('Styling', () => {
|
|
it('should have cursor-pointer class', () => {
|
|
const tool = createMockTool()
|
|
render(<MCPToolItem tool={tool} />)
|
|
const toolElement = document.querySelector('.cursor-pointer')
|
|
expect(toolElement).toBeInTheDocument()
|
|
})
|
|
|
|
it('should have rounded-xl class', () => {
|
|
const tool = createMockTool()
|
|
render(<MCPToolItem tool={tool} />)
|
|
const toolElement = document.querySelector('.rounded-xl')
|
|
expect(toolElement).toBeInTheDocument()
|
|
})
|
|
|
|
it('should have hover styles', () => {
|
|
const tool = createMockTool()
|
|
render(<MCPToolItem tool={tool} />)
|
|
const toolElement = document.querySelector('[class*="hover:bg-components-panel-on-panel-item-bg-hover"]')
|
|
expect(toolElement).toBeInTheDocument()
|
|
})
|
|
})
|
|
|
|
describe('Edge Cases', () => {
|
|
it('should handle empty label', () => {
|
|
const tool = createMockTool({
|
|
label: { en_US: '', zh_Hans: '' },
|
|
})
|
|
render(<MCPToolItem tool={tool} />)
|
|
// Should render without crashing
|
|
expect(document.querySelector('.cursor-pointer')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should handle empty description', () => {
|
|
const tool = createMockTool({
|
|
description: { en_US: '', zh_Hans: '' },
|
|
})
|
|
render(<MCPToolItem tool={tool} />)
|
|
expect(screen.getByText('Test Tool')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should handle long description with line clamp', () => {
|
|
const longDescription = 'This is a very long description '.repeat(20)
|
|
const tool = createMockTool({
|
|
description: { en_US: longDescription, zh_Hans: longDescription },
|
|
})
|
|
render(<MCPToolItem tool={tool} />)
|
|
const descElement = document.querySelector('.line-clamp-2')
|
|
expect(descElement).toBeInTheDocument()
|
|
})
|
|
|
|
it('should handle special characters in tool name', () => {
|
|
const tool = createMockTool({
|
|
name: 'special-tool_v2.0',
|
|
label: { en_US: 'Special Tool <v2.0>', zh_Hans: '特殊工具' },
|
|
})
|
|
render(<MCPToolItem tool={tool} />)
|
|
expect(screen.getByText('Special Tool <v2.0>')).toBeInTheDocument()
|
|
})
|
|
})
|
|
})
|