镜像自地址
https://github.com/lhly/search-syntax-pro.git
已同步 2026-10-20 22:37:48 +08:00
231 行
6.7 KiB
TypeScript
231 行
6.7 KiB
TypeScript
import { BaiduAdapter } from '@/services/adapters/baidu'
|
||
import type { SearchParams } from '@/types'
|
||
|
||
describe('BaiduAdapter', () => {
|
||
let adapter: BaiduAdapter
|
||
|
||
beforeEach(() => {
|
||
adapter = new BaiduAdapter()
|
||
})
|
||
|
||
describe('基础功能', () => {
|
||
it('应该返回正确的适配器名称', () => {
|
||
expect(adapter.getName()).toBe('百度')
|
||
})
|
||
|
||
it('应该返回正确的基准URL', () => {
|
||
expect(adapter.getBaseUrl()).toBe('https://www.baidu.com/s')
|
||
})
|
||
|
||
it('应该支持正确的语法类型', () => {
|
||
const supportedSyntax = adapter.getSupportedSyntax()
|
||
expect(supportedSyntax).toContain('site')
|
||
expect(supportedSyntax).toContain('filetype')
|
||
expect(supportedSyntax).toContain('exact')
|
||
expect(supportedSyntax).toContain('date_range')
|
||
})
|
||
})
|
||
|
||
describe('搜索查询构建', () => {
|
||
it('应该构建基础关键词搜索', () => {
|
||
const params: SearchParams = {
|
||
keyword: '测试搜索',
|
||
engine: 'baidu'
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('wd=%E6%B5%8B%E8%AF%95%E6%90%9C%E7%B4%A2') // URL编码的"测试搜索"
|
||
expect(url).toContain('https://www.baidu.com/s')
|
||
})
|
||
|
||
it('应该构建网站内搜索', () => {
|
||
const params: SearchParams = {
|
||
keyword: 'Vue教程',
|
||
engine: 'baidu',
|
||
site: 'vuejs.org'
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('wd=Vue%E6%95%99%E7%A8%8B%20site%3Avuejs.org') // URL编码
|
||
})
|
||
|
||
it('应该构建文件类型搜索', () => {
|
||
const params: SearchParams = {
|
||
keyword: 'JavaScript指南',
|
||
engine: 'baidu',
|
||
fileType: 'pdf'
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('wd=JavaScript%E6%8C%87%E5%8D%97%20filetype%3Apdf') // URL编码
|
||
})
|
||
|
||
it('应该构建精确匹配搜索', () => {
|
||
const params: SearchParams = {
|
||
keyword: '',
|
||
engine: 'baidu',
|
||
exactMatch: 'React框架'
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('wd=%22React%E6%A1%86%E6%9E%B6%22') // URL编码的"React框架"
|
||
})
|
||
|
||
it('应该构建复合搜索', () => {
|
||
const params: SearchParams = {
|
||
keyword: '前端开发',
|
||
engine: 'baidu',
|
||
site: 'github.com',
|
||
fileType: 'md',
|
||
exactMatch: 'README'
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('site%3Agithub.com') // URL编码
|
||
expect(url).toContain('filetype%3Amd') // URL编码
|
||
expect(url).toContain('%22README%22') // URL编码的"README"
|
||
})
|
||
|
||
it('应该处理日期范围搜索', () => {
|
||
const params: SearchParams = {
|
||
keyword: '技术新闻',
|
||
engine: 'baidu',
|
||
dateRange: {
|
||
from: '2024-01-01',
|
||
to: '2024-12-31'
|
||
}
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('..2024-12-31')
|
||
})
|
||
|
||
it('应该正确清理网站域名', () => {
|
||
const params: SearchParams = {
|
||
keyword: '测试',
|
||
engine: 'baidu',
|
||
site: 'https://www.example.com/path/to/page'
|
||
}
|
||
|
||
const url = adapter.buildQuery(params)
|
||
expect(url).toContain('site%3Awww.example.com') // URL编码
|
||
// 验证site参数中不包含原始的https://(但基础URL会包含)
|
||
const queryPart = url.split('?')[1]
|
||
expect(queryPart).not.toContain('https://')
|
||
expect(url).not.toContain('/path')
|
||
})
|
||
})
|
||
|
||
describe('参数验证', () => {
|
||
it('应该验证有效的搜索参数', () => {
|
||
const params: SearchParams = {
|
||
keyword: '有效搜索',
|
||
engine: 'baidu',
|
||
site: 'example.com',
|
||
fileType: 'pdf'
|
||
}
|
||
|
||
const result = adapter.validateParams(params)
|
||
expect(result.isValid).toBe(true)
|
||
expect(result.errors).toHaveLength(0)
|
||
})
|
||
|
||
it('应该检测空的搜索参数', () => {
|
||
const params: SearchParams = {
|
||
keyword: '',
|
||
engine: 'baidu'
|
||
}
|
||
|
||
const result = adapter.validateParams(params)
|
||
expect(result.isValid).toBe(false)
|
||
expect(result.errors).toContain('请输入搜索关键词或精确匹配内容')
|
||
})
|
||
|
||
it('应该检测无效的网站域名', () => {
|
||
const params: SearchParams = {
|
||
keyword: '测试',
|
||
engine: 'baidu',
|
||
site: 'invalid-domain'
|
||
}
|
||
|
||
const result = adapter.validateParams(params)
|
||
expect(result.isValid).toBe(false)
|
||
expect(result.errors).toContain('网站域名格式不正确')
|
||
})
|
||
|
||
it('应该对不常见文件类型给出警告', () => {
|
||
const params: SearchParams = {
|
||
keyword: '测试',
|
||
engine: 'baidu',
|
||
fileType: 'xyz'
|
||
}
|
||
|
||
const result = adapter.validateParams(params)
|
||
expect(result.isValid).toBe(true)
|
||
expect(result.warnings).toContain('文件类型 "xyz" 可能不被百度支持')
|
||
})
|
||
|
||
it('应该检测无效的日期格式', () => {
|
||
const params: SearchParams = {
|
||
keyword: '测试',
|
||
engine: 'baidu',
|
||
dateRange: {
|
||
from: 'invalid-date',
|
||
to: '2024-01-01'
|
||
}
|
||
}
|
||
|
||
const result = adapter.validateParams(params)
|
||
expect(result.isValid).toBe(false)
|
||
expect(result.errors).toContain('开始日期格式不正确')
|
||
})
|
||
|
||
it('应该检测日期范围逻辑错误', () => {
|
||
const params: SearchParams = {
|
||
keyword: '测试',
|
||
engine: 'baidu',
|
||
dateRange: {
|
||
from: '2024-12-31',
|
||
to: '2024-01-01'
|
||
}
|
||
}
|
||
|
||
const result = adapter.validateParams(params)
|
||
expect(result.isValid).toBe(false)
|
||
expect(result.errors).toContain('开始日期不能晚于结束日期')
|
||
})
|
||
})
|
||
|
||
describe('搜索建议', () => {
|
||
it('应该为教程搜索建议文件类型', () => {
|
||
const params: SearchParams = {
|
||
keyword: 'Vue.js教程',
|
||
engine: 'baidu'
|
||
}
|
||
|
||
const suggestions = adapter.getSearchSuggestions(params)
|
||
expect(suggestions).toContain('添加文件类型限制:filetype:pdf')
|
||
})
|
||
|
||
it('应该为官网搜索建议网站限制', () => {
|
||
const params: SearchParams = {
|
||
keyword: 'React官网文档',
|
||
engine: 'baidu'
|
||
}
|
||
|
||
const suggestions = adapter.getSearchSuggestions(params)
|
||
expect(suggestions).toContain('添加网站限制:site:官方网站域名')
|
||
})
|
||
|
||
it('应该为长关键词建议精确匹配', () => {
|
||
const longKeyword = '这是一个非常长的搜索关键词用于测试精确匹配功能'
|
||
const params: SearchParams = {
|
||
keyword: longKeyword,
|
||
engine: 'baidu'
|
||
}
|
||
|
||
const suggestions = adapter.getSearchSuggestions(params)
|
||
expect(suggestions).toContain('使用精确匹配:\"关键词\"')
|
||
})
|
||
})
|
||
}) |