Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
import { QueryClient } from '@tanstack/query-core'
import { queryKey } from '@tanstack/query-test-utils'
import { LitElement } from 'lit'
import { describe, expectTypeOf, it } from 'vitest'
import { createInfiniteQueryController } from '../createInfiniteQueryController.js'
import type { InfiniteData } from '@tanstack/query-core'
import type { CreateInfiniteQueryOptions } from '../createInfiniteQueryController.js'

class Host extends LitElement {}

describe('pageParam', () => {
it('initialPageParam should define type of param passed to queryFunctionContext', () => {
createInfiniteQueryController(
new Host(),
{
queryKey: queryKey(),
queryFn: ({ pageParam }) => {
expectTypeOf(pageParam).toEqualTypeOf<number>()
},
initialPageParam: 1,
getNextPageParam: () => undefined,
},
new QueryClient(),
)
})

it('direction should be passed to queryFn of createInfiniteQueryController', () => {
createInfiniteQueryController(
new Host(),
{
queryKey: queryKey(),
queryFn: ({ direction }) => {
expectTypeOf(direction).toEqualTypeOf<'forward' | 'backward'>()
},
initialPageParam: 1,
getNextPageParam: () => undefined,
},
new QueryClient(),
)
})
})

describe('select', () => {
it('should still return paginated data if no select result', () => {
const infiniteQuery = createInfiniteQueryController(
new Host(),
{
queryKey: queryKey(),
queryFn: ({ pageParam }) => {
return pageParam * 5
},
initialPageParam: 1,
getNextPageParam: () => undefined,
},
new QueryClient(),
)

// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
expectTypeOf(infiniteQuery().data).toEqualTypeOf<
InfiniteData<number, unknown> | undefined
>()
})

it('should be able to transform data to arbitrary result', () => {
const infiniteQuery = createInfiniteQueryController(
new Host(),
{
queryKey: queryKey(),
queryFn: ({ pageParam }) => {
return pageParam * 5
},
initialPageParam: 1,
getNextPageParam: () => undefined,
select: (data) => {
expectTypeOf(data).toEqualTypeOf<InfiniteData<number, number>>()
return 'selected' as const
},
},
new QueryClient(),
)

expectTypeOf(infiniteQuery().data).toEqualTypeOf<'selected' | undefined>()
})
})

describe('getNextPageParam / getPreviousPageParam', () => {
it('should get typed params', () => {
const infiniteQuery = createInfiniteQueryController(
new Host(),
{
queryKey: queryKey(),
queryFn: ({ pageParam }) => {
return String(pageParam)
},
initialPageParam: 1,
getNextPageParam: (
lastPage,
allPages,
lastPageParam,
allPageParams,
) => {
expectTypeOf(lastPage).toEqualTypeOf<string>()
expectTypeOf(allPages).toEqualTypeOf<Array<string>>()
expectTypeOf(lastPageParam).toEqualTypeOf<number>()
expectTypeOf(allPageParams).toEqualTypeOf<Array<number>>()
return undefined
},
getPreviousPageParam: (
firstPage,
allPages,
firstPageParam,
allPageParams,
) => {
expectTypeOf(firstPage).toEqualTypeOf<string>()
expectTypeOf(allPages).toEqualTypeOf<Array<string>>()
expectTypeOf(firstPageParam).toEqualTypeOf<number>()
expectTypeOf(allPageParams).toEqualTypeOf<Array<number>>()
return undefined
},
},
new QueryClient(),
)

// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
expectTypeOf(infiniteQuery().data).toEqualTypeOf<
InfiniteData<string, unknown> | undefined
>()
})
})

describe('error booleans', () => {
it('should not be permanently `false`', () => {
const infiniteQuery = createInfiniteQueryController(
new Host(),
{
queryKey: queryKey(),
queryFn: ({ pageParam }) => {
return pageParam * 5
},
initialPageParam: 1,
getNextPageParam: () => undefined,
},
new QueryClient(),
)
const {
isFetchNextPageError,
isFetchPreviousPageError,
isLoadingError,
isRefetchError,
} = infiniteQuery()

expectTypeOf(isFetchNextPageError).toEqualTypeOf<boolean>()
expectTypeOf(isFetchPreviousPageError).toEqualTypeOf<boolean>()
expectTypeOf(isLoadingError).toEqualTypeOf<boolean>()
expectTypeOf(isRefetchError).toEqualTypeOf<boolean>()
})
})

describe('CreateInfiniteQueryOptions', () => {
it('should default TData to InfiniteData<TQueryFnData>', () => {
const options: CreateInfiniteQueryOptions<number, Error> = {
queryKey: queryKey(),
queryFn: () => 5,
initialPageParam: 1,
getNextPageParam: () => undefined,
}
const infiniteQuery = createInfiniteQueryController(
new Host(),
options,
new QueryClient(),
)

expectTypeOf(infiniteQuery().data).toEqualTypeOf<
InfiniteData<number, unknown> | undefined
>()
})
})
Loading