From f4ff8407d30020bf5b7efd9661a5417f7ad68d6c Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 13 Apr 2026 11:42:05 +0900 Subject: [PATCH] test(vue-query/mutationOptions): add 'queryClient.isMutating' tests for getter overloads --- .../src/__tests__/mutationOptions.test.ts | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/packages/vue-query/src/__tests__/mutationOptions.test.ts b/packages/vue-query/src/__tests__/mutationOptions.test.ts index cf73ac686de..0c1bb4608ad 100644 --- a/packages/vue-query/src/__tests__/mutationOptions.test.ts +++ b/packages/vue-query/src/__tests__/mutationOptions.test.ts @@ -350,6 +350,135 @@ describe('mutationOptions', () => { unsubscribe() }) + it('should return the number of fetching mutations when used with queryClient.isMutating (getter with mutationKey in mutationOptions)', async () => { + const isMutatingArray: Array = [] + const queryClient = useQueryClient() + const mutationOpts = mutationOptions(() => ({ + mutationKey: ['mutation'], + mutationFn: () => sleep(500).then(() => 'data'), + })) + + const { mutate } = useMutation(mutationOpts) + + const resolvedOpts = mutationOpts() + + const mutationCache = queryClient.getMutationCache() + const unsubscribe = mutationCache.subscribe(() => { + isMutatingArray.push(queryClient.isMutating(resolvedOpts)) + }) + + isMutatingArray.push(queryClient.isMutating(resolvedOpts)) + + mutate() + await vi.advanceTimersByTimeAsync(0) + // Use Math.max because subscribe callback count is implementation-dependent + expect(Math.max(...isMutatingArray)).toEqual(1) + await vi.advanceTimersByTimeAsync(500) + expect(isMutatingArray[isMutatingArray.length - 1]).toEqual(0) + + unsubscribe() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating (getter without mutationKey in mutationOptions)', async () => { + const isMutatingArray: Array = [] + const queryClient = useQueryClient() + const mutationOpts = mutationOptions(() => ({ + mutationFn: () => sleep(500).then(() => 'data'), + })) + + const { mutate } = useMutation(mutationOpts) + + const mutationCache = queryClient.getMutationCache() + const unsubscribe = mutationCache.subscribe(() => { + isMutatingArray.push(queryClient.isMutating()) + }) + + isMutatingArray.push(queryClient.isMutating()) + + mutate() + await vi.advanceTimersByTimeAsync(0) + // Use Math.max because subscribe callback count is implementation-dependent + expect(Math.max(...isMutatingArray)).toEqual(1) + await vi.advanceTimersByTimeAsync(500) + expect(isMutatingArray[isMutatingArray.length - 1]).toEqual(0) + + unsubscribe() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating (getter)', async () => { + const isMutatingArray: Array = [] + const queryClient = useQueryClient() + const mutationOpts1 = mutationOptions(() => ({ + mutationKey: ['mutation'], + mutationFn: () => sleep(500).then(() => 'data1'), + })) + const mutationOpts2 = mutationOptions(() => ({ + mutationFn: () => sleep(500).then(() => 'data2'), + })) + + const { mutate: mutate1 } = useMutation(mutationOpts1) + const { mutate: mutate2 } = useMutation(mutationOpts2) + + const mutationCache = queryClient.getMutationCache() + const unsubscribe = mutationCache.subscribe(() => { + isMutatingArray.push(queryClient.isMutating()) + }) + + isMutatingArray.push(queryClient.isMutating()) + + mutate1() + mutate2() + await vi.advanceTimersByTimeAsync(0) + // Use Math.max because subscribe callback count is implementation-dependent + expect(Math.max(...isMutatingArray)).toEqual(2) + await vi.advanceTimersByTimeAsync(500) + expect(isMutatingArray[isMutatingArray.length - 1]).toEqual(0) + + unsubscribe() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating (getter, filter mutationOpts1.mutationKey)', async () => { + const isMutatingArray: Array = [] + const queryClient = useQueryClient() + const mutationOpts1 = mutationOptions(() => ({ + mutationKey: ['mutation'], + mutationFn: () => sleep(500).then(() => 'data1'), + })) + const mutationOpts2 = mutationOptions(() => ({ + mutationFn: () => sleep(500).then(() => 'data2'), + })) + + const resolvedOpts1 = mutationOpts1() + + const { mutate: mutate1 } = useMutation(mutationOpts1) + const { mutate: mutate2 } = useMutation(mutationOpts2) + + const mutationCache = queryClient.getMutationCache() + const unsubscribe = mutationCache.subscribe(() => { + isMutatingArray.push( + queryClient.isMutating({ + mutationKey: resolvedOpts1.mutationKey, + }), + ) + }) + + isMutatingArray.push( + queryClient.isMutating({ + mutationKey: resolvedOpts1.mutationKey, + }), + ) + + mutate1() + mutate2() + await vi.advanceTimersByTimeAsync(0) + // Use Math.max because subscribe callback count is implementation-dependent + expect(Math.max(...isMutatingArray)).toEqual(1) + await vi.advanceTimersByTimeAsync(500) + expect(isMutatingArray[isMutatingArray.length - 1]).toEqual(0) + + unsubscribe() + }) + it('should return mutation states when used with useMutationState (with mutationKey in mutationOptions)', async () => { const mutationOpts = mutationOptions({ mutationKey: ['mutation'],