Files
dify/web/service/use-sandbox-file.spec.tsx
yyh 2b848d7e93 fix(workflow): prevent redundant sandbox download refetch after reset
Problem:\n- In variable inspect artifacts view, clicking Reset All invalidates sandbox download query keys.\n- If a previously selected file has been removed, the download-url query may still refetch with stale path and return 400.\n- Default query retry amplifies this into repeated failed requests in this scenario.\n\nSolution:\n- Extend sandbox file invalidation with an option to skip download query refetch.\n- Use that option in Reset All flow so download-url queries are marked stale without immediate refetch.\n- Derive selected file path from latest sandbox flat data and disable download-url query when file no longer exists.\n- Disable retry only for artifacts-tab download-url query to avoid repeated 400 retries in this path.\n- Align tree selectedPath with derived selectedFilePath and add hook tests for invalidation behavior.\n\nValidation:\n- pnpm vitest --run service/use-sandbox-file.spec.tsx
2026-02-07 22:43:13 +08:00

61 lines
2.0 KiB
TypeScript

import type { ReactNode } from 'react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { act, renderHook } from '@testing-library/react'
import { consoleQuery } from './client'
import { useInvalidateSandboxFiles } from './use-sandbox-file'
const createQueryClient = () => new QueryClient({
defaultOptions: {
queries: {
retry: false,
},
},
})
const createWrapper = (queryClient: QueryClient) => {
return ({ children }: { children: ReactNode }) => (
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
)
}
describe('useInvalidateSandboxFiles', () => {
it('should keep download query refetch enabled by default', async () => {
const queryClient = createQueryClient()
const invalidateSpy = vi.spyOn(queryClient, 'invalidateQueries').mockResolvedValue(undefined)
const { result } = renderHook(() => useInvalidateSandboxFiles(), {
wrapper: createWrapper(queryClient),
})
await act(async () => {
await result.current()
})
expect(invalidateSpy).toHaveBeenNthCalledWith(1, {
queryKey: consoleQuery.sandboxFile.listFiles.key(),
})
expect(invalidateSpy).toHaveBeenNthCalledWith(2, {
queryKey: consoleQuery.sandboxFile.downloadFile.key(),
})
})
it('should disable download query refetch when requested', async () => {
const queryClient = createQueryClient()
const invalidateSpy = vi.spyOn(queryClient, 'invalidateQueries').mockResolvedValue(undefined)
const { result } = renderHook(() => useInvalidateSandboxFiles(), {
wrapper: createWrapper(queryClient),
})
await act(async () => {
await result.current({ refetchDownloadFile: false })
})
expect(invalidateSpy).toHaveBeenNthCalledWith(1, {
queryKey: consoleQuery.sandboxFile.listFiles.key(),
})
expect(invalidateSpy).toHaveBeenNthCalledWith(2, {
queryKey: consoleQuery.sandboxFile.downloadFile.key(),
refetchType: 'none',
})
})
})