From 7fee9c39333880003d1fe97160fde936fe5c9f17 Mon Sep 17 00:00:00 2001 From: minseong Date: Mon, 12 May 2025 08:54:57 +0900 Subject: [PATCH 1/4] test(query-core): add test case for query --- .../query-core/src/__tests__/query.test.tsx | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index fa38abad82..b61ac0a613 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -5,6 +5,7 @@ import { sleep, } from '@tanstack/query-test-utils' import { + Query, QueryClient, QueryObserver, dehydrate, @@ -12,7 +13,12 @@ import { isCancelledError, } from '..' import { mockOnlineManagerIsOnline, setIsServer } from './utils' -import type { QueryCache, QueryFunctionContext, QueryObserverResult } from '..' +import type { + QueryCache, + QueryFunctionContext, + QueryKey, + QueryObserverResult, +} from '..' describe('query', () => { let queryClient: QueryClient @@ -1019,4 +1025,53 @@ describe('query', () => { await vi.advanceTimersByTimeAsync(10) expect(query.state.status).toBe('error') }) + + test('should use persister if provided', async () => { + const key = queryKey() + + await queryClient.prefetchQuery({ + queryKey: key, + queryFn: () => 'data', + persister: () => Promise.resolve('persisted data'), + }) + + const query = queryCache.find({ queryKey: key })! + expect(query.state.data).toBe('persisted data') + }) + + test('should use queryFn from observer if not provided in options', async () => { + const key = queryKey() + const observer = new QueryObserver(queryClient, { + queryKey: key, + queryFn: () => Promise.resolve('data'), + }) + + const query = new Query({ + client: queryClient, + queryKey: key, + queryHash: key.toString(), + }) + + query.addObserver(observer) + + await query.fetch() + const result = await query.state.data + expect(result).toBe('data') + }) + + test('should log error when queryKey is not an array', async () => { + const consoleMock = vi.spyOn(console, 'error') + const key: unknown = 'string-key' + + await queryClient.prefetchQuery({ + queryKey: key as QueryKey, + queryFn: () => 'data', + }) + + expect(consoleMock).toHaveBeenCalledWith( + "As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']", + ) + + consoleMock.mockRestore() + }) }) From 3159d96242ae17c9e953fab1290380f392cf1601 Mon Sep 17 00:00:00 2001 From: minseong Date: Mon, 12 May 2025 09:14:51 +0900 Subject: [PATCH 2/4] test(query-core): use hashQueryKeyByOptions --- packages/query-core/src/__tests__/query.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index b61ac0a613..deac6f4710 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -12,6 +12,7 @@ import { hydrate, isCancelledError, } from '..' +import { hashQueryKeyByOptions } from '../utils' import { mockOnlineManagerIsOnline, setIsServer } from './utils' import type { QueryCache, @@ -1049,7 +1050,7 @@ describe('query', () => { const query = new Query({ client: queryClient, queryKey: key, - queryHash: key.toString(), + queryHash: hashQueryKeyByOptions(key), }) query.addObserver(observer) From 3d5f226d1ddc6031c644c48b59d281583e44cffa Mon Sep 17 00:00:00 2001 From: minseong Date: Wed, 14 May 2025 03:16:27 +0900 Subject: [PATCH 3/4] add test case about "should call initialData function when it is a function" --- .../query-core/src/__tests__/query.test.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index deac6f4710..fc5e7beb23 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -1075,4 +1075,22 @@ describe('query', () => { consoleMock.mockRestore() }) + + test('should call initialData function when it is a function', () => { + const key = queryKey() + const initialDataFn = vi.fn(() => 'initial data') + + const query = new Query({ + client: queryClient, + queryKey: key, + queryHash: hashQueryKeyByOptions(key), + options: { + queryFn: () => 'data', + initialData: initialDataFn, + }, + }) + + expect(initialDataFn).toHaveBeenCalledTimes(1) + expect(query.state.data).toBe('initial data') + }) }) From 41eabff90acfd028397ab2d2544cae05a4abf040 Mon Sep 17 00:00:00 2001 From: minseong Date: Mon, 19 May 2025 01:34:20 +0900 Subject: [PATCH 4/4] reflect feedback --- packages/query-core/src/__tests__/query.test.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index fc5e7beb23..25ee912637 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -1042,9 +1042,10 @@ describe('query', () => { test('should use queryFn from observer if not provided in options', async () => { const key = queryKey() + const queryFn = () => Promise.resolve('data') const observer = new QueryObserver(queryClient, { queryKey: key, - queryFn: () => Promise.resolve('data'), + queryFn: queryFn, }) const query = new Query({ @@ -1058,6 +1059,7 @@ describe('query', () => { await query.fetch() const result = await query.state.data expect(result).toBe('data') + expect(query.options.queryFn).toBe(queryFn) }) test('should log error when queryKey is not an array', async () => {