From 8c79ae448b72f9c5591c5e8887c57172b7d77766 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 14 Apr 2026 02:40:22 +0900 Subject: [PATCH 1/2] test({react,preact}-query/useMutation): add single callback tests for 'mutateAsync' --- .../src/__tests__/useMutation.test.tsx | 107 ++++++++++++++++++ .../src/__tests__/useMutation.test.tsx | 107 ++++++++++++++++++ 2 files changed, 214 insertions(+) diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 39e56cc3c5a..4185f10bc2d 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -369,6 +369,113 @@ describe('useMutation', () => { expect(callbacks).toEqual(['useMutation.onSettled', 'mutate.onSettled']) }) + it('should be able to call `onSuccess` callback after successful mutateAsync', async () => { + const callbacks: Array = [] + + function Page() { + const { mutateAsync } = useMutation({ + mutationFn: (text: string) => sleep(10).then(() => text), + onSuccess: () => { + callbacks.push('useMutation.onSuccess') + }, + }) + + useEffect(() => { + setActTimeout(async () => { + await mutateAsync('todo', { + onSuccess: () => { + callbacks.push('mutateAsync.onSuccess') + }, + }) + }, 0) + }, [mutateAsync]) + + return null + } + + renderWithClient(queryClient, ) + + await vi.advanceTimersByTimeAsync(10) + + expect(callbacks).toEqual([ + 'useMutation.onSuccess', + 'mutateAsync.onSuccess', + ]) + }) + + it('should be able to call `onError` callback after failed mutateAsync', async () => { + const callbacks: Array = [] + + function Page() { + const { mutateAsync } = useMutation({ + mutationFn: async (_text: string) => + sleep(10).then(() => { + throw new Error('oops') + }), + onError: () => { + callbacks.push('useMutation.onError') + }, + }) + + useEffect(() => { + setActTimeout(async () => { + try { + await mutateAsync('todo', { + onError: () => { + callbacks.push('mutateAsync.onError') + }, + }) + } catch {} + }, 0) + }, [mutateAsync]) + + return null + } + + renderWithClient(queryClient, ) + + await vi.advanceTimersByTimeAsync(10) + + expect(callbacks).toEqual([ + 'useMutation.onError', + 'mutateAsync.onError', + ]) + }) + + it('should be able to call `onSettled` callback after mutateAsync', async () => { + const callbacks: Array = [] + + function Page() { + const { mutateAsync } = useMutation({ + mutationFn: (text: string) => sleep(10).then(() => text), + onSettled: () => { + callbacks.push('useMutation.onSettled') + }, + }) + + useEffect(() => { + setActTimeout(async () => { + await mutateAsync('todo', { + onSettled: () => { + callbacks.push('mutateAsync.onSettled') + }, + }) + }, 0) + }, [mutateAsync]) + + return null + } + + renderWithClient(queryClient, ) + + await vi.advanceTimersByTimeAsync(10) + + expect(callbacks).toEqual([ + 'useMutation.onSettled', + 'mutateAsync.onSettled', + ]) + }) + it('should be able to override the useMutation success callbacks', async () => { const callbacks: Array = [] diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index b8deb78eed9..51646ec1da0 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -368,6 +368,113 @@ describe('useMutation', () => { expect(callbacks).toEqual(['useMutation.onSettled', 'mutate.onSettled']) }) + it('should be able to call `onSuccess` callback after successful mutateAsync', async () => { + const callbacks: Array = [] + + function Page() { + const { mutateAsync } = useMutation({ + mutationFn: (text: string) => sleep(10).then(() => text), + onSuccess: () => { + callbacks.push('useMutation.onSuccess') + }, + }) + + React.useEffect(() => { + setActTimeout(async () => { + await mutateAsync('todo', { + onSuccess: () => { + callbacks.push('mutateAsync.onSuccess') + }, + }) + }, 0) + }, [mutateAsync]) + + return null + } + + renderWithClient(queryClient, ) + + await vi.advanceTimersByTimeAsync(10) + + expect(callbacks).toEqual([ + 'useMutation.onSuccess', + 'mutateAsync.onSuccess', + ]) + }) + + it('should be able to call `onError` callback after failed mutateAsync', async () => { + const callbacks: Array = [] + + function Page() { + const { mutateAsync } = useMutation({ + mutationFn: async (_text: string) => + sleep(10).then(() => { + throw new Error('oops') + }), + onError: () => { + callbacks.push('useMutation.onError') + }, + }) + + React.useEffect(() => { + setActTimeout(async () => { + try { + await mutateAsync('todo', { + onError: () => { + callbacks.push('mutateAsync.onError') + }, + }) + } catch {} + }, 0) + }, [mutateAsync]) + + return null + } + + renderWithClient(queryClient, ) + + await vi.advanceTimersByTimeAsync(10) + + expect(callbacks).toEqual([ + 'useMutation.onError', + 'mutateAsync.onError', + ]) + }) + + it('should be able to call `onSettled` callback after mutateAsync', async () => { + const callbacks: Array = [] + + function Page() { + const { mutateAsync } = useMutation({ + mutationFn: (text: string) => sleep(10).then(() => text), + onSettled: () => { + callbacks.push('useMutation.onSettled') + }, + }) + + React.useEffect(() => { + setActTimeout(async () => { + await mutateAsync('todo', { + onSettled: () => { + callbacks.push('mutateAsync.onSettled') + }, + }) + }, 0) + }, [mutateAsync]) + + return null + } + + renderWithClient(queryClient, ) + + await vi.advanceTimersByTimeAsync(10) + + expect(callbacks).toEqual([ + 'useMutation.onSettled', + 'mutateAsync.onSettled', + ]) + }) + it('should be able to override the useMutation success callbacks', async () => { const callbacks: Array = [] From be99db14885aefb9352022f77e6fa13412a7b4a8 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 17:41:40 +0000 Subject: [PATCH 2/2] ci: apply automated fixes --- packages/preact-query/src/__tests__/useMutation.test.tsx | 5 +---- packages/react-query/src/__tests__/useMutation.test.tsx | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 4185f10bc2d..ff95c827e34 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -436,10 +436,7 @@ describe('useMutation', () => { await vi.advanceTimersByTimeAsync(10) - expect(callbacks).toEqual([ - 'useMutation.onError', - 'mutateAsync.onError', - ]) + expect(callbacks).toEqual(['useMutation.onError', 'mutateAsync.onError']) }) it('should be able to call `onSettled` callback after mutateAsync', async () => { diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index 51646ec1da0..4e077e89576 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -435,10 +435,7 @@ describe('useMutation', () => { await vi.advanceTimersByTimeAsync(10) - expect(callbacks).toEqual([ - 'useMutation.onError', - 'mutateAsync.onError', - ]) + expect(callbacks).toEqual(['useMutation.onError', 'mutateAsync.onError']) }) it('should be able to call `onSettled` callback after mutateAsync', async () => {