Skip to content

Commit e6c26c0

Browse files
authored
test(query-persist-client-core/persist): wrap the suites in a top-level 'persist' describe and hoist the shared 'queryClient' setup (#10875)
1 parent a6fda44 commit e6c26c0

1 file changed

Lines changed: 135 additions & 133 deletions

File tree

packages/query-persist-client-core/src/__tests__/persist.test.ts

Lines changed: 135 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -6,174 +6,176 @@ import {
66
} from '../persist'
77
import { createMockPersister, createSpyPersister } from './utils'
88

9-
describe('persistQueryClientSubscribe', () => {
10-
it('should persist mutations', async () => {
11-
const queryClient = new QueryClient()
9+
describe('persist', () => {
10+
let queryClient: QueryClient
1211

13-
const persister = createMockPersister()
12+
beforeEach(() => {
13+
queryClient = new QueryClient()
14+
})
1415

15-
const unsubscribe = persistQueryClientSubscribe({
16-
queryClient,
17-
persister,
18-
dehydrateOptions: { shouldDehydrateMutation: () => true },
19-
})
16+
afterEach(() => {
17+
queryClient.clear()
18+
})
2019

21-
queryClient.getMutationCache().build(queryClient, {
22-
mutationFn: (text: string) => Promise.resolve(text),
23-
})
20+
describe('persistQueryClientSubscribe', () => {
21+
it('should persist mutations', async () => {
22+
const persister = createMockPersister()
2423

25-
const result = await persister.restoreClient()
24+
const unsubscribe = persistQueryClientSubscribe({
25+
queryClient,
26+
persister,
27+
dehydrateOptions: { shouldDehydrateMutation: () => true },
28+
})
2629

27-
expect(result?.clientState.mutations).toHaveLength(1)
30+
queryClient.getMutationCache().build(queryClient, {
31+
mutationFn: (text: string) => Promise.resolve(text),
32+
})
33+
34+
const result = await persister.restoreClient()
35+
36+
expect(result?.clientState.mutations).toHaveLength(1)
2837

29-
unsubscribe()
38+
unsubscribe()
39+
})
3040
})
31-
})
3241

33-
describe('persistQueryClientSave', () => {
34-
it('should not be triggered on observer type events', () => {
35-
const queryClient = new QueryClient()
42+
describe('persistQueryClientSave', () => {
43+
it('should not be triggered on observer type events', () => {
44+
const persister = createSpyPersister()
3645

37-
const persister = createSpyPersister()
46+
const unsubscribe = persistQueryClientSubscribe({
47+
queryClient,
48+
persister,
49+
})
3850

39-
const unsubscribe = persistQueryClientSubscribe({
40-
queryClient,
41-
persister,
51+
const queryKey = ['test']
52+
const queryFn = vi.fn().mockReturnValue(1)
53+
const observer = new QueriesObserver(queryClient, [{ queryKey, queryFn }])
54+
const unsubscribeObserver = observer.subscribe(vi.fn())
55+
observer
56+
.getObservers()[0]
57+
?.setOptions({ queryKey, refetchOnWindowFocus: false })
58+
unsubscribeObserver()
59+
60+
queryClient.setQueryData(queryKey, 2)
61+
62+
// persistClient should be called 3 times:
63+
// 1. When query is added
64+
// 2. When queryFn is resolved
65+
// 3. When setQueryData is called
66+
// All events fired by manipulating observers are ignored
67+
expect(persister.persistClient).toHaveBeenCalledTimes(3)
68+
69+
unsubscribe()
4270
})
43-
44-
const queryKey = ['test']
45-
const queryFn = vi.fn().mockReturnValue(1)
46-
const observer = new QueriesObserver(queryClient, [{ queryKey, queryFn }])
47-
const unsubscribeObserver = observer.subscribe(vi.fn())
48-
observer
49-
.getObservers()[0]
50-
?.setOptions({ queryKey, refetchOnWindowFocus: false })
51-
unsubscribeObserver()
52-
53-
queryClient.setQueryData(queryKey, 2)
54-
55-
// persistClient should be called 3 times:
56-
// 1. When query is added
57-
// 2. When queryFn is resolved
58-
// 3. When setQueryData is called
59-
// All events fired by manipulating observers are ignored
60-
expect(persister.persistClient).toHaveBeenCalledTimes(3)
61-
62-
unsubscribe()
6371
})
64-
})
6572

66-
describe('persistQueryClientRestore', () => {
67-
let queryClient: QueryClient
68-
let persister: ReturnType<typeof createSpyPersister>
73+
describe('persistQueryClientRestore', () => {
74+
let persister: ReturnType<typeof createSpyPersister>
6975

70-
beforeEach(() => {
71-
queryClient = new QueryClient()
72-
persister = createSpyPersister()
73-
})
76+
beforeEach(() => {
77+
persister = createSpyPersister()
78+
})
7479

75-
afterEach(() => {
76-
queryClient.clear()
77-
})
80+
it('should rethrow exceptions in `restoreClient`', async () => {
81+
const consoleMock = vi
82+
.spyOn(console, 'error')
83+
.mockImplementation(() => undefined)
7884

79-
it('should rethrow exceptions in `restoreClient`', async () => {
80-
const consoleMock = vi
81-
.spyOn(console, 'error')
82-
.mockImplementation(() => undefined)
85+
const consoleWarn = vi
86+
.spyOn(console, 'warn')
87+
.mockImplementation(() => undefined)
8388

84-
const consoleWarn = vi
85-
.spyOn(console, 'warn')
86-
.mockImplementation(() => undefined)
89+
const restoreError = new Error('Error restoring client')
8790

88-
const restoreError = new Error('Error restoring client')
91+
persister.restoreClient = () => Promise.reject(restoreError)
8992

90-
persister.restoreClient = () => Promise.reject(restoreError)
93+
await expect(
94+
persistQueryClientRestore({
95+
queryClient,
96+
persister,
97+
}),
98+
).rejects.toBe(restoreError)
9199

92-
await expect(
93-
persistQueryClientRestore({
94-
queryClient,
95-
persister,
96-
}),
97-
).rejects.toBe(restoreError)
100+
expect(consoleMock).toHaveBeenCalledTimes(1)
101+
expect(consoleWarn).toHaveBeenCalledTimes(1)
102+
expect(consoleMock).toHaveBeenNthCalledWith(1, restoreError)
98103

99-
expect(consoleMock).toHaveBeenCalledTimes(1)
100-
expect(consoleWarn).toHaveBeenCalledTimes(1)
101-
expect(consoleMock).toHaveBeenNthCalledWith(1, restoreError)
104+
consoleMock.mockRestore()
105+
consoleWarn.mockRestore()
106+
})
102107

103-
consoleMock.mockRestore()
104-
consoleWarn.mockRestore()
105-
})
108+
it('should rethrow exceptions in `removeClient` before `restoreClient`', async () => {
109+
const consoleMock = vi
110+
.spyOn(console, 'error')
111+
.mockImplementation(() => undefined)
106112

107-
it('should rethrow exceptions in `removeClient` before `restoreClient`', async () => {
108-
const consoleMock = vi
109-
.spyOn(console, 'error')
110-
.mockImplementation(() => undefined)
113+
const consoleWarn = vi
114+
.spyOn(console, 'warn')
115+
.mockImplementation(() => undefined)
111116

112-
const consoleWarn = vi
113-
.spyOn(console, 'warn')
114-
.mockImplementation(() => undefined)
117+
const restoreError = new Error('Error restoring client')
118+
const removeError = new Error('Error removing client')
115119

116-
const restoreError = new Error('Error restoring client')
117-
const removeError = new Error('Error removing client')
120+
persister.restoreClient = () => Promise.reject(restoreError)
121+
persister.removeClient = () => Promise.reject(removeError)
118122

119-
persister.restoreClient = () => Promise.reject(restoreError)
120-
persister.removeClient = () => Promise.reject(removeError)
123+
await expect(
124+
persistQueryClientRestore({
125+
queryClient,
126+
persister,
127+
}),
128+
).rejects.toBe(removeError)
121129

122-
await expect(
123-
persistQueryClientRestore({
124-
queryClient,
125-
persister,
126-
}),
127-
).rejects.toBe(removeError)
130+
expect(consoleMock).toHaveBeenCalledTimes(1)
131+
expect(consoleWarn).toHaveBeenCalledTimes(1)
132+
expect(consoleMock).toHaveBeenNthCalledWith(1, restoreError)
128133

129-
expect(consoleMock).toHaveBeenCalledTimes(1)
130-
expect(consoleWarn).toHaveBeenCalledTimes(1)
131-
expect(consoleMock).toHaveBeenNthCalledWith(1, restoreError)
134+
consoleMock.mockRestore()
135+
consoleWarn.mockRestore()
136+
})
132137

133-
consoleMock.mockRestore()
134-
consoleWarn.mockRestore()
135-
})
138+
it('should rethrow error in `removeClient`', async () => {
139+
const removeError = new Error('Error removing client')
140+
141+
persister.removeClient = () => Promise.reject(removeError)
142+
persister.restoreClient = () => {
143+
return Promise.resolve({
144+
buster: 'random-buster',
145+
clientState: {
146+
mutations: [],
147+
queries: [],
148+
},
149+
timestamp: new Date().getTime(),
150+
})
151+
}
152+
153+
await expect(
154+
persistQueryClientRestore({
155+
queryClient,
156+
persister,
157+
}),
158+
).rejects.toBe(removeError)
159+
})
136160

137-
it('should rethrow error in `removeClient`', async () => {
138-
const removeError = new Error('Error removing client')
139-
140-
persister.removeClient = () => Promise.reject(removeError)
141-
persister.restoreClient = () => {
142-
return Promise.resolve({
143-
buster: 'random-buster',
144-
clientState: {
145-
mutations: [],
146-
queries: [],
147-
},
148-
timestamp: new Date().getTime(),
149-
})
150-
}
161+
it('should hydrate the query client when the persisted cache is valid', async () => {
162+
const sourceClient = new QueryClient()
163+
sourceClient.setQueryData(['key'], 'data')
151164

152-
await expect(
153-
persistQueryClientRestore({
165+
persister.restoreClient = () =>
166+
Promise.resolve({
167+
buster: '',
168+
clientState: dehydrate(sourceClient),
169+
timestamp: Date.now(),
170+
})
171+
172+
await persistQueryClientRestore({
154173
queryClient,
155174
persister,
156-
}),
157-
).rejects.toBe(removeError)
158-
})
159-
160-
it('should hydrate the query client when the persisted cache is valid', async () => {
161-
const sourceClient = new QueryClient()
162-
sourceClient.setQueryData(['key'], 'data')
163-
164-
persister.restoreClient = () =>
165-
Promise.resolve({
166-
buster: '',
167-
clientState: dehydrate(sourceClient),
168-
timestamp: Date.now(),
169175
})
170176

171-
await persistQueryClientRestore({
172-
queryClient,
173-
persister,
177+
expect(persister.removeClient).not.toHaveBeenCalled()
178+
expect(queryClient.getQueryData(['key'])).toBe('data')
174179
})
175-
176-
expect(persister.removeClient).not.toHaveBeenCalled()
177-
expect(queryClient.getQueryData(['key'])).toBe('data')
178180
})
179181
})

0 commit comments

Comments
 (0)