-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathcacheCollection.test.ts
125 lines (113 loc) · 3.65 KB
/
cacheCollection.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query'
import { configureStore } from '@reduxjs/toolkit'
import { waitMs } from './helpers'
import type { Middleware, Reducer } from 'redux'
beforeAll(() => {
jest.useFakeTimers('legacy')
})
const onCleanup = jest.fn()
beforeEach(() => {
onCleanup.mockClear()
})
test(`query: await cleanup, defaults`, async () => {
const { store, api } = storeForApi(
createApi({
baseQuery: fetchBaseQuery({ baseUrl: 'https://example.com' }),
endpoints: (build) => ({
query: build.query<unknown, string>({
query: () => '/success',
}),
}),
})
)
store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe()
jest.advanceTimersByTime(59000), await waitMs()
expect(onCleanup).not.toHaveBeenCalled()
jest.advanceTimersByTime(2000), await waitMs()
expect(onCleanup).toHaveBeenCalled()
})
test(`query: await cleanup, keepUnusedDataFor set`, async () => {
const { store, api } = storeForApi(
createApi({
baseQuery: fetchBaseQuery({ baseUrl: 'https://example.com' }),
endpoints: (build) => ({
query: build.query<unknown, string>({
query: () => '/success',
}),
}),
keepUnusedDataFor: 29,
})
)
store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe()
jest.advanceTimersByTime(28000), await waitMs()
expect(onCleanup).not.toHaveBeenCalled()
jest.advanceTimersByTime(2000), await waitMs()
expect(onCleanup).toHaveBeenCalled()
})
describe(`query: await cleanup, keepUnusedDataFor set`, () => {
const { store, api } = storeForApi(
createApi({
baseQuery: fetchBaseQuery({ baseUrl: 'https://example.com' }),
endpoints: (build) => ({
query: build.query<unknown, string>({
query: () => '/success',
}),
query2: build.query<unknown, string>({
query: () => '/success',
keepUnusedDataFor: 35,
}),
query3: build.query<unknown, string>({
query: () => '/success',
keepUnusedDataFor: 0,
}),
}),
keepUnusedDataFor: 29,
})
)
test('global keepUnusedDataFor', async () => {
store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe()
jest.advanceTimersByTime(28000), await waitMs()
expect(onCleanup).not.toHaveBeenCalled()
jest.advanceTimersByTime(2000), await waitMs()
expect(onCleanup).toHaveBeenCalled()
})
test('endpoint keepUnusedDataFor', async () => {
store.dispatch(api.endpoints.query2.initiate('arg')).unsubscribe()
jest.advanceTimersByTime(34000), await waitMs()
expect(onCleanup).not.toHaveBeenCalled()
jest.advanceTimersByTime(2000), await waitMs()
expect(onCleanup).toHaveBeenCalled()
})
test('endpoint keepUnusedDataFor: 0 ', async () => {
expect(onCleanup).not.toHaveBeenCalled()
store.dispatch(api.endpoints.query3.initiate('arg')).unsubscribe()
expect(onCleanup).not.toHaveBeenCalled()
jest.advanceTimersByTime(1), await waitMs()
expect(onCleanup).toHaveBeenCalled()
})
})
function storeForApi<
A extends {
reducerPath: 'api'
reducer: Reducer<any, any>
middleware: Middleware
util: { resetApiState(): any }
}
>(api: A) {
const store = configureStore({
reducer: { api: api.reducer },
middleware: (gdm) =>
gdm({ serializableCheck: false, immutableCheck: false }).concat(
api.middleware
),
})
let hadQueries = false
store.subscribe(() => {
const queryState = store.getState().api.queries
if (hadQueries && Object.keys(queryState).length === 0) {
onCleanup()
}
hadQueries = hadQueries || Object.keys(queryState).length > 0
})
return { api, store }
}