import { render, fireEvent } from '@testing-library/react'
import { Input } from '@/components/ui/input'
describe('Input', () => {
it('应该渲染输入框', () => {
const { container } = render()
const input = container.querySelector('input')
expect(input).toBeTruthy()
})
it('应该显示占位符文本', () => {
const { getByPlaceholderText } = render(
)
expect(getByPlaceholderText('请输入内容')).toBeTruthy()
})
it('应该处理输入事件', () => {
const handleChange = jest.fn()
const { container } = render(
)
const input = container.querySelector('input') as HTMLInputElement
fireEvent.input(input, { target: { value: '测试输入' } })
expect(handleChange).toHaveBeenCalledWith('测试输入', expect.any(Object))
})
it('应该显示错误状态', () => {
const { container, getByText } = render(
)
const input = container.querySelector('input')
expect(input?.className).toContain('border-red-500')
expect(getByText('输入错误')).toBeTruthy()
})
it('应该显示左侧图标', () => {
const { container } = render(
)
const leftIcon = container.querySelector('.absolute.left-3')
expect(leftIcon).toBeTruthy()
})
it('应该显示右侧图标', () => {
const { container } = render(
)
const rightIcon = container.querySelector('.absolute.right-3')
expect(rightIcon).toBeTruthy()
})
it('应该处理左侧图标点击事件', () => {
const handleLeftIconClick = jest.fn()
const { container } = render(
)
const leftIcon = container.querySelector('.absolute.left-3')
fireEvent.click(leftIcon!)
expect(handleLeftIconClick).toHaveBeenCalled()
})
it('应该处理右侧图标点击事件', () => {
const handleRightIconClick = jest.fn()
const { container } = render(
)
const rightIcon = container.querySelector('.absolute.right-3')
fireEvent.click(rightIcon!)
expect(handleRightIconClick).toHaveBeenCalled()
})
it('应该应用不同的变体样式', () => {
const { container: defaultContainer } = render()
const { container: outlineContainer } = render()
const { container: filledContainer } = render()
const defaultInput = defaultContainer.querySelector('input')
const outlineInput = outlineContainer.querySelector('input')
const filledInput = filledContainer.querySelector('input')
expect(defaultInput?.className).toContain('border-gray-300')
expect(outlineInput?.className).toContain('border-input')
expect(filledInput?.className).toContain('border-none')
})
it('应该应用不同的大小样式', () => {
const { container: defaultContainer } = render()
const { container: smContainer } = render()
const { container: lgContainer } = render()
const defaultInput = defaultContainer.querySelector('input')
const smInput = smContainer.querySelector('input')
const lgInput = lgContainer.querySelector('input')
expect(defaultInput?.className).toContain('h-10')
expect(smInput?.className).toContain('h-9')
expect(lgInput?.className).toContain('h-11')
})
it('应该禁用输入框', () => {
const { container } = render()
const input = container.querySelector('input')
expect(input?.disabled).toBe(true)
})
it('应该设置输入框类型', () => {
const { container } = render()
const input = container.querySelector('input')
expect(input?.type).toBe('password')
})
it('应该设置输入框值', () => {
const { container } = render()
const input = container.querySelector('input') as HTMLInputElement
expect(input.value).toBe('预设值')
})
})