diff --git a/web/service/__tests__/use-snippet-workflows.spec.tsx b/web/service/__tests__/use-snippet-workflows.spec.tsx new file mode 100644 index 0000000000..d39f27390b --- /dev/null +++ b/web/service/__tests__/use-snippet-workflows.spec.tsx @@ -0,0 +1,78 @@ +import type { ReactNode } from 'react' +import type { SnippetWorkflow } from '@/types/snippet' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { renderHook, waitFor } from '@testing-library/react' +import { get } from '../base' +import { useSnippetDraftWorkflow } from '../use-snippet-workflows' + +const { draftWorkflowQueryOptions } = vi.hoisted(() => ({ + draftWorkflowQueryOptions: vi.fn(), +})) + +vi.mock('../base', () => ({ + get: vi.fn(), +})) + +vi.mock('@/service/client', () => ({ + consoleQuery: { + snippets: { + draftWorkflow: { + queryOptions: draftWorkflowQueryOptions, + }, + }, + }, +})) + +const mockGet = vi.mocked(get) + +const createWrapper = () => { + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, + }) + + return ({ children }: { children: ReactNode }) => ( + {children} + ) +} + +describe('useSnippetDraftWorkflow', () => { + beforeEach(() => { + vi.clearAllMocks() + draftWorkflowQueryOptions.mockReturnValue({ + queryKey: ['console', 'snippets', 'draft-workflow', 'snippet-1'], + enabled: true, + queryFn: vi.fn(), + }) + }) + + it('should fetch the draft workflow silently during initialization', async () => { + const onSuccess = vi.fn() + const draftWorkflow = { + hash: 'draft-hash', + updated_at: 1_712_345_678, + } as SnippetWorkflow + + mockGet.mockResolvedValueOnce(draftWorkflow) + + const { result } = renderHook(() => useSnippetDraftWorkflow('snippet-1', onSuccess), { + wrapper: createWrapper(), + }) + + await waitFor(() => { + expect(result.current.data).toEqual(draftWorkflow) + }) + + expect(draftWorkflowQueryOptions).toHaveBeenCalledWith({ + input: { + params: { snippetId: 'snippet-1' }, + }, + enabled: true, + }) + expect(mockGet).toHaveBeenCalledWith('/snippets/snippet-1/workflows/draft', {}, { silent: true }) + expect(onSuccess).toHaveBeenCalledWith(draftWorkflow) + }) +}) diff --git a/web/service/use-snippet-workflows.ts b/web/service/use-snippet-workflows.ts index 4141097bed..8130e73752 100644 --- a/web/service/use-snippet-workflows.ts +++ b/web/service/use-snippet-workflows.ts @@ -1,6 +1,7 @@ import type { SnippetWorkflow } from '@/types/snippet' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { consoleQuery } from '@/service/client' +import { get } from './base' const isNotFoundError = (error: unknown) => { return !!error && typeof error === 'object' && 'status' in error && error.status === 404 @@ -47,9 +48,9 @@ export const useSnippetDraftWorkflow = ( return useQuery({ ...queryOptions, - queryFn: async (context) => { + queryFn: async () => { try { - const draftWorkflow = await queryOptions.queryFn(context) + const draftWorkflow = await get(`/snippets/${snippetId}/workflows/draft`, {}, { silent: true }) onSuccess?.(draftWorkflow) return draftWorkflow }