diff --git a/codecov.yml b/codecov.yml index 3547af3b6b..ef21589e00 100644 --- a/codecov.yml +++ b/codecov.yml @@ -59,6 +59,10 @@ component_management: name: '@tanstack/query-sync-storage-persister' paths: - packages/query-sync-storage-persister/** + - component_id: query-test-utils + name: '@tanstack/query-test-utils' + paths: + - packages/query-test-utils/** - component_id: react-query name: '@tanstack/react-query' paths: diff --git a/package.json b/package.json index 54e95c533b..0b6e2ea90c 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "@tanstack/query-devtools": "workspace:*", "@tanstack/query-persist-client-core": "workspace:*", "@tanstack/query-sync-storage-persister": "workspace:*", + "@tanstack/query-test-utils": "workspace:*", "@tanstack/react-query": "workspace:*", "@tanstack/react-query-devtools": "workspace:*", "@tanstack/react-query-next-experimental": "workspace:*", diff --git a/packages/angular-query-experimental/package.json b/packages/angular-query-experimental/package.json index bf086e02c7..e1a9d13dbe 100644 --- a/packages/angular-query-experimental/package.json +++ b/packages/angular-query-experimental/package.json @@ -74,6 +74,7 @@ "@angular/core": "^19.2.4", "@angular/platform-browser": "^19.2.4", "@angular/platform-browser-dynamic": "^19.2.4", + "@tanstack/query-test-utils": "workspace:*", "eslint-plugin-jsdoc": "^50.5.0", "npm-run-all2": "^5.0.0" }, diff --git a/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test-d.ts b/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test-d.ts index 047da657e2..f07e0ded24 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test-d.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test-d.ts @@ -1,8 +1,8 @@ import { TestBed } from '@angular/core/testing' import { afterEach, beforeEach, describe, expectTypeOf, test, vi } from 'vitest' import { provideExperimentalZonelessChangeDetection } from '@angular/core' +import { sleep } from '@tanstack/query-test-utils' import { QueryClient, injectInfiniteQuery, provideTanStackQuery } from '..' -import { infiniteFetcher } from './test-utils' import type { InfiniteData } from '@tanstack/query-core' describe('injectInfiniteQuery', () => { @@ -27,7 +27,8 @@ describe('injectInfiniteQuery', () => { const query = TestBed.runInInjectionContext(() => { return injectInfiniteQuery(() => ({ queryKey: ['infiniteQuery'], - queryFn: infiniteFetcher, + queryFn: ({ pageParam }) => + sleep(0).then(() => 'data on page ' + pageParam), initialPageParam: 0, getNextPageParam: () => 12, })) diff --git a/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test.ts b/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test.ts index 6c7c8d1d51..5b4f6222d8 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-infinite-query.test.ts @@ -4,8 +4,9 @@ import { Injector, provideExperimentalZonelessChangeDetection, } from '@angular/core' +import { sleep } from '@tanstack/query-test-utils' import { QueryClient, injectInfiniteQuery, provideTanStackQuery } from '..' -import { expectSignals, infiniteFetcher } from './test-utils' +import { expectSignals } from './test-utils' const QUERY_DURATION = 1000 @@ -33,7 +34,8 @@ describe('injectInfiniteQuery', () => { const query = TestBed.runInInjectionContext(() => { return injectInfiniteQuery(() => ({ queryKey: ['infiniteQuery'], - queryFn: infiniteFetcher, + queryFn: ({ pageParam }) => + sleep(0).then(() => 'data on page ' + pageParam), initialPageParam: 0, getNextPageParam: () => 12, })) @@ -72,7 +74,8 @@ describe('injectInfiniteQuery', () => { expect(() => { injectInfiniteQuery(() => ({ queryKey: ['injectionContextError'], - queryFn: infiniteFetcher, + queryFn: ({ pageParam }) => + sleep(0).then(() => 'data on page ' + pageParam), initialPageParam: 0, getNextPageParam: () => 12, })) @@ -83,7 +86,8 @@ describe('injectInfiniteQuery', () => { const query = injectInfiniteQuery( () => ({ queryKey: ['manualInjector'], - queryFn: infiniteFetcher, + queryFn: ({ pageParam }) => + sleep(0).then(() => 'data on page ' + pageParam), initialPageParam: 0, getNextPageParam: () => 12, }), diff --git a/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts b/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts index 1e42ddc124..fb21f8614d 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts @@ -4,13 +4,13 @@ import { Injector, provideExperimentalZonelessChangeDetection, } from '@angular/core' +import { sleep } from '@tanstack/query-test-utils' import { QueryClient, injectIsFetching, injectQuery, provideTanStackQuery, } from '..' -import { delayedFetcher } from './test-utils' const QUERY_DURATION = 100 @@ -39,7 +39,7 @@ describe('injectIsFetching', () => { const isFetching = TestBed.runInInjectionContext(() => { injectQuery(() => ({ queryKey: ['isFetching1'], - queryFn: delayedFetcher(100), + queryFn: () => sleep(100).then(() => 'Some data'), })) return injectIsFetching() }) diff --git a/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts b/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts index 73a3ce5f24..4b7ed85f73 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts @@ -4,13 +4,13 @@ import { Injector, provideExperimentalZonelessChangeDetection, } from '@angular/core' +import { sleep } from '@tanstack/query-test-utils' import { QueryClient, injectIsMutating, injectMutation, provideTanStackQuery, } from '..' -import { successMutator } from './test-utils' describe('injectIsMutating', () => { let queryClient: QueryClient @@ -36,7 +36,7 @@ describe('injectIsMutating', () => { const isMutating = injectIsMutating() const mutation = injectMutation(() => ({ mutationKey: ['isMutating1'], - mutationFn: successMutator<{ par1: string }>, + mutationFn: (params: { par1: string }) => sleep(0).then(() => params), })) expect(isMutating()).toBe(0) diff --git a/packages/angular-query-experimental/src/__tests__/inject-mutation-state.test.ts b/packages/angular-query-experimental/src/__tests__/inject-mutation-state.test.ts index 44e6eeab90..e5a78d6d22 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-mutation-state.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-mutation-state.test.ts @@ -8,13 +8,14 @@ import { import { TestBed } from '@angular/core/testing' import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { By } from '@angular/platform-browser' +import { sleep } from '@tanstack/query-test-utils' import { QueryClient, injectMutation, injectMutationState, provideTanStackQuery, } from '..' -import { setFixtureSignalInputs, successMutator } from './test-utils' +import { setFixtureSignalInputs } from './test-utils' describe('injectMutationState', () => { let queryClient: QueryClient @@ -42,7 +43,7 @@ describe('injectMutationState', () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ mutationKey: mutationKey, - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) @@ -68,11 +69,11 @@ describe('injectMutationState', () => { return [ injectMutation(() => ({ mutationKey: mutationKey1, - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })), injectMutation(() => ({ mutationKey: mutationKey2, - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })), ] }) @@ -103,7 +104,7 @@ describe('injectMutationState', () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ mutationKey: mutationKey, - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) diff --git a/packages/angular-query-experimental/src/__tests__/inject-mutation.test-d.ts b/packages/angular-query-experimental/src/__tests__/inject-mutation.test-d.ts index b3aa0a96dc..f331bb02de 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-mutation.test-d.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-mutation.test-d.ts @@ -1,12 +1,12 @@ import { describe, expectTypeOf, test } from 'vitest' +import { sleep } from '@tanstack/query-test-utils' import { injectMutation } from '..' -import { successMutator } from './test-utils' import type { Signal } from '@angular/core' describe('Discriminated union return type', () => { test('data should be possibly undefined by default', () => { const mutation = injectMutation(() => ({ - mutationFn: successMutator, + mutationFn: () => sleep(0).then(() => 'string'), })) expectTypeOf(mutation.data).toEqualTypeOf>() @@ -14,7 +14,7 @@ describe('Discriminated union return type', () => { test('data should be defined when mutation is success', () => { const mutation = injectMutation(() => ({ - mutationFn: successMutator, + mutationFn: () => sleep(0).then(() => 'string'), })) if (mutation.isSuccess()) { @@ -24,7 +24,7 @@ describe('Discriminated union return type', () => { test('error should be null when mutation is success', () => { const mutation = injectMutation(() => ({ - mutationFn: successMutator, + mutationFn: () => sleep(0).then(() => 'string'), })) if (mutation.isSuccess()) { @@ -34,7 +34,7 @@ describe('Discriminated union return type', () => { test('data should be undefined when mutation is pending', () => { const mutation = injectMutation(() => ({ - mutationFn: successMutator, + mutationFn: () => sleep(0).then(() => 'string'), })) if (mutation.isPending()) { @@ -44,7 +44,7 @@ describe('Discriminated union return type', () => { test('error should be defined when mutation is error', () => { const mutation = injectMutation(() => ({ - mutationFn: successMutator, + mutationFn: () => sleep(0).then(() => 'string'), })) if (mutation.isError()) { @@ -54,7 +54,7 @@ describe('Discriminated union return type', () => { test('should narrow variables', () => { const mutation = injectMutation(() => ({ - mutationFn: successMutator, + mutationFn: (_variables: string) => sleep(0).then(() => 'string'), })) if (mutation.isIdle()) { diff --git a/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts b/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts index f595095c81..eeb0c7cc12 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts @@ -8,13 +8,9 @@ import { import { TestBed } from '@angular/core/testing' import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { By } from '@angular/platform-browser' +import { sleep } from '@tanstack/query-test-utils' import { QueryClient, injectMutation, provideTanStackQuery } from '..' -import { - errorMutator, - expectSignals, - setFixtureSignalInputs, - successMutator, -} from './test-utils' +import { expectSignals, setFixtureSignalInputs } from './test-utils' const MUTATION_DURATION = 1000 @@ -41,7 +37,7 @@ describe('injectMutation', () => { test('should be in idle state initially', () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params) => successMutator(params), + mutationFn: (params) => sleep(0).then(() => params), })) }) @@ -58,7 +54,7 @@ describe('injectMutation', () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) @@ -80,11 +76,12 @@ describe('injectMutation', () => { test('should return error when request fails', async () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: errorMutator, + mutationFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), })) }) - mutation.mutate({}) + mutation.mutate() await resolveMutations() @@ -102,7 +99,7 @@ describe('injectMutation', () => { const result = 'Mock data' const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) @@ -128,7 +125,7 @@ describe('injectMutation', () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ mutationKey: mutationKey(), - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) @@ -144,11 +141,12 @@ describe('injectMutation', () => { test('should reset state after invoking mutation.reset', async () => { const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => errorMutator(params), + mutationFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), })) }) - mutation.mutate('') + mutation.mutate() await resolveMutations() @@ -177,7 +175,7 @@ describe('injectMutation', () => { const onMutate = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), onMutate, })) }) @@ -193,7 +191,8 @@ describe('injectMutation', () => { const onError = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => errorMutator(params), + mutationFn: (_params: string) => + sleep(0).then(() => Promise.reject(new Error('Some error'))), onError, })) }) @@ -209,7 +208,7 @@ describe('injectMutation', () => { const onSuccess = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), onSuccess, })) }) @@ -225,7 +224,7 @@ describe('injectMutation', () => { const onSettled = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), onSettled, })) }) @@ -241,7 +240,8 @@ describe('injectMutation', () => { const onError = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => errorMutator(params), + mutationFn: (_params: string) => + sleep(0).then(() => Promise.reject(new Error('Some error'))), })) }) @@ -256,7 +256,7 @@ describe('injectMutation', () => { const onSuccess = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) @@ -271,7 +271,7 @@ describe('injectMutation', () => { const onSettled = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), })) }) @@ -287,7 +287,7 @@ describe('injectMutation', () => { const onSettledOnFunction = vi.fn() const mutation = TestBed.runInInjectionContext(() => { return injectMutation(() => ({ - mutationFn: (params: string) => successMutator(params), + mutationFn: (params: string) => sleep(0).then(() => params), onSettled, })) }) @@ -317,7 +317,7 @@ describe('injectMutation', () => { mutation = injectMutation(() => ({ mutationKey: ['fake', this.name()], - mutationFn: () => successMutator(this.name()), + mutationFn: () => sleep(0).then(() => this.name()), })) mutate(): void { @@ -358,7 +358,7 @@ describe('injectMutation', () => { mutation = injectMutation(() => ({ mutationKey: ['fake', this.name()], - mutationFn: () => successMutator(this.name()), + mutationFn: () => sleep(0).then(() => this.name()), })) mutate(): void { diff --git a/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts b/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts index ded20a5803..541ad65f14 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts @@ -1,6 +1,6 @@ import { describe, expectTypeOf, it, test } from 'vitest' +import { sleep } from '@tanstack/query-test-utils' import { injectQuery, queryOptions } from '..' -import { simpleFetcher } from './test-utils' import type { Signal } from '@angular/core' describe('initialData', () => { @@ -127,7 +127,7 @@ describe('Discriminated union return type', () => { test('data should be possibly undefined by default', () => { const query = injectQuery(() => ({ queryKey: ['key'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) expectTypeOf(query.data).toEqualTypeOf>() @@ -136,7 +136,7 @@ describe('Discriminated union return type', () => { test('data should be defined when query is success', () => { const query = injectQuery(() => ({ queryKey: ['key'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) if (query.isSuccess()) { @@ -147,7 +147,7 @@ describe('Discriminated union return type', () => { test('error should be null when query is success', () => { const query = injectQuery(() => ({ queryKey: ['key'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) if (query.isSuccess()) { @@ -158,7 +158,7 @@ describe('Discriminated union return type', () => { test('data should be undefined when query is pending', () => { const query = injectQuery(() => ({ queryKey: ['key'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) if (query.isPending()) { @@ -169,7 +169,7 @@ describe('Discriminated union return type', () => { test('error should be defined when query is error', () => { const query = injectQuery(() => ({ queryKey: ['key'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) if (query.isError()) { diff --git a/packages/angular-query-experimental/src/__tests__/inject-query.test.ts b/packages/angular-query-experimental/src/__tests__/inject-query.test.ts index 2f7d5f4f45..54818704b2 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-query.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-query.test.ts @@ -17,15 +17,9 @@ import { test, vi, } from 'vitest' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, QueryClient, injectQuery, provideTanStackQuery } from '..' -import { - delayedFetcher, - getSimpleFetcherWithReturnData, - queryKey, - rejectFetcher, - setSignalInputs, - simpleFetcher, -} from './test-utils' +import { setSignalInputs } from './test-utils' import type { CreateQueryOptions, OmitKeyof, QueryFunction } from '..' const QUERY_DURATION = 100 @@ -271,7 +265,7 @@ describe('injectQuery', () => { const query = TestBed.runInInjectionContext(() => { return injectQuery(() => ({ queryKey: ['key1'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) }) @@ -286,7 +280,7 @@ describe('injectQuery', () => { const query = TestBed.runInInjectionContext(() => { return injectQuery(() => ({ queryKey: ['key2'], - queryFn: getSimpleFetcherWithReturnData('result2'), + queryFn: () => sleep(0).then(() => 'result2'), })) }) @@ -305,7 +299,8 @@ describe('injectQuery', () => { return injectQuery(() => ({ retry: false, queryKey: ['key3'], - queryFn: rejectFetcher, + queryFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), })) }) @@ -323,7 +318,7 @@ describe('injectQuery', () => { test('should update query on options contained signal change', async () => { const key = signal(['key6', 'key7']) - const spy = vi.fn(simpleFetcher) + const spy = vi.fn(() => sleep(0).then(() => 'Some data')) const query = TestBed.runInInjectionContext(() => { return injectQuery(() => ({ @@ -352,7 +347,7 @@ describe('injectQuery', () => { }) test('should only run query once enabled signal is set to true', async () => { - const spy = vi.fn(simpleFetcher) + const spy = vi.fn(() => sleep(0).then(() => 'Some data')) const enabled = signal(false) const query = TestBed.runInInjectionContext(() => { @@ -376,11 +371,13 @@ describe('injectQuery', () => { const query1 = TestBed.runInInjectionContext(() => { return injectQuery(() => ({ queryKey: ['dependant1'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) }) - const dependentQueryFn = vi.fn().mockImplementation(delayedFetcher(1000)) + const dependentQueryFn = vi + .fn() + .mockImplementation(() => sleep(1000).then(() => 'Some data')) const query2 = TestBed.runInInjectionContext(() => { return injectQuery( @@ -412,7 +409,7 @@ describe('injectQuery', () => { }) test('should use the current value for the queryKey when refetch is called', async () => { - const fetchFn = vi.fn(simpleFetcher) + const fetchFn = vi.fn(() => sleep(0).then(() => 'Some data')) const keySignal = signal('key11') const query = TestBed.runInInjectionContext(() => { @@ -458,7 +455,8 @@ describe('injectQuery', () => { TestBed.runInInjectionContext(() => { return injectQuery(() => ({ queryKey: ['key12'], - queryFn: rejectFetcher, + queryFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), throwOnError: boundaryFn, })) }) @@ -478,7 +476,8 @@ describe('injectQuery', () => { TestBed.runInInjectionContext(() => { return injectQuery(() => ({ queryKey: ['key13'], - queryFn: rejectFetcher, + queryFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), throwOnError: true, })) }) @@ -490,7 +489,8 @@ describe('injectQuery', () => { TestBed.runInInjectionContext(() => { return injectQuery(() => ({ queryKey: ['key14'], - queryFn: rejectFetcher, + queryFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), throwOnError: () => true, })) }) @@ -504,7 +504,8 @@ describe('injectQuery', () => { return injectQuery(() => ({ retry: false, queryKey: ['key15'], - queryFn: rejectFetcher, + queryFn: () => + sleep(0).then(() => Promise.reject(new Error('Some error'))), })) }) @@ -548,7 +549,7 @@ describe('injectQuery', () => { expect(() => { injectQuery(() => ({ queryKey: ['injectionContextError'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), })) }).toThrowError(/NG0203(.*?)injectQuery/) }) @@ -557,7 +558,7 @@ describe('injectQuery', () => { const query = injectQuery( () => ({ queryKey: ['manualInjector'], - queryFn: simpleFetcher, + queryFn: () => sleep(0).then(() => 'Some data'), }), { injector: TestBed.inject(Injector), diff --git a/packages/angular-query-experimental/src/__tests__/test-utils.ts b/packages/angular-query-experimental/src/__tests__/test-utils.ts index 9fdd01f943..a035414b0e 100644 --- a/packages/angular-query-experimental/src/__tests__/test-utils.ts +++ b/packages/angular-query-experimental/src/__tests__/test-utils.ts @@ -4,65 +4,7 @@ import { expect } from 'vitest' import type { InputSignal, Signal } from '@angular/core' import type { ComponentFixture } from '@angular/core/testing' -let queryKeyCount = 0 -export function queryKey() { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - -export function simpleFetcher(): Promise { - return new Promise((resolve) => { - setTimeout(() => { - return resolve('Some data') - }, 0) - }) -} - -export function delayedFetcher(timeout = 0): () => Promise { - return () => - new Promise((resolve) => { - setTimeout(() => { - return resolve('Some data') - }, timeout) - }) -} - -export function getSimpleFetcherWithReturnData(returnData: unknown) { - return () => - new Promise((resolve) => setTimeout(() => resolve(returnData), 0)) -} - -export function rejectFetcher(): Promise { - return new Promise((_, reject) => { - setTimeout(() => { - return reject(new Error('Some error')) - }, 0) - }) -} - -export function infiniteFetcher({ - pageParam, -}: { - pageParam?: number -}): Promise { - return new Promise((resolve) => { - setTimeout(() => { - return resolve('data on page ' + pageParam) - }, 0) - }) -} - -export function successMutator(param: T): Promise { - return new Promise((resolve) => { - setTimeout(() => { - return resolve(param) - }, 0) - }) -} - -export function errorMutator(_parameter?: unknown): Promise { - return rejectFetcher() -} +/* eslint jsdoc/require-jsdoc: 0, jsdoc/require-param: 0 */ // Evaluate all signals on an object and return the result function evaluateSignals>( diff --git a/packages/angular-query-persist-client/package.json b/packages/angular-query-persist-client/package.json index 59d27f8e8c..d4343f998e 100644 --- a/packages/angular-query-persist-client/package.json +++ b/packages/angular-query-persist-client/package.json @@ -62,6 +62,7 @@ "@angular/platform-browser": "^19.2.4", "@angular/platform-browser-dynamic": "^19.2.4", "@tanstack/angular-query-experimental": "workspace:*", + "@tanstack/query-test-utils": "workspace:*", "@testing-library/angular": "^17.3.2", "@testing-library/dom": "^10.4.0", "eslint-plugin-jsdoc": "^50.5.0", diff --git a/packages/angular-query-persist-client/src/__tests__/utils.ts b/packages/angular-query-persist-client/src/__tests__/utils.ts deleted file mode 100644 index 73fb0ed26f..0000000000 --- a/packages/angular-query-persist-client/src/__tests__/utils.ts +++ /dev/null @@ -1,12 +0,0 @@ -let queryKeyCount = 0 - -export function queryKey(): Array { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} diff --git a/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts b/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts index 7085c753ea..4a6a8d6fab 100644 --- a/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts +++ b/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts @@ -11,8 +11,8 @@ import { provideExperimentalZonelessChangeDetection, } from '@angular/core' import { render, screen, waitFor } from '@testing-library/angular' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { withPersistQueryClient } from '../with-persist-query-client' -import { queryKey, sleep } from './utils' import type { PersistedClient, Persister, diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index 71157ceaae..22884685b3 100644 --- a/packages/query-async-storage-persister/package.json +++ b/packages/query-async-storage-persister/package.json @@ -62,6 +62,7 @@ "@tanstack/query-persist-client-core": "workspace:*" }, "devDependencies": { + "@tanstack/query-test-utils": "workspace:*", "npm-run-all2": "^5.0.0" } } diff --git a/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts b/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts index d85ea1c465..ec7476d174 100644 --- a/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts +++ b/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { sleep } from '@tanstack/query-test-utils' import { asyncThrottle } from '../asyncThrottle' -import { sleep as delay } from './utils' describe('asyncThrottle', () => { beforeEach(() => { @@ -16,7 +16,7 @@ describe('asyncThrottle', () => { const execTimeStamps: Array = [] const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { - await delay(1) + await sleep(1) execTimeStamps.push(Date.now()) if (complete) { complete(id) @@ -49,7 +49,7 @@ describe('asyncThrottle', () => { const execTimeStamps: Array = [] const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { - await delay(30) + await sleep(30) execTimeStamps.push(Date.now()) if (complete) { complete(id) @@ -81,7 +81,7 @@ describe('asyncThrottle', () => { const execTimeStamps: Array = [] const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { - await delay(interval + 10) + await sleep(interval + 10) execTimeStamps.push(Date.now()) if (complete) { complete(id) @@ -112,7 +112,7 @@ describe('asyncThrottle', () => { const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { if (id === 1) throw new Error('error') - await delay(1) + await sleep(1) if (complete) { complete(id) } diff --git a/packages/query-async-storage-persister/src/__tests__/utils.ts b/packages/query-async-storage-persister/src/__tests__/utils.ts deleted file mode 100644 index 1a3a619a22..0000000000 --- a/packages/query-async-storage-persister/src/__tests__/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} diff --git a/packages/query-core/package.json b/packages/query-core/package.json index 7c905b1971..95241f6b65 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -59,6 +59,7 @@ "!src/__tests__" ], "devDependencies": { + "@tanstack/query-test-utils": "workspace:*", "npm-run-all2": "^5.0.0" } } diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index ed9a1a2a29..353d5c1dcb 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -1,23 +1,10 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { sleep } from '@tanstack/query-test-utils' +import { QueryClient } from '../queryClient' import { QueryCache } from '../queryCache' import { dehydrate, hydrate } from '../hydration' import { MutationCache } from '../mutationCache' -import { - createQueryClient, - executeMutation, - mockOnlineManagerIsOnline, - sleep, -} from './utils' - -async function fetchData(value: TData, ms?: number): Promise { - await sleep(ms || 0) - return value -} - -async function fetchDate(value: string, ms?: number): Promise { - await sleep(ms || 0) - return new Date(value) -} +import { executeMutation, mockOnlineManagerIsOnline } from './utils' describe('dehydration and rehydration', () => { beforeEach(() => { @@ -30,42 +17,42 @@ describe('dehydration and rehydration', () => { test('should work with serializable values', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string'), + queryFn: () => sleep(0).then(() => 'string'), }), ) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['number'], - queryFn: () => fetchData(1), + queryFn: () => sleep(0).then(() => 1), }), ) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['boolean'], - queryFn: () => fetchData(true), + queryFn: () => sleep(0).then(() => true), }), ) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['null'], - queryFn: () => fetchData(null), + queryFn: () => sleep(0).then(() => null), }), ) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['array'], - queryFn: () => fetchData(['string', 0]), + queryFn: () => sleep(0).then(() => ['string', 0]), }), ) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['nested'], - queryFn: () => fetchData({ key: [{ nestedKey: 1 }] }), + queryFn: () => sleep(0).then(() => ({ key: [{ nestedKey: 1 }] })), }), ) const dehydrated = dehydrate(queryClient) @@ -75,7 +62,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ queryCache: hydrationCache, }) hydrate(hydrationClient, parsed) @@ -135,11 +122,11 @@ describe('dehydration and rehydration', () => { test('should not dehydrate queries if dehydrateQueries is set to false', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string'), + queryFn: () => sleep(0).then(() => 'string'), }), ) @@ -154,11 +141,11 @@ describe('dehydration and rehydration', () => { test('should use the garbage collection time from the client', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string'), + queryFn: () => sleep(0).then(() => 'string'), gcTime: 50, }), ) @@ -171,7 +158,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed) expect(hydrationCache.find({ queryKey: ['string'] })?.state.data).toBe( 'string', @@ -185,18 +172,18 @@ describe('dehydration and rehydration', () => { test('should be able to provide default options for the hydrated queries', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string'), + queryFn: () => sleep(0).then(() => 'string'), }), ) const dehydrated = dehydrate(queryClient) const stringified = JSON.stringify(dehydrated) const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed, { defaultOptions: { queries: { retry: 10 } }, }) @@ -209,7 +196,7 @@ describe('dehydration and rehydration', () => { test('should respect query defaultOptions specified on the QueryClient', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true }, @@ -228,7 +215,7 @@ describe('dehydration and rehydration', () => { const stringified = JSON.stringify(dehydrated) const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ queryCache: hydrationCache, defaultOptions: { hydrate: { queries: { retry: 10 } } }, }) @@ -247,7 +234,7 @@ describe('dehydration and rehydration', () => { test('should respect mutation defaultOptions specified on the QueryClient', async () => { const mutationCache = new MutationCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ mutationCache, defaultOptions: { dehydrate: { @@ -270,7 +257,7 @@ describe('dehydration and rehydration', () => { const stringified = JSON.stringify(dehydrated) const parsed = JSON.parse(stringified) const hydrationCache = new MutationCache() - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ mutationCache: hydrationCache, defaultOptions: { hydrate: { mutations: { retry: 10 } } }, }) @@ -289,11 +276,11 @@ describe('dehydration and rehydration', () => { test('should work with complex keys', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string', { key: ['string'], key2: 0 }], - queryFn: () => fetchData('string'), + queryFn: () => sleep(0).then(() => 'string'), }), ) const dehydrated = dehydrate(queryClient) @@ -303,7 +290,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed) expect( hydrationCache.find({ @@ -331,16 +318,16 @@ describe('dehydration and rehydration', () => { consoleMock.mockImplementation(() => undefined) const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['success'], - queryFn: () => fetchData('success'), + queryFn: () => sleep(0).then(() => 'success'), }), ) queryClient.prefetchQuery({ queryKey: ['loading'], - queryFn: () => fetchData('loading', 10000), + queryFn: () => sleep(10000).then(() => 'loading'), }) await vi.waitFor(() => queryClient.prefetchQuery({ @@ -357,7 +344,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed) expect(hydrationCache.find({ queryKey: ['success'] })).toBeTruthy() @@ -371,17 +358,17 @@ describe('dehydration and rehydration', () => { test('should filter queries via dehydrateQuery', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string'), + queryFn: () => sleep(0).then(() => 'string'), }), ) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['number'], - queryFn: () => fetchData(1), + queryFn: () => sleep(0).then(() => 1), }), ) const dehydrated = dehydrate(queryClient, { @@ -401,7 +388,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed) expect(hydrationCache.find({ queryKey: ['string'] })).toBeUndefined() expect(hydrationCache.find({ queryKey: ['number'] })?.state.data).toBe(1) @@ -412,11 +399,11 @@ describe('dehydration and rehydration', () => { test('should not overwrite query in cache if hydrated query is older', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string-older', 5), + queryFn: () => sleep(5).then(() => 'string-older'), }), ) const dehydrated = dehydrate(queryClient) @@ -426,11 +413,11 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) await vi.waitFor(() => hydrationClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string-newer', 5), + queryFn: () => sleep(5).then(() => 'string-newer'), }), ) @@ -445,22 +432,22 @@ describe('dehydration and rehydration', () => { test('should overwrite query in cache if hydrated query is newer', async () => { const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) await vi.waitFor(() => hydrationClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string-older', 5), + queryFn: () => sleep(5).then(() => 'string-older'), }), ) // --- const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['string'], - queryFn: () => fetchData('string-newer', 5), + queryFn: () => sleep(5).then(() => 'string-newer'), }), ) const dehydrated = dehydrate(queryClient) @@ -492,7 +479,7 @@ describe('dehydration and rehydration', () => { }) const serverOnSuccess = vi.fn() - const serverClient = createQueryClient() + const serverClient = new QueryClient() serverClient.setMutationDefaults(['addTodo'], { mutationFn: serverAddTodo, @@ -522,7 +509,7 @@ describe('dehydration and rehydration', () => { onlineMock.mockReturnValue(true) const parsed = JSON.parse(stringified) - const client = createQueryClient() + const client = new QueryClient() const clientAddTodo = vi.fn().mockImplementation((variables) => { return { id: 2, text: variables.text } @@ -567,7 +554,7 @@ describe('dehydration and rehydration', () => { .fn() .mockImplementation(() => Promise.reject(new Error('offline'))) - const queryClient = createQueryClient() + const queryClient = new QueryClient() queryClient.setMutationDefaults(['addTodo'], { mutationFn: serverAddTodo, @@ -601,7 +588,7 @@ describe('dehydration and rehydration', () => { .fn() .mockImplementation(() => Promise.reject(new Error('offline'))) - const queryClient = createQueryClient() + const queryClient = new QueryClient() queryClient.setMutationDefaults(['addTodo'], { mutationFn: serverAddTodo, @@ -630,7 +617,7 @@ describe('dehydration and rehydration', () => { test('should not hydrate if the hydratedState is null or is not an object', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) expect(() => hydrate(queryClient, null)).not.toThrow() expect(() => hydrate(queryClient, 'invalid')).not.toThrow() @@ -640,7 +627,7 @@ describe('dehydration and rehydration', () => { test('should support hydratedState with undefined queries and mutations', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) expect(() => hydrate(queryClient, {})).not.toThrow() expect(() => hydrate(queryClient, {})).not.toThrow() @@ -650,7 +637,7 @@ describe('dehydration and rehydration', () => { test('should set the fetchStatus to idle when creating a query with dehydrate', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) let isInitialFetch = true let resolvePromise: (value: unknown) => void = () => undefined @@ -686,7 +673,7 @@ describe('dehydration and rehydration', () => { // --- const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed) expect( hydrationCache.find({ queryKey: ['string'] })?.state.fetchStatus, @@ -695,7 +682,7 @@ describe('dehydration and rehydration', () => { test('should dehydrate and hydrate meta for queries', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['meta'], @@ -736,7 +723,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ queryCache: hydrationCache, }) hydrate(hydrationClient, parsed) @@ -750,7 +737,7 @@ describe('dehydration and rehydration', () => { test('should dehydrate and hydrate meta for mutations', async () => { const mutationCache = new MutationCache() - const queryClient = createQueryClient({ mutationCache }) + const queryClient = new QueryClient({ mutationCache }) await executeMutation( queryClient, @@ -795,7 +782,7 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const hydrationCache = new MutationCache() - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ mutationCache: hydrationCache, }) hydrate(hydrationClient, parsed) @@ -808,7 +795,7 @@ describe('dehydration and rehydration', () => { }) test('should not change fetchStatus when updating a query with dehydrate', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const options = { queryKey: ['string'], @@ -830,7 +817,7 @@ describe('dehydration and rehydration', () => { // --- const parsed = JSON.parse(stringified) const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ queryCache: hydrationCache }) + const hydrationClient = new QueryClient({ queryCache: hydrationCache }) const promise = hydrationClient.prefetchQuery(options) hydrate(hydrationClient, parsed) @@ -844,7 +831,7 @@ describe('dehydration and rehydration', () => { }) test('should dehydrate and hydrate mutation scopes', () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const onlineMock = mockOnlineManagerIsOnline(false) void executeMutation( @@ -868,7 +855,7 @@ describe('dehydration and rehydration', () => { // --- const parsed = JSON.parse(stringified) const hydrationCache = new MutationCache() - const hydrationClient = createQueryClient({ mutationCache: hydrationCache }) + const hydrationClient = new QueryClient({ mutationCache: hydrationCache }) hydrate(hydrationClient, parsed) @@ -879,20 +866,20 @@ describe('dehydration and rehydration', () => { test('should dehydrate promises for pending queries', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true } }, }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['success'], - queryFn: () => fetchData('success'), + queryFn: () => sleep(0).then(() => 'success'), }), ) const promise = queryClient.prefetchQuery({ queryKey: ['pending'], - queryFn: () => fetchData('pending', 10), + queryFn: () => sleep(10).then(() => 'pending'), }) const dehydrated = dehydrate(queryClient) @@ -905,27 +892,27 @@ describe('dehydration and rehydration', () => { test('should hydrate promises even without observers', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true } }, }) await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['success'], - queryFn: () => fetchData('success'), + queryFn: () => sleep(0).then(() => 'success'), }), ) void queryClient.prefetchQuery({ queryKey: ['pending'], - queryFn: () => fetchData('pending', 20), + queryFn: () => sleep(20).then(() => 'pending'), }) const dehydrated = dehydrate(queryClient) // no stringify/parse here because promises can't be serialized to json // but nextJs still can do it const hydrationCache = new QueryCache() - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ queryCache: hydrationCache, }) @@ -973,7 +960,7 @@ describe('dehydration and rehydration', () => { }) test('should transform promise result', async () => { - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true, @@ -984,12 +971,12 @@ describe('dehydration and rehydration', () => { const promise = queryClient.prefetchQuery({ queryKey: ['transformedStringToDate'], - queryFn: () => fetchDate('2024-01-01T00:00:00.000Z', 20), + queryFn: () => sleep(20).then(() => new Date('2024-01-01T00:00:00.000Z')), }) const dehydrated = dehydrate(queryClient) expect(dehydrated.queries[0]?.promise).toBeInstanceOf(Promise) - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ defaultOptions: { hydrate: { deserializeData: (data) => new Date(data), @@ -1009,7 +996,7 @@ describe('dehydration and rehydration', () => { }) test('should transform query data if promise is already resolved', async () => { - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true, @@ -1020,12 +1007,12 @@ describe('dehydration and rehydration', () => { const promise = queryClient.prefetchQuery({ queryKey: ['transformedStringToDate'], - queryFn: () => fetchDate('2024-01-01T00:00:00.000Z', 0), + queryFn: () => sleep(0).then(() => new Date('2024-01-01T00:00:00.000Z')), }) await vi.advanceTimersByTimeAsync(20) const dehydrated = dehydrate(queryClient) - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ defaultOptions: { hydrate: { deserializeData: (data) => new Date(data), @@ -1045,7 +1032,7 @@ describe('dehydration and rehydration', () => { }) test('should overwrite query in cache if hydrated query is newer (with transformation)', async () => { - const hydrationClient = createQueryClient({ + const hydrationClient = new QueryClient({ defaultOptions: { hydrate: { deserializeData: (data) => new Date(data), @@ -1055,13 +1042,14 @@ describe('dehydration and rehydration', () => { await vi.waitFor(() => hydrationClient.prefetchQuery({ queryKey: ['date'], - queryFn: () => fetchDate('2024-01-01T00:00:00.000Z', 5), + queryFn: () => + sleep(5).then(() => new Date('2024-01-01T00:00:00.000Z')), }), ) // --- - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true, @@ -1072,7 +1060,8 @@ describe('dehydration and rehydration', () => { await vi.waitFor(() => queryClient.prefetchQuery({ queryKey: ['date'], - queryFn: () => fetchDate('2024-01-02T00:00:00.000Z', 10), + queryFn: () => + sleep(10).then(() => new Date('2024-01-02T00:00:00.000Z')), }), ) const dehydrated = dehydrate(queryClient) @@ -1092,7 +1081,7 @@ describe('dehydration and rehydration', () => { test('should overwrite query in cache if hydrated query is newer (with promise)', async () => { // --- server --- - const serverQueryClient = createQueryClient({ + const serverQueryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true, @@ -1112,7 +1101,7 @@ describe('dehydration and rehydration', () => { // --- client --- - const clientQueryClient = createQueryClient() + const clientQueryClient = new QueryClient() clientQueryClient.setQueryData(['data'], 'old data', { updatedAt: 10 }) @@ -1133,7 +1122,7 @@ describe('dehydration and rehydration', () => { const countRef = { current: 0 } // --- server --- - const serverQueryClient = createQueryClient({ + const serverQueryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true, @@ -1156,7 +1145,7 @@ describe('dehydration and rehydration', () => { // --- client --- - const clientQueryClient = createQueryClient({ + const clientQueryClient = new QueryClient({ defaultOptions: { hydrate: { deserializeData: deserializeDataMock, @@ -1205,7 +1194,7 @@ describe('dehydration and rehydration', () => { test('should not redact errors when shouldRedactErrors returns false', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { dehydrate: { @@ -1237,7 +1226,7 @@ describe('dehydration and rehydration', () => { consoleMock.mockImplementation(() => undefined) const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { dehydrate: { @@ -1271,7 +1260,7 @@ describe('dehydration and rehydration', () => { consoleMock.mockImplementation(() => undefined) const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { dehydrate: { diff --git a/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx b/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx index db77d25144..e382a307c9 100644 --- a/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx +++ b/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx @@ -1,12 +1,7 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -import { CancelledError, InfiniteQueryObserver } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { - InfiniteData, - InfiniteQueryObserverResult, - QueryCache, - QueryClient, -} from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { CancelledError, InfiniteQueryObserver, QueryClient } from '..' +import type { InfiniteData, InfiniteQueryObserverResult, QueryCache } from '..' describe('InfiniteQueryBehavior', () => { let queryClient: QueryClient @@ -14,7 +9,7 @@ describe('InfiniteQueryBehavior', () => { beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryCache = queryClient.getQueryCache() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/infiniteQueryObserver.test-d.tsx b/packages/query-core/src/__tests__/infiniteQueryObserver.test-d.tsx index 1124c1e0b7..8e22fafde7 100644 --- a/packages/query-core/src/__tests__/infiniteQueryObserver.test-d.tsx +++ b/packages/query-core/src/__tests__/infiniteQueryObserver.test-d.tsx @@ -1,13 +1,13 @@ import { afterEach, beforeEach, describe, expectTypeOf, it, vi } from 'vitest' -import { InfiniteQueryObserver } from '..' -import { createQueryClient, queryKey } from './utils' -import type { InfiniteData, QueryClient } from '..' +import { queryKey } from '@tanstack/query-test-utils' +import { InfiniteQueryObserver, QueryClient } from '..' +import type { InfiniteData } from '..' describe('InfiniteQueryObserver', () => { let queryClient: QueryClient beforeEach(() => { - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx b/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx index eac9241253..22328c71e1 100644 --- a/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx +++ b/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx @@ -1,14 +1,13 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -import { InfiniteQueryObserver } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { QueryClient } from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { InfiniteQueryObserver, QueryClient } from '..' describe('InfiniteQueryObserver', () => { let queryClient: QueryClient beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/mutationCache.test.tsx b/packages/query-core/src/__tests__/mutationCache.test.tsx index 7b7f6289a6..23cf7c1e40 100644 --- a/packages/query-core/src/__tests__/mutationCache.test.tsx +++ b/packages/query-core/src/__tests__/mutationCache.test.tsx @@ -1,6 +1,7 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -import { MutationCache, MutationObserver } from '..' -import { createQueryClient, executeMutation, queryKey, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { MutationCache, MutationObserver, QueryClient } from '..' +import { executeMutation } from './utils' describe('mutationCache', () => { beforeEach(() => { @@ -18,7 +19,7 @@ describe('mutationCache', () => { const onSuccess = vi.fn() const onSettled = vi.fn() const testCache = new MutationCache({ onError, onSuccess, onSettled }) - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) try { await executeMutation( @@ -65,7 +66,7 @@ describe('mutationCache', () => { states.push(6) } const testCache = new MutationCache({ onError, onSettled }) - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) try { await executeMutation( @@ -99,7 +100,7 @@ describe('mutationCache', () => { const onSuccess = vi.fn() const onSettled = vi.fn() const testCache = new MutationCache({ onError, onSuccess, onSettled }) - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) try { await executeMutation( @@ -145,7 +146,7 @@ describe('mutationCache', () => { states.push(6) } const testCache = new MutationCache({ onSuccess, onSettled }) - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) executeMutation( testClient, @@ -175,7 +176,7 @@ describe('mutationCache', () => { const key = queryKey() const onMutate = vi.fn() const testCache = new MutationCache({ onMutate }) - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) try { await executeMutation( @@ -202,7 +203,7 @@ describe('mutationCache', () => { states.push(2) } const testCache = new MutationCache({ onMutate }) - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) executeMutation( testClient, @@ -226,7 +227,7 @@ describe('mutationCache', () => { describe('find', () => { test('should filter correctly', async () => { const testCache = new MutationCache() - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) const key = ['mutation', 'vars'] await executeMutation( testClient, @@ -253,7 +254,7 @@ describe('mutationCache', () => { describe('findAll', () => { test('should filter correctly', async () => { const testCache = new MutationCache() - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) await executeMutation( testClient, { @@ -296,7 +297,7 @@ describe('mutationCache', () => { describe('garbage collection', () => { test('should remove unused mutations after gcTime has elapsed', async () => { const testCache = new MutationCache() - const testClient = createQueryClient({ mutationCache: testCache }) + const testClient = new QueryClient({ mutationCache: testCache }) const onSuccess = vi.fn() executeMutation( testClient, @@ -316,7 +317,7 @@ describe('mutationCache', () => { }) test('should not remove mutations if there are active observers', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const observer = new MutationObserver(queryClient, { gcTime: 10, mutationFn: (input: number) => Promise.resolve(input), @@ -337,7 +338,7 @@ describe('mutationCache', () => { }) test('should be garbage collected later when unsubscribed and mutation is pending', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const onSuccess = vi.fn() const observer = new MutationObserver(queryClient, { gcTime: 10, @@ -363,7 +364,7 @@ describe('mutationCache', () => { }) test('should call callbacks even with gcTime 0 and mutation still pending', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const onSuccess = vi.fn() const observer = new MutationObserver(queryClient, { gcTime: 0, diff --git a/packages/query-core/src/__tests__/mutationObserver.test.tsx b/packages/query-core/src/__tests__/mutationObserver.test.tsx index 13347d56ed..9ad58ac501 100644 --- a/packages/query-core/src/__tests__/mutationObserver.test.tsx +++ b/packages/query-core/src/__tests__/mutationObserver.test.tsx @@ -1,14 +1,13 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -import { MutationObserver } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { QueryClient } from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { MutationObserver, QueryClient } from '..' describe('mutationObserver', () => { let queryClient: QueryClient beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/mutations.test.tsx b/packages/query-core/src/__tests__/mutations.test.tsx index 9e1288e7e0..779daff63e 100644 --- a/packages/query-core/src/__tests__/mutations.test.tsx +++ b/packages/query-core/src/__tests__/mutations.test.tsx @@ -1,7 +1,8 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { MutationObserver } from '../mutationObserver' -import { createQueryClient, executeMutation, queryKey, sleep } from './utils' -import type { QueryClient } from '..' +import { QueryClient } from '..' +import { executeMutation } from './utils' import type { MutationState } from '../mutation' describe('mutations', () => { @@ -9,7 +10,7 @@ describe('mutations', () => { beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/notifyManager.test.tsx b/packages/query-core/src/__tests__/notifyManager.test.tsx index deb070f2c5..ea13421455 100644 --- a/packages/query-core/src/__tests__/notifyManager.test.tsx +++ b/packages/query-core/src/__tests__/notifyManager.test.tsx @@ -8,8 +8,8 @@ import { it, vi, } from 'vitest' +import { sleep } from '@tanstack/query-test-utils' import { createNotifyManager } from '../notifyManager' -import { sleep } from './utils' describe('notifyManager', () => { beforeEach(() => { diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index c6d58d8d91..bdcbbd962c 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -1,14 +1,14 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -import { QueriesObserver } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { QueryClient, QueryObserverResult } from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { QueriesObserver, QueryClient } from '..' +import type { QueryObserverResult } from '..' describe('queriesObserver', () => { let queryClient: QueryClient beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index 6d7485a6d7..fa38abad82 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -1,19 +1,18 @@ import { afterEach, beforeEach, describe, expect, it, test, vi } from 'vitest' -import { QueryObserver, dehydrate, hydrate, isCancelledError } from '..' import { - createQueryClient, - mockOnlineManagerIsOnline, mockVisibilityState, queryKey, - setIsServer, sleep, -} from './utils' -import type { - QueryCache, +} from '@tanstack/query-test-utils' +import { QueryClient, - QueryFunctionContext, - QueryObserverResult, + QueryObserver, + dehydrate, + hydrate, + isCancelledError, } from '..' +import { mockOnlineManagerIsOnline, setIsServer } from './utils' +import type { QueryCache, QueryFunctionContext, QueryObserverResult } from '..' describe('query', () => { let queryClient: QueryClient @@ -21,7 +20,7 @@ describe('query', () => { beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryCache = queryClient.getQueryCache() queryClient.mount() }) @@ -387,7 +386,7 @@ describe('query', () => { }) test('should reset to default state when created from hydration', async () => { - const client = createQueryClient() + const client = new QueryClient() await client.prefetchQuery({ queryKey: ['string'], queryFn: () => Promise.resolve('string'), @@ -395,7 +394,7 @@ describe('query', () => { const dehydrated = dehydrate(client) - const hydrationClient = createQueryClient() + const hydrationClient = new QueryClient() hydrate(hydrationClient, dehydrated) expect(hydrationClient.getQueryData(['string'])).toBe('string') diff --git a/packages/query-core/src/__tests__/queryCache.test.tsx b/packages/query-core/src/__tests__/queryCache.test.tsx index 6399e78733..feb995692d 100644 --- a/packages/query-core/src/__tests__/queryCache.test.tsx +++ b/packages/query-core/src/__tests__/queryCache.test.tsx @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, QueryClient, QueryObserver } from '..' -import { createQueryClient, queryKey, sleep } from './utils' describe('queryCache', () => { let queryClient: QueryClient @@ -8,7 +8,7 @@ describe('queryCache', () => { beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryCache = queryClient.getQueryCache() }) @@ -320,7 +320,7 @@ describe('queryCache', () => { const onSettled = vi.fn() const onError = vi.fn() const testCache = new QueryCache({ onSuccess, onError, onSettled }) - const testClient = createQueryClient({ queryCache: testCache }) + const testClient = new QueryClient({ queryCache: testCache }) testClient.prefetchQuery({ queryKey: key, queryFn: () => sleep(100).then(() => Promise.reject('error')), @@ -342,7 +342,7 @@ describe('queryCache', () => { const onSettled = vi.fn() const onError = vi.fn() const testCache = new QueryCache({ onSuccess, onError, onSettled }) - const testClient = createQueryClient({ queryCache: testCache }) + const testClient = new QueryClient({ queryCache: testCache }) testClient.prefetchQuery({ queryKey: key, queryFn: () => sleep(100).then(() => ({ data: 5 })), diff --git a/packages/query-core/src/__tests__/queryClient.test.tsx b/packages/query-core/src/__tests__/queryClient.test.tsx index 68a59c75b4..4f18534808 100644 --- a/packages/query-core/src/__tests__/queryClient.test.tsx +++ b/packages/query-core/src/__tests__/queryClient.test.tsx @@ -1,4 +1,5 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { MutationObserver, QueryClient, @@ -9,12 +10,7 @@ import { onlineManager, skipToken, } from '..' -import { - createQueryClient, - mockOnlineManagerIsOnline, - queryKey, - sleep, -} from './utils' +import { mockOnlineManagerIsOnline } from './utils' import type { QueryCache, QueryFunction, QueryObserverOptions } from '..' describe('queryClient', () => { @@ -23,7 +19,7 @@ describe('queryClient', () => { beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryCache = queryClient.getQueryCache() queryClient.mount() }) @@ -39,7 +35,7 @@ describe('queryClient', () => { const key = queryKey() const queryFn = () => 'data' - const testClient = createQueryClient({ + const testClient = new QueryClient({ defaultOptions: { queries: { queryFn } }, }) @@ -49,7 +45,7 @@ describe('queryClient', () => { test('should merge defaultOptions when query is added to cache', async () => { const key = queryKey() - const testClient = createQueryClient({ + const testClient = new QueryClient({ defaultOptions: { queries: { gcTime: Infinity }, }, @@ -64,7 +60,7 @@ describe('queryClient', () => { test('should get defaultOptions', () => { const queryFn = () => 'data' const defaultOptions = { queries: { queryFn } } - const testClient = createQueryClient({ + const testClient = new QueryClient({ defaultOptions, }) expect(testClient.getDefaultOptions()).toMatchObject(defaultOptions) @@ -150,7 +146,7 @@ describe('queryClient', () => { describe('defaultQueryOptions', () => { test('should default networkMode when persister is present', () => { expect( - createQueryClient({ + new QueryClient({ defaultOptions: { queries: { persister: 'ignore' as any, @@ -162,7 +158,7 @@ describe('queryClient', () => { test('should not default networkMode without persister', () => { expect( - createQueryClient({ + new QueryClient({ defaultOptions: { queries: { staleTime: 1000, @@ -174,7 +170,7 @@ describe('queryClient', () => { test('should not default networkMode when already present', () => { expect( - createQueryClient({ + new QueryClient({ defaultOptions: { queries: { persister: 'ignore' as any, @@ -208,7 +204,7 @@ describe('queryClient', () => { test('should use default options', () => { const key = queryKey() - const testClient = createQueryClient({ + const testClient = new QueryClient({ defaultOptions: { queries: { queryKeyHashFn: () => 'someKey' } }, }) const testCache = testClient.getQueryCache() @@ -1641,7 +1637,7 @@ describe('queryClient', () => { focusManager.setFocused(undefined) }) test('should notify queryCache and mutationCache if focused', async () => { - const testClient = createQueryClient() + const testClient = new QueryClient() testClient.mount() const queryCacheOnFocusSpy = vi.spyOn( @@ -1675,7 +1671,7 @@ describe('queryClient', () => { }) test('should notify queryCache and mutationCache if online', async () => { - const testClient = createQueryClient() + const testClient = new QueryClient() testClient.mount() const queryCacheOnFocusSpy = vi.spyOn( @@ -1991,7 +1987,7 @@ describe('queryClient', () => { }) test('should notify queryCache and mutationCache after multiple mounts and single unmount', async () => { - const testClient = createQueryClient() + const testClient = new QueryClient() testClient.mount() testClient.mount() testClient.unmount() @@ -2030,7 +2026,7 @@ describe('queryClient', () => { }) test('should not notify queryCache and mutationCache after multiple mounts/unmounts', () => { - const testClient = createQueryClient() + const testClient = new QueryClient() testClient.mount() testClient.mount() testClient.unmount() diff --git a/packages/query-core/src/__tests__/queryObserver.test-d.tsx b/packages/query-core/src/__tests__/queryObserver.test-d.tsx index afb01d83c6..f248c393de 100644 --- a/packages/query-core/src/__tests__/queryObserver.test-d.tsx +++ b/packages/query-core/src/__tests__/queryObserver.test-d.tsx @@ -1,13 +1,13 @@ import { afterEach, beforeEach, describe, expectTypeOf, it } from 'vitest' -import { QueryObserver } from '..' -import { createQueryClient, queryKey } from './utils' -import type { DefaultError, QueryClient } from '..' +import { queryKey } from '@tanstack/query-test-utils' +import { QueryClient, QueryObserver } from '..' +import type { DefaultError } from '..' describe('queryObserver', () => { let queryClient: QueryClient beforeEach(() => { - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) @@ -104,7 +104,7 @@ describe('queryObserver', () => { it('previousQuery should have typed queryKey', () => { const testQueryKey = ['SomeQuery', 42, { foo: 'bar' }] as const - new QueryObserver(createQueryClient(), { + new QueryObserver(new QueryClient(), { queryKey: testQueryKey, placeholderData: (_, previousQuery) => { if (previousQuery) { @@ -121,7 +121,7 @@ describe('queryObserver', () => { name = 'CustomError' as const } - new QueryObserver(createQueryClient(), { + new QueryObserver(new QueryClient(), { queryKey: ['key'], placeholderData: (_, previousQuery) => { if (previousQuery) { @@ -137,7 +137,7 @@ describe('queryObserver', () => { it('previousData should have the same type as query data', () => { const queryData = { foo: 'bar' } as const - new QueryObserver(createQueryClient(), { + new QueryObserver(new QueryClient(), { queryKey: ['key'], queryFn: () => queryData, select: (data) => data.foo, diff --git a/packages/query-core/src/__tests__/queryObserver.test.tsx b/packages/query-core/src/__tests__/queryObserver.test.tsx index a977a4f735..6b8b70ace9 100644 --- a/packages/query-core/src/__tests__/queryObserver.test.tsx +++ b/packages/query-core/src/__tests__/queryObserver.test.tsx @@ -7,16 +7,16 @@ import { test, vi, } from 'vitest' -import { QueryObserver, focusManager } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { QueryClient, QueryObserverResult } from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { QueryClient, QueryObserver, focusManager } from '..' +import type { QueryObserverResult } from '..' describe('queryObserver', () => { let queryClient: QueryClient beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient({ + queryClient = new QueryClient({ defaultOptions: { queries: { experimental_prefetchInRender: true, diff --git a/packages/query-core/src/__tests__/streamedQuery.test.tsx b/packages/query-core/src/__tests__/streamedQuery.test.tsx index eadeebea49..931e90b9ad 100644 --- a/packages/query-core/src/__tests__/streamedQuery.test.tsx +++ b/packages/query-core/src/__tests__/streamedQuery.test.tsx @@ -1,15 +1,14 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { streamedQuery } from '../streamedQuery' -import { QueryObserver } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { QueryClient } from '..' +import { QueryClient, QueryObserver } from '..' describe('streamedQuery', () => { let queryClient: QueryClient beforeEach(() => { vi.useFakeTimers() - queryClient = createQueryClient() + queryClient = new QueryClient() queryClient.mount() }) diff --git a/packages/query-core/src/__tests__/utils.test.tsx b/packages/query-core/src/__tests__/utils.test.tsx index a162a5ab5f..8c5bc6b2dc 100644 --- a/packages/query-core/src/__tests__/utils.test.tsx +++ b/packages/query-core/src/__tests__/utils.test.tsx @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' +import { QueryClient } from '..' import { addToEnd, addToStart, @@ -13,7 +14,6 @@ import { shallowEqualObjects, } from '../utils' import { Mutation } from '../mutation' -import { createQueryClient } from './utils' describe('core/utils', () => { describe('hashQueryKeyByOptions', () => { @@ -420,7 +420,7 @@ describe('core/utils', () => { describe('matchMutation', () => { it('should return false if mutationKey options is undefined', () => { const filters = { mutationKey: ['key1'] } - const queryClient = createQueryClient() + const queryClient = new QueryClient() const mutation = new Mutation({ mutationId: 1, mutationCache: queryClient.getMutationCache(), diff --git a/packages/query-core/src/__tests__/utils.ts b/packages/query-core/src/__tests__/utils.ts index 8d876afc3c..f9ef89d765 100644 --- a/packages/query-core/src/__tests__/utils.ts +++ b/packages/query-core/src/__tests__/utils.ts @@ -1,18 +1,8 @@ import { vi } from 'vitest' -import { QueryClient, onlineManager } from '..' +import { onlineManager } from '..' import * as utils from '../utils' import type { MockInstance } from 'vitest' -import type { MutationOptions, QueryClientConfig } from '..' - -export function createQueryClient(config?: QueryClientConfig): QueryClient { - return new QueryClient(config) -} - -export function mockVisibilityState( - value: DocumentVisibilityState, -): MockInstance<() => DocumentVisibilityState> { - return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) -} +import type { MutationOptions, QueryClient } from '..' export function mockOnlineManagerIsOnline( value: boolean, @@ -20,18 +10,6 @@ export function mockOnlineManagerIsOnline( return vi.spyOn(onlineManager, 'isOnline').mockReturnValue(value) } -let queryKeyCount = 0 -export function queryKey(): Array { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} - export function executeMutation( queryClient: QueryClient, options: MutationOptions, diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index 0cac7b9e57..11a00a05b7 100644 --- a/packages/query-persist-client-core/package.json +++ b/packages/query-persist-client-core/package.json @@ -62,6 +62,7 @@ "@tanstack/query-core": "workspace:*" }, "devDependencies": { + "@tanstack/query-test-utils": "workspace:*", "npm-run-all2": "^5.0.0" } } diff --git a/packages/query-persist-client-core/src/__tests__/persist.test.ts b/packages/query-persist-client-core/src/__tests__/persist.test.ts index 07cce75f09..14f7d0720b 100644 --- a/packages/query-persist-client-core/src/__tests__/persist.test.ts +++ b/packages/query-persist-client-core/src/__tests__/persist.test.ts @@ -1,18 +1,14 @@ import { describe, expect, test, vi } from 'vitest' -import { QueriesObserver } from '@tanstack/query-core' +import { QueriesObserver, QueryClient } from '@tanstack/query-core' import { persistQueryClientRestore, persistQueryClientSubscribe, } from '../persist' -import { - createMockPersister, - createQueryClient, - createSpyPersister, -} from './utils' +import { createMockPersister, createSpyPersister } from './utils' describe('persistQueryClientSubscribe', () => { test('should persist mutations', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const persister = createMockPersister() @@ -36,7 +32,7 @@ describe('persistQueryClientSubscribe', () => { describe('persistQueryClientSave', () => { test('should not be triggered on observer type events', () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const persister = createSpyPersister() @@ -77,7 +73,7 @@ describe('persistQueryClientRestore', () => { .spyOn(console, 'warn') .mockImplementation(() => undefined) - const queryClient = createQueryClient() + const queryClient = new QueryClient() const restoreError = new Error('Error restoring client') @@ -109,7 +105,7 @@ describe('persistQueryClientRestore', () => { .spyOn(console, 'warn') .mockImplementation(() => undefined) - const queryClient = createQueryClient() + const queryClient = new QueryClient() const restoreError = new Error('Error restoring client') const removeError = new Error('Error removing client') @@ -135,7 +131,7 @@ describe('persistQueryClientRestore', () => { }) test('should rethrow error in `removeClient`', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const persister = createSpyPersister() const removeError = new Error('Error removing client') diff --git a/packages/query-persist-client-core/src/__tests__/utils.ts b/packages/query-persist-client-core/src/__tests__/utils.ts index ee5ac7f0d4..1c9b4682e7 100644 --- a/packages/query-persist-client-core/src/__tests__/utils.ts +++ b/packages/query-persist-client-core/src/__tests__/utils.ts @@ -1,18 +1,7 @@ import { vi } from 'vitest' -import { QueryClient } from '@tanstack/query-core' -import type { QueryClientConfig } from '@tanstack/query-core' +import { sleep } from '@tanstack/query-test-utils' import type { PersistedClient, Persister } from '../persist' -export function createQueryClient(config?: QueryClientConfig): QueryClient { - return new QueryClient(config) -} - -function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} - export function createMockPersister(): Persister { let storedState: PersistedClient | undefined diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index 9c1be23407..805307ef27 100644 --- a/packages/query-sync-storage-persister/package.json +++ b/packages/query-sync-storage-persister/package.json @@ -63,6 +63,7 @@ "@tanstack/query-persist-client-core": "workspace:*" }, "devDependencies": { + "@tanstack/query-test-utils": "workspace:*", "npm-run-all2": "^5.0.0" } } diff --git a/packages/query-sync-storage-persister/src/__tests__/storageIsFull.test.ts b/packages/query-sync-storage-persister/src/__tests__/storageIsFull.test.ts index ae1a1a008d..5f75d66c21 100644 --- a/packages/query-sync-storage-persister/src/__tests__/storageIsFull.test.ts +++ b/packages/query-sync-storage-persister/src/__tests__/storageIsFull.test.ts @@ -6,8 +6,8 @@ import { dehydrate, } from '@tanstack/query-core' import { removeOldestQuery } from '@tanstack/query-persist-client-core' +import { sleep } from '@tanstack/query-test-utils' import { createSyncStoragePersister } from '../index' -import { sleep } from './utils' function getMockStorage(limitSize?: number) { const dataSet = new Map() diff --git a/packages/query-sync-storage-persister/src/__tests__/utils.ts b/packages/query-sync-storage-persister/src/__tests__/utils.ts deleted file mode 100644 index 1a3a619a22..0000000000 --- a/packages/query-sync-storage-persister/src/__tests__/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} diff --git a/packages/query-test-utils/eslint.config.js b/packages/query-test-utils/eslint.config.js new file mode 100644 index 0000000000..df75435c7e --- /dev/null +++ b/packages/query-test-utils/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from './root.eslint.config.js' + +export default [...rootConfig] diff --git a/packages/query-test-utils/package.json b/packages/query-test-utils/package.json new file mode 100644 index 0000000000..434c84a7a3 --- /dev/null +++ b/packages/query-test-utils/package.json @@ -0,0 +1,40 @@ +{ + "name": "@tanstack/query-test-utils", + "version": "0.0.0", + "description": "Internal test utilities for TanStack Query", + "author": "Jonghyeon Ko ", + "private": true, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/query.git", + "directory": "packages/query-test-utils" + }, + "homepage": "https://tanstack.com/query", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "main": "src/index.ts", + "types": "src/index.ts", + "module": "src/index.ts", + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./package.json": "./package.json" + }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "test:eslint": "eslint ./src", + "test:types": "npm-run-all --serial test:types:*", + "test:types:tscurrent": "tsc --build", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch" + }, + "type": "module", + "devDependencies": { + "npm-run-all2": "^5.0.0" + } +} diff --git a/packages/query-test-utils/root.eslint.config.js b/packages/query-test-utils/root.eslint.config.js new file mode 120000 index 0000000000..35dedbe5a4 --- /dev/null +++ b/packages/query-test-utils/root.eslint.config.js @@ -0,0 +1 @@ +../../eslint.config.js \ No newline at end of file diff --git a/packages/query-test-utils/src/__test__/queryKey.test.ts b/packages/query-test-utils/src/__test__/queryKey.test.ts new file mode 100644 index 0000000000..d403f70b01 --- /dev/null +++ b/packages/query-test-utils/src/__test__/queryKey.test.ts @@ -0,0 +1,12 @@ +import { queryKey } from 'src/queryKey' +import { describe, expect, it } from 'vitest' + +describe('queryKey', () => { + it('should return a query key', () => { + const key = queryKey() + expect(key).toEqual(['query_1']) + }) + it('should return a new query key each time', () => { + expect(queryKey()).not.toEqual(queryKey()) + }) +}) diff --git a/packages/query-test-utils/src/__test__/sleep.test.ts b/packages/query-test-utils/src/__test__/sleep.test.ts new file mode 100644 index 0000000000..db52331929 --- /dev/null +++ b/packages/query-test-utils/src/__test__/sleep.test.ts @@ -0,0 +1,11 @@ +import { describe, expect, it } from 'vitest' +import { sleep } from '../sleep' + +describe('sleep', () => { + it('should sleep for the given amount of time', async () => { + const start = Date.now() + await sleep(100) + const end = Date.now() + expect(end - start).toBeGreaterThanOrEqual(100) + }) +}) diff --git a/packages/query-test-utils/src/index.ts b/packages/query-test-utils/src/index.ts new file mode 100644 index 0000000000..5bd8473b3a --- /dev/null +++ b/packages/query-test-utils/src/index.ts @@ -0,0 +1,3 @@ +export { sleep } from './sleep' +export { queryKey } from './queryKey' +export { mockVisibilityState } from './mockVisibilityState' diff --git a/packages/query-test-utils/src/mockVisibilityState.ts b/packages/query-test-utils/src/mockVisibilityState.ts new file mode 100644 index 0000000000..a3a043adab --- /dev/null +++ b/packages/query-test-utils/src/mockVisibilityState.ts @@ -0,0 +1,7 @@ +import { vi } from 'vitest' +import type { MockInstance } from 'vitest' + +export const mockVisibilityState = ( + value: DocumentVisibilityState, +): MockInstance<() => DocumentVisibilityState> => + vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) diff --git a/packages/query-test-utils/src/queryKey.ts b/packages/query-test-utils/src/queryKey.ts new file mode 100644 index 0000000000..6c2fc03505 --- /dev/null +++ b/packages/query-test-utils/src/queryKey.ts @@ -0,0 +1,6 @@ +let queryKeyCount = 0 + +export const queryKey = (): Array => { + queryKeyCount++ + return [`query_${queryKeyCount}`] +} diff --git a/packages/query-test-utils/src/sleep.ts b/packages/query-test-utils/src/sleep.ts new file mode 100644 index 0000000000..3df1811e99 --- /dev/null +++ b/packages/query-test-utils/src/sleep.ts @@ -0,0 +1,4 @@ +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) diff --git a/packages/query-test-utils/tsconfig.json b/packages/query-test-utils/tsconfig.json new file mode 100644 index 0000000000..21715ae3ce --- /dev/null +++ b/packages/query-test-utils/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist-ts", + "rootDir": ".", + "baseUrl": "." + }, + "include": ["src", "*.config.js", "package.json"] +} diff --git a/packages/query-test-utils/vite.config.ts b/packages/query-test-utils/vite.config.ts new file mode 100644 index 0000000000..730e2b979c --- /dev/null +++ b/packages/query-test-utils/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from 'vitest/config' + +import packageJson from './package.json' + +export default defineConfig({ + // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + environments: { + ssr: { + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + }, + }, + test: { + name: packageJson.name, + dir: './src', + watch: false, + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + restoreMocks: true, + }, +}) diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index 7a67aaed1e..53b5445614 100644 --- a/packages/react-query-persist-client/package.json +++ b/packages/react-query-persist-client/package.json @@ -62,6 +62,7 @@ "@tanstack/query-persist-client-core": "workspace:*" }, "devDependencies": { + "@tanstack/query-test-utils": "workspace:*", "@tanstack/react-query": "workspace:*", "@testing-library/react": "^16.1.0", "@types/react": "^19.0.1", diff --git a/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx b/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx index e47a1f75f4..74bccab533 100644 --- a/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -3,9 +3,8 @@ import * as React from 'react' import { fireEvent, render, waitFor } from '@testing-library/react' import { QueryClient, useQueries, useQuery } from '@tanstack/react-query' import { persistQueryClientSave } from '@tanstack/query-persist-client-core' - +import { queryKey, sleep } from '@tanstack/query-test-utils' import { PersistQueryClientProvider } from '../PersistQueryClientProvider' -import { createQueryClient, queryKey, sleep } from './utils' import type { PersistedClient, Persister, @@ -56,7 +55,7 @@ describe('PersistQueryClientProvider', () => { const key = queryKey() const states: Array> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -130,7 +129,7 @@ describe('PersistQueryClientProvider', () => { test('should subscribe correctly in StrictMode', async () => { const key = queryKey() - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -195,7 +194,7 @@ describe('PersistQueryClientProvider', () => { const key = queryKey() const states: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -274,7 +273,7 @@ describe('PersistQueryClientProvider', () => { const key = queryKey() const states: Array> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -354,7 +353,7 @@ describe('PersistQueryClientProvider', () => { const key = queryKey() const states: Array> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -422,7 +421,7 @@ describe('PersistQueryClientProvider', () => { test('should call onSuccess after successful restoring', async () => { const key = queryKey() - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -472,7 +471,7 @@ describe('PersistQueryClientProvider', () => { test('should await onSuccess after successful restoring', async () => { const key = queryKey() - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -537,7 +536,7 @@ describe('PersistQueryClientProvider', () => { .mockImplementation(() => undefined) consoleMock.mockImplementation(() => undefined) - const queryClient = createQueryClient() + const queryClient = new QueryClient() const removeClient = vi.fn() const onSuccess = vi.fn() const onError = vi.fn() @@ -587,7 +586,7 @@ describe('PersistQueryClientProvider', () => { const key = queryKey() const states: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -722,7 +721,7 @@ describe('PersistQueryClientProvider', () => { const key = queryKey() - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), diff --git a/packages/react-query-persist-client/src/__tests__/utils.ts b/packages/react-query-persist-client/src/__tests__/utils.ts deleted file mode 100644 index 1dd6aa1b48..0000000000 --- a/packages/react-query-persist-client/src/__tests__/utils.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { QueryClient } from '@tanstack/react-query' -import type { QueryClientConfig } from '@tanstack/react-query' - -export function createQueryClient(config?: QueryClientConfig): QueryClient { - return new QueryClient(config) -} - -let queryKeyCount = 0 -export function queryKey(): Array { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} diff --git a/packages/react-query/package.json b/packages/react-query/package.json index ee4f33d50c..36bf1d6042 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -69,6 +69,7 @@ }, "devDependencies": { "@tanstack/query-persist-client-core": "workspace:*", + "@tanstack/query-test-utils": "workspace:*", "@testing-library/react": "^16.1.0", "@testing-library/react-render-stream": "^2.0.0", "@types/react": "^19.0.1", diff --git a/packages/react-query/src/__tests__/HydrationBoundary.test.tsx b/packages/react-query/src/__tests__/HydrationBoundary.test.tsx index f81c028948..aea35826c2 100644 --- a/packages/react-query/src/__tests__/HydrationBoundary.test.tsx +++ b/packages/react-query/src/__tests__/HydrationBoundary.test.tsx @@ -1,8 +1,8 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import * as React from 'react' import { render } from '@testing-library/react' - import * as coreModule from '@tanstack/query-core' +import { sleep } from '@tanstack/query-test-utils' import { HydrationBoundary, QueryClient, @@ -10,14 +10,13 @@ import { dehydrate, useQuery, } from '..' -import { createQueryClient, sleep } from './utils' describe('React hydration', () => { let stringifiedState: string beforeEach(async () => { vi.useFakeTimers() - const queryClient = createQueryClient() + const queryClient = new QueryClient() queryClient.prefetchQuery({ queryKey: ['string'], queryFn: () => sleep(10).then(() => ['stringCached']), @@ -33,7 +32,7 @@ describe('React hydration', () => { test('should hydrate queries to the cache on context', async () => { const dehydratedState = JSON.parse(stringifiedState) - const queryClient = createQueryClient() + const queryClient = new QueryClient() function Page() { const { data } = useQuery({ @@ -101,7 +100,7 @@ describe('React hydration', () => { describe('ReactQueryCacheProvider with hydration support', () => { test('should hydrate new queries if queries change', async () => { const dehydratedState = JSON.parse(stringifiedState) - const queryClient = createQueryClient() + const queryClient = new QueryClient() function Page({ queryKey }: { queryKey: [string] }) { const { data } = useQuery({ @@ -128,7 +127,7 @@ describe('React hydration', () => { await vi.advanceTimersByTimeAsync(20) expect(rendered.getByText('string')).toBeInTheDocument() - const intermediateClient = createQueryClient() + const intermediateClient = new QueryClient() intermediateClient.prefetchQuery({ queryKey: ['string'], @@ -174,7 +173,7 @@ describe('React hydration', () => { // since they don't have any observers on the current page that would update. test('should hydrate new but not existing queries if transition is aborted', async () => { const initialDehydratedState = JSON.parse(stringifiedState) - const queryClient = createQueryClient() + const queryClient = new QueryClient() function Page({ queryKey }: { queryKey: [string] }) { const { data } = useQuery({ @@ -201,7 +200,7 @@ describe('React hydration', () => { await vi.advanceTimersByTimeAsync(20) expect(rendered.getByText('string')).toBeInTheDocument() - const intermediateClient = createQueryClient() + const intermediateClient = new QueryClient() intermediateClient.prefetchQuery({ queryKey: ['string'], queryFn: () => sleep(20).then(() => ['should not change']), @@ -270,7 +269,7 @@ describe('React hydration', () => { test('should hydrate queries to new cache if cache changes', async () => { const dehydratedState = JSON.parse(stringifiedState) - const queryClient = createQueryClient() + const queryClient = new QueryClient() function Page() { const { data } = useQuery({ @@ -296,7 +295,7 @@ describe('React hydration', () => { expect(rendered.getByText('stringCached')).toBeInTheDocument() await vi.advanceTimersByTimeAsync(20) expect(rendered.getByText('string')).toBeInTheDocument() - const newClientQueryClient = createQueryClient() + const newClientQueryClient = new QueryClient() rendered.rerender( @@ -315,7 +314,7 @@ describe('React hydration', () => { }) test('should not hydrate queries if state is null', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const hydrateSpy = vi.spyOn(coreModule, 'hydrate') @@ -343,7 +342,7 @@ describe('React hydration', () => { }) test('should not hydrate queries if state is undefined', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const hydrateSpy = vi.spyOn(coreModule, 'hydrate') diff --git a/packages/react-query/src/__tests__/QueryClientProvider.test.tsx b/packages/react-query/src/__tests__/QueryClientProvider.test.tsx index 53ebf7bafb..ebf599c1a4 100644 --- a/packages/react-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/react-query/src/__tests__/QueryClientProvider.test.tsx @@ -1,7 +1,13 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { render } from '@testing-library/react' -import { QueryCache, QueryClientProvider, useQuery, useQueryClient } from '..' -import { createQueryClient, queryKey, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + QueryClientProvider, + useQuery, + useQueryClient, +} from '..' describe('QueryClientProvider', () => { beforeEach(() => { @@ -16,7 +22,7 @@ describe('QueryClientProvider', () => { const key = queryKey() const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) function Page() { const { data } = useQuery({ @@ -49,8 +55,8 @@ describe('QueryClientProvider', () => { const queryCache1 = new QueryCache() const queryCache2 = new QueryCache() - const queryClient1 = createQueryClient({ queryCache: queryCache1 }) - const queryClient2 = createQueryClient({ queryCache: queryCache2 }) + const queryClient1 = new QueryClient({ queryCache: queryCache1 }) + const queryClient2 = new QueryClient({ queryCache: queryCache2 }) function Page1() { const { data } = useQuery({ @@ -101,7 +107,7 @@ describe('QueryClientProvider', () => { const key = queryKey() const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { queries: { diff --git a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx index eeb19512d9..8bc5dd9923 100644 --- a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx +++ b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx @@ -2,20 +2,21 @@ import { describe, expect, it, vi } from 'vitest' import { fireEvent, waitFor } from '@testing-library/react' import { ErrorBoundary } from 'react-error-boundary' import * as React from 'react' - +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, + QueryClient, QueryErrorResetBoundary, useQueries, useQuery, useSuspenseQueries, useSuspenseQuery, } from '..' -import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' +import { renderWithClient } from './utils' describe('QueryErrorResetBoundary', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) describe('useQuery', () => { it('should retry fetch if the reset error boundary has been reset', async () => { diff --git a/packages/react-query/src/__tests__/fine-grained-persister.test.tsx b/packages/react-query/src/__tests__/fine-grained-persister.test.tsx index 800e708559..13a2e3aed9 100644 --- a/packages/react-query/src/__tests__/fine-grained-persister.test.tsx +++ b/packages/react-query/src/__tests__/fine-grained-persister.test.tsx @@ -1,12 +1,12 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import * as React from 'react' -import { QueryCache, hashKey } from '@tanstack/query-core' import { PERSISTER_KEY_PREFIX, experimental_createPersister, } from '@tanstack/query-persist-client-core' -import { useQuery } from '..' -import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { QueryCache, QueryClient, hashKey, useQuery } from '..' +import { renderWithClient } from './utils' describe('fine grained persister', () => { beforeEach(() => { @@ -18,7 +18,7 @@ describe('fine grained persister', () => { }) const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should restore query state from persister and not refetch', async () => { const key = queryKey() diff --git a/packages/react-query/src/__tests__/ssr-hydration.test.tsx b/packages/react-query/src/__tests__/ssr-hydration.test.tsx index 1edf18d564..07f469b568 100644 --- a/packages/react-query/src/__tests__/ssr-hydration.test.tsx +++ b/packages/react-query/src/__tests__/ssr-hydration.test.tsx @@ -2,15 +2,15 @@ import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import { hydrateRoot } from 'react-dom/client' import { act } from 'react' import * as ReactDOMServer from 'react-dom/server' - import { QueryCache, + QueryClient, QueryClientProvider, dehydrate, hydrate, useQuery, } from '..' -import { createQueryClient, setIsServer } from './utils' +import { setIsServer } from './utils' const ReactHydrate = (element: React.ReactElement, container: Element) => { let root: any @@ -66,7 +66,7 @@ describe('Server side rendering with de/rehydration', () => { setIsServer(true) const prefetchCache = new QueryCache() - const prefetchClient = createQueryClient({ + const prefetchClient = new QueryClient({ queryCache: prefetchCache, }) await prefetchClient.prefetchQuery({ @@ -75,7 +75,7 @@ describe('Server side rendering with de/rehydration', () => { }) const dehydratedStateServer = dehydrate(prefetchClient) const renderCache = new QueryCache() - const renderClient = createQueryClient({ + const renderClient = new QueryClient({ queryCache: renderCache, }) hydrate(renderClient, dehydratedStateServer) @@ -99,7 +99,7 @@ describe('Server side rendering with de/rehydration', () => { el.innerHTML = markup const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) hydrate(queryClient, JSON.parse(stringifiedState)) const unmount = ReactHydrate( @@ -143,7 +143,7 @@ describe('Server side rendering with de/rehydration', () => { // -- Server part -- setIsServer(true) const prefetchCache = new QueryCache() - const prefetchClient = createQueryClient({ + const prefetchClient = new QueryClient({ queryCache: prefetchCache, }) await prefetchClient.prefetchQuery({ @@ -152,7 +152,7 @@ describe('Server side rendering with de/rehydration', () => { }) const dehydratedStateServer = dehydrate(prefetchClient) const renderCache = new QueryCache() - const renderClient = createQueryClient({ + const renderClient = new QueryClient({ queryCache: renderCache, }) hydrate(renderClient, dehydratedStateServer) @@ -175,7 +175,7 @@ describe('Server side rendering with de/rehydration', () => { el.innerHTML = markup const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) hydrate(queryClient, JSON.parse(stringifiedState)) const unmount = ReactHydrate( @@ -219,9 +219,9 @@ describe('Server side rendering with de/rehydration', () => { // -- Server part -- setIsServer(true) - const prefetchClient = createQueryClient() + const prefetchClient = new QueryClient() const dehydratedStateServer = dehydrate(prefetchClient) - const renderClient = createQueryClient() + const renderClient = new QueryClient() hydrate(renderClient, dehydratedStateServer) const markup = ReactDOMServer.renderToString( @@ -242,7 +242,7 @@ describe('Server side rendering with de/rehydration', () => { el.innerHTML = markup const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) hydrate(queryClient, JSON.parse(stringifiedState)) const unmount = ReactHydrate( diff --git a/packages/react-query/src/__tests__/ssr.test.tsx b/packages/react-query/src/__tests__/ssr.test.tsx index 49d51abcaf..0fdd248159 100644 --- a/packages/react-query/src/__tests__/ssr.test.tsx +++ b/packages/react-query/src/__tests__/ssr.test.tsx @@ -1,8 +1,15 @@ import * as React from 'react' import { renderToString } from 'react-dom/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { QueryCache, QueryClientProvider, useInfiniteQuery, useQuery } from '..' -import { createQueryClient, queryKey, setIsServer } from './utils' +import { queryKey } from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + QueryClientProvider, + useInfiniteQuery, + useQuery, +} from '..' +import { setIsServer } from './utils' describe('Server Side Rendering', () => { setIsServer(true) @@ -17,7 +24,7 @@ describe('Server Side Rendering', () => { it('should not trigger fetch', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key = queryKey() const queryFn = vi.fn().mockReturnValue('data') @@ -46,7 +53,7 @@ describe('Server Side Rendering', () => { it('should add prefetched data to cache', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key = queryKey() const fetchFn = () => Promise.resolve('data') const data = await queryClient.fetchQuery({ @@ -60,7 +67,7 @@ describe('Server Side Rendering', () => { it('should return existing data from the cache', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key = queryKey() const queryFn = vi.fn(async () => { await vi.advanceTimersByTimeAsync(10) @@ -96,7 +103,7 @@ describe('Server Side Rendering', () => { const key = queryKey() const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) function Page() { const [page, setPage] = React.useState(1) @@ -128,7 +135,7 @@ describe('Server Side Rendering', () => { it('useInfiniteQuery should return the correct state', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key = queryKey() const queryFn = vi.fn(async () => { await vi.advanceTimersByTimeAsync(5) diff --git a/packages/react-query/src/__tests__/suspense.test.tsx b/packages/react-query/src/__tests__/suspense.test.tsx index cc8ae1fe7f..c00c036c0a 100644 --- a/packages/react-query/src/__tests__/suspense.test.tsx +++ b/packages/react-query/src/__tests__/suspense.test.tsx @@ -9,8 +9,8 @@ import { it, vi, } from 'vitest' +import { queryKey } from '@tanstack/query-test-utils' import { QueryClient, QueryClientProvider, useSuspenseQuery } from '..' -import { queryKey } from './utils' import type { QueryKey } from '..' function renderWithSuspense(client: QueryClient, ui: React.ReactNode) { diff --git a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx index 433bc3fa2c..e114642019 100644 --- a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx @@ -5,19 +5,15 @@ import { createRenderStream, useTrackRenders, } from '@testing-library/react-render-stream' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, + QueryClient, QueryClientProvider, keepPreviousData, useInfiniteQuery, } from '..' -import { - createQueryClient, - queryKey, - renderWithClient, - setActTimeout, - sleep, -} from './utils' +import { renderWithClient, setActTimeout } from './utils' import type { InfiniteData, QueryFunctionContext, @@ -51,7 +47,7 @@ const fetchItems = async ( describe('useInfiniteQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { queries: { diff --git a/packages/react-query/src/__tests__/useIsFetching.test.tsx b/packages/react-query/src/__tests__/useIsFetching.test.tsx index bed5506fe9..4b2ca7e0f6 100644 --- a/packages/react-query/src/__tests__/useIsFetching.test.tsx +++ b/packages/react-query/src/__tests__/useIsFetching.test.tsx @@ -1,13 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fireEvent, render } from '@testing-library/react' import * as React from 'react' -import { QueryCache, useIsFetching, useQuery } from '..' -import { - createQueryClient, - queryKey, - renderWithClient, - setActTimeout, -} from './utils' +import { queryKey } from '@tanstack/query-test-utils' +import { QueryCache, QueryClient, useIsFetching, useQuery } from '..' +import { renderWithClient, setActTimeout } from './utils' describe('useIsFetching', () => { beforeEach(() => { @@ -21,7 +17,7 @@ describe('useIsFetching', () => { // See https://github.com/tannerlinsley/react-query/issues/105 it('should update as queries start and stop fetching', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key = queryKey() function IsFetching() { @@ -72,7 +68,7 @@ describe('useIsFetching', () => { it('should not update state while rendering', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key1 = queryKey() const key2 = queryKey() @@ -133,7 +129,7 @@ describe('useIsFetching', () => { }) it('should be able to filter', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const key1 = queryKey() const key2 = queryKey() @@ -202,7 +198,7 @@ describe('useIsFetching', () => { }) it('should show the correct fetching state when mounted after a query', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const key = queryKey() function Page() { @@ -235,7 +231,7 @@ describe('useIsFetching', () => { }) it('should use provided custom queryClient', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const key = queryKey() function Page() { diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index 20aad96b95..d98ec6d1df 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -4,21 +4,19 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fireEvent, render } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' -import { MutationCache, QueryCache, useMutation } from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { MutationCache, QueryCache, QueryClient, useMutation } from '..' import { - createQueryClient, mockOnlineManagerIsOnline, - queryKey, renderWithClient, setActTimeout, - sleep, } from './utils' import type { UseMutationResult } from '../types' describe('useMutation', () => { let queryCache = new QueryCache() let mutationCache = new MutationCache() - let queryClient = createQueryClient({ + let queryClient = new QueryClient({ queryCache, mutationCache, }) @@ -26,7 +24,7 @@ describe('useMutation', () => { beforeEach(() => { queryCache = new QueryCache() mutationCache = new MutationCache() - queryClient = createQueryClient({ + queryClient = new QueryClient({ queryCache, }) vi.useFakeTimers() @@ -826,7 +824,7 @@ describe('useMutation', () => { const errorMock = vi.fn() const successMock = vi.fn() - const queryClientMutationMeta = createQueryClient({ + const queryClientMutationMeta = new QueryClient({ mutationCache: new MutationCache({ onSuccess: (_, __, ___, mutation) => { successMock(mutation.meta?.metaSuccessMessage) diff --git a/packages/react-query/src/__tests__/useMutationState.test.tsx b/packages/react-query/src/__tests__/useMutationState.test.tsx index 1f88ed6200..5797172030 100644 --- a/packages/react-query/src/__tests__/useMutationState.test.tsx +++ b/packages/react-query/src/__tests__/useMutationState.test.tsx @@ -1,9 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fireEvent, render } from '@testing-library/react' import * as React from 'react' -import { useIsMutating, useMutationState } from '../useMutationState' -import { useMutation } from '../useMutation' -import { createQueryClient, renderWithClient, sleep } from './utils' +import { sleep } from '@tanstack/query-test-utils' +import { QueryClient, useIsMutating, useMutation, useMutationState } from '..' +import { renderWithClient } from './utils' describe('useIsMutating', () => { beforeEach(() => { @@ -16,7 +16,7 @@ describe('useIsMutating', () => { it('should return the number of fetching mutations', async () => { const isMutatingArray: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { const isMutating = useIsMutating() @@ -72,7 +72,7 @@ describe('useIsMutating', () => { it('should filter correctly by mutationKey', async () => { const isMutatingArray: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { const isMutating = useIsMutating({ mutationKey: ['mutation1'] }) @@ -104,7 +104,7 @@ describe('useIsMutating', () => { it('should filter correctly by predicate', async () => { const isMutatingArray: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { const isMutating = useIsMutating({ @@ -138,7 +138,7 @@ describe('useIsMutating', () => { }) it('should use provided custom queryClient', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() function Page() { const isMutating = useIsMutating({}, queryClient) @@ -171,7 +171,7 @@ describe('useIsMutating', () => { describe('useMutationState', () => { it('should return variables after calling mutate', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const variables: Array> = [] const mutationKey = ['mutation'] diff --git a/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx index 326149991d..0ebd96c68e 100644 --- a/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx @@ -1,14 +1,14 @@ import { describe, expect, it, vi } from 'vitest' import React from 'react' import { fireEvent, waitFor } from '@testing-library/react' - +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, + QueryClient, usePrefetchInfiniteQuery, useSuspenseInfiniteQuery, } from '..' -import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' - +import { renderWithClient } from './utils' import type { InfiniteData, UseSuspenseInfiniteQueryOptions } from '..' import type { Mock } from 'vitest' @@ -41,7 +41,7 @@ const generateInfiniteQueryOptions = ( describe('usePrefetchInfiniteQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const Fallback = vi.fn().mockImplementation(() =>
Loading...
) diff --git a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx index 894d7c2ac2..2f8fdeca54 100644 --- a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx @@ -2,13 +2,15 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import React from 'react' import { fireEvent } from '@testing-library/react' import { ErrorBoundary } from 'react-error-boundary' +import { queryKey } from '@tanstack/query-test-utils' import { QueryCache, + QueryClient, usePrefetchQuery, useQueryErrorResetBoundary, useSuspenseQuery, } from '..' -import { createQueryClient, queryKey, renderWithClient } from './utils' +import { renderWithClient } from './utils' import type { UseSuspenseQueryOptions } from '..' @@ -23,7 +25,7 @@ const generateQueryFn = (data: string) => describe('usePrefetchQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) beforeEach(() => { vi.useFakeTimers() diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index 8bb81fffcc..b885def59c 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -2,9 +2,15 @@ import { describe, expect, expectTypeOf, it, vi } from 'vitest' import { fireEvent, render, waitFor } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' -import { QueryClient } from '@tanstack/query-core' -import { QueryCache, queryOptions, skipToken, useQueries } from '..' -import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + queryOptions, + skipToken, + useQueries, +} from '..' +import { renderWithClient } from './utils' import type { QueryFunction, QueryKey, @@ -16,7 +22,7 @@ import type { QueryFunctionContext } from '@tanstack/query-core' describe('useQueries', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should return the correct states', async () => { const key1 = queryKey() diff --git a/packages/react-query/src/__tests__/useQuery.promise.test.tsx b/packages/react-query/src/__tests__/useQuery.promise.test.tsx index 915100d367..8f06f1e165 100644 --- a/packages/react-query/src/__tests__/useQuery.promise.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.promise.test.tsx @@ -5,18 +5,19 @@ import { createRenderStream, useTrackRenders, } from '@testing-library/react-render-stream' +import { queryKey } from '@tanstack/query-test-utils' import { + QueryClient, QueryClientProvider, QueryErrorResetBoundary, keepPreviousData, useQuery, } from '..' import { QueryCache } from '../index' -import { createQueryClient, queryKey } from './utils' describe('useQuery().promise', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, }) diff --git a/packages/react-query/src/__tests__/useQuery.test-d.tsx b/packages/react-query/src/__tests__/useQuery.test-d.tsx index b59e7f295d..fd5e265b74 100644 --- a/packages/react-query/src/__tests__/useQuery.test-d.tsx +++ b/packages/react-query/src/__tests__/useQuery.test-d.tsx @@ -1,7 +1,7 @@ import { describe, expectTypeOf, it } from 'vitest' +import { queryKey } from '@tanstack/query-test-utils' import { useQuery } from '../useQuery' import { queryOptions } from '../queryOptions' -import { queryKey } from './utils' import type { OmitKeyof, QueryFunction, UseQueryOptions } from '..' describe('useQuery', () => { diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index 0cc6d639fb..3635b668bf 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -2,30 +2,38 @@ import { afterEach, beforeEach, describe, expect, it, test, vi } from 'vitest' import { act, fireEvent, render } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' -import { dehydrate, hydrate, skipToken } from '@tanstack/query-core' -import { QueryCache, keepPreviousData, useQuery } from '..' import { - Blink, - createQueryClient, - mockOnlineManagerIsOnline, mockVisibilityState, queryKey, + sleep, +} from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + dehydrate, + hydrate, + keepPreviousData, + skipToken, + useQuery, +} from '..' +import { + Blink, + mockOnlineManagerIsOnline, renderWithClient, setActTimeout, - sleep, } from './utils' import type { DefinedUseQueryResult, QueryFunction, UseQueryResult } from '..' import type { Mock } from 'vitest' describe('useQuery', () => { let queryCache = new QueryCache() - let queryClient = createQueryClient({ + let queryClient = new QueryClient({ queryCache, }) beforeEach(() => { queryCache = new QueryCache() - queryClient = createQueryClient({ + queryClient = new QueryClient({ queryCache, }) vi.useFakeTimers() @@ -6735,7 +6743,7 @@ describe('useQuery', () => { it('should pick up an initialPromise', async () => { const key = queryKey() - const serverQueryClient = createQueryClient({ + const serverQueryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true } }, }) @@ -6769,7 +6777,7 @@ describe('useQuery', () => { ) } - const clientQueryClient = createQueryClient() + const clientQueryClient = new QueryClient() hydrate(clientQueryClient, dehydrated) const rendered = renderWithClient(clientQueryClient, ) @@ -6789,7 +6797,7 @@ describe('useQuery', () => { .mockImplementation(() => undefined) const key = queryKey() - const serverQueryClient = createQueryClient({ + const serverQueryClient = new QueryClient({ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true }, }, @@ -6825,7 +6833,7 @@ describe('useQuery', () => { ) } - const clientQueryClient = createQueryClient({ + const clientQueryClient = new QueryClient({ defaultOptions: { hydrate: { queries: { retry: 1, retryDelay: 10 } } }, }) hydrate(clientQueryClient, dehydrated) diff --git a/packages/react-query/src/__tests__/useSuspenseInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/useSuspenseInfiniteQuery.test.tsx index b5d7b4a49d..398b7515cd 100644 --- a/packages/react-query/src/__tests__/useSuspenseInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseInfiniteQuery.test.tsx @@ -1,11 +1,17 @@ import { describe, expect, it, vi } from 'vitest' import * as React from 'react' -import { QueryCache, skipToken, useSuspenseInfiniteQuery } from '..' -import { createQueryClient, queryKey, renderWithClient } from './utils' +import { queryKey } from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + skipToken, + useSuspenseInfiniteQuery, +} from '..' +import { renderWithClient } from './utils' describe('useSuspenseInfiniteQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should log an error when skipToken is passed as queryFn', () => { const consoleErrorSpy = vi diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx index af541cebb6..64f09fb800 100644 --- a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx @@ -10,8 +10,14 @@ import { import { act, fireEvent, render, waitFor } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' -import { skipToken, useSuspenseQueries, useSuspenseQuery } from '..' -import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { + QueryClient, + skipToken, + useSuspenseQueries, + useSuspenseQuery, +} from '..' +import { renderWithClient } from './utils' import type { UseSuspenseQueryOptions } from '..' type NumberQueryOptions = UseSuspenseQueryOptions @@ -27,7 +33,7 @@ const createQuery: (id: number) => NumberQueryOptions = (id) => ({ }) const resolveQueries = () => vi.advanceTimersByTimeAsync(QUERY_DURATION) -const queryClient = createQueryClient() +const queryClient = new QueryClient() describe('useSuspenseQueries', () => { const onSuspend = vi.fn() @@ -506,7 +512,7 @@ describe('useSuspenseQueries 2', () => { it('should still suspense if queryClient has placeholderData config', async () => { const key = queryKey() - const queryClientWithPlaceholder = createQueryClient({ + const queryClientWithPlaceholder = new QueryClient({ defaultOptions: { queries: { placeholderData: (previousData: any) => previousData, diff --git a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx index 06b8e61d07..3ea24a9326 100644 --- a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx @@ -2,15 +2,17 @@ import { describe, expect, it, vi } from 'vitest' import { fireEvent, waitFor } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, + QueryClient, QueryErrorResetBoundary, skipToken, useQueryErrorResetBoundary, useSuspenseInfiniteQuery, useSuspenseQuery, } from '..' -import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' +import { renderWithClient } from './utils' import type { InfiniteData, UseSuspenseInfiniteQueryResult, @@ -19,7 +21,7 @@ import type { describe('useSuspenseQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should render the correct amount of times in Suspense mode', async () => { const key = queryKey() @@ -848,7 +850,7 @@ describe('useSuspenseQuery', () => { it('should still suspense if queryClient has placeholderData config', async () => { const key = queryKey() - const queryClientWithPlaceholder = createQueryClient({ + const queryClientWithPlaceholder = new QueryClient({ defaultOptions: { queries: { placeholderData: (previousData: any) => previousData, diff --git a/packages/react-query/src/__tests__/utils.tsx b/packages/react-query/src/__tests__/utils.tsx index d3536bf98d..3734c1caf6 100644 --- a/packages/react-query/src/__tests__/utils.tsx +++ b/packages/react-query/src/__tests__/utils.tsx @@ -2,8 +2,8 @@ import { vi } from 'vitest' import * as React from 'react' import { act, render } from '@testing-library/react' import * as utils from '@tanstack/query-core' -import { QueryClient, QueryClientProvider, onlineManager } from '..' -import type { QueryClientConfig } from '..' +import { QueryClientProvider, onlineManager } from '..' +import type { QueryClient } from '..' import type { MockInstance } from 'vitest' export function renderWithClient( @@ -42,34 +42,12 @@ export function Blink({ return shouldShow ? <>{children} : <>off } -export function createQueryClient(config?: QueryClientConfig): QueryClient { - return new QueryClient(config) -} - -export function mockVisibilityState( - value: DocumentVisibilityState, -): MockInstance<() => DocumentVisibilityState> { - return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) -} - export function mockOnlineManagerIsOnline( value: boolean, ): MockInstance<() => boolean> { return vi.spyOn(onlineManager, 'isOnline').mockReturnValue(value) } -let queryKeyCount = 0 -export function queryKey(): Array { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} - export function setActTimeout(fn: () => void, ms?: number) { return setTimeout(() => { act(() => { diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index 948ba1a4e4..09b5dea478 100644 --- a/packages/solid-query-persist-client/package.json +++ b/packages/solid-query-persist-client/package.json @@ -68,6 +68,7 @@ }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", + "@tanstack/query-test-utils": "workspace:*", "@tanstack/solid-query": "workspace:*", "npm-run-all2": "^5.0.0", "solid-js": "^1.9.5", diff --git a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx index 164a387d40..06bf8790cd 100644 --- a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -3,9 +3,8 @@ import { render, screen, waitFor } from '@solidjs/testing-library' import { QueryClient, useQueries, useQuery } from '@tanstack/solid-query' import { persistQueryClientSave } from '@tanstack/query-persist-client-core' import { createEffect, createSignal, onMount } from 'solid-js' - +import { queryKey, sleep } from '@tanstack/query-test-utils' import { PersistQueryClientProvider } from '../PersistQueryClientProvider' -import { createQueryClient, queryKey, sleep } from './utils' import type { PersistedClient, Persister, @@ -56,7 +55,7 @@ describe('PersistQueryClientProvider', () => { data: string | undefined }> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -134,7 +133,7 @@ describe('PersistQueryClientProvider', () => { data: string | undefined }> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -217,7 +216,7 @@ describe('PersistQueryClientProvider', () => { data: string | undefined }> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -300,7 +299,7 @@ describe('PersistQueryClientProvider', () => { data: string | undefined }> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -373,7 +372,7 @@ describe('PersistQueryClientProvider', () => { test('should call onSuccess after successful restoring', async () => { const key = queryKey() - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), @@ -426,7 +425,7 @@ describe('PersistQueryClientProvider', () => { const onErrorMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) - const queryClient = createQueryClient() + const queryClient = new QueryClient() const removeClient = vi.fn() const onSuccess = vi.fn() const onError = vi.fn() @@ -479,7 +478,7 @@ describe('PersistQueryClientProvider', () => { data: string | undefined }> = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => Promise.resolve('hydrated'), diff --git a/packages/solid-query-persist-client/src/__tests__/utils.ts b/packages/solid-query-persist-client/src/__tests__/utils.ts deleted file mode 100644 index dd483203f3..0000000000 --- a/packages/solid-query-persist-client/src/__tests__/utils.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { QueryClient } from '@tanstack/solid-query' -import type { QueryClientConfig } from '@tanstack/solid-query' - -export function createQueryClient(config?: QueryClientConfig): QueryClient { - return new QueryClient(config) -} - -let queryKeyCount = 0 -export function queryKey(): Array { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index 079893575e..986ba11844 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -70,6 +70,7 @@ }, "devDependencies": { "@solidjs/testing-library": "^0.8.10", + "@tanstack/query-test-utils": "workspace:*", "npm-run-all2": "^5.0.0", "solid-js": "^1.9.5", "tsup-preset-solid": "^2.2.0", diff --git a/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx b/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx index 025b633106..53bd1d0269 100644 --- a/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx @@ -1,15 +1,15 @@ import { describe, expect, it, vi } from 'vitest' import { render, waitFor } from '@solidjs/testing-library' import { QueryCache } from '@tanstack/query-core' -import { QueryClientProvider, useQuery, useQueryClient } from '..' -import { createQueryClient, queryKey, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { QueryClient, QueryClientProvider, useQuery, useQueryClient } from '..' describe('QueryClientProvider', () => { it('sets a specific cache for all queries to use', async () => { const key = queryKey() const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) function Page() { const query = useQuery(() => ({ @@ -47,8 +47,8 @@ describe('QueryClientProvider', () => { const queryCache1 = new QueryCache() const queryCache2 = new QueryCache() - const queryClient1 = createQueryClient({ queryCache: queryCache1 }) - const queryClient2 = createQueryClient({ queryCache: queryCache2 }) + const queryClient1 = new QueryClient({ queryCache: queryCache1 }) + const queryClient2 = new QueryClient({ queryCache: queryCache2 }) function Page1() { const query = useQuery(() => ({ @@ -105,7 +105,7 @@ describe('QueryClientProvider', () => { const key = queryKey() const queryCache = new QueryCache() - const queryClient = createQueryClient({ + const queryClient = new QueryClient({ queryCache, defaultOptions: { queries: { @@ -167,7 +167,7 @@ describe('QueryClientProvider', () => { .mockImplementation(() => undefined) function Page() { - const client = createQueryClient() + const client = new QueryClient() useQueryClient(client) return null } diff --git a/packages/solid-query/src/__tests__/suspense.test.tsx b/packages/solid-query/src/__tests__/suspense.test.tsx index 8a35844618..a0ac00b8e2 100644 --- a/packages/solid-query/src/__tests__/suspense.test.tsx +++ b/packages/solid-query/src/__tests__/suspense.test.tsx @@ -1,6 +1,5 @@ import { describe, expect, it, vi } from 'vitest' import { fireEvent, render, waitFor } from '@solidjs/testing-library' - import { ErrorBoundary, Show, @@ -9,13 +8,19 @@ import { createSignal, on, } from 'solid-js' -import { QueryCache, QueryClientProvider, useInfiniteQuery, useQuery } from '..' -import { createQueryClient, queryKey, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + QueryClientProvider, + useInfiniteQuery, + useQuery, +} from '..' import type { InfiniteData, UseInfiniteQueryResult, UseQueryResult } from '..' describe("useQuery's in Suspense mode", () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should render the correct amount of times in Suspense mode', async () => { const key = queryKey() diff --git a/packages/solid-query/src/__tests__/transition.test.tsx b/packages/solid-query/src/__tests__/transition.test.tsx index 72f1491d2a..f329f73efe 100644 --- a/packages/solid-query/src/__tests__/transition.test.tsx +++ b/packages/solid-query/src/__tests__/transition.test.tsx @@ -1,12 +1,12 @@ import { describe, expect, it } from 'vitest' import { fireEvent, render, waitFor } from '@solidjs/testing-library' import { Show, Suspense, createSignal, startTransition } from 'solid-js' -import { QueryCache, QueryClientProvider, useQuery } from '..' -import { createQueryClient, queryKey, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { QueryCache, QueryClient, QueryClientProvider, useQuery } from '..' describe("useQuery's in Suspense mode with transitions", () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should render the content when the transition is done', async () => { const key = queryKey() diff --git a/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx index 6fc070a04b..402e4bc22a 100644 --- a/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx @@ -11,21 +11,16 @@ import { createSignal, on, } from 'solid-js' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueryCache, + QueryClient, QueryClientProvider, infiniteQueryOptions, keepPreviousData, useInfiniteQuery, } from '..' -import { - Blink, - createQueryClient, - queryKey, - setActTimeout, - sleep, -} from './utils' - +import { Blink, setActTimeout } from './utils' import type { InfiniteData, QueryFunctionContext, @@ -59,7 +54,7 @@ const fetchItems = async ( describe('useInfiniteQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should return the correct states for a successful query', async () => { const key = queryKey() diff --git a/packages/solid-query/src/__tests__/useIsFetching.test.tsx b/packages/solid-query/src/__tests__/useIsFetching.test.tsx index c72a07784b..313f74d7a3 100644 --- a/packages/solid-query/src/__tests__/useIsFetching.test.tsx +++ b/packages/solid-query/src/__tests__/useIsFetching.test.tsx @@ -1,14 +1,21 @@ import { describe, expect, it } from 'vitest' import { fireEvent, render, waitFor } from '@solidjs/testing-library' import { Show, createEffect, createRenderEffect, createSignal } from 'solid-js' -import { QueryCache, QueryClientProvider, useIsFetching, useQuery } from '..' -import { createQueryClient, queryKey, setActTimeout, sleep } from './utils' +import { queryKey, sleep } from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + QueryClientProvider, + useIsFetching, + useQuery, +} from '..' +import { setActTimeout } from './utils' describe('useIsFetching', () => { // See https://github.com/tannerlinsley/react-query/issues/105 it('should update as queries start and stop fetching', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key = queryKey() function IsFetching() { @@ -60,7 +67,7 @@ describe('useIsFetching', () => { it('should not update state while rendering', async () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) const key1 = queryKey() const key2 = queryKey() @@ -127,7 +134,7 @@ describe('useIsFetching', () => { }) it('should be able to filter', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const key1 = queryKey() const key2 = queryKey() @@ -194,7 +201,7 @@ describe('useIsFetching', () => { }) it('should show the correct fetching state when mounted after a query', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const key = queryKey() function Page() { @@ -230,7 +237,7 @@ describe('useIsFetching', () => { }) it('should use provided custom queryClient', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const key = queryKey() function Page() { diff --git a/packages/solid-query/src/__tests__/useIsMutating.test.tsx b/packages/solid-query/src/__tests__/useIsMutating.test.tsx index 81c29ef591..0a8dd6c199 100644 --- a/packages/solid-query/src/__tests__/useIsMutating.test.tsx +++ b/packages/solid-query/src/__tests__/useIsMutating.test.tsx @@ -2,13 +2,19 @@ import { describe, expect, it, vi } from 'vitest' import { fireEvent, render, waitFor } from '@solidjs/testing-library' import { Show, createEffect, createRenderEffect, createSignal } from 'solid-js' import * as QueryCore from '@tanstack/query-core' -import { QueryClientProvider, useIsMutating, useMutation } from '..' -import { createQueryClient, setActTimeout, sleep } from './utils' +import { sleep } from '@tanstack/query-test-utils' +import { + QueryClient, + QueryClientProvider, + useIsMutating, + useMutation, +} from '..' +import { setActTimeout } from './utils' describe('useIsMutating', () => { it('should return the number of fetching mutations', async () => { const isMutatingArray: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { const isMutating = useIsMutating() @@ -63,7 +69,7 @@ describe('useIsMutating', () => { it('should filter correctly by mutationKey', async () => { const isMutatingArray: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { const isMutating = useIsMutating(() => ({ mutationKey: ['mutation1'] })) @@ -108,7 +114,7 @@ describe('useIsMutating', () => { it('should filter correctly by predicate', async () => { const isMutatingArray: Array = [] - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { const isMutating = useIsMutating(() => ({ @@ -156,7 +162,7 @@ describe('useIsMutating', () => { }) it('should use provided custom queryClient', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() function Page() { const isMutating = useIsMutating(undefined, () => queryClient) @@ -204,7 +210,7 @@ describe('useIsMutating', () => { return new MutationCacheMock(fn) }) - const queryClient = createQueryClient() + const queryClient = new QueryClient() function IsMutating() { useIsMutating() diff --git a/packages/solid-query/src/__tests__/useMutation.test.tsx b/packages/solid-query/src/__tests__/useMutation.test.tsx index 3d0894b004..7c5149f900 100644 --- a/packages/solid-query/src/__tests__/useMutation.test.tsx +++ b/packages/solid-query/src/__tests__/useMutation.test.tsx @@ -6,14 +6,15 @@ import { createSignal, } from 'solid-js' import { fireEvent, render } from '@solidjs/testing-library' -import { MutationCache, QueryCache, QueryClientProvider, useMutation } from '..' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { - createQueryClient, - mockOnlineManagerIsOnline, - queryKey, - setActTimeout, - sleep, -} from './utils' + MutationCache, + QueryCache, + QueryClient, + QueryClientProvider, + useMutation, +} from '..' +import { mockOnlineManagerIsOnline, setActTimeout } from './utils' import type { UseMutationResult } from '../types' describe('useMutation', () => { @@ -27,7 +28,7 @@ describe('useMutation', () => { const queryCache = new QueryCache() const mutationCache = new MutationCache() - const queryClient = createQueryClient({ queryCache, mutationCache }) + const queryClient = new QueryClient({ queryCache, mutationCache }) it('should be able to reset `data`', async () => { function Page() { @@ -898,7 +899,7 @@ describe('useMutation', () => { const errorMock = vi.fn() const successMock = vi.fn() - const queryClientMutationMeta = createQueryClient({ + const queryClientMutationMeta = new QueryClient({ mutationCache: new MutationCache({ onSuccess: (_, __, ___, mutation) => { successMock(mutation.meta?.metaSuccessMessage) diff --git a/packages/solid-query/src/__tests__/useMutationState.test.tsx b/packages/solid-query/src/__tests__/useMutationState.test.tsx index 2ba5cdb648..47ee04c35a 100644 --- a/packages/solid-query/src/__tests__/useMutationState.test.tsx +++ b/packages/solid-query/src/__tests__/useMutationState.test.tsx @@ -1,14 +1,17 @@ import { describe, expect, it } from 'vitest' import { fireEvent, render, waitFor } from '@solidjs/testing-library' import { createEffect } from 'solid-js' -import { useMutationState } from '../useMutationState' -import { useMutation } from '../useMutation' -import { QueryClientProvider } from '../QueryClientProvider' -import { createQueryClient, sleep } from './utils' +import { sleep } from '@tanstack/query-test-utils' +import { + QueryClient, + QueryClientProvider, + useMutation, + useMutationState, +} from '..' describe('useMutationState', () => { it('should return variables after calling mutate', async () => { - const queryClient = createQueryClient() + const queryClient = new QueryClient() const variables: Array> = [] const mutationKey = ['mutation'] diff --git a/packages/solid-query/src/__tests__/useQueries.test.tsx b/packages/solid-query/src/__tests__/useQueries.test.tsx index 6dca9bac2f..ad0a3ef2f3 100644 --- a/packages/solid-query/src/__tests__/useQueries.test.tsx +++ b/packages/solid-query/src/__tests__/useQueries.test.tsx @@ -2,19 +2,25 @@ import { describe, expect, expectTypeOf, it, vi } from 'vitest' import { fireEvent, render, waitFor } from '@solidjs/testing-library' import * as QueryCore from '@tanstack/query-core' import { createRenderEffect, createSignal } from 'solid-js' +import { queryKey, sleep } from '@tanstack/query-test-utils' import { QueriesObserver, QueryCache, + QueryClient, QueryClientProvider, useQueries, } from '..' -import { createQueryClient, queryKey, sleep } from './utils' -import type { QueryFunctionContext, QueryKey } from '@tanstack/query-core' -import type { QueryFunction, SolidQueryOptions, UseQueryResult } from '..' +import type { + QueryFunction, + QueryFunctionContext, + QueryKey, + SolidQueryOptions, + UseQueryResult, +} from '..' describe('useQueries', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should return the correct states', async () => { const key1 = queryKey() diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 0701d4ec8f..7e3027afcc 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -11,16 +11,19 @@ import { } from 'solid-js' import { fireEvent, render, waitFor } from '@solidjs/testing-library' import { reconcile } from 'solid-js/store' -import { QueryCache, QueryClientProvider, keepPreviousData, useQuery } from '..' import { - Blink, - createQueryClient, - mockOnlineManagerIsOnline, mockVisibilityState, queryKey, - setActTimeout, sleep, -} from './utils' +} from '@tanstack/query-test-utils' +import { + QueryCache, + QueryClient, + QueryClientProvider, + keepPreviousData, + useQuery, +} from '..' +import { Blink, mockOnlineManagerIsOnline, setActTimeout } from './utils' import type { DefinedUseQueryResult, OmitKeyof, @@ -33,7 +36,7 @@ import type { JSX } from 'solid-js' describe('useQuery', () => { const queryCache = new QueryCache() - const queryClient = createQueryClient({ queryCache }) + const queryClient = new QueryClient({ queryCache }) it('should return the correct types', () => { const key = queryKey() diff --git a/packages/solid-query/src/__tests__/utils.tsx b/packages/solid-query/src/__tests__/utils.tsx index 98bd80b57e..f93a8f8399 100644 --- a/packages/solid-query/src/__tests__/utils.tsx +++ b/packages/solid-query/src/__tests__/utils.tsx @@ -1,17 +1,9 @@ import { vi } from 'vitest' import { Show, createEffect, createSignal, onCleanup } from 'solid-js' import { onlineManager } from '@tanstack/query-core' -import { QueryClient } from '../QueryClient' -import type { QueryClientConfig } from '..' import type { ParentProps } from 'solid-js' import type { MockInstance } from 'vitest' -let queryKeyCount = 0 -export function queryKey() { - queryKeyCount++ - return [`query_${queryKeyCount}`] -} - export function Blink( props: { duration: number @@ -32,28 +24,12 @@ export function Blink( ) } -export function createQueryClient(config?: QueryClientConfig): QueryClient { - return new QueryClient(config) -} - -export function mockVisibilityState( - value: DocumentVisibilityState, -): MockInstance<() => DocumentVisibilityState> { - return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) -} - export function mockOnlineManagerIsOnline( value: boolean, ): MockInstance<() => boolean> { return vi.spyOn(onlineManager, 'isOnline').mockReturnValue(value) } -export function sleep(timeout: number): Promise { - return new Promise((resolve, _reject) => { - setTimeout(resolve, timeout) - }) -} - export function setActTimeout(fn: () => void, ms?: number) { return setTimeout(() => { fn() diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index 01d8d06875..7643d7efda 100644 --- a/packages/svelte-query-persist-client/package.json +++ b/packages/svelte-query-persist-client/package.json @@ -49,6 +49,7 @@ "devDependencies": { "@sveltejs/package": "^2.3.10", "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tanstack/query-test-utils": "workspace:*", "@tanstack/svelte-query": "workspace:*", "@testing-library/svelte": "^5.2.6", "eslint-plugin-svelte": "^2.46.0", diff --git a/packages/svelte-query-persist-client/tests/AwaitOnSuccess/AwaitOnSuccess.svelte b/packages/svelte-query-persist-client/tests/AwaitOnSuccess/AwaitOnSuccess.svelte index 2a7501660e..74f09accd8 100644 --- a/packages/svelte-query-persist-client/tests/AwaitOnSuccess/AwaitOnSuccess.svelte +++ b/packages/svelte-query-persist-client/tests/AwaitOnSuccess/AwaitOnSuccess.svelte @@ -1,6 +1,6 @@