镜像自地址
https://github.com/lhly/search-syntax-pro.git
已同步 2026-10-20 22:37:48 +08:00
191 行
5.8 KiB
TypeScript
191 行
5.8 KiB
TypeScript
import { render, screen, fireEvent } from '@testing-library/react'
|
||
import { SearchForm } from '@/components/SearchForm'
|
||
import type { SearchParams } from '@/types'
|
||
|
||
// Mock Chrome APIs
|
||
const mockChrome = {
|
||
storage: {
|
||
local: {
|
||
get: jest.fn(),
|
||
set: jest.fn(),
|
||
remove: jest.fn(),
|
||
clear: jest.fn()
|
||
}
|
||
}
|
||
}
|
||
|
||
Object.defineProperty(global, 'chrome', {
|
||
value: mockChrome,
|
||
writable: true
|
||
})
|
||
|
||
describe('SearchForm', () => {
|
||
const mockOnChange = jest.fn()
|
||
const defaultProps = {
|
||
searchParams: {
|
||
keyword: '',
|
||
engine: 'baidu' as const,
|
||
site: '',
|
||
fileType: '',
|
||
exactMatch: ''
|
||
},
|
||
onSearchParamsChange: mockOnChange
|
||
}
|
||
|
||
beforeEach(() => {
|
||
mockOnChange.mockClear()
|
||
})
|
||
|
||
it('应该渲染搜索表单', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
expect(screen.getByLabelText('搜索关键词')).toBeInTheDocument()
|
||
expect(screen.getByLabelText('搜索引擎')).toBeInTheDocument()
|
||
expect(screen.getByText('高级搜索选项')).toBeInTheDocument()
|
||
})
|
||
|
||
it('应该更新关键词输入', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
const keywordInput = screen.getByLabelText('搜索关键词')
|
||
fireEvent.change(keywordInput, { target: { value: 'Vue.js' } })
|
||
|
||
expect(mockOnChange).toHaveBeenCalledWith({
|
||
...defaultProps.searchParams,
|
||
keyword: 'Vue.js'
|
||
})
|
||
})
|
||
|
||
it('应该更新搜索引擎选择', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
const engineSelect = screen.getByLabelText('搜索引擎')
|
||
fireEvent.change(engineSelect, { target: { value: 'google' } })
|
||
|
||
expect(mockOnChange).toHaveBeenCalledWith({
|
||
...defaultProps.searchParams,
|
||
engine: 'google'
|
||
})
|
||
})
|
||
|
||
it('应该展开和折叠高级选项', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
|
||
// 初始状态应该不显示高级选项
|
||
expect(screen.queryByLabelText('<27><><EFBFBD>站内搜索')).not.toBeInTheDocument()
|
||
|
||
// 点击展开
|
||
fireEvent.click(toggleButton)
|
||
expect(screen.getByLabelText('网站内搜索')).toBeInTheDocument()
|
||
expect(screen.getByLabelText('文件类型搜索')).toBeInTheDocument()
|
||
expect(screen.getByLabelText('精确匹配')).toBeInTheDocument()
|
||
|
||
// 再次点击折叠
|
||
fireEvent.click(toggleButton)
|
||
expect(screen.queryByLabelText('网站内搜索')).not.toBeInTheDocument()
|
||
})
|
||
|
||
it('应该更新网站内搜索', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
// 先展开高级选项
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
fireEvent.click(toggleButton)
|
||
|
||
const siteInput = screen.getByLabelText('网站内搜索 (site:)')
|
||
fireEvent.change(siteInput, { target: { value: 'github.com' } })
|
||
|
||
expect(mockOnChange).toHaveBeenCalledWith({
|
||
...defaultProps.searchParams,
|
||
site: 'github.com'
|
||
})
|
||
})
|
||
|
||
it('应该更新文件类型选择', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
// 先展开高级选项
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
fireEvent.click(toggleButton)
|
||
|
||
const fileTypeSelect = screen.getByLabelText('文件类型 (filetype:)')
|
||
fireEvent.change(fileTypeSelect, { target: { value: 'pdf' } })
|
||
|
||
expect(mockOnChange).toHaveBeenCalledWith({
|
||
...defaultProps.searchParams,
|
||
fileType: 'pdf'
|
||
})
|
||
})
|
||
|
||
it('应该更新精确匹配输入', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
// 先展开高级选项
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
fireEvent.click(toggleButton)
|
||
|
||
const exactMatchInput = screen.getByLabelText('精确匹配 (" ")')
|
||
fireEvent.change(exactMatchInput, { target: { value: 'React框架' } })
|
||
|
||
expect(mockOnChange).toHaveBeenCalledWith({
|
||
...defaultProps.searchParams,
|
||
exactMatch: 'React框架'
|
||
})
|
||
})
|
||
|
||
it('应该显示所有常见文件类型选项', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
fireEvent.click(toggleButton)
|
||
|
||
// 检查常见文件类型选项
|
||
expect(screen.getByText('PDF文档')).toBeInTheDocument()
|
||
expect(screen.getAllByText('Word文档')).toHaveLength(2) // doc 和 docx
|
||
expect(screen.getAllByText('Excel表格')).toHaveLength(2) // xls 和 xlsx
|
||
expect(screen.getAllByText('PPT演示文稿')).toHaveLength(2) // ppt 和 pptx
|
||
})
|
||
|
||
it('应该保留现有搜索参数', () => {
|
||
const existingParams: SearchParams = {
|
||
keyword: 'React',
|
||
engine: 'google',
|
||
site: 'reactjs.org',
|
||
fileType: 'pdf',
|
||
exactMatch: 'Hooks'
|
||
}
|
||
|
||
render(<SearchForm searchParams={existingParams} onSearchParamsChange={mockOnChange} />)
|
||
|
||
expect(screen.getByDisplayValue('React')).toBeInTheDocument()
|
||
expect(screen.getByDisplayValue('谷歌')).toBeInTheDocument()
|
||
|
||
// 展开高级选项检查其他字段
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
fireEvent.click(toggleButton)
|
||
|
||
expect(screen.getByDisplayValue('reactjs.org')).toBeInTheDocument()
|
||
expect(screen.getByDisplayValue('PDF文档')).toBeInTheDocument()
|
||
expect(screen.getByDisplayValue('Hooks')).toBeInTheDocument()
|
||
})
|
||
|
||
it('应该有正确的占位符文本', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
const keywordInput = screen.getByPlaceholderText('输入要搜索的关键词...')
|
||
expect(keywordInput).toBeInTheDocument()
|
||
})
|
||
|
||
it('应该显示帮助文本', () => {
|
||
render(<SearchForm {...defaultProps} />)
|
||
|
||
const toggleButton = screen.getByText('高级搜索选项')
|
||
fireEvent.click(toggleButton)
|
||
|
||
expect(screen.getByText('在指定网站内搜索内容')).toBeInTheDocument()
|
||
expect(screen.getByText('搜索特定格式的文件')).toBeInTheDocument()
|
||
expect(screen.getByText('完全匹配输入的短语')).toBeInTheDocument()
|
||
})
|
||
}) |