dify/web/app/components/goto-anything/actions/__tests__/knowledge.spec.ts
Coding On Star b6d506828b
test(web): add and enhance frontend automated tests across multiple modules (#32268)
Co-authored-by: CodingOnStar <hanxujiang@dify.com>
2026-02-13 10:27:48 +08:00

93 lines
2.8 KiB
TypeScript

import type { DataSet } from '@/models/datasets'
import { knowledgeAction } from '../knowledge'
vi.mock('@/service/datasets', () => ({
fetchDatasets: vi.fn(),
}))
vi.mock('@/utils/classnames', () => ({
cn: (...args: string[]) => args.filter(Boolean).join(' '),
}))
describe('knowledgeAction', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('has correct metadata', () => {
expect(knowledgeAction.key).toBe('@knowledge')
expect(knowledgeAction.shortcut).toBe('@kb')
})
it('returns parsed dataset results on success', async () => {
const { fetchDatasets } = await import('@/service/datasets')
vi.mocked(fetchDatasets).mockResolvedValue({
data: [
{ id: 'ds-1', name: 'My Knowledge', description: 'A KB', provider: 'vendor', embedding_available: true } as unknown as DataSet,
],
has_more: false,
limit: 10,
page: 1,
total: 1,
})
const results = await knowledgeAction.search('@knowledge query', 'query', 'en')
expect(fetchDatasets).toHaveBeenCalledWith({
url: '/datasets',
params: { page: 1, limit: 10, keyword: 'query' },
})
expect(results).toHaveLength(1)
expect(results[0]).toMatchObject({
id: 'ds-1',
title: 'My Knowledge',
type: 'knowledge',
})
})
it('generates correct path for external provider', async () => {
const { fetchDatasets } = await import('@/service/datasets')
vi.mocked(fetchDatasets).mockResolvedValue({
data: [
{ id: 'ds-ext', name: 'External', description: '', provider: 'external', embedding_available: true } as unknown as DataSet,
],
has_more: false,
limit: 10,
page: 1,
total: 1,
})
const results = await knowledgeAction.search('@knowledge', '', 'en')
expect(results[0].path).toBe('/datasets/ds-ext/hitTesting')
})
it('generates correct path for non-external provider', async () => {
const { fetchDatasets } = await import('@/service/datasets')
vi.mocked(fetchDatasets).mockResolvedValue({
data: [
{ id: 'ds-2', name: 'Internal', description: '', provider: 'vendor', embedding_available: true } as unknown as DataSet,
],
has_more: false,
limit: 10,
page: 1,
total: 1,
})
const results = await knowledgeAction.search('@knowledge', '', 'en')
expect(results[0].path).toBe('/datasets/ds-2/documents')
})
it('returns empty array on API failure', async () => {
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
const { fetchDatasets } = await import('@/service/datasets')
vi.mocked(fetchDatasets).mockRejectedValue(new Error('fail'))
const results = await knowledgeAction.search('@knowledge', 'fail', 'en')
expect(results).toEqual([])
expect(warnSpy).toHaveBeenCalledWith('Knowledge search failed:', expect.any(Error))
warnSpy.mockRestore()
})
})