From f4ee2f93160f295643c3f39dc7885fb819368973 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 14 Apr 2026 04:13:59 +0900 Subject: [PATCH 1/2] test({react,preact}-query/useMutation): add conditional handling and retry tests using 'mutate' callbacks --- .../src/__tests__/useMutation.test.tsx | 103 ++++++++++++++++++ .../src/__tests__/useMutation.test.tsx | 103 ++++++++++++++++++ 2 files changed, 206 insertions(+) diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 21384391cb..54664c50f6 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -1979,4 +1979,107 @@ 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 fa21f16e58..554ce6cbc9 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -1978,4 +1978,107 @@ 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() + }) }) From 9a98500252f711ff30c6751f12f4007d2bc7386a Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 19:15:32 +0000 Subject: [PATCH 2/2] ci: apply automated fixes --- .../preact-query/src/__tests__/useMutation.test.tsx | 12 +++++++++--- .../react-query/src/__tests__/useMutation.test.tsx | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 54664c50f6..285c47cff4 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -2027,12 +2027,16 @@ describe('useMutation', () => { fireEvent.click(rendered.getByRole('button', { name: /^submit$/i })) await vi.advanceTimersByTimeAsync(11) - expect(rendered.getByText('message: success: submitted successfully')).toBeInTheDocument() + 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() + expect( + rendered.getByText('message: error: submission failed'), + ).toBeInTheDocument() }) it('should handle conditional error with retry using mutate', async () => { @@ -2075,7 +2079,9 @@ describe('useMutation', () => { fireEvent.click(rendered.getByRole('button', { name: /submit/i })) await vi.advanceTimersByTimeAsync(11) - expect(rendered.getByText('message: failed, retrying...')).toBeInTheDocument() + expect( + rendered.getByText('message: failed, retrying...'), + ).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /submit/i })) await vi.advanceTimersByTimeAsync(11) diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index 554ce6cbc9..cf24c29ebd 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -2026,12 +2026,16 @@ describe('useMutation', () => { fireEvent.click(rendered.getByRole('button', { name: /^submit$/i })) await vi.advanceTimersByTimeAsync(11) - expect(rendered.getByText('message: success: submitted successfully')).toBeInTheDocument() + 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() + expect( + rendered.getByText('message: error: submission failed'), + ).toBeInTheDocument() }) it('should handle conditional error with retry using mutate', async () => { @@ -2074,7 +2078,9 @@ describe('useMutation', () => { fireEvent.click(rendered.getByRole('button', { name: /submit/i })) await vi.advanceTimersByTimeAsync(11) - expect(rendered.getByText('message: failed, retrying...')).toBeInTheDocument() + expect( + rendered.getByText('message: failed, retrying...'), + ).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /submit/i })) await vi.advanceTimersByTimeAsync(11)