|
|
|
@@ -0,0 +1,84 @@ |
|
|
|
import { DataType } from '@/app/components/datasets/metadata/types' |
|
|
|
import { act, renderHook } from '@testing-library/react' |
|
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query' |
|
|
|
import { useBatchUpdateDocMetadata } from '@/service/knowledge/use-metadata' |
|
|
|
import { useDocumentListKey } from './use-document' |
|
|
|
|
|
|
|
// Mock the post function to avoid real network requests |
|
|
|
jest.mock('@/service/base', () => ({ |
|
|
|
post: jest.fn().mockResolvedValue({ success: true }), |
|
|
|
})) |
|
|
|
|
|
|
|
const NAME_SPACE = 'dataset-metadata' |
|
|
|
|
|
|
|
describe('useBatchUpdateDocMetadata', () => { |
|
|
|
let queryClient: QueryClient |
|
|
|
|
|
|
|
beforeEach(() => { |
|
|
|
// Create a fresh QueryClient before each test |
|
|
|
queryClient = new QueryClient() |
|
|
|
}) |
|
|
|
|
|
|
|
// Wrapper for React Query context |
|
|
|
const wrapper = ({ children }: { children: React.ReactNode }) => ( |
|
|
|
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider> |
|
|
|
) |
|
|
|
|
|
|
|
it('should correctly invalidate dataset and document caches', async () => { |
|
|
|
const { result } = renderHook(() => useBatchUpdateDocMetadata(), { wrapper }) |
|
|
|
|
|
|
|
// Spy on queryClient.invalidateQueries |
|
|
|
const invalidateSpy = jest.spyOn(queryClient, 'invalidateQueries') |
|
|
|
|
|
|
|
// Correct payload type: each document has its own metadata_list array |
|
|
|
|
|
|
|
const payload = { |
|
|
|
dataset_id: 'dataset-1', |
|
|
|
metadata_list: [ |
|
|
|
{ |
|
|
|
document_id: 'doc-1', |
|
|
|
metadata_list: [ |
|
|
|
{ key: 'title-1', id: '01', name: 'name-1', type: DataType.string, value: 'new title 01' }, |
|
|
|
], |
|
|
|
}, |
|
|
|
{ |
|
|
|
document_id: 'doc-2', |
|
|
|
metadata_list: [ |
|
|
|
{ key: 'title-2', id: '02', name: 'name-1', type: DataType.string, value: 'new title 02' }, |
|
|
|
], |
|
|
|
}, |
|
|
|
], |
|
|
|
} |
|
|
|
|
|
|
|
// Execute the mutation |
|
|
|
await act(async () => { |
|
|
|
await result.current.mutateAsync(payload) |
|
|
|
}) |
|
|
|
|
|
|
|
// Expect invalidateQueries to have been called exactly 5 times |
|
|
|
expect(invalidateSpy).toHaveBeenCalledTimes(5) |
|
|
|
|
|
|
|
// Dataset cache invalidation |
|
|
|
expect(invalidateSpy).toHaveBeenNthCalledWith(1, { |
|
|
|
queryKey: [NAME_SPACE, 'dataset', 'dataset-1'], |
|
|
|
}) |
|
|
|
|
|
|
|
// Document list cache invalidation |
|
|
|
expect(invalidateSpy).toHaveBeenNthCalledWith(2, { |
|
|
|
queryKey: [NAME_SPACE, 'document', 'dataset-1'], |
|
|
|
}) |
|
|
|
|
|
|
|
// useDocumentListKey cache invalidation |
|
|
|
expect(invalidateSpy).toHaveBeenNthCalledWith(3, { |
|
|
|
queryKey: [...useDocumentListKey, 'dataset-1'], |
|
|
|
}) |
|
|
|
|
|
|
|
// Single document cache invalidation |
|
|
|
expect(invalidateSpy.mock.calls.slice(3)).toEqual( |
|
|
|
expect.arrayContaining([ |
|
|
|
[{ queryKey: [NAME_SPACE, 'document', 'dataset-1', 'doc-1'] }], |
|
|
|
[{ queryKey: [NAME_SPACE, 'document', 'dataset-1', 'doc-2'] }], |
|
|
|
]), |
|
|
|
) |
|
|
|
}) |
|
|
|
}) |