@@ -820,4 +820,67 @@ describe('useMutation', () => {
820820 expect ( onSuccessMutate ) . toHaveBeenCalledTimes ( 0 )
821821 expect ( onSettledMutate ) . toHaveBeenCalledTimes ( 0 )
822822 } )
823+
824+ it ( 'should call mutate callbacks only for the last observer' , async ( ) => {
825+ const onSuccess = jest . fn ( )
826+ const onSuccessMutate = jest . fn ( )
827+ const onSettled = jest . fn ( )
828+ const onSettledMutate = jest . fn ( )
829+ let count = 0
830+
831+ function Page ( ) {
832+ const mutation = useMutation (
833+ async ( _text : string ) => {
834+ count ++
835+ await sleep ( 10 )
836+ return `result${ count } `
837+ } ,
838+ {
839+ onSuccess,
840+ onSettled,
841+ }
842+ )
843+
844+ return (
845+ < div >
846+ < button
847+ onClick = { ( ) =>
848+ mutation . mutate ( 'todo' , {
849+ onSuccess : onSuccessMutate ,
850+ onSettled : onSettledMutate ,
851+ } )
852+ }
853+ >
854+ mutate
855+ </ button >
856+ < div >
857+ data: { mutation . data ?? 'null' } , status: { mutation . status }
858+ </ div >
859+ </ div >
860+ )
861+ }
862+
863+ const rendered = renderWithClient ( queryClient , < Page /> )
864+
865+ await rendered . findByText ( 'data: null, status: idle' )
866+
867+ rendered . getByRole ( 'button' , { name : / m u t a t e / i } ) . click ( )
868+ rendered . getByRole ( 'button' , { name : / m u t a t e / i } ) . click ( )
869+
870+ await rendered . findByText ( 'data: result2, status: success' )
871+
872+ expect ( count ) . toBe ( 2 )
873+
874+ expect ( onSuccess ) . toHaveBeenCalledTimes ( 2 )
875+ expect ( onSettled ) . toHaveBeenCalledTimes ( 2 )
876+ expect ( onSuccessMutate ) . toHaveBeenCalledTimes ( 1 )
877+ expect ( onSuccessMutate ) . toHaveBeenCalledWith ( 'result2' , 'todo' , undefined )
878+ expect ( onSettledMutate ) . toHaveBeenCalledTimes ( 1 )
879+ expect ( onSettledMutate ) . toHaveBeenCalledWith (
880+ 'result2' ,
881+ null ,
882+ 'todo' ,
883+ undefined
884+ )
885+ } )
823886} )
0 commit comments