Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

test(query-core): add test case for hydration #8949

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
111 changes: 111 additions & 0 deletions packages/query-core/src/__tests__/hydration.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1142,4 +1142,115 @@ describe('dehydration and rehydration', () => {
clientQueryClient.clear()
serverQueryClient.clear()
})

test('should not redact errors when shouldRedactErrors returns false', async () => {
const queryCache = new QueryCache()
const queryClient = createQueryClient({
queryCache,
defaultOptions: {
dehydrate: {
shouldDehydrateQuery: () => true,
shouldRedactErrors: () => false,
},
},
})

const testError = new Error('original error')

const promise = queryClient
.prefetchQuery({
queryKey: ['error'],
queryFn: () => Promise.reject(testError),
retry: false,
})
.catch(() => undefined)

const dehydrated = dehydrate(queryClient)

expect(dehydrated.queries[0]?.promise).toBeInstanceOf(Promise)
await expect(dehydrated.queries[0]?.promise).rejects.toBe(testError)
await promise
})

test('should handle errors in promises for pending queries', async () => {
const consoleMock = vi.spyOn(console, 'error')
consoleMock.mockImplementation(() => undefined)

const queryCache = new QueryCache()
const queryClient = createQueryClient({
queryCache,
defaultOptions: {
dehydrate: {
shouldDehydrateQuery: () => true,
},
},
})

const promise = queryClient
.prefetchQuery({
queryKey: ['error'],
queryFn: () => Promise.reject(new Error('test error')),
retry: false,
})
.catch(() => undefined)

const dehydrated = dehydrate(queryClient)

expect(dehydrated.queries[0]?.promise).toBeInstanceOf(Promise)

try {
await dehydrated.queries[0]?.promise
expect(true).toBe(false)
} catch (error) {}

await promise
consoleMock.mockRestore()
})

test('should log error in development environment when redacting errors', async () => {
const originalNodeEnv = process.env.NODE_ENV
process.env.NODE_ENV = 'development'

const consoleMock = vi.spyOn(console, 'error')
consoleMock.mockImplementation(() => undefined)

const queryCache = new QueryCache()
const queryClient = createQueryClient({
queryCache,
defaultOptions: {
dehydrate: {
shouldDehydrateQuery: () => true,
shouldRedactErrors: () => true,
},
},
})

const testError = new Error('test error')

const promise = queryClient
.prefetchQuery({
queryKey: ['error'],
queryFn: () => Promise.reject(testError),
retry: false,
})
.catch(() => undefined)

const dehydrated = dehydrate(queryClient)

try {
await dehydrated.queries[0]?.promise
expect(true).toBe(false)
} catch (error) {
if (error instanceof Error) {
expect(error.message).toBe('redacted')
}
expect(consoleMock).toHaveBeenCalledWith(
expect.stringContaining('test error'),
)
}

process.env.NODE_ENV = originalNodeEnv
consoleMock.mockRestore()
await promise
})
})
Loading