From adb018558096ec8e809f05337fc2cccb16527818 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 14 Apr 2026 13:39:52 +0900 Subject: [PATCH] test(solid-query/useMutation): add type tests for generic type inference and callbacks --- .../src/__tests__/useMutation.test-d.tsx | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 packages/solid-query/src/__tests__/useMutation.test-d.tsx diff --git a/packages/solid-query/src/__tests__/useMutation.test-d.tsx b/packages/solid-query/src/__tests__/useMutation.test-d.tsx new file mode 100644 index 0000000000..9bc689ea9b --- /dev/null +++ b/packages/solid-query/src/__tests__/useMutation.test-d.tsx @@ -0,0 +1,138 @@ +import { describe, expectTypeOf, it } from 'vitest' +import { useMutation } from '../useMutation' +import { QueryClient } from '../QueryClient' +import type { DefaultError } from '@tanstack/query-core' +import type { UseMutationResult } from '../types' + +describe('useMutation', () => { + it('should infer TData from mutationFn return type', () => { + const mutation = useMutation(() => ({ + mutationFn: () => Promise.resolve('data'), + })) + + expectTypeOf(mutation.data).toEqualTypeOf() + expectTypeOf(mutation.error).toEqualTypeOf() + }) + + it('should infer TVariables from mutationFn parameter', () => { + const mutation = useMutation(() => ({ + mutationFn: (vars: { id: string }) => Promise.resolve(vars.id), + })) + + expectTypeOf(mutation.mutate).toBeCallableWith({ id: '1' }) + expectTypeOf(mutation.data).toEqualTypeOf() + }) + + it('should infer TOnMutateResult from onMutate return type', () => { + useMutation(() => ({ + mutationFn: () => Promise.resolve('data'), + onMutate: () => { + return { token: 'abc' } + }, + onSuccess: (_data, _variables, onMutateResult) => { + expectTypeOf(onMutateResult).toEqualTypeOf<{ token: string }>() + }, + onError: (_error, _variables, onMutateResult) => { + expectTypeOf(onMutateResult).toEqualTypeOf< + { token: string } | undefined + >() + }, + })) + }) + + it('should allow explicit generic types', () => { + const mutation = useMutation(() => ({ + mutationFn: (vars) => { + expectTypeOf(vars).toEqualTypeOf<{ id: number }>() + return Promise.resolve('result') + }, + })) + + expectTypeOf(mutation.data).toEqualTypeOf() + expectTypeOf(mutation.error).toEqualTypeOf() + }) + + it('should return correct UseMutationResult type', () => { + const mutation = useMutation(() => ({ + mutationFn: () => Promise.resolve(42), + })) + + expectTypeOf(mutation).toEqualTypeOf< + UseMutationResult + >() + }) + + it('should type mutateAsync with correct return type', () => { + const mutation = useMutation(() => ({ + mutationFn: (id: string) => Promise.resolve(id.length), + })) + + expectTypeOf(mutation.mutateAsync).toBeCallableWith('test') + expectTypeOf(mutation.mutateAsync('test')).toEqualTypeOf>() + }) + + it('should default TVariables to void when mutationFn has no parameters', () => { + const mutation = useMutation(() => ({ + mutationFn: () => Promise.resolve('data'), + })) + + expectTypeOf(mutation.mutate).toBeCallableWith() + }) + + it('should infer custom TError type', () => { + class CustomError extends Error { + code: number + constructor(code: number) { + super() + this.code = code + } + } + + const mutation = useMutation(() => ({ + mutationFn: () => Promise.resolve('data'), + })) + + expectTypeOf(mutation.error).toEqualTypeOf() + expectTypeOf(mutation.data).toEqualTypeOf() + }) + + it('should infer types for onSettled callback', () => { + useMutation(() => ({ + mutationFn: () => Promise.resolve(42), + onSettled: (data, error, _variables, _onMutateResult) => { + expectTypeOf(data).toEqualTypeOf() + expectTypeOf(error).toEqualTypeOf() + }, + })) + }) + + it('should infer custom TError in onError callback', () => { + class CustomError extends Error { + code: number + constructor(code: number) { + super() + this.code = code + } + } + + useMutation(() => ({ + mutationFn: () => Promise.resolve('data'), + onError: (error) => { + expectTypeOf(error).toEqualTypeOf() + }, + })) + }) + + it('should accept queryClient as second argument', () => { + const queryClient = new QueryClient() + + const mutation = useMutation( + () => ({ + mutationFn: () => Promise.resolve('data'), + }), + () => queryClient, + ) + + expectTypeOf(mutation.data).toEqualTypeOf() + }) +})