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 }) => ( {children} ) 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'] }], ]), ) }) })