UNPKG

@tanstack/vue-query

Version:

Hooks for managing, caching and syncing asynchronous and remote data in Vue

154 lines (129 loc) 4.21 kB
import { describe, it } from 'vitest' import { reactive } from 'vue' import { useQueries } from '..' import { queryOptions } from '../queryOptions' import { doNotExecute } from './test-utils' import type { UseQueryOptions } from '../useQuery' import type { Equal, Expect } from './test-utils' describe('UseQueries config object overload', () => { it('TData should always be defined when initialData is provided as an object', () => { const query1 = { queryKey: ['key1'], queryFn: () => { return { wow: true, } }, initialData: { wow: false, }, } const query2 = queryOptions({ queryKey: ['key2'], queryFn: () => 'Query Data', initialData: 'initial data', }) const query3 = { queryKey: ['key2'], queryFn: () => 'Query Data', } doNotExecute(() => { const { value: queriesState } = useQueries({ queries: [query1, query2, query3], }) const query1Data = queriesState[0].data const query2Data = queriesState[1].data const query3Data = queriesState[2].data const result1: Expect<Equal<{ wow: boolean }, typeof query1Data>> = true const result2: Expect<Equal<string, typeof query2Data>> = true const result3: Expect<Equal<string | undefined, typeof query3Data>> = true return result1 && result2 && result3 }) }) it('TData should be defined when passed through queryOptions', () => { doNotExecute(() => { const options = queryOptions({ queryKey: ['key'], queryFn: () => { return { wow: true, } }, initialData: { wow: true, }, }) const { value: queriesState } = useQueries({ queries: [options] }) const data = queriesState[0].data const result: Expect<Equal<{ wow: boolean }, typeof data>> = true return result }) }) it('it should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQueries', () => { doNotExecute(() => { const query1 = queryOptions({ queryKey: ['key'], queryFn: () => Promise.resolve(1), select: (data) => data > 1, }) const query2 = { queryKey: ['key'], queryFn: () => Promise.resolve(1), select: (data: any) => data > 1, } const queriesState = reactive(useQueries({ queries: [query1, query2] })) const query1Data = queriesState.value[0].data const query2Data = queriesState.value[1].data const result1: Expect<Equal<boolean | undefined, typeof query1Data>> = true const result2: Expect<Equal<boolean | undefined, typeof query2Data>> = true return result1 && result2 }) }) it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => { doNotExecute(() => { const { value: queriesState } = useQueries({ queries: [ { queryKey: ['key'], queryFn: () => { return { wow: true, } }, initialData: () => undefined as { wow: boolean } | undefined, }, ], }) const data = queriesState[0].data const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> = true return result }) }) describe('custom hook', () => { it('should allow custom hooks using UseQueryOptions', () => { doNotExecute(() => { type Data = string const useCustomQueries = ( options?: Omit<UseQueryOptions<Data>, 'queryKey' | 'queryFn'>, ) => { return useQueries({ queries: [ { ...options, queryKey: ['todos-key'], queryFn: () => Promise.resolve('data'), }, ], }) } const { value: queriesState } = useCustomQueries() const data = queriesState[0].data const result: Expect<Equal<Data | undefined, typeof data>> = true return result }) }) }) })