@@ -820,4 +820,67 @@ describe('useMutation', () => {
820
820
expect ( onSuccessMutate ) . toHaveBeenCalledTimes ( 0 )
821
821
expect ( onSettledMutate ) . toHaveBeenCalledTimes ( 0 )
822
822
} )
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
+ } )
823
886
} )
0 commit comments