diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 21384391cb7..285c47cff45 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -1979,4 +1979,113 @@ describe('useMutation', () => { rendered.getByText('result: error: create failed'), ).toBeInTheDocument() }) + + it('should handle conditional logic based on mutate success or failure', async () => { + function Page() { + const [message, setMessage] = useState('idle') + + const submitMutation = useMutation({ + mutationFn: async (shouldFail: boolean) => { + await sleep(10) + if (shouldFail) { + throw new Error('submission failed') + } + return 'submitted successfully' + }, + retry: false, + }) + + return ( +
+ + +
message: {message}
+
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + fireEvent.click(rendered.getByRole('button', { name: /^submit$/i })) + await vi.advanceTimersByTimeAsync(11) + + expect( + rendered.getByText('message: success: submitted successfully'), + ).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /submit fail/i })) + await vi.advanceTimersByTimeAsync(11) + + expect( + rendered.getByText('message: error: submission failed'), + ).toBeInTheDocument() + }) + + it('should handle conditional error with retry using mutate', async () => { + let attempt = 0 + + function Page() { + const [message, setMessage] = useState('idle') + + const submitMutation = useMutation({ + mutationFn: async () => { + await sleep(10) + attempt++ + if (attempt < 2) { + throw new Error('temporary failure') + } + return 'success' + }, + retry: false, + }) + + return ( +
+ +
message: {message}
+
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + fireEvent.click(rendered.getByRole('button', { name: /submit/i })) + await vi.advanceTimersByTimeAsync(11) + + expect( + rendered.getByText('message: failed, retrying...'), + ).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /submit/i })) + await vi.advanceTimersByTimeAsync(11) + + expect(rendered.getByText('message: result: success')).toBeInTheDocument() + }) }) diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index fa21f16e588..cf24c29ebd9 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -1978,4 +1978,113 @@ describe('useMutation', () => { rendered.getByText('result: error: create failed'), ).toBeInTheDocument() }) + + it('should handle conditional logic based on mutate success or failure', async () => { + function Page() { + const [message, setMessage] = React.useState('idle') + + const submitMutation = useMutation({ + mutationFn: async (shouldFail: boolean) => { + await sleep(10) + if (shouldFail) { + throw new Error('submission failed') + } + return 'submitted successfully' + }, + retry: false, + }) + + return ( +
+ + +
message: {message}
+
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + fireEvent.click(rendered.getByRole('button', { name: /^submit$/i })) + await vi.advanceTimersByTimeAsync(11) + + expect( + rendered.getByText('message: success: submitted successfully'), + ).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /submit fail/i })) + await vi.advanceTimersByTimeAsync(11) + + expect( + rendered.getByText('message: error: submission failed'), + ).toBeInTheDocument() + }) + + it('should handle conditional error with retry using mutate', async () => { + let attempt = 0 + + function Page() { + const [message, setMessage] = React.useState('idle') + + const submitMutation = useMutation({ + mutationFn: async () => { + await sleep(10) + attempt++ + if (attempt < 2) { + throw new Error('temporary failure') + } + return 'success' + }, + retry: false, + }) + + return ( +
+ +
message: {message}
+
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + fireEvent.click(rendered.getByRole('button', { name: /submit/i })) + await vi.advanceTimersByTimeAsync(11) + + expect( + rendered.getByText('message: failed, retrying...'), + ).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /submit/i })) + await vi.advanceTimersByTimeAsync(11) + + expect(rendered.getByText('message: result: success')).toBeInTheDocument() + }) })