@mic-rexjs/usecases-react 2.11.2 → 2.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/es/components/SafeUseCaseFragment/index.js +17 -7
- package/es/components/SafeUseCaseFragment/types.js +1 -1
- package/es/components/UseCaseFragment/index.js +16 -6
- package/es/components/UseCaseFragment/types.js +1 -1
- package/es/entities/matchPropertyFailedResult/types.js +1 -1
- package/es/enums/ArgumentTypes/index.js +3 -3
- package/es/enums/Statuses/index.js +22 -22
- package/es/hooks/useArgumentTypes/index.js +12 -10
- package/es/hooks/useConstant/index.js +7 -4
- package/es/hooks/useConstant/types.js +1 -1
- package/es/hooks/useConstantEntityReducers/index.js +4 -4
- package/es/hooks/useConstantFn/index.js +9 -6
- package/es/hooks/useConstantReducers/index.js +4 -4
- package/es/hooks/useContext/index.js +14 -11
- package/es/hooks/useContext/index.test.js +50 -44
- package/es/hooks/useContextualItem/index.js +27 -25
- package/es/hooks/useContextualItem/types.js +1 -1
- package/es/hooks/useDepsKey/index.js +9 -5
- package/es/hooks/useEntity/index.js +65 -61
- package/es/hooks/useFullArguments/index.js +12 -17
- package/es/hooks/useFullArguments/types.js +1 -1
- package/es/hooks/useIsRenderingRef/index.js +6 -6
- package/es/hooks/useProvider/index.js +21 -15
- package/es/hooks/useProvider/types.js +1 -1
- package/es/hooks/useRuntimeEntity/index.js +18 -16
- package/es/hooks/useStatuses/index.js +19 -19
- package/es/hooks/useUseCase/index.js +78 -57
- package/es/hooks/useUseCase/index.test.js +2402 -1701
- package/es/hooks/useUseCase/types.d.ts +11 -8
- package/es/hooks/useUseCase/types.js +1 -1
- package/es/index.js +1 -1
- package/es/methods/triggerWatchers/index.js +12 -7
- package/es/types.js +1 -1
- package/es/usecases/contextUseCase/index.js +70 -65
- package/es/usecases/contextUseCase/types.js +1 -1
- package/es/usecases/methodUseCase/index.js +69 -52
- package/es/usecases/methodUseCase/types.js +1 -1
- package/es/usecases/valueUseCase/index.js +175 -167
- package/es/usecases/valueUseCase/types.js +1 -1
- package/lib/components/UseCaseFragment/index.js +1 -1
- package/lib/hooks/useUseCase/index.js +5 -8
- package/lib/hooks/useUseCase/index.test.js +198 -104
- package/lib/methods/triggerWatchers/index.js +9 -7
- package/lib/usecases/valueUseCase/index.js +1 -1
- package/package.json +3 -3
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
1
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { useUseCase } from '.';
|
|
3
4
|
import { useDepsKey } from '../useDepsKey';
|
|
4
5
|
import { beforeEach, describe, expect, jest, test } from '@jest/globals';
|
|
5
|
-
import { entityUseCase, objectUseCase
|
|
6
|
+
import { entityUseCase, objectUseCase } from '@mic-rexjs/usecases';
|
|
6
7
|
import { fireEvent, screen } from '@testing-library/dom';
|
|
7
8
|
import { act, render, renderHook } from '@testing-library/react';
|
|
8
9
|
import { useDeepCompareEffect, useMemoizedFn, useMount, useUpdate, useUpdateEffect } from 'ahooks';
|
|
9
10
|
import { Fragment, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
+
import { createPortal } from 'react-dom';
|
|
10
12
|
const EXT_1 = '.png';
|
|
11
13
|
const EXT_2 = '.jpg';
|
|
12
14
|
const PATH_1 = `hello${EXT_1}`;
|
|
@@ -14,1778 +16,2477 @@ const PATH_2 = `hello${EXT_2}`;
|
|
|
14
16
|
const PARENT_BUTTON_TEXT = 'parent button';
|
|
15
17
|
const CHILD_BUTTON_TEXT = 'child button';
|
|
16
18
|
const defaultFile = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
path: '',
|
|
20
|
+
ext: '',
|
|
21
|
+
size: 0
|
|
20
22
|
};
|
|
21
|
-
const fileUseCase = (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
23
|
+
const fileUseCase = function () {
|
|
24
|
+
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
25
|
+
const entityReducers = objectUseCase();
|
|
26
|
+
const _options$pathPrefix = options.pathPrefix,
|
|
27
|
+
pathPrefix = _options$pathPrefix === void 0 ? '' : _options$pathPrefix,
|
|
28
|
+
onPathChange = options.onPathChange;
|
|
29
|
+
const init = function (entity) {
|
|
30
|
+
let newEntity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultFile;
|
|
31
|
+
return function* () {
|
|
32
|
+
yield () => {
|
|
33
|
+
return newEntity;
|
|
34
|
+
};
|
|
35
|
+
}();
|
|
36
|
+
};
|
|
37
|
+
const setPath = function* (entity, path) {
|
|
38
|
+
var _path$match;
|
|
39
|
+
const oldPath = entity.path;
|
|
40
|
+
const newPath = pathPrefix + path;
|
|
41
|
+
yield {
|
|
42
|
+
...entity,
|
|
43
|
+
path: newPath,
|
|
44
|
+
ext: ((_path$match = path.match(/\.[^.]+$/)) === null || _path$match === void 0 ? void 0 : _path$match[0]) || ''
|
|
38
45
|
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
onPathChange === null || onPathChange === void 0 || onPathChange(newPath, oldPath);
|
|
47
|
+
};
|
|
48
|
+
const readFile = async function* (entity, path) {
|
|
49
|
+
const size = 2000;
|
|
50
|
+
yield* setPath(entity, path);
|
|
51
|
+
await Promise.resolve(null);
|
|
52
|
+
yield oldEntity => {
|
|
53
|
+
return {
|
|
54
|
+
...oldEntity,
|
|
55
|
+
size
|
|
56
|
+
};
|
|
50
57
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return
|
|
58
|
+
return size;
|
|
59
|
+
};
|
|
60
|
+
const isImage = entity => {
|
|
61
|
+
const ext = entity.ext;
|
|
62
|
+
return [EXT_1, EXT_2].includes(ext);
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
...entityReducers,
|
|
66
|
+
init,
|
|
67
|
+
setPath,
|
|
68
|
+
readFile,
|
|
69
|
+
isImage
|
|
70
|
+
};
|
|
56
71
|
};
|
|
57
72
|
const subtractionReducer = jest.fn((value1, value2) => {
|
|
58
|
-
|
|
73
|
+
return value1 - value2;
|
|
59
74
|
});
|
|
60
|
-
const mathUseCase = (
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
75
|
+
const mathUseCase = function () {
|
|
76
|
+
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
77
|
+
const _options$extraValue = options.extraValue,
|
|
78
|
+
extraValue = _options$extraValue === void 0 ? 0 : _options$extraValue;
|
|
79
|
+
const add = (value1, value2) => {
|
|
80
|
+
return value1 + value2 + extraValue;
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
add,
|
|
84
|
+
subtraction: subtractionReducer
|
|
85
|
+
};
|
|
66
86
|
};
|
|
67
87
|
const fieldPathUseCase = () => {
|
|
68
|
-
|
|
88
|
+
return objectUseCase();
|
|
69
89
|
};
|
|
70
|
-
const Child =
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
const Child = _ref => {
|
|
91
|
+
let _ref$textPrefix = _ref.textPrefix,
|
|
92
|
+
textPrefix = _ref$textPrefix === void 0 ? '' : _ref$textPrefix,
|
|
93
|
+
onUpdate = _ref.onUpdate,
|
|
94
|
+
onPathChange = _ref.onPathChange,
|
|
95
|
+
onUndefinedEntity = _ref.onUndefinedEntity;
|
|
96
|
+
const _useUseCase = useUseCase(fileUseCase),
|
|
97
|
+
_useUseCase2 = _slicedToArray(_useUseCase, 2),
|
|
98
|
+
file = _useUseCase2[0],
|
|
99
|
+
setPath = _useUseCase2[1].setPath;
|
|
100
|
+
const _ref2 = file || {},
|
|
101
|
+
path = _ref2.path,
|
|
102
|
+
ext = _ref2.ext;
|
|
103
|
+
const onClick = () => {
|
|
104
|
+
setPath(PATH_2);
|
|
105
|
+
};
|
|
106
|
+
const undefinedEntity = useMemoizedFn(() => {
|
|
107
|
+
onUndefinedEntity === null || onUndefinedEntity === void 0 || onUndefinedEntity();
|
|
108
|
+
});
|
|
109
|
+
useUpdateEffect(() => {
|
|
110
|
+
onUpdate === null || onUpdate === void 0 || onUpdate();
|
|
111
|
+
});
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (file === void 0) {
|
|
114
|
+
undefinedEntity();
|
|
115
|
+
}
|
|
116
|
+
}, [file, undefinedEntity]);
|
|
117
|
+
const pathChange = useMemoizedFn(() => {
|
|
118
|
+
onPathChange === null || onPathChange === void 0 || onPathChange(path);
|
|
119
|
+
});
|
|
120
|
+
useUpdateEffect(pathChange, [path, pathChange]);
|
|
121
|
+
return _jsxs("div", {
|
|
122
|
+
children: [_jsxs("main", {
|
|
123
|
+
children: ["child path: ", path, _jsx("br", {}), "child ext: ", ext]
|
|
124
|
+
}), _jsx("footer", {
|
|
125
|
+
children: _jsx("button", {
|
|
126
|
+
onClick: onClick,
|
|
127
|
+
children: textPrefix + CHILD_BUTTON_TEXT
|
|
128
|
+
})
|
|
129
|
+
})]
|
|
130
|
+
});
|
|
92
131
|
};
|
|
93
|
-
const Parent =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
132
|
+
const Parent = _ref3 => {
|
|
133
|
+
let children = _ref3.children,
|
|
134
|
+
onUpdate = _ref3.onUpdate,
|
|
135
|
+
onSetPath = _ref3.onSetPath;
|
|
136
|
+
const _useUseCase3 = useUseCase(defaultFile, fileUseCase),
|
|
137
|
+
_useUseCase4 = _slicedToArray(_useUseCase3, 3),
|
|
138
|
+
_useUseCase4$ = _useUseCase4[0],
|
|
139
|
+
path = _useUseCase4$.path,
|
|
140
|
+
ext = _useUseCase4$.ext,
|
|
141
|
+
setPath = _useUseCase4[1].setPath,
|
|
142
|
+
Provider = _useUseCase4[2];
|
|
143
|
+
const onClick = () => {
|
|
144
|
+
setPath((onSetPath === null || onSetPath === void 0 ? void 0 : onSetPath()) || '');
|
|
145
|
+
};
|
|
146
|
+
useUpdateEffect(() => {
|
|
147
|
+
onUpdate === null || onUpdate === void 0 || onUpdate();
|
|
148
|
+
});
|
|
149
|
+
return _jsx(Provider, {
|
|
150
|
+
children: _jsxs("div", {
|
|
151
|
+
children: [_jsxs("header", {
|
|
152
|
+
children: ["parent path: ", path, _jsx("br", {}), "parent ext: ", ext]
|
|
153
|
+
}), _jsx("main", {
|
|
154
|
+
children: children
|
|
155
|
+
}), _jsx("footer", {
|
|
156
|
+
children: _jsx("button", {
|
|
157
|
+
onClick: onClick,
|
|
158
|
+
children: PARENT_BUTTON_TEXT
|
|
159
|
+
})
|
|
160
|
+
})]
|
|
161
|
+
})
|
|
162
|
+
});
|
|
102
163
|
};
|
|
103
|
-
const MathParent =
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
164
|
+
const MathParent = _ref4 => {
|
|
165
|
+
let _ref4$extraValue = _ref4.extraValue,
|
|
166
|
+
extraValue = _ref4$extraValue === void 0 ? 0 : _ref4$extraValue,
|
|
167
|
+
onUpdate = _ref4.onUpdate;
|
|
168
|
+
const _useUseCase5 = useUseCase(mathUseCase, {
|
|
169
|
+
extraValue
|
|
170
|
+
}, [extraValue]),
|
|
171
|
+
add = _useUseCase5.add;
|
|
172
|
+
const onClick = () => {
|
|
173
|
+
add(1, 2);
|
|
174
|
+
};
|
|
175
|
+
useUpdateEffect(() => {
|
|
176
|
+
onUpdate === null || onUpdate === void 0 || onUpdate();
|
|
177
|
+
});
|
|
178
|
+
return _jsx("div", {
|
|
179
|
+
children: _jsx("button", {
|
|
180
|
+
onClick: onClick,
|
|
181
|
+
children: PARENT_BUTTON_TEXT
|
|
182
|
+
})
|
|
183
|
+
});
|
|
112
184
|
};
|
|
113
185
|
const useDeepCompareUpdate = (callback, deps) => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
186
|
+
const isFirstRef = useRef(true);
|
|
187
|
+
const memoizedCallback = useMemoizedFn(callback);
|
|
188
|
+
const depsKey = useDepsKey(deps);
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
return () => {
|
|
191
|
+
isFirstRef.current = false;
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
useDeepCompareEffect(() => {
|
|
195
|
+
if (isFirstRef.current) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
memoizedCallback();
|
|
199
|
+
}, [depsKey, memoizedCallback]);
|
|
128
200
|
};
|
|
129
201
|
beforeEach(() => {
|
|
130
|
-
|
|
202
|
+
subtractionReducer.mockClear();
|
|
131
203
|
});
|
|
132
204
|
describe('useUseCase', () => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
205
|
+
describe('`useUseCase` should work the same as `useRootCoreCollection`', () => {
|
|
206
|
+
test('check context type', () => {
|
|
207
|
+
const _renderHook = renderHook(() => {
|
|
208
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
209
|
+
}),
|
|
210
|
+
result = _renderHook.result;
|
|
211
|
+
const cores = result.current;
|
|
212
|
+
expect(Array.isArray(cores)).toBe(true);
|
|
213
|
+
expect(cores).toHaveLength(3);
|
|
214
|
+
});
|
|
215
|
+
test('`entity` should equal `defaultFile`', () => {
|
|
216
|
+
const _renderHook2 = renderHook(() => {
|
|
217
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
218
|
+
}),
|
|
219
|
+
result = _renderHook2.result;
|
|
220
|
+
const cores = result.current;
|
|
221
|
+
const _cores = _slicedToArray(cores, 1),
|
|
222
|
+
entity = _cores[0];
|
|
223
|
+
expect(entity).toEqual(defaultFile);
|
|
224
|
+
});
|
|
225
|
+
test('Should return the `EntityStore.value` if root entity has not changed', () => {
|
|
226
|
+
const _renderHook3 = renderHook(() => {
|
|
227
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
228
|
+
}),
|
|
229
|
+
result = _renderHook3.result;
|
|
230
|
+
const collection = result.current;
|
|
231
|
+
const _collection = _slicedToArray(collection, 2),
|
|
232
|
+
setPath = _collection[1].setPath;
|
|
233
|
+
act(() => {
|
|
234
|
+
setPath(PATH_1);
|
|
235
|
+
});
|
|
236
|
+
expect(result.current[0]).toEqual({
|
|
237
|
+
...defaultFile,
|
|
238
|
+
path: PATH_1,
|
|
239
|
+
ext: EXT_1
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
test('Should return the root entity if root entity has changed', () => {
|
|
243
|
+
let file = defaultFile;
|
|
244
|
+
const _renderHook4 = renderHook(() => {
|
|
245
|
+
return useUseCase(file, fileUseCase);
|
|
246
|
+
}),
|
|
247
|
+
result = _renderHook4.result,
|
|
248
|
+
rerender = _renderHook4.rerender;
|
|
249
|
+
file = {
|
|
250
|
+
...defaultFile,
|
|
251
|
+
path: PATH_2
|
|
252
|
+
};
|
|
253
|
+
rerender();
|
|
254
|
+
expect(result.current[0]).toEqual({
|
|
255
|
+
...defaultFile,
|
|
256
|
+
path: PATH_2
|
|
257
|
+
});
|
|
258
|
+
// 渲染多一次,避免第二次渲染的 `entity` 没变化而取错缓存的情况
|
|
259
|
+
rerender();
|
|
260
|
+
expect(result.current[0]).toEqual({
|
|
261
|
+
...defaultFile,
|
|
262
|
+
path: PATH_2
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
test('Should return the root entity if root entity has changed even with entity state changed', () => {
|
|
266
|
+
let file = defaultFile;
|
|
267
|
+
const _renderHook5 = renderHook(() => {
|
|
268
|
+
return useUseCase(file, fileUseCase);
|
|
269
|
+
}),
|
|
270
|
+
result = _renderHook5.result;
|
|
271
|
+
const collection = result.current;
|
|
272
|
+
const _collection2 = _slicedToArray(collection, 2),
|
|
273
|
+
setPath = _collection2[1].setPath;
|
|
274
|
+
act(() => {
|
|
275
|
+
file = {
|
|
276
|
+
...defaultFile,
|
|
277
|
+
path: PATH_2
|
|
278
|
+
};
|
|
279
|
+
setPath(PATH_1);
|
|
280
|
+
});
|
|
281
|
+
expect(result.current[0]).toEqual({
|
|
282
|
+
...defaultFile,
|
|
283
|
+
path: PATH_2
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
test('Should support entity getter', () => {
|
|
287
|
+
const file = defaultFile;
|
|
288
|
+
const _renderHook6 = renderHook(() => {
|
|
289
|
+
return useUseCase(() => {
|
|
290
|
+
return file;
|
|
291
|
+
}, fileUseCase);
|
|
292
|
+
}),
|
|
293
|
+
result = _renderHook6.result;
|
|
294
|
+
const _result$current = _slicedToArray(result.current, 1),
|
|
295
|
+
currentFile = _result$current[0];
|
|
296
|
+
expect(currentFile).toEqual(file);
|
|
297
|
+
});
|
|
298
|
+
test('Entity getter should provide the current entity', () => {
|
|
299
|
+
let updateIndex = 0;
|
|
300
|
+
const file = defaultFile;
|
|
301
|
+
const onFile = jest.fn();
|
|
302
|
+
const _renderHook7 = renderHook(() => {
|
|
303
|
+
return useUseCase(currentFile => {
|
|
304
|
+
onFile(currentFile);
|
|
305
|
+
return currentFile !== null && currentFile !== void 0 ? currentFile : file;
|
|
306
|
+
}, fileUseCase, {}, [updateIndex++]);
|
|
307
|
+
}),
|
|
308
|
+
result = _renderHook7.result;
|
|
309
|
+
const _result$current2 = _slicedToArray(result.current, 2),
|
|
310
|
+
setPath1 = _result$current2[1].setPath;
|
|
311
|
+
expect(onFile).toHaveBeenCalledTimes(1);
|
|
312
|
+
expect(onFile).toHaveBeenCalledWith(void 0);
|
|
313
|
+
act(() => {
|
|
314
|
+
setPath1(PATH_1);
|
|
315
|
+
});
|
|
316
|
+
const _result$current3 = _slicedToArray(result.current, 2),
|
|
317
|
+
setPath2 = _result$current3[1].setPath;
|
|
318
|
+
expect(onFile).toHaveBeenCalledTimes(2);
|
|
319
|
+
expect(onFile).toHaveBeenCalledWith({
|
|
320
|
+
...file,
|
|
321
|
+
ext: EXT_1,
|
|
322
|
+
path: PATH_1
|
|
323
|
+
});
|
|
324
|
+
act(() => {
|
|
325
|
+
setPath2(PATH_2);
|
|
326
|
+
});
|
|
327
|
+
expect(onFile).toHaveBeenCalledTimes(3);
|
|
328
|
+
expect(onFile).toHaveBeenCalledWith({
|
|
329
|
+
...file,
|
|
330
|
+
ext: EXT_2,
|
|
331
|
+
path: PATH_2
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
test('Entity getter should provide the changed deps', () => {
|
|
335
|
+
let updateIndex = 0;
|
|
336
|
+
const file = defaultFile;
|
|
337
|
+
const symbol = Symbol('changedDep');
|
|
338
|
+
const onChangedDeps = jest.fn();
|
|
339
|
+
const _renderHook8 = renderHook(() => {
|
|
340
|
+
return useUseCase(function () {
|
|
341
|
+
let currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : file;
|
|
342
|
+
let changedDeps = arguments.length > 1 ? arguments[1] : undefined;
|
|
343
|
+
// 验证参数类型
|
|
344
|
+
const _changedDeps = _slicedToArray(changedDeps, 6),
|
|
345
|
+
index1 = _changedDeps[0],
|
|
346
|
+
num1 = _changedDeps[1],
|
|
347
|
+
index2 = _changedDeps[2],
|
|
348
|
+
string1 = _changedDeps[3],
|
|
349
|
+
index3 = _changedDeps[4],
|
|
350
|
+
boolean1 = _changedDeps[5];
|
|
351
|
+
const a = index1;
|
|
352
|
+
const b = num1;
|
|
353
|
+
const c = index2;
|
|
354
|
+
const d = string1;
|
|
355
|
+
const e = index3;
|
|
356
|
+
const f = boolean1;
|
|
357
|
+
void a;
|
|
358
|
+
void b;
|
|
359
|
+
void c;
|
|
360
|
+
void d;
|
|
361
|
+
void e;
|
|
362
|
+
void f;
|
|
363
|
+
// 先 `fill` 填充,再合并,以 `symbol` 代替虚无项去匹配
|
|
364
|
+
onChangedDeps(Object.assign([...changedDeps].fill(symbol), changedDeps));
|
|
365
|
+
return currentFile;
|
|
366
|
+
}, fileUseCase, {}, [updateIndex++, 0, updateIndex++, 'xyz', updateIndex++, false]);
|
|
367
|
+
}),
|
|
368
|
+
result = _renderHook8.result;
|
|
369
|
+
const _result$current4 = _slicedToArray(result.current, 2),
|
|
370
|
+
setPath = _result$current4[1].setPath;
|
|
371
|
+
expect(onChangedDeps).toHaveBeenCalledTimes(1);
|
|
372
|
+
expect(onChangedDeps).toHaveBeenCalledWith([symbol, symbol, symbol, symbol, symbol, symbol]);
|
|
373
|
+
act(() => {
|
|
374
|
+
setPath(PATH_1);
|
|
375
|
+
});
|
|
376
|
+
expect(onChangedDeps).toHaveBeenCalledTimes(2);
|
|
377
|
+
expect(onChangedDeps).toHaveBeenCalledWith([3, symbol, 4, symbol, 5, symbol]);
|
|
378
|
+
});
|
|
379
|
+
test('Entity property getter should always return the same object if nothing changed after component update', () => {
|
|
380
|
+
let updateTimes = 0;
|
|
381
|
+
const data = {
|
|
382
|
+
x: 1,
|
|
383
|
+
get obj() {
|
|
384
|
+
return {};
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
const _renderHook9 = renderHook(() => {
|
|
388
|
+
const collection = useUseCase(data, objectUseCase);
|
|
389
|
+
const _collection3 = _slicedToArray(collection, 1),
|
|
390
|
+
obj = _collection3[0].obj;
|
|
391
|
+
useMemo(() => {
|
|
392
|
+
void obj;
|
|
393
|
+
updateTimes++;
|
|
394
|
+
}, [obj]);
|
|
395
|
+
return collection;
|
|
396
|
+
}),
|
|
397
|
+
rerender = _renderHook9.rerender;
|
|
398
|
+
expect(updateTimes).toEqual(1);
|
|
399
|
+
act(() => {
|
|
400
|
+
rerender();
|
|
401
|
+
});
|
|
402
|
+
expect(updateTimes).toEqual(1);
|
|
403
|
+
});
|
|
404
|
+
test('Entity property getter should always return a new object if something changed after component update', () => {
|
|
405
|
+
let updateTimes = 0;
|
|
406
|
+
const data = {
|
|
407
|
+
x: 1,
|
|
408
|
+
get obj() {
|
|
409
|
+
return {};
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
const _renderHook0 = renderHook(() => {
|
|
413
|
+
const collection = useUseCase(data, objectUseCase);
|
|
414
|
+
const _collection4 = _slicedToArray(collection, 1),
|
|
415
|
+
obj = _collection4[0].obj;
|
|
416
|
+
useMemo(() => {
|
|
417
|
+
void obj;
|
|
418
|
+
updateTimes++;
|
|
419
|
+
}, [obj]);
|
|
420
|
+
return collection;
|
|
421
|
+
}),
|
|
422
|
+
result = _renderHook0.result;
|
|
423
|
+
const current = result.current;
|
|
424
|
+
const _current = _slicedToArray(current, 2),
|
|
425
|
+
setEntity = _current[1].setEntity;
|
|
426
|
+
expect(updateTimes).toEqual(1);
|
|
427
|
+
act(() => {
|
|
428
|
+
setEntity({
|
|
429
|
+
x: 2
|
|
255
430
|
});
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
431
|
+
});
|
|
432
|
+
expect(updateTimes).toEqual(2);
|
|
433
|
+
});
|
|
434
|
+
test('Entity getter should provide the first argument with current entity when deps has change.', () => {
|
|
435
|
+
let entityArg;
|
|
436
|
+
let times = 0;
|
|
437
|
+
const file = defaultFile;
|
|
438
|
+
const _renderHook1 = renderHook(() => {
|
|
439
|
+
return useUseCase(function () {
|
|
440
|
+
let entity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : file;
|
|
441
|
+
const path = entity.path;
|
|
442
|
+
entityArg = entity;
|
|
443
|
+
return {
|
|
444
|
+
...entity,
|
|
445
|
+
path: path + '1'
|
|
263
446
|
};
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
447
|
+
}, fileUseCase, {}, [times++]);
|
|
448
|
+
}),
|
|
449
|
+
result = _renderHook1.result;
|
|
450
|
+
const collection1 = result.current;
|
|
451
|
+
const _collection5 = _slicedToArray(collection1, 2),
|
|
452
|
+
currentFile1 = _collection5[0],
|
|
453
|
+
setPath = _collection5[1].setPath;
|
|
454
|
+
expect(entityArg).toEqual(defaultFile);
|
|
455
|
+
expect(currentFile1).toEqual({
|
|
456
|
+
...defaultFile,
|
|
457
|
+
path: '1'
|
|
458
|
+
});
|
|
459
|
+
act(() => {
|
|
460
|
+
setPath('2');
|
|
461
|
+
});
|
|
462
|
+
const collection2 = result.current;
|
|
463
|
+
const _collection6 = _slicedToArray(collection2, 1),
|
|
464
|
+
currentFile2 = _collection6[0];
|
|
465
|
+
expect(entityArg).toEqual({
|
|
466
|
+
...defaultFile,
|
|
467
|
+
path: '2'
|
|
468
|
+
});
|
|
469
|
+
expect(currentFile2).toEqual({
|
|
470
|
+
...defaultFile,
|
|
471
|
+
path: '21'
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
test('`reducers` should be returned as an object', () => {
|
|
475
|
+
const _renderHook10 = renderHook(() => {
|
|
476
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
477
|
+
}),
|
|
478
|
+
result = _renderHook10.result;
|
|
479
|
+
const cores = result.current;
|
|
480
|
+
const _cores2 = _slicedToArray(cores, 2),
|
|
481
|
+
reducers = _cores2[1];
|
|
482
|
+
expect(typeof reducers).toBe('object');
|
|
483
|
+
});
|
|
484
|
+
test('`Provider` should be returned as a function', () => {
|
|
485
|
+
const _renderHook11 = renderHook(() => {
|
|
486
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
487
|
+
}),
|
|
488
|
+
result = _renderHook11.result;
|
|
489
|
+
const cores = result.current;
|
|
490
|
+
const _cores3 = _slicedToArray(cores, 3),
|
|
491
|
+
Provider = _cores3[2];
|
|
492
|
+
expect(typeof Provider).toBe('function');
|
|
493
|
+
});
|
|
494
|
+
test('`usecase` should be called only once if deps has not provided', () => {
|
|
495
|
+
const mockUseCase = jest.fn(fileUseCase);
|
|
496
|
+
const _renderHook12 = renderHook(() => {
|
|
497
|
+
return useUseCase(defaultFile, mockUseCase);
|
|
498
|
+
}),
|
|
499
|
+
result = _renderHook12.result,
|
|
500
|
+
rerender = _renderHook12.rerender;
|
|
501
|
+
const cores = result.current;
|
|
502
|
+
const _cores4 = _slicedToArray(cores, 2),
|
|
503
|
+
setEntity = _cores4[1].setEntity;
|
|
504
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
505
|
+
act(() => {
|
|
506
|
+
setEntity({
|
|
507
|
+
...defaultFile
|
|
278
508
|
});
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const [, { setEntity }] = current;
|
|
298
|
-
expect(updateTimes).toEqual(1);
|
|
299
|
-
act(() => {
|
|
300
|
-
setEntity({ x: 2 });
|
|
301
|
-
});
|
|
302
|
-
expect(updateTimes).toEqual(2);
|
|
509
|
+
});
|
|
510
|
+
rerender();
|
|
511
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
512
|
+
});
|
|
513
|
+
test('`usecase` should be called only once if deps has not changed', () => {
|
|
514
|
+
const mockUseCase = jest.fn(fileUseCase);
|
|
515
|
+
const _renderHook13 = renderHook(() => {
|
|
516
|
+
return useUseCase(defaultFile, mockUseCase, {}, [1, 'x']);
|
|
517
|
+
}),
|
|
518
|
+
result = _renderHook13.result,
|
|
519
|
+
rerender = _renderHook13.rerender;
|
|
520
|
+
const cores = result.current;
|
|
521
|
+
const _cores5 = _slicedToArray(cores, 2),
|
|
522
|
+
setEntity = _cores5[1].setEntity;
|
|
523
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
524
|
+
act(() => {
|
|
525
|
+
setEntity({
|
|
526
|
+
...defaultFile
|
|
303
527
|
});
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
setPath('2');
|
|
324
|
-
});
|
|
325
|
-
const { current: collection2 } = result;
|
|
326
|
-
const [currentFile2] = collection2;
|
|
327
|
-
expect(entityArg).toEqual({ ...defaultFile, path: '2' });
|
|
328
|
-
expect(currentFile2).toEqual({ ...defaultFile, path: '21' });
|
|
528
|
+
});
|
|
529
|
+
rerender();
|
|
530
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
531
|
+
});
|
|
532
|
+
test('`usecase` should be called if deps has changed', () => {
|
|
533
|
+
let i = 0;
|
|
534
|
+
const mockUseCase = jest.fn(fileUseCase);
|
|
535
|
+
const _renderHook14 = renderHook(() => {
|
|
536
|
+
return useUseCase(defaultFile, mockUseCase, {}, [i++, 'x']);
|
|
537
|
+
}),
|
|
538
|
+
result = _renderHook14.result,
|
|
539
|
+
rerender = _renderHook14.rerender;
|
|
540
|
+
const cores = result.current;
|
|
541
|
+
const _cores6 = _slicedToArray(cores, 2),
|
|
542
|
+
setEntity = _cores6[1].setEntity;
|
|
543
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
544
|
+
act(() => {
|
|
545
|
+
setEntity({
|
|
546
|
+
...defaultFile
|
|
329
547
|
});
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
548
|
+
});
|
|
549
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
550
|
+
rerender();
|
|
551
|
+
expect(mockUseCase).toHaveBeenCalledTimes(2);
|
|
552
|
+
});
|
|
553
|
+
test('after call non-generator reducer, it should not trigger update', () => {
|
|
554
|
+
const onUpdate = jest.fn();
|
|
555
|
+
const onDeepUpdate = jest.fn();
|
|
556
|
+
const _renderHook15 = renderHook(() => {
|
|
557
|
+
const context = useUseCase(defaultFile, fileUseCase);
|
|
558
|
+
const _context = _slicedToArray(context, 2),
|
|
559
|
+
reducers = _context[1];
|
|
560
|
+
const isImage = reducers.isImage;
|
|
561
|
+
const update = useUpdate();
|
|
562
|
+
useUpdateEffect(() => {
|
|
563
|
+
onUpdate();
|
|
564
|
+
}, [context]);
|
|
565
|
+
useDeepCompareUpdate(() => {
|
|
566
|
+
onDeepUpdate();
|
|
567
|
+
}, [context]);
|
|
568
|
+
return shouldUpdate => {
|
|
569
|
+
isImage();
|
|
570
|
+
if (!shouldUpdate) {
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
update();
|
|
574
|
+
};
|
|
575
|
+
}),
|
|
576
|
+
result = _renderHook15.result;
|
|
577
|
+
act(() => {
|
|
578
|
+
result.current();
|
|
579
|
+
});
|
|
580
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
581
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
582
|
+
act(() => {
|
|
583
|
+
result.current(true);
|
|
584
|
+
});
|
|
585
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
586
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
587
|
+
});
|
|
588
|
+
test('after `yield entity`, it should trigger update', () => {
|
|
589
|
+
const onUpdate = jest.fn();
|
|
590
|
+
const _renderHook16 = renderHook(() => {
|
|
591
|
+
useUpdateEffect(() => {
|
|
592
|
+
onUpdate();
|
|
593
|
+
});
|
|
594
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
595
|
+
}),
|
|
596
|
+
result = _renderHook16.result;
|
|
597
|
+
const cores = result.current;
|
|
598
|
+
const _cores7 = _slicedToArray(cores, 2),
|
|
599
|
+
entity = _cores7[0],
|
|
600
|
+
reducers = _cores7[1];
|
|
601
|
+
const setPath = reducers.setPath,
|
|
602
|
+
setEntity = reducers.setEntity;
|
|
603
|
+
act(() => {
|
|
604
|
+
setPath(PATH_1);
|
|
605
|
+
setEntity({
|
|
606
|
+
size: 5000
|
|
337
607
|
});
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
608
|
+
});
|
|
609
|
+
expect(result.current).not.toBe(cores);
|
|
610
|
+
expect(result.current[0]).not.toBe(entity);
|
|
611
|
+
expect(result.current[1]).not.toBe(reducers);
|
|
612
|
+
expect(result.current[1].setPath).not.toBe(setPath);
|
|
613
|
+
expect(result.current[0]).toEqual({
|
|
614
|
+
...defaultFile,
|
|
615
|
+
path: PATH_1,
|
|
616
|
+
ext: EXT_1,
|
|
617
|
+
size: 5000
|
|
618
|
+
});
|
|
619
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
620
|
+
});
|
|
621
|
+
test('after `yield entity` on async mode, it should trigger update', async () => {
|
|
622
|
+
const onUpdate = jest.fn();
|
|
623
|
+
const _renderHook17 = renderHook(() => {
|
|
624
|
+
useUpdateEffect(() => {
|
|
625
|
+
onUpdate();
|
|
626
|
+
});
|
|
627
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
628
|
+
}),
|
|
629
|
+
result = _renderHook17.result;
|
|
630
|
+
const cores = result.current;
|
|
631
|
+
const _cores8 = _slicedToArray(cores, 2),
|
|
632
|
+
entity = _cores8[0],
|
|
633
|
+
reducers = _cores8[1];
|
|
634
|
+
const readFile = reducers.readFile;
|
|
635
|
+
const promise = act(() => {
|
|
636
|
+
return readFile(PATH_1);
|
|
637
|
+
});
|
|
638
|
+
expect(result.current).toBe(cores);
|
|
639
|
+
expect(result.current).toEqual(cores);
|
|
640
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
641
|
+
await promise;
|
|
642
|
+
expect(result.current[0]).not.toBe(entity);
|
|
643
|
+
expect(result.current[1]).not.toBe(reducers);
|
|
644
|
+
expect(result.current[1].readFile).not.toBe(readFile);
|
|
645
|
+
expect(result.current[0].path).toBe(PATH_1);
|
|
646
|
+
expect(result.current[0].ext).toBe(EXT_1);
|
|
647
|
+
expect(result.current[0].size).toBe(2000);
|
|
648
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
649
|
+
});
|
|
650
|
+
test('after `yield entity` callbacks, it should trigger update', () => {
|
|
651
|
+
const onUpdate = jest.fn();
|
|
652
|
+
const _renderHook18 = renderHook(() => {
|
|
653
|
+
useUpdateEffect(() => {
|
|
654
|
+
onUpdate();
|
|
655
|
+
});
|
|
656
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
657
|
+
}),
|
|
658
|
+
result = _renderHook18.result;
|
|
659
|
+
const cores = result.current;
|
|
660
|
+
const _cores9 = _slicedToArray(cores, 2),
|
|
661
|
+
reducers = _cores9[1];
|
|
662
|
+
const init = reducers.init;
|
|
663
|
+
act(() => {
|
|
664
|
+
init({
|
|
665
|
+
...defaultFile,
|
|
666
|
+
size: 5000
|
|
345
667
|
});
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
668
|
+
});
|
|
669
|
+
expect(result.current[0].size).toBe(5000);
|
|
670
|
+
expect(result.current[1]).not.toBe(reducers);
|
|
671
|
+
expect(result.current[1].init).not.toBe(init);
|
|
672
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
673
|
+
});
|
|
674
|
+
test('reducer call should be cached if component is at rendering phase', () => {
|
|
675
|
+
const buttonText = 'button';
|
|
676
|
+
const addReducer = jest.fn((entity, substring) => {
|
|
677
|
+
return entity + substring;
|
|
678
|
+
});
|
|
679
|
+
const stringUseCase = () => {
|
|
680
|
+
const entityReducers = entityUseCase();
|
|
681
|
+
return {
|
|
682
|
+
...entityReducers,
|
|
683
|
+
add: addReducer
|
|
684
|
+
};
|
|
685
|
+
};
|
|
686
|
+
const CacheTestComponent = () => {
|
|
687
|
+
const _useUseCase6 = useUseCase('', stringUseCase),
|
|
688
|
+
_useUseCase7 = _slicedToArray(_useUseCase6, 2),
|
|
689
|
+
add = _useUseCase7[1].add;
|
|
690
|
+
const update = useUpdate();
|
|
691
|
+
const onClick = () => {
|
|
692
|
+
update();
|
|
693
|
+
};
|
|
694
|
+
add('x');
|
|
695
|
+
return _jsx("button", {
|
|
696
|
+
onClick: onClick,
|
|
697
|
+
children: buttonText
|
|
361
698
|
});
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
699
|
+
};
|
|
700
|
+
render(_jsx(CacheTestComponent, {}));
|
|
701
|
+
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
702
|
+
expect(addReducer).toHaveBeenCalledWith('', 'x');
|
|
703
|
+
expect(addReducer).toHaveReturnedWith('x');
|
|
704
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
705
|
+
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
706
|
+
});
|
|
707
|
+
test('reducer call should not be cached if component is not at rendering phase', () => {
|
|
708
|
+
const buttonText = 'button';
|
|
709
|
+
const addReducer = jest.fn((entity, substring) => {
|
|
710
|
+
return entity + substring;
|
|
711
|
+
});
|
|
712
|
+
const stringUseCase = () => {
|
|
713
|
+
const entityReducers = entityUseCase();
|
|
714
|
+
return {
|
|
715
|
+
...entityReducers,
|
|
716
|
+
add: addReducer
|
|
717
|
+
};
|
|
718
|
+
};
|
|
719
|
+
const CacheTestComponent = () => {
|
|
720
|
+
const _useUseCase8 = useUseCase('', stringUseCase),
|
|
721
|
+
_useUseCase9 = _slicedToArray(_useUseCase8, 2),
|
|
722
|
+
add = _useUseCase9[1].add;
|
|
723
|
+
const onClick = () => {
|
|
724
|
+
add('x');
|
|
725
|
+
};
|
|
726
|
+
useMount(() => {
|
|
727
|
+
add('x');
|
|
728
|
+
add('x');
|
|
377
729
|
});
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
const { result, rerender } = renderHook(() => {
|
|
382
|
-
return useUseCase(defaultFile, mockUseCase, {}, [i++, 'x']);
|
|
383
|
-
});
|
|
384
|
-
const { current: cores } = result;
|
|
385
|
-
const [, { setEntity }] = cores;
|
|
386
|
-
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
387
|
-
act(() => {
|
|
388
|
-
setEntity({
|
|
389
|
-
...defaultFile,
|
|
390
|
-
});
|
|
391
|
-
});
|
|
392
|
-
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
393
|
-
rerender();
|
|
394
|
-
expect(mockUseCase).toHaveBeenCalledTimes(2);
|
|
730
|
+
return _jsx("button", {
|
|
731
|
+
onClick: onClick,
|
|
732
|
+
children: buttonText
|
|
395
733
|
});
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
734
|
+
};
|
|
735
|
+
render(_jsx(CacheTestComponent, {}));
|
|
736
|
+
expect(addReducer).toHaveBeenCalledTimes(2);
|
|
737
|
+
expect(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
|
|
738
|
+
expect(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
|
|
739
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
740
|
+
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
741
|
+
expect(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
|
|
742
|
+
});
|
|
743
|
+
test('reducer call should not be cached if entity or parameters have changed', () => {
|
|
744
|
+
let count = 0;
|
|
745
|
+
let addedText = 'x';
|
|
746
|
+
const setButtonText = 'button';
|
|
747
|
+
const updateButtonText = 'update';
|
|
748
|
+
const addReducer = jest.fn((entity, substring) => {
|
|
749
|
+
return entity + substring;
|
|
750
|
+
});
|
|
751
|
+
const stringUseCase = () => {
|
|
752
|
+
const entityReducers = entityUseCase();
|
|
753
|
+
return {
|
|
754
|
+
...entityReducers,
|
|
755
|
+
add: addReducer
|
|
756
|
+
};
|
|
757
|
+
};
|
|
758
|
+
const CacheTestComponent = () => {
|
|
759
|
+
const _useUseCase0 = useUseCase('', stringUseCase),
|
|
760
|
+
_useUseCase1 = _slicedToArray(_useUseCase0, 2),
|
|
761
|
+
_useUseCase1$ = _useUseCase1[1],
|
|
762
|
+
add = _useUseCase1$.add,
|
|
763
|
+
setEntity = _useUseCase1$.setEntity;
|
|
764
|
+
const update = useUpdate();
|
|
765
|
+
add(addedText);
|
|
766
|
+
const onSet = () => {
|
|
767
|
+
setEntity(`${count++}`);
|
|
768
|
+
};
|
|
769
|
+
const onUpdate = () => {
|
|
770
|
+
update();
|
|
771
|
+
};
|
|
772
|
+
return _jsxs("div", {
|
|
773
|
+
children: [_jsx("button", {
|
|
774
|
+
onClick: onSet,
|
|
775
|
+
children: setButtonText
|
|
776
|
+
}), _jsx("button", {
|
|
777
|
+
onClick: onUpdate,
|
|
778
|
+
children: updateButtonText
|
|
779
|
+
})]
|
|
428
780
|
});
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
781
|
+
};
|
|
782
|
+
render(_jsx(CacheTestComponent, {}));
|
|
783
|
+
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
784
|
+
expect(addReducer).toHaveBeenCalledWith('', 'x');
|
|
785
|
+
fireEvent.click(screen.getByText(setButtonText));
|
|
786
|
+
expect(addReducer).toHaveBeenCalledTimes(2);
|
|
787
|
+
expect(addReducer).toHaveBeenCalledWith('0', 'x');
|
|
788
|
+
expect(addReducer).toHaveReturnedWith('0x');
|
|
789
|
+
addedText = 'y';
|
|
790
|
+
fireEvent.click(screen.getByText(updateButtonText));
|
|
791
|
+
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
792
|
+
expect(addReducer).toHaveBeenCalledWith('0', 'y');
|
|
793
|
+
expect(addReducer).toHaveReturnedWith('0y');
|
|
794
|
+
fireEvent.click(screen.getByText(updateButtonText));
|
|
795
|
+
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
796
|
+
});
|
|
797
|
+
test('`options.onChange` should be trigger when entity has changed', () => {
|
|
798
|
+
const onChange = jest.fn();
|
|
799
|
+
const _renderHook19 = renderHook(() => {
|
|
800
|
+
return useUseCase(defaultFile, fileUseCase, {
|
|
801
|
+
onChange
|
|
802
|
+
});
|
|
803
|
+
}),
|
|
804
|
+
result = _renderHook19.result;
|
|
805
|
+
const cores = result.current;
|
|
806
|
+
const _cores0 = _slicedToArray(cores, 2),
|
|
807
|
+
reducers = _cores0[1];
|
|
808
|
+
const setPath = reducers.setPath;
|
|
809
|
+
expect(onChange).toHaveBeenCalledTimes(0);
|
|
810
|
+
act(() => {
|
|
811
|
+
setPath(PATH_1);
|
|
812
|
+
});
|
|
813
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
814
|
+
expect(onChange).toHaveBeenLastCalledWith({
|
|
815
|
+
...defaultFile,
|
|
816
|
+
path: PATH_1,
|
|
817
|
+
ext: EXT_1
|
|
818
|
+
}, defaultFile);
|
|
819
|
+
});
|
|
820
|
+
test('`options.onChange` should always trigger the latest one', () => {
|
|
821
|
+
const onChange1 = jest.fn();
|
|
822
|
+
const onChange2 = jest.fn();
|
|
823
|
+
let onChange = onChange1;
|
|
824
|
+
const _renderHook20 = renderHook(() => {
|
|
825
|
+
return useUseCase(defaultFile, fileUseCase, {
|
|
826
|
+
onChange
|
|
827
|
+
}, []);
|
|
828
|
+
}),
|
|
829
|
+
result = _renderHook20.result;
|
|
830
|
+
const cores = result.current;
|
|
831
|
+
const _cores1 = _slicedToArray(cores, 2),
|
|
832
|
+
reducers = _cores1[1];
|
|
833
|
+
const setPath = reducers.setPath;
|
|
834
|
+
expect(onChange1).toHaveBeenCalledTimes(0);
|
|
835
|
+
act(() => {
|
|
836
|
+
setPath(PATH_1);
|
|
837
|
+
onChange = onChange2;
|
|
838
|
+
});
|
|
839
|
+
expect(onChange2).toHaveBeenCalledTimes(0);
|
|
840
|
+
expect(onChange1).toHaveBeenCalledTimes(1);
|
|
841
|
+
expect(onChange1).toHaveBeenLastCalledWith({
|
|
842
|
+
...defaultFile,
|
|
843
|
+
path: PATH_1,
|
|
844
|
+
ext: EXT_1
|
|
845
|
+
}, defaultFile);
|
|
846
|
+
act(() => {
|
|
847
|
+
setPath(PATH_2);
|
|
848
|
+
});
|
|
849
|
+
expect(onChange1).toHaveBeenCalledTimes(1);
|
|
850
|
+
expect(onChange2).toHaveBeenCalledTimes(1);
|
|
851
|
+
expect(onChange2).toHaveBeenLastCalledWith({
|
|
852
|
+
...defaultFile,
|
|
853
|
+
path: PATH_2,
|
|
854
|
+
ext: EXT_2
|
|
855
|
+
}, {
|
|
856
|
+
...defaultFile,
|
|
857
|
+
path: PATH_1,
|
|
858
|
+
ext: EXT_1
|
|
859
|
+
});
|
|
860
|
+
});
|
|
861
|
+
test('`options.options` should override rest options', () => {
|
|
862
|
+
const _renderHook21 = renderHook(() => {
|
|
863
|
+
return useUseCase(defaultFile, fileUseCase, {
|
|
864
|
+
pathPrefix: 'xyz/',
|
|
865
|
+
options: {
|
|
866
|
+
pathPrefix: '123/'
|
|
867
|
+
}
|
|
868
|
+
});
|
|
869
|
+
}),
|
|
870
|
+
result = _renderHook21.result;
|
|
871
|
+
const cores = result.current;
|
|
872
|
+
const _cores10 = _slicedToArray(cores, 2),
|
|
873
|
+
path = _cores10[0].path,
|
|
874
|
+
reducers = _cores10[1];
|
|
875
|
+
const setPath = reducers.setPath;
|
|
876
|
+
expect(path).toBe('');
|
|
877
|
+
act(() => {
|
|
878
|
+
setPath(PATH_1);
|
|
879
|
+
});
|
|
880
|
+
expect(result.current[0].path).toBe('123/' + PATH_1);
|
|
881
|
+
});
|
|
882
|
+
test('Option functions: use `T` (not `S`) when `S extends T`', () => {
|
|
883
|
+
const testObjectUseCase = function () {
|
|
884
|
+
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
885
|
+
const objectReducers = objectUseCase();
|
|
886
|
+
void options;
|
|
887
|
+
return {
|
|
888
|
+
...objectReducers
|
|
889
|
+
};
|
|
890
|
+
};
|
|
891
|
+
renderHook(() => {
|
|
892
|
+
useUseCase(defaultFile, testObjectUseCase, {
|
|
893
|
+
onUpdate(data) {
|
|
894
|
+
void data;
|
|
895
|
+
return Promise.reject();
|
|
896
|
+
}
|
|
455
897
|
});
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
898
|
+
});
|
|
899
|
+
// 这个测试仅仅是为了确保类型不会报错,不验证实际逻辑
|
|
900
|
+
expect(1).toBe(1);
|
|
901
|
+
});
|
|
902
|
+
test('when `options` has changed, it should not trigger update', () => {
|
|
903
|
+
const onUpdate = jest.fn();
|
|
904
|
+
const onDeepUpdate = jest.fn();
|
|
905
|
+
const _renderHook22 = renderHook(() => {
|
|
906
|
+
const _useState = useState('user/'),
|
|
907
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
908
|
+
pathPrefix = _useState2[0],
|
|
909
|
+
setPathPrefix = _useState2[1];
|
|
910
|
+
const context = useUseCase(defaultFile, fileUseCase, {
|
|
911
|
+
pathPrefix
|
|
912
|
+
});
|
|
913
|
+
useUpdateEffect(() => {
|
|
914
|
+
onUpdate();
|
|
915
|
+
}, [context]);
|
|
916
|
+
useDeepCompareUpdate(() => {
|
|
917
|
+
onDeepUpdate();
|
|
918
|
+
}, [context]);
|
|
919
|
+
return setPathPrefix;
|
|
920
|
+
}),
|
|
921
|
+
result = _renderHook22.result;
|
|
922
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
923
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
924
|
+
act(() => {
|
|
925
|
+
result.current('my/');
|
|
926
|
+
});
|
|
927
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
928
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
929
|
+
});
|
|
930
|
+
test('when `deps` has changed, it should trigger update', () => {
|
|
931
|
+
const onUpdate = jest.fn();
|
|
932
|
+
const onDeepUpdate = jest.fn();
|
|
933
|
+
const _renderHook23 = renderHook(() => {
|
|
934
|
+
const _useState3 = useState('user/'),
|
|
935
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
936
|
+
pathPrefix = _useState4[0],
|
|
937
|
+
setPathPrefix = _useState4[1];
|
|
938
|
+
const context = useUseCase(defaultFile, fileUseCase, {
|
|
939
|
+
pathPrefix
|
|
940
|
+
}, [pathPrefix]);
|
|
941
|
+
useUpdateEffect(() => {
|
|
942
|
+
onUpdate();
|
|
943
|
+
}, [context]);
|
|
944
|
+
useDeepCompareUpdate(() => {
|
|
945
|
+
onDeepUpdate();
|
|
946
|
+
}, [context]);
|
|
947
|
+
return setPathPrefix;
|
|
948
|
+
}),
|
|
949
|
+
result = _renderHook23.result;
|
|
950
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
951
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
952
|
+
act(() => {
|
|
953
|
+
result.current('my/');
|
|
954
|
+
});
|
|
955
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
956
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(1);
|
|
957
|
+
});
|
|
958
|
+
test('empty `deps` should not trigger update', () => {
|
|
959
|
+
const onUpdate = jest.fn();
|
|
960
|
+
const onDeepUpdate = jest.fn();
|
|
961
|
+
const _renderHook24 = renderHook(() => {
|
|
962
|
+
const _useState5 = useState('user/'),
|
|
963
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
964
|
+
pathPrefix = _useState6[0],
|
|
965
|
+
setPathPrefix = _useState6[1];
|
|
966
|
+
const context = useUseCase(defaultFile, fileUseCase, {
|
|
967
|
+
pathPrefix
|
|
968
|
+
}, []);
|
|
969
|
+
useUpdateEffect(() => {
|
|
970
|
+
onUpdate();
|
|
971
|
+
}, [context]);
|
|
972
|
+
useDeepCompareUpdate(() => {
|
|
973
|
+
onDeepUpdate();
|
|
974
|
+
}, [context]);
|
|
975
|
+
return setPathPrefix;
|
|
976
|
+
}),
|
|
977
|
+
result = _renderHook24.result;
|
|
978
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
979
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
980
|
+
act(() => {
|
|
981
|
+
result.current('my/');
|
|
982
|
+
});
|
|
983
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
984
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
985
|
+
});
|
|
986
|
+
test(`should call latest functions of usecase options even deps has not change`, () => {
|
|
987
|
+
const onPathChange1 = jest.fn();
|
|
988
|
+
const onPathChange2 = jest.fn();
|
|
989
|
+
let onPathChange = onPathChange1;
|
|
990
|
+
const _renderHook25 = renderHook(() => {
|
|
991
|
+
return useUseCase(defaultFile, fileUseCase, {
|
|
992
|
+
onPathChange
|
|
993
|
+
});
|
|
994
|
+
}),
|
|
995
|
+
result = _renderHook25.result;
|
|
996
|
+
const context = result.current;
|
|
997
|
+
const _context2 = _slicedToArray(context, 2),
|
|
998
|
+
setPath = _context2[1].setPath;
|
|
999
|
+
act(() => {
|
|
1000
|
+
setPath(PATH_1);
|
|
1001
|
+
onPathChange = onPathChange2;
|
|
1002
|
+
});
|
|
1003
|
+
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
1004
|
+
expect(onPathChange2).toHaveBeenCalledTimes(0);
|
|
1005
|
+
expect(onPathChange1).toHaveBeenLastCalledWith(PATH_1, '');
|
|
1006
|
+
act(() => {
|
|
1007
|
+
setPath(PATH_2);
|
|
1008
|
+
});
|
|
1009
|
+
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
1010
|
+
expect(onPathChange2).toHaveBeenCalledTimes(1);
|
|
1011
|
+
expect(onPathChange2).toHaveBeenLastCalledWith(PATH_2, PATH_1);
|
|
1012
|
+
});
|
|
1013
|
+
test('`options.watch` should be trigger after entity changed', () => {
|
|
1014
|
+
const onPathChange = jest.fn();
|
|
1015
|
+
const onSizeChange = jest.fn();
|
|
1016
|
+
const _renderHook26 = renderHook(() => {
|
|
1017
|
+
return useUseCase(defaultFile, fileUseCase, {
|
|
1018
|
+
watch: {
|
|
1019
|
+
path: onPathChange,
|
|
1020
|
+
size: onSizeChange
|
|
1021
|
+
}
|
|
1022
|
+
});
|
|
1023
|
+
}),
|
|
1024
|
+
result = _renderHook26.result;
|
|
1025
|
+
const cores = result.current;
|
|
1026
|
+
const _cores11 = _slicedToArray(cores, 2),
|
|
1027
|
+
setPath = _cores11[1].setPath;
|
|
1028
|
+
expect(onPathChange).toHaveBeenCalledTimes(0);
|
|
1029
|
+
act(() => {
|
|
1030
|
+
setPath(PATH_1);
|
|
1031
|
+
});
|
|
1032
|
+
expect(onPathChange).toHaveBeenCalledTimes(1);
|
|
1033
|
+
expect(onSizeChange).toHaveBeenCalledTimes(0);
|
|
1034
|
+
expect(onPathChange).toHaveBeenLastCalledWith({
|
|
1035
|
+
fieldPaths: ['path'],
|
|
1036
|
+
newEntity: {
|
|
1037
|
+
...defaultFile,
|
|
1038
|
+
path: PATH_1,
|
|
1039
|
+
ext: EXT_1
|
|
1040
|
+
},
|
|
1041
|
+
oldEntity: defaultFile,
|
|
1042
|
+
newValue: PATH_1,
|
|
1043
|
+
oldValue: ''
|
|
1044
|
+
});
|
|
1045
|
+
});
|
|
1046
|
+
test('`options.watch` should trigger the latest one', () => {
|
|
1047
|
+
const onPathChange1 = jest.fn();
|
|
1048
|
+
const onPathChange2 = jest.fn();
|
|
1049
|
+
let onPathChange = onPathChange1;
|
|
1050
|
+
const _renderHook27 = renderHook(() => {
|
|
1051
|
+
return useUseCase(defaultFile, fileUseCase, {
|
|
1052
|
+
watch: {
|
|
1053
|
+
path: onPathChange
|
|
1054
|
+
}
|
|
1055
|
+
});
|
|
1056
|
+
}),
|
|
1057
|
+
result = _renderHook27.result;
|
|
1058
|
+
const cores = result.current;
|
|
1059
|
+
const _cores12 = _slicedToArray(cores, 2),
|
|
1060
|
+
_cores12$ = _cores12[1],
|
|
1061
|
+
setPath = _cores12$.setPath,
|
|
1062
|
+
setEntity = _cores12$.setEntity;
|
|
1063
|
+
expect(onPathChange1).toHaveBeenCalledTimes(0);
|
|
1064
|
+
act(() => {
|
|
1065
|
+
setPath(PATH_1);
|
|
1066
|
+
setEntity({
|
|
1067
|
+
size: 5000
|
|
481
1068
|
});
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
1069
|
+
onPathChange = onPathChange2;
|
|
1070
|
+
});
|
|
1071
|
+
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
1072
|
+
expect(onPathChange1).toHaveBeenLastCalledWith({
|
|
1073
|
+
fieldPaths: ['path'],
|
|
1074
|
+
newEntity: {
|
|
1075
|
+
...defaultFile,
|
|
1076
|
+
path: PATH_1,
|
|
1077
|
+
ext: EXT_1
|
|
1078
|
+
},
|
|
1079
|
+
oldEntity: defaultFile,
|
|
1080
|
+
newValue: PATH_1,
|
|
1081
|
+
oldValue: ''
|
|
1082
|
+
});
|
|
1083
|
+
act(() => {
|
|
1084
|
+
setPath('');
|
|
1085
|
+
});
|
|
1086
|
+
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
1087
|
+
expect(onPathChange2).toHaveBeenCalledTimes(1);
|
|
1088
|
+
expect(onPathChange2).toHaveBeenLastCalledWith({
|
|
1089
|
+
fieldPaths: ['path'],
|
|
1090
|
+
newEntity: {
|
|
1091
|
+
...defaultFile,
|
|
1092
|
+
size: 5000
|
|
1093
|
+
},
|
|
1094
|
+
oldEntity: {
|
|
1095
|
+
...defaultFile,
|
|
1096
|
+
path: PATH_1,
|
|
1097
|
+
ext: EXT_1,
|
|
1098
|
+
size: 5000
|
|
1099
|
+
},
|
|
1100
|
+
newValue: '',
|
|
1101
|
+
oldValue: PATH_1
|
|
1102
|
+
});
|
|
1103
|
+
});
|
|
1104
|
+
test('`options.watch` should work with array field path of array', () => {
|
|
1105
|
+
const initialData = {};
|
|
1106
|
+
const onExtChange = jest.fn();
|
|
1107
|
+
const onSizeChange = jest.fn();
|
|
1108
|
+
const _renderHook28 = renderHook(() => {
|
|
1109
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
1110
|
+
watch: {
|
|
1111
|
+
'list.ext': onExtChange,
|
|
1112
|
+
'list.size': onSizeChange
|
|
1113
|
+
}
|
|
1114
|
+
});
|
|
1115
|
+
}),
|
|
1116
|
+
result = _renderHook28.result;
|
|
1117
|
+
const cores = result.current;
|
|
1118
|
+
const _cores13 = _slicedToArray(cores, 2),
|
|
1119
|
+
setEntity = _cores13[1].setEntity;
|
|
1120
|
+
act(() => {
|
|
1121
|
+
setEntity({
|
|
1122
|
+
list: [defaultFile]
|
|
500
1123
|
});
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
1124
|
+
});
|
|
1125
|
+
expect(onExtChange).toHaveBeenCalledTimes(1);
|
|
1126
|
+
expect(onSizeChange).toHaveBeenCalledTimes(1);
|
|
1127
|
+
expect(onExtChange).toHaveBeenCalledWith({
|
|
1128
|
+
fieldPaths: ['list', '0', 'ext'],
|
|
1129
|
+
newEntity: {
|
|
1130
|
+
list: [defaultFile]
|
|
1131
|
+
},
|
|
1132
|
+
oldEntity: {},
|
|
1133
|
+
newValue: '',
|
|
1134
|
+
oldValue: void 0
|
|
1135
|
+
});
|
|
1136
|
+
expect(onSizeChange).toHaveBeenCalledWith({
|
|
1137
|
+
fieldPaths: ['list', '0', 'size'],
|
|
1138
|
+
newEntity: {
|
|
1139
|
+
list: [defaultFile]
|
|
1140
|
+
},
|
|
1141
|
+
oldEntity: {},
|
|
1142
|
+
newValue: 0,
|
|
1143
|
+
oldValue: void 0
|
|
1144
|
+
});
|
|
1145
|
+
act(() => {
|
|
1146
|
+
setEntity({
|
|
1147
|
+
list: [{
|
|
1148
|
+
...defaultFile,
|
|
1149
|
+
ext: EXT_1
|
|
1150
|
+
}]
|
|
528
1151
|
});
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
expect(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
|
|
556
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
557
|
-
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
558
|
-
expect(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
|
|
1152
|
+
});
|
|
1153
|
+
expect(onExtChange).toHaveBeenCalledTimes(2);
|
|
1154
|
+
expect(onSizeChange).toHaveBeenCalledTimes(1);
|
|
1155
|
+
expect(onExtChange).toHaveBeenCalledWith({
|
|
1156
|
+
fieldPaths: ['list', '0', 'ext'],
|
|
1157
|
+
newEntity: {
|
|
1158
|
+
list: [{
|
|
1159
|
+
...defaultFile,
|
|
1160
|
+
ext: EXT_1
|
|
1161
|
+
}]
|
|
1162
|
+
},
|
|
1163
|
+
oldEntity: {
|
|
1164
|
+
list: [defaultFile]
|
|
1165
|
+
},
|
|
1166
|
+
newValue: EXT_1,
|
|
1167
|
+
oldValue: ''
|
|
1168
|
+
});
|
|
1169
|
+
act(() => {
|
|
1170
|
+
setEntity({
|
|
1171
|
+
list: [{
|
|
1172
|
+
...defaultFile,
|
|
1173
|
+
ext: EXT_1
|
|
1174
|
+
}, {
|
|
1175
|
+
...defaultFile,
|
|
1176
|
+
ext: EXT_2
|
|
1177
|
+
}]
|
|
559
1178
|
});
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
1179
|
+
});
|
|
1180
|
+
expect(onExtChange).toHaveBeenCalledTimes(3);
|
|
1181
|
+
expect(onSizeChange).toHaveBeenCalledTimes(2);
|
|
1182
|
+
expect(onExtChange).toHaveBeenCalledWith({
|
|
1183
|
+
fieldPaths: ['list', '1', 'ext'],
|
|
1184
|
+
newEntity: {
|
|
1185
|
+
list: [{
|
|
1186
|
+
...defaultFile,
|
|
1187
|
+
ext: EXT_1
|
|
1188
|
+
}, {
|
|
1189
|
+
...defaultFile,
|
|
1190
|
+
ext: EXT_2
|
|
1191
|
+
}]
|
|
1192
|
+
},
|
|
1193
|
+
oldEntity: {
|
|
1194
|
+
list: [{
|
|
1195
|
+
...defaultFile,
|
|
1196
|
+
ext: EXT_1
|
|
1197
|
+
}]
|
|
1198
|
+
},
|
|
1199
|
+
newValue: EXT_2,
|
|
1200
|
+
oldValue: void 0
|
|
1201
|
+
});
|
|
1202
|
+
expect(onSizeChange).toHaveBeenCalledWith({
|
|
1203
|
+
fieldPaths: ['list', '1', 'size'],
|
|
1204
|
+
newEntity: {
|
|
1205
|
+
list: [{
|
|
1206
|
+
...defaultFile,
|
|
1207
|
+
ext: EXT_1
|
|
1208
|
+
}, {
|
|
1209
|
+
...defaultFile,
|
|
1210
|
+
ext: EXT_2
|
|
1211
|
+
}]
|
|
1212
|
+
},
|
|
1213
|
+
oldEntity: {
|
|
1214
|
+
list: [{
|
|
1215
|
+
...defaultFile,
|
|
1216
|
+
ext: EXT_1
|
|
1217
|
+
}]
|
|
1218
|
+
},
|
|
1219
|
+
newValue: 0,
|
|
1220
|
+
oldValue: void 0
|
|
1221
|
+
});
|
|
1222
|
+
act(() => {
|
|
1223
|
+
setEntity({
|
|
1224
|
+
nestedList: []
|
|
601
1225
|
});
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
1226
|
+
});
|
|
1227
|
+
expect(onExtChange).toHaveBeenCalledTimes(3);
|
|
1228
|
+
expect(onSizeChange).toHaveBeenCalledTimes(2);
|
|
1229
|
+
act(() => {
|
|
1230
|
+
setEntity(() => {
|
|
1231
|
+
return {
|
|
1232
|
+
list: [{
|
|
1233
|
+
...defaultFile,
|
|
1234
|
+
ext: EXT_2
|
|
1235
|
+
}, {
|
|
1236
|
+
...defaultFile,
|
|
1237
|
+
ext: EXT_1
|
|
1238
|
+
}, defaultFile]
|
|
1239
|
+
};
|
|
616
1240
|
});
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
1241
|
+
});
|
|
1242
|
+
expect(onExtChange).toHaveBeenCalledTimes(6);
|
|
1243
|
+
expect(onSizeChange).toHaveBeenCalledTimes(3);
|
|
1244
|
+
expect(onExtChange).toHaveBeenNthCalledWith(4, {
|
|
1245
|
+
fieldPaths: ['list', '0', 'ext'],
|
|
1246
|
+
newEntity: {
|
|
1247
|
+
list: [{
|
|
1248
|
+
...defaultFile,
|
|
1249
|
+
ext: EXT_2
|
|
1250
|
+
}, {
|
|
1251
|
+
...defaultFile,
|
|
1252
|
+
ext: EXT_1
|
|
1253
|
+
}, defaultFile]
|
|
1254
|
+
},
|
|
1255
|
+
oldEntity: {
|
|
1256
|
+
list: [{
|
|
1257
|
+
...defaultFile,
|
|
1258
|
+
ext: EXT_1
|
|
1259
|
+
}, {
|
|
1260
|
+
...defaultFile,
|
|
1261
|
+
ext: EXT_2
|
|
1262
|
+
}],
|
|
1263
|
+
nestedList: []
|
|
1264
|
+
},
|
|
1265
|
+
newValue: EXT_2,
|
|
1266
|
+
oldValue: EXT_1
|
|
1267
|
+
});
|
|
1268
|
+
expect(onExtChange).toHaveBeenNthCalledWith(5, {
|
|
1269
|
+
fieldPaths: ['list', '1', 'ext'],
|
|
1270
|
+
newEntity: {
|
|
1271
|
+
list: [{
|
|
1272
|
+
...defaultFile,
|
|
1273
|
+
ext: EXT_2
|
|
1274
|
+
}, {
|
|
1275
|
+
...defaultFile,
|
|
1276
|
+
ext: EXT_1
|
|
1277
|
+
}, defaultFile]
|
|
1278
|
+
},
|
|
1279
|
+
oldEntity: {
|
|
1280
|
+
list: [{
|
|
1281
|
+
...defaultFile,
|
|
1282
|
+
ext: EXT_1
|
|
1283
|
+
}, {
|
|
1284
|
+
...defaultFile,
|
|
1285
|
+
ext: EXT_2
|
|
1286
|
+
}],
|
|
1287
|
+
nestedList: []
|
|
1288
|
+
},
|
|
1289
|
+
newValue: EXT_1,
|
|
1290
|
+
oldValue: EXT_2
|
|
1291
|
+
});
|
|
1292
|
+
expect(onExtChange).toHaveBeenNthCalledWith(6, {
|
|
1293
|
+
fieldPaths: ['list', '2', 'ext'],
|
|
1294
|
+
newEntity: {
|
|
1295
|
+
list: [{
|
|
1296
|
+
...defaultFile,
|
|
1297
|
+
ext: EXT_2
|
|
1298
|
+
}, {
|
|
1299
|
+
...defaultFile,
|
|
1300
|
+
ext: EXT_1
|
|
1301
|
+
}, defaultFile]
|
|
1302
|
+
},
|
|
1303
|
+
oldEntity: {
|
|
1304
|
+
list: [{
|
|
1305
|
+
...defaultFile,
|
|
1306
|
+
ext: EXT_1
|
|
1307
|
+
}, {
|
|
1308
|
+
...defaultFile,
|
|
1309
|
+
ext: EXT_2
|
|
1310
|
+
}],
|
|
1311
|
+
nestedList: []
|
|
1312
|
+
},
|
|
1313
|
+
newValue: '',
|
|
1314
|
+
oldValue: void 0
|
|
1315
|
+
});
|
|
1316
|
+
expect(onSizeChange).toHaveBeenCalledWith({
|
|
1317
|
+
fieldPaths: ['list', '2', 'size'],
|
|
1318
|
+
newEntity: {
|
|
1319
|
+
list: [{
|
|
1320
|
+
...defaultFile,
|
|
1321
|
+
ext: EXT_2
|
|
1322
|
+
}, {
|
|
1323
|
+
...defaultFile,
|
|
1324
|
+
ext: EXT_1
|
|
1325
|
+
}, defaultFile]
|
|
1326
|
+
},
|
|
1327
|
+
oldEntity: {
|
|
1328
|
+
list: [{
|
|
1329
|
+
...defaultFile,
|
|
1330
|
+
ext: EXT_1
|
|
1331
|
+
}, {
|
|
1332
|
+
...defaultFile,
|
|
1333
|
+
ext: EXT_2
|
|
1334
|
+
}],
|
|
1335
|
+
nestedList: []
|
|
1336
|
+
},
|
|
1337
|
+
newValue: 0,
|
|
1338
|
+
oldValue: void 0
|
|
1339
|
+
});
|
|
1340
|
+
act(() => {
|
|
1341
|
+
setEntity(() => {
|
|
1342
|
+
return {};
|
|
641
1343
|
});
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
1344
|
+
});
|
|
1345
|
+
expect(onExtChange).toHaveBeenCalledTimes(9);
|
|
1346
|
+
expect(onSizeChange).toHaveBeenCalledTimes(6);
|
|
1347
|
+
expect(onExtChange).toHaveBeenNthCalledWith(7, {
|
|
1348
|
+
fieldPaths: ['list', '0', 'ext'],
|
|
1349
|
+
newEntity: {},
|
|
1350
|
+
oldEntity: {
|
|
1351
|
+
list: [{
|
|
1352
|
+
...defaultFile,
|
|
1353
|
+
ext: EXT_2
|
|
1354
|
+
}, {
|
|
1355
|
+
...defaultFile,
|
|
1356
|
+
ext: EXT_1
|
|
1357
|
+
}, defaultFile]
|
|
1358
|
+
},
|
|
1359
|
+
newValue: void 0,
|
|
1360
|
+
oldValue: EXT_2
|
|
1361
|
+
});
|
|
1362
|
+
expect(onExtChange).toHaveBeenNthCalledWith(8, {
|
|
1363
|
+
fieldPaths: ['list', '1', 'ext'],
|
|
1364
|
+
newEntity: {},
|
|
1365
|
+
oldEntity: {
|
|
1366
|
+
list: [{
|
|
1367
|
+
...defaultFile,
|
|
1368
|
+
ext: EXT_2
|
|
1369
|
+
}, {
|
|
1370
|
+
...defaultFile,
|
|
1371
|
+
ext: EXT_1
|
|
1372
|
+
}, defaultFile]
|
|
1373
|
+
},
|
|
1374
|
+
newValue: void 0,
|
|
1375
|
+
oldValue: EXT_1
|
|
1376
|
+
});
|
|
1377
|
+
expect(onExtChange).toHaveBeenNthCalledWith(9, {
|
|
1378
|
+
fieldPaths: ['list', '2', 'ext'],
|
|
1379
|
+
newEntity: {},
|
|
1380
|
+
oldEntity: {
|
|
1381
|
+
list: [{
|
|
1382
|
+
...defaultFile,
|
|
1383
|
+
ext: EXT_2
|
|
1384
|
+
}, {
|
|
1385
|
+
...defaultFile,
|
|
1386
|
+
ext: EXT_1
|
|
1387
|
+
}, defaultFile]
|
|
1388
|
+
},
|
|
1389
|
+
newValue: void 0,
|
|
1390
|
+
oldValue: ''
|
|
1391
|
+
});
|
|
1392
|
+
expect(onSizeChange).toHaveBeenNthCalledWith(4, {
|
|
1393
|
+
fieldPaths: ['list', '0', 'size'],
|
|
1394
|
+
newEntity: {},
|
|
1395
|
+
oldEntity: {
|
|
1396
|
+
list: [{
|
|
1397
|
+
...defaultFile,
|
|
1398
|
+
ext: EXT_2
|
|
1399
|
+
}, {
|
|
1400
|
+
...defaultFile,
|
|
1401
|
+
ext: EXT_1
|
|
1402
|
+
}, defaultFile]
|
|
1403
|
+
},
|
|
1404
|
+
newValue: void 0,
|
|
1405
|
+
oldValue: 0
|
|
1406
|
+
});
|
|
1407
|
+
expect(onSizeChange).toHaveBeenNthCalledWith(5, {
|
|
1408
|
+
fieldPaths: ['list', '1', 'size'],
|
|
1409
|
+
newEntity: {},
|
|
1410
|
+
oldEntity: {
|
|
1411
|
+
list: [{
|
|
1412
|
+
...defaultFile,
|
|
1413
|
+
ext: EXT_2
|
|
1414
|
+
}, {
|
|
1415
|
+
...defaultFile,
|
|
1416
|
+
ext: EXT_1
|
|
1417
|
+
}, defaultFile]
|
|
1418
|
+
},
|
|
1419
|
+
newValue: void 0,
|
|
1420
|
+
oldValue: 0
|
|
1421
|
+
});
|
|
1422
|
+
expect(onSizeChange).toHaveBeenNthCalledWith(6, {
|
|
1423
|
+
fieldPaths: ['list', '2', 'size'],
|
|
1424
|
+
newEntity: {},
|
|
1425
|
+
oldEntity: {
|
|
1426
|
+
list: [{
|
|
1427
|
+
...defaultFile,
|
|
1428
|
+
ext: EXT_2
|
|
1429
|
+
}, {
|
|
1430
|
+
...defaultFile,
|
|
1431
|
+
ext: EXT_1
|
|
1432
|
+
}, defaultFile]
|
|
1433
|
+
},
|
|
1434
|
+
newValue: void 0,
|
|
1435
|
+
oldValue: 0
|
|
1436
|
+
});
|
|
1437
|
+
});
|
|
1438
|
+
test('`options.watch` should work with field path of array length', () => {
|
|
1439
|
+
const onEntityLengthChange = jest.fn();
|
|
1440
|
+
const onListLengthChange = jest.fn();
|
|
1441
|
+
const lengthUseCase = () => {
|
|
1442
|
+
return entityUseCase();
|
|
1443
|
+
};
|
|
1444
|
+
const _renderHook29 = renderHook(() => {
|
|
1445
|
+
return useUseCase([], lengthUseCase, {
|
|
1446
|
+
watch: {
|
|
1447
|
+
length: onEntityLengthChange,
|
|
1448
|
+
'list.length': onListLengthChange
|
|
1449
|
+
}
|
|
1450
|
+
});
|
|
1451
|
+
}),
|
|
1452
|
+
result = _renderHook29.result;
|
|
1453
|
+
const cores = result.current;
|
|
1454
|
+
const _cores14 = _slicedToArray(cores, 2),
|
|
1455
|
+
setEntity = _cores14[1].setEntity;
|
|
1456
|
+
expect(onEntityLengthChange).toHaveBeenCalledTimes(0);
|
|
1457
|
+
expect(onListLengthChange).toHaveBeenCalledTimes(0);
|
|
1458
|
+
act(() => {
|
|
1459
|
+
setEntity([{
|
|
1460
|
+
list: [defaultFile, defaultFile]
|
|
1461
|
+
}]);
|
|
1462
|
+
});
|
|
1463
|
+
expect(onEntityLengthChange).toHaveBeenCalledTimes(1);
|
|
1464
|
+
expect(onListLengthChange).toHaveBeenCalledTimes(1);
|
|
1465
|
+
expect(onEntityLengthChange).toHaveBeenCalledWith({
|
|
1466
|
+
fieldPaths: ['length'],
|
|
1467
|
+
newEntity: [{
|
|
1468
|
+
list: [defaultFile, defaultFile]
|
|
1469
|
+
}],
|
|
1470
|
+
oldEntity: [],
|
|
1471
|
+
newValue: 1,
|
|
1472
|
+
oldValue: 0
|
|
1473
|
+
});
|
|
1474
|
+
expect(onListLengthChange).toHaveBeenCalledWith({
|
|
1475
|
+
fieldPaths: ['0', 'list', 'length'],
|
|
1476
|
+
newEntity: [{
|
|
1477
|
+
list: [defaultFile, defaultFile]
|
|
1478
|
+
}],
|
|
1479
|
+
oldEntity: [],
|
|
1480
|
+
newValue: 2,
|
|
1481
|
+
oldValue: void 0
|
|
1482
|
+
});
|
|
1483
|
+
});
|
|
1484
|
+
test('`options.watch` should work with field path of nested array', () => {
|
|
1485
|
+
const initialData = {};
|
|
1486
|
+
const onChange = jest.fn();
|
|
1487
|
+
const _renderHook30 = renderHook(() => {
|
|
1488
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
1489
|
+
watch: {
|
|
1490
|
+
'nestedList.size': onChange
|
|
1491
|
+
}
|
|
1492
|
+
});
|
|
1493
|
+
}),
|
|
1494
|
+
result = _renderHook30.result;
|
|
1495
|
+
const cores = result.current;
|
|
1496
|
+
const _cores15 = _slicedToArray(cores, 2),
|
|
1497
|
+
setEntity = _cores15[1].setEntity;
|
|
1498
|
+
expect(onChange).toHaveBeenCalledTimes(0);
|
|
1499
|
+
act(() => {
|
|
1500
|
+
setEntity({
|
|
1501
|
+
nestedList: [[[defaultFile]]]
|
|
657
1502
|
});
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
1503
|
+
});
|
|
1504
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
1505
|
+
expect(onChange).toHaveBeenCalledWith({
|
|
1506
|
+
fieldPaths: ['nestedList', '0', '0', '0', 'size'],
|
|
1507
|
+
newEntity: {
|
|
1508
|
+
nestedList: [[[defaultFile]]]
|
|
1509
|
+
},
|
|
1510
|
+
oldEntity: {},
|
|
1511
|
+
newValue: 0,
|
|
1512
|
+
oldValue: void 0
|
|
1513
|
+
});
|
|
1514
|
+
act(() => {
|
|
1515
|
+
setEntity({
|
|
1516
|
+
nestedList: [[[{
|
|
1517
|
+
...defaultFile,
|
|
1518
|
+
size: 100
|
|
1519
|
+
}, {
|
|
1520
|
+
...defaultFile,
|
|
1521
|
+
size: 200
|
|
1522
|
+
}]], [[{
|
|
1523
|
+
...defaultFile,
|
|
1524
|
+
size: 300
|
|
1525
|
+
}]]]
|
|
674
1526
|
});
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
1527
|
+
});
|
|
1528
|
+
expect(onChange).toHaveBeenCalledTimes(4);
|
|
1529
|
+
expect(onChange).toHaveBeenNthCalledWith(2, {
|
|
1530
|
+
fieldPaths: ['nestedList', '0', '0', '0', 'size'],
|
|
1531
|
+
newEntity: {
|
|
1532
|
+
nestedList: [[[{
|
|
1533
|
+
...defaultFile,
|
|
1534
|
+
size: 100
|
|
1535
|
+
}, {
|
|
1536
|
+
...defaultFile,
|
|
1537
|
+
size: 200
|
|
1538
|
+
}]], [[{
|
|
1539
|
+
...defaultFile,
|
|
1540
|
+
size: 300
|
|
1541
|
+
}]]]
|
|
1542
|
+
},
|
|
1543
|
+
oldEntity: {
|
|
1544
|
+
nestedList: [[[defaultFile]]]
|
|
1545
|
+
},
|
|
1546
|
+
newValue: 100,
|
|
1547
|
+
oldValue: 0
|
|
1548
|
+
});
|
|
1549
|
+
expect(onChange).toHaveBeenNthCalledWith(3, {
|
|
1550
|
+
fieldPaths: ['nestedList', '0', '0', '1', 'size'],
|
|
1551
|
+
newEntity: {
|
|
1552
|
+
nestedList: [[[{
|
|
1553
|
+
...defaultFile,
|
|
1554
|
+
size: 100
|
|
1555
|
+
}, {
|
|
1556
|
+
...defaultFile,
|
|
1557
|
+
size: 200
|
|
1558
|
+
}]], [[{
|
|
1559
|
+
...defaultFile,
|
|
1560
|
+
size: 300
|
|
1561
|
+
}]]]
|
|
1562
|
+
},
|
|
1563
|
+
oldEntity: {
|
|
1564
|
+
nestedList: [[[defaultFile]]]
|
|
1565
|
+
},
|
|
1566
|
+
newValue: 200,
|
|
1567
|
+
oldValue: void 0
|
|
1568
|
+
});
|
|
1569
|
+
expect(onChange).toHaveBeenNthCalledWith(4, {
|
|
1570
|
+
fieldPaths: ['nestedList', '1', '0', '0', 'size'],
|
|
1571
|
+
newEntity: {
|
|
1572
|
+
nestedList: [[[{
|
|
1573
|
+
...defaultFile,
|
|
1574
|
+
size: 100
|
|
1575
|
+
}, {
|
|
1576
|
+
...defaultFile,
|
|
1577
|
+
size: 200
|
|
1578
|
+
}]], [[{
|
|
1579
|
+
...defaultFile,
|
|
1580
|
+
size: 300
|
|
1581
|
+
}]]]
|
|
1582
|
+
},
|
|
1583
|
+
oldEntity: {
|
|
1584
|
+
nestedList: [[[defaultFile]]]
|
|
1585
|
+
},
|
|
1586
|
+
newValue: 300,
|
|
1587
|
+
oldValue: void 0
|
|
1588
|
+
});
|
|
1589
|
+
});
|
|
1590
|
+
test('`options.watch` should work with field path of object', () => {
|
|
1591
|
+
const initialData = {};
|
|
1592
|
+
const onExtChange = jest.fn();
|
|
1593
|
+
const onSizeChange = jest.fn();
|
|
1594
|
+
const _renderHook31 = renderHook(() => {
|
|
1595
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
1596
|
+
watch: {
|
|
1597
|
+
'obj.file.ext': onExtChange,
|
|
1598
|
+
'obj.file.size': onSizeChange
|
|
1599
|
+
}
|
|
1600
|
+
});
|
|
1601
|
+
}),
|
|
1602
|
+
result = _renderHook31.result;
|
|
1603
|
+
const cores = result.current;
|
|
1604
|
+
const _cores16 = _slicedToArray(cores, 2),
|
|
1605
|
+
setEntity = _cores16[1].setEntity;
|
|
1606
|
+
expect(onExtChange).toHaveBeenCalledTimes(0);
|
|
1607
|
+
act(() => {
|
|
1608
|
+
setEntity({
|
|
1609
|
+
obj: {
|
|
1610
|
+
file: {
|
|
1611
|
+
ext: EXT_1
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
696
1614
|
});
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
717
|
-
expect(onDeepUpdate).toHaveBeenCalledTimes(1);
|
|
1615
|
+
});
|
|
1616
|
+
expect(onExtChange).toHaveBeenCalledTimes(1);
|
|
1617
|
+
expect(onSizeChange).toHaveBeenCalledTimes(0);
|
|
1618
|
+
expect(onExtChange).toHaveBeenCalledWith({
|
|
1619
|
+
fieldPaths: ['obj', 'file', 'ext'],
|
|
1620
|
+
newEntity: {
|
|
1621
|
+
obj: {
|
|
1622
|
+
file: {
|
|
1623
|
+
ext: EXT_1
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
},
|
|
1627
|
+
oldEntity: {},
|
|
1628
|
+
newValue: EXT_1,
|
|
1629
|
+
oldValue: void 0
|
|
1630
|
+
});
|
|
1631
|
+
act(() => {
|
|
1632
|
+
setEntity(() => {
|
|
1633
|
+
return {};
|
|
718
1634
|
});
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
1635
|
+
});
|
|
1636
|
+
expect(onExtChange).toHaveBeenCalledTimes(2);
|
|
1637
|
+
expect(onSizeChange).toHaveBeenCalledTimes(0);
|
|
1638
|
+
expect(onExtChange).toHaveBeenCalledWith({
|
|
1639
|
+
fieldPaths: ['obj', 'file', 'ext'],
|
|
1640
|
+
newEntity: {},
|
|
1641
|
+
oldEntity: {
|
|
1642
|
+
obj: {
|
|
1643
|
+
file: {
|
|
1644
|
+
ext: EXT_1
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
},
|
|
1648
|
+
newValue: void 0,
|
|
1649
|
+
oldValue: EXT_1
|
|
1650
|
+
});
|
|
1651
|
+
});
|
|
1652
|
+
test('multiple `Provider` should work', () => {
|
|
1653
|
+
const onNumberMount = jest.fn();
|
|
1654
|
+
const onStringMount = jest.fn();
|
|
1655
|
+
const onBooleanMount = jest.fn();
|
|
1656
|
+
const numberUseCase = () => {
|
|
1657
|
+
return entityUseCase();
|
|
1658
|
+
};
|
|
1659
|
+
const stringUseCase = () => {
|
|
1660
|
+
return entityUseCase();
|
|
1661
|
+
};
|
|
1662
|
+
const booleanUseCase = () => {
|
|
1663
|
+
return entityUseCase();
|
|
1664
|
+
};
|
|
1665
|
+
const TestChildComponent = () => {
|
|
1666
|
+
const _useUseCase10 = useUseCase(numberUseCase),
|
|
1667
|
+
_useUseCase11 = _slicedToArray(_useUseCase10, 1),
|
|
1668
|
+
numberValue = _useUseCase11[0];
|
|
1669
|
+
const _useUseCase12 = useUseCase(stringUseCase),
|
|
1670
|
+
_useUseCase13 = _slicedToArray(_useUseCase12, 1),
|
|
1671
|
+
stringValue = _useUseCase13[0];
|
|
1672
|
+
const _useUseCase14 = useUseCase(booleanUseCase),
|
|
1673
|
+
_useUseCase15 = _slicedToArray(_useUseCase14, 1),
|
|
1674
|
+
booleanValue = _useUseCase15[0];
|
|
1675
|
+
useMount(() => {
|
|
1676
|
+
onNumberMount(numberValue);
|
|
1677
|
+
onStringMount(stringValue);
|
|
1678
|
+
onBooleanMount(booleanValue);
|
|
740
1679
|
});
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
expect(onPathChange1).toHaveBeenLastCalledWith(PATH_1, '');
|
|
757
|
-
act(() => {
|
|
758
|
-
setPath(PATH_2);
|
|
759
|
-
});
|
|
760
|
-
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
761
|
-
expect(onPathChange2).toHaveBeenCalledTimes(1);
|
|
762
|
-
expect(onPathChange2).toHaveBeenLastCalledWith(PATH_2, PATH_1);
|
|
1680
|
+
return null;
|
|
1681
|
+
};
|
|
1682
|
+
const TestParentComponent = () => {
|
|
1683
|
+
const _useUseCase16 = useUseCase(11, numberUseCase),
|
|
1684
|
+
_useUseCase17 = _slicedToArray(_useUseCase16, 3),
|
|
1685
|
+
NumberProvider = _useUseCase17[2];
|
|
1686
|
+
const _useUseCase18 = useUseCase('hello', stringUseCase),
|
|
1687
|
+
_useUseCase19 = _slicedToArray(_useUseCase18, 3),
|
|
1688
|
+
StringProvider = _useUseCase19[2];
|
|
1689
|
+
const _useUseCase20 = useUseCase(true, booleanUseCase),
|
|
1690
|
+
_useUseCase21 = _slicedToArray(_useUseCase20, 3),
|
|
1691
|
+
BooleanProvider = _useUseCase21[2];
|
|
1692
|
+
return _jsx(NumberProvider, {
|
|
1693
|
+
with: [StringProvider, BooleanProvider],
|
|
1694
|
+
children: _jsx(TestChildComponent, {})
|
|
763
1695
|
});
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
expect(onSizeChange).toHaveBeenCalledTimes(0);
|
|
783
|
-
expect(onPathChange).toHaveBeenLastCalledWith({
|
|
784
|
-
fieldPaths: ['path'],
|
|
785
|
-
newEntity: { ...defaultFile, path: PATH_1, ext: EXT_1 },
|
|
786
|
-
oldEntity: defaultFile,
|
|
787
|
-
newValue: PATH_1,
|
|
788
|
-
oldValue: '',
|
|
789
|
-
});
|
|
1696
|
+
};
|
|
1697
|
+
render(_jsx(TestParentComponent, {}));
|
|
1698
|
+
expect(onNumberMount).toHaveBeenCalledWith(11);
|
|
1699
|
+
expect(onStringMount).toHaveBeenCalledWith('hello');
|
|
1700
|
+
expect(onBooleanMount).toHaveBeenCalledWith(true);
|
|
1701
|
+
});
|
|
1702
|
+
});
|
|
1703
|
+
describe('`useUseCase` should work the same as `useContextualCoreCollection`', () => {
|
|
1704
|
+
test('Provider should be returned in child component', () => {
|
|
1705
|
+
const onCore = jest.fn();
|
|
1706
|
+
const TestChild = () => {
|
|
1707
|
+
const core = useUseCase(fileUseCase);
|
|
1708
|
+
const length = core.length;
|
|
1709
|
+
const _core = _slicedToArray(core, 3),
|
|
1710
|
+
file = _core[0],
|
|
1711
|
+
Provider = _core[2];
|
|
1712
|
+
useEffect(() => {
|
|
1713
|
+
onCore(file, length, typeof Provider);
|
|
790
1714
|
});
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
expect(onPathChange1).toHaveBeenCalledTimes(0);
|
|
805
|
-
act(() => {
|
|
806
|
-
setPath(PATH_1);
|
|
807
|
-
setEntity({ size: 5000 });
|
|
808
|
-
onPathChange = onPathChange2;
|
|
809
|
-
});
|
|
810
|
-
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
811
|
-
expect(onPathChange1).toHaveBeenLastCalledWith({
|
|
812
|
-
fieldPaths: ['path'],
|
|
813
|
-
newEntity: { ...defaultFile, path: PATH_1, ext: EXT_1 },
|
|
814
|
-
oldEntity: defaultFile,
|
|
815
|
-
newValue: PATH_1,
|
|
816
|
-
oldValue: '',
|
|
817
|
-
});
|
|
818
|
-
act(() => {
|
|
819
|
-
setPath('');
|
|
820
|
-
});
|
|
821
|
-
expect(onPathChange1).toHaveBeenCalledTimes(1);
|
|
822
|
-
expect(onPathChange2).toHaveBeenCalledTimes(1);
|
|
823
|
-
expect(onPathChange2).toHaveBeenLastCalledWith({
|
|
824
|
-
fieldPaths: ['path'],
|
|
825
|
-
newEntity: { ...defaultFile, size: 5000 },
|
|
826
|
-
oldEntity: { ...defaultFile, path: PATH_1, ext: EXT_1, size: 5000 },
|
|
827
|
-
newValue: '',
|
|
828
|
-
oldValue: PATH_1,
|
|
829
|
-
});
|
|
1715
|
+
return _jsx(Fragment, {});
|
|
1716
|
+
};
|
|
1717
|
+
const TestParent = () => {
|
|
1718
|
+
const _useUseCase22 = useUseCase(() => {
|
|
1719
|
+
return {
|
|
1720
|
+
...defaultFile,
|
|
1721
|
+
ext: EXT_1
|
|
1722
|
+
};
|
|
1723
|
+
}, fileUseCase),
|
|
1724
|
+
_useUseCase23 = _slicedToArray(_useUseCase22, 3),
|
|
1725
|
+
Provider = _useUseCase23[2];
|
|
1726
|
+
return _jsx(Provider, {
|
|
1727
|
+
children: _jsx(TestChild, {})
|
|
830
1728
|
});
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
newEntity: { list: [defaultFile] },
|
|
860
|
-
oldEntity: {},
|
|
861
|
-
newValue: 0,
|
|
862
|
-
oldValue: void 0,
|
|
863
|
-
});
|
|
864
|
-
act(() => {
|
|
865
|
-
setEntity({ list: [{ ...defaultFile, ext: EXT_1 }] });
|
|
866
|
-
});
|
|
867
|
-
expect(onExtChange).toHaveBeenCalledTimes(2);
|
|
868
|
-
expect(onSizeChange).toHaveBeenCalledTimes(1);
|
|
869
|
-
expect(onExtChange).toHaveBeenCalledWith({
|
|
870
|
-
fieldPaths: ['list', '0', 'ext'],
|
|
871
|
-
newEntity: { list: [{ ...defaultFile, ext: EXT_1 }] },
|
|
872
|
-
oldEntity: { list: [defaultFile] },
|
|
873
|
-
newValue: EXT_1,
|
|
874
|
-
oldValue: '',
|
|
875
|
-
});
|
|
876
|
-
act(() => {
|
|
877
|
-
setEntity({
|
|
878
|
-
list: [
|
|
879
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
880
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
881
|
-
],
|
|
882
|
-
});
|
|
883
|
-
});
|
|
884
|
-
expect(onExtChange).toHaveBeenCalledTimes(3);
|
|
885
|
-
expect(onSizeChange).toHaveBeenCalledTimes(2);
|
|
886
|
-
expect(onExtChange).toHaveBeenCalledWith({
|
|
887
|
-
fieldPaths: ['list', '1', 'ext'],
|
|
888
|
-
newEntity: {
|
|
889
|
-
list: [
|
|
890
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
891
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
892
|
-
],
|
|
893
|
-
},
|
|
894
|
-
oldEntity: { list: [{ ...defaultFile, ext: EXT_1 }] },
|
|
895
|
-
newValue: EXT_2,
|
|
896
|
-
oldValue: void 0,
|
|
897
|
-
});
|
|
898
|
-
expect(onSizeChange).toHaveBeenCalledWith({
|
|
899
|
-
fieldPaths: ['list', '1', 'size'],
|
|
900
|
-
newEntity: {
|
|
901
|
-
list: [
|
|
902
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
903
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
904
|
-
],
|
|
905
|
-
},
|
|
906
|
-
oldEntity: { list: [{ ...defaultFile, ext: EXT_1 }] },
|
|
907
|
-
newValue: 0,
|
|
908
|
-
oldValue: void 0,
|
|
909
|
-
});
|
|
910
|
-
act(() => {
|
|
911
|
-
setEntity({
|
|
912
|
-
nestedList: [],
|
|
913
|
-
});
|
|
914
|
-
});
|
|
915
|
-
expect(onExtChange).toHaveBeenCalledTimes(3);
|
|
916
|
-
expect(onSizeChange).toHaveBeenCalledTimes(2);
|
|
917
|
-
act(() => {
|
|
918
|
-
setEntity(() => {
|
|
919
|
-
return {
|
|
920
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
921
|
-
};
|
|
922
|
-
});
|
|
923
|
-
});
|
|
924
|
-
expect(onExtChange).toHaveBeenCalledTimes(6);
|
|
925
|
-
expect(onSizeChange).toHaveBeenCalledTimes(3);
|
|
926
|
-
expect(onExtChange).toHaveBeenNthCalledWith(4, {
|
|
927
|
-
fieldPaths: ['list', '0', 'ext'],
|
|
928
|
-
newEntity: {
|
|
929
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
930
|
-
},
|
|
931
|
-
oldEntity: {
|
|
932
|
-
list: [
|
|
933
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
934
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
935
|
-
],
|
|
936
|
-
nestedList: [],
|
|
937
|
-
},
|
|
938
|
-
newValue: EXT_2,
|
|
939
|
-
oldValue: EXT_1,
|
|
940
|
-
});
|
|
941
|
-
expect(onExtChange).toHaveBeenNthCalledWith(5, {
|
|
942
|
-
fieldPaths: ['list', '1', 'ext'],
|
|
943
|
-
newEntity: {
|
|
944
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
945
|
-
},
|
|
946
|
-
oldEntity: {
|
|
947
|
-
list: [
|
|
948
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
949
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
950
|
-
],
|
|
951
|
-
nestedList: [],
|
|
952
|
-
},
|
|
953
|
-
newValue: EXT_1,
|
|
954
|
-
oldValue: EXT_2,
|
|
955
|
-
});
|
|
956
|
-
expect(onExtChange).toHaveBeenNthCalledWith(6, {
|
|
957
|
-
fieldPaths: ['list', '2', 'ext'],
|
|
958
|
-
newEntity: {
|
|
959
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
960
|
-
},
|
|
961
|
-
oldEntity: {
|
|
962
|
-
list: [
|
|
963
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
964
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
965
|
-
],
|
|
966
|
-
nestedList: [],
|
|
967
|
-
},
|
|
968
|
-
newValue: '',
|
|
969
|
-
oldValue: void 0,
|
|
970
|
-
});
|
|
971
|
-
expect(onSizeChange).toHaveBeenCalledWith({
|
|
972
|
-
fieldPaths: ['list', '2', 'size'],
|
|
973
|
-
newEntity: {
|
|
974
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
975
|
-
},
|
|
976
|
-
oldEntity: {
|
|
977
|
-
list: [
|
|
978
|
-
{ ...defaultFile, ext: EXT_1 },
|
|
979
|
-
{ ...defaultFile, ext: EXT_2 },
|
|
980
|
-
],
|
|
981
|
-
nestedList: [],
|
|
982
|
-
},
|
|
983
|
-
newValue: 0,
|
|
984
|
-
oldValue: void 0,
|
|
985
|
-
});
|
|
986
|
-
act(() => {
|
|
987
|
-
setEntity(() => {
|
|
988
|
-
return {};
|
|
989
|
-
});
|
|
990
|
-
});
|
|
991
|
-
expect(onExtChange).toHaveBeenCalledTimes(9);
|
|
992
|
-
expect(onSizeChange).toHaveBeenCalledTimes(6);
|
|
993
|
-
expect(onExtChange).toHaveBeenNthCalledWith(7, {
|
|
994
|
-
fieldPaths: ['list', '0', 'ext'],
|
|
995
|
-
newEntity: {},
|
|
996
|
-
oldEntity: {
|
|
997
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
998
|
-
},
|
|
999
|
-
newValue: void 0,
|
|
1000
|
-
oldValue: EXT_2,
|
|
1001
|
-
});
|
|
1002
|
-
expect(onExtChange).toHaveBeenNthCalledWith(8, {
|
|
1003
|
-
fieldPaths: ['list', '1', 'ext'],
|
|
1004
|
-
newEntity: {},
|
|
1005
|
-
oldEntity: {
|
|
1006
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
1007
|
-
},
|
|
1008
|
-
newValue: void 0,
|
|
1009
|
-
oldValue: EXT_1,
|
|
1010
|
-
});
|
|
1011
|
-
expect(onExtChange).toHaveBeenNthCalledWith(9, {
|
|
1012
|
-
fieldPaths: ['list', '2', 'ext'],
|
|
1013
|
-
newEntity: {},
|
|
1014
|
-
oldEntity: {
|
|
1015
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
1016
|
-
},
|
|
1017
|
-
newValue: void 0,
|
|
1018
|
-
oldValue: '',
|
|
1019
|
-
});
|
|
1020
|
-
expect(onSizeChange).toHaveBeenNthCalledWith(4, {
|
|
1021
|
-
fieldPaths: ['list', '0', 'size'],
|
|
1022
|
-
newEntity: {},
|
|
1023
|
-
oldEntity: {
|
|
1024
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
1025
|
-
},
|
|
1026
|
-
newValue: void 0,
|
|
1027
|
-
oldValue: 0,
|
|
1028
|
-
});
|
|
1029
|
-
expect(onSizeChange).toHaveBeenNthCalledWith(5, {
|
|
1030
|
-
fieldPaths: ['list', '1', 'size'],
|
|
1031
|
-
newEntity: {},
|
|
1032
|
-
oldEntity: {
|
|
1033
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
1034
|
-
},
|
|
1035
|
-
newValue: void 0,
|
|
1036
|
-
oldValue: 0,
|
|
1037
|
-
});
|
|
1038
|
-
expect(onSizeChange).toHaveBeenNthCalledWith(6, {
|
|
1039
|
-
fieldPaths: ['list', '2', 'size'],
|
|
1040
|
-
newEntity: {},
|
|
1041
|
-
oldEntity: {
|
|
1042
|
-
list: [{ ...defaultFile, ext: EXT_2 }, { ...defaultFile, ext: EXT_1 }, defaultFile],
|
|
1043
|
-
},
|
|
1044
|
-
newValue: void 0,
|
|
1045
|
-
oldValue: 0,
|
|
1046
|
-
});
|
|
1729
|
+
};
|
|
1730
|
+
render(_jsx(TestParent, {}));
|
|
1731
|
+
expect(onCore).toHaveBeenCalledWith({
|
|
1732
|
+
...defaultFile,
|
|
1733
|
+
ext: EXT_1
|
|
1734
|
+
}, 3, 'function');
|
|
1735
|
+
});
|
|
1736
|
+
test('Provider should work in child component or popup component', () => {
|
|
1737
|
+
const onChange = jest.fn();
|
|
1738
|
+
const onRootFile = jest.fn();
|
|
1739
|
+
const onPopupFile = jest.fn();
|
|
1740
|
+
const buttonText = 'button';
|
|
1741
|
+
const Popup = () => {
|
|
1742
|
+
const _useUseCase24 = useUseCase(fileUseCase),
|
|
1743
|
+
_useUseCase25 = _slicedToArray(_useUseCase24, 2),
|
|
1744
|
+
file = _useUseCase25[0],
|
|
1745
|
+
setEntity = _useUseCase25[1].setEntity;
|
|
1746
|
+
const onClick = () => {
|
|
1747
|
+
setEntity({
|
|
1748
|
+
ext: EXT_2
|
|
1749
|
+
});
|
|
1750
|
+
};
|
|
1751
|
+
useEffect(() => {
|
|
1752
|
+
onPopupFile(file);
|
|
1753
|
+
}, [file]);
|
|
1754
|
+
return _jsx("button", {
|
|
1755
|
+
onClick: onClick,
|
|
1756
|
+
children: buttonText
|
|
1047
1757
|
});
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1758
|
+
};
|
|
1759
|
+
const TestChild = () => {
|
|
1760
|
+
const _useUseCase26 = useUseCase(fileUseCase),
|
|
1761
|
+
_useUseCase27 = _slicedToArray(_useUseCase26, 3),
|
|
1762
|
+
Provider = _useUseCase27[2];
|
|
1763
|
+
return createPortal(_jsx(Provider, {
|
|
1764
|
+
children: _jsx(Popup, {})
|
|
1765
|
+
}), document.body);
|
|
1766
|
+
};
|
|
1767
|
+
const TestParent = () => {
|
|
1768
|
+
const _useUseCase28 = useUseCase(() => {
|
|
1769
|
+
return {
|
|
1770
|
+
...defaultFile,
|
|
1771
|
+
ext: EXT_1
|
|
1053
1772
|
};
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
expect(onListLengthChange).toHaveBeenCalledTimes(0);
|
|
1066
|
-
act(() => {
|
|
1067
|
-
setEntity([{ list: [defaultFile, defaultFile] }]);
|
|
1068
|
-
});
|
|
1069
|
-
expect(onEntityLengthChange).toHaveBeenCalledTimes(1);
|
|
1070
|
-
expect(onListLengthChange).toHaveBeenCalledTimes(1);
|
|
1071
|
-
expect(onEntityLengthChange).toHaveBeenCalledWith({
|
|
1072
|
-
fieldPaths: ['length'],
|
|
1073
|
-
newEntity: [{ list: [defaultFile, defaultFile] }],
|
|
1074
|
-
oldEntity: [],
|
|
1075
|
-
newValue: 1,
|
|
1076
|
-
oldValue: 0,
|
|
1077
|
-
});
|
|
1078
|
-
expect(onListLengthChange).toHaveBeenCalledWith({
|
|
1079
|
-
fieldPaths: ['0', 'list', 'length'],
|
|
1080
|
-
newEntity: [{ list: [defaultFile, defaultFile] }],
|
|
1081
|
-
oldEntity: [],
|
|
1082
|
-
newValue: 2,
|
|
1083
|
-
oldValue: void 0,
|
|
1084
|
-
});
|
|
1773
|
+
}, fileUseCase, {
|
|
1774
|
+
onChange
|
|
1775
|
+
}),
|
|
1776
|
+
_useUseCase29 = _slicedToArray(_useUseCase28, 3),
|
|
1777
|
+
file = _useUseCase29[0],
|
|
1778
|
+
Provider = _useUseCase29[2];
|
|
1779
|
+
useEffect(() => {
|
|
1780
|
+
onRootFile(file);
|
|
1781
|
+
}, [file]);
|
|
1782
|
+
return _jsx(Provider, {
|
|
1783
|
+
children: _jsx(TestChild, {})
|
|
1085
1784
|
});
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
],
|
|
1150
|
-
],
|
|
1151
|
-
[[{ ...defaultFile, size: 300 }]],
|
|
1152
|
-
],
|
|
1153
|
-
},
|
|
1154
|
-
oldEntity: { nestedList: [[[defaultFile]]] },
|
|
1155
|
-
newValue: 200,
|
|
1156
|
-
oldValue: void 0,
|
|
1157
|
-
});
|
|
1158
|
-
expect(onChange).toHaveBeenNthCalledWith(4, {
|
|
1159
|
-
fieldPaths: ['nestedList', '1', '0', '0', 'size'],
|
|
1160
|
-
newEntity: {
|
|
1161
|
-
nestedList: [
|
|
1162
|
-
[
|
|
1163
|
-
[
|
|
1164
|
-
{ ...defaultFile, size: 100 },
|
|
1165
|
-
{ ...defaultFile, size: 200 },
|
|
1166
|
-
],
|
|
1167
|
-
],
|
|
1168
|
-
[[{ ...defaultFile, size: 300 }]],
|
|
1169
|
-
],
|
|
1170
|
-
},
|
|
1171
|
-
oldEntity: { nestedList: [[[defaultFile]]] },
|
|
1172
|
-
newValue: 300,
|
|
1173
|
-
oldValue: void 0,
|
|
1174
|
-
});
|
|
1785
|
+
};
|
|
1786
|
+
render(_jsx(TestParent, {}));
|
|
1787
|
+
expect(onRootFile).toHaveBeenCalledWith({
|
|
1788
|
+
...defaultFile,
|
|
1789
|
+
ext: EXT_1
|
|
1790
|
+
});
|
|
1791
|
+
expect(onPopupFile).toHaveBeenCalledWith({
|
|
1792
|
+
...defaultFile,
|
|
1793
|
+
ext: EXT_1
|
|
1794
|
+
});
|
|
1795
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
1796
|
+
expect(onRootFile).toHaveBeenCalledWith({
|
|
1797
|
+
...defaultFile,
|
|
1798
|
+
ext: EXT_2
|
|
1799
|
+
});
|
|
1800
|
+
expect(onPopupFile).toHaveBeenCalledWith({
|
|
1801
|
+
...defaultFile,
|
|
1802
|
+
ext: EXT_2
|
|
1803
|
+
});
|
|
1804
|
+
});
|
|
1805
|
+
test('Should trigger Parent & Child to update', () => {
|
|
1806
|
+
const onParentUpdate = jest.fn();
|
|
1807
|
+
const onChildUpdate = jest.fn();
|
|
1808
|
+
const onPathChange = jest.fn();
|
|
1809
|
+
const onUndefinedEntity = jest.fn();
|
|
1810
|
+
const onSetPath = jest.fn(() => {
|
|
1811
|
+
return PATH_1;
|
|
1812
|
+
});
|
|
1813
|
+
render(_jsx("div", {
|
|
1814
|
+
children: _jsx(Parent, {
|
|
1815
|
+
onSetPath: onSetPath,
|
|
1816
|
+
onUpdate: onParentUpdate,
|
|
1817
|
+
children: _jsx(Child, {
|
|
1818
|
+
onUpdate: onChildUpdate,
|
|
1819
|
+
onPathChange: onPathChange,
|
|
1820
|
+
onUndefinedEntity: onUndefinedEntity
|
|
1821
|
+
})
|
|
1822
|
+
})
|
|
1823
|
+
}));
|
|
1824
|
+
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
1825
|
+
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1826
|
+
expect(onParentUpdate).toHaveBeenCalledTimes(1);
|
|
1827
|
+
expect(onChildUpdate).toHaveBeenCalledTimes(1);
|
|
1828
|
+
expect(onPathChange).toHaveBeenCalledWith(PATH_1);
|
|
1829
|
+
fireEvent.click(screen.getByText(CHILD_BUTTON_TEXT));
|
|
1830
|
+
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1831
|
+
expect(onParentUpdate).toHaveBeenCalledTimes(2);
|
|
1832
|
+
expect(onChildUpdate).toHaveBeenCalledTimes(2);
|
|
1833
|
+
expect(onPathChange).toHaveBeenCalledWith(PATH_2);
|
|
1834
|
+
expect(onUndefinedEntity).toHaveBeenCalledTimes(0);
|
|
1835
|
+
});
|
|
1836
|
+
test('`usecase` should not be called at child component', () => {
|
|
1837
|
+
const mockUseCase = jest.fn(fileUseCase);
|
|
1838
|
+
const A = () => {
|
|
1839
|
+
useUseCase(mockUseCase);
|
|
1840
|
+
return _jsx(Fragment, {});
|
|
1841
|
+
};
|
|
1842
|
+
const B = () => {
|
|
1843
|
+
const _useUseCase30 = useUseCase(defaultFile, mockUseCase),
|
|
1844
|
+
_useUseCase31 = _slicedToArray(_useUseCase30, 3),
|
|
1845
|
+
Provider = _useUseCase31[2];
|
|
1846
|
+
return _jsx(Provider, {
|
|
1847
|
+
children: _jsx(A, {})
|
|
1175
1848
|
});
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
newEntity: {
|
|
1205
|
-
obj: {
|
|
1206
|
-
file: {
|
|
1207
|
-
ext: EXT_1,
|
|
1208
|
-
},
|
|
1209
|
-
},
|
|
1210
|
-
},
|
|
1211
|
-
oldEntity: {},
|
|
1212
|
-
newValue: EXT_1,
|
|
1213
|
-
oldValue: void 0,
|
|
1214
|
-
});
|
|
1215
|
-
act(() => {
|
|
1216
|
-
setEntity(() => {
|
|
1217
|
-
return {};
|
|
1218
|
-
});
|
|
1219
|
-
});
|
|
1220
|
-
expect(onExtChange).toHaveBeenCalledTimes(2);
|
|
1221
|
-
expect(onSizeChange).toHaveBeenCalledTimes(0);
|
|
1222
|
-
expect(onExtChange).toHaveBeenCalledWith({
|
|
1223
|
-
fieldPaths: ['obj', 'file', 'ext'],
|
|
1224
|
-
newEntity: {},
|
|
1225
|
-
oldEntity: {
|
|
1226
|
-
obj: {
|
|
1227
|
-
file: {
|
|
1228
|
-
ext: EXT_1,
|
|
1229
|
-
},
|
|
1230
|
-
},
|
|
1231
|
-
},
|
|
1232
|
-
newValue: void 0,
|
|
1233
|
-
oldValue: EXT_1,
|
|
1234
|
-
});
|
|
1849
|
+
};
|
|
1850
|
+
render(_jsx(B, {}));
|
|
1851
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
1852
|
+
});
|
|
1853
|
+
test('reducer call should be cached if component is at rendering phase in child components', () => {
|
|
1854
|
+
const buttonText = 'button';
|
|
1855
|
+
const addReducer = jest.fn((entity, substring) => {
|
|
1856
|
+
return entity + substring;
|
|
1857
|
+
});
|
|
1858
|
+
const stringUseCase = () => {
|
|
1859
|
+
const entityReducers = entityUseCase();
|
|
1860
|
+
return {
|
|
1861
|
+
...entityReducers,
|
|
1862
|
+
add: addReducer
|
|
1863
|
+
};
|
|
1864
|
+
};
|
|
1865
|
+
const A = () => {
|
|
1866
|
+
const _useUseCase32 = useUseCase(stringUseCase),
|
|
1867
|
+
_useUseCase33 = _slicedToArray(_useUseCase32, 2),
|
|
1868
|
+
add = _useUseCase33[1].add;
|
|
1869
|
+
const update = useUpdate();
|
|
1870
|
+
const onClick = () => {
|
|
1871
|
+
update();
|
|
1872
|
+
};
|
|
1873
|
+
add('x');
|
|
1874
|
+
return _jsx("button", {
|
|
1875
|
+
onClick: onClick,
|
|
1876
|
+
children: buttonText
|
|
1235
1877
|
});
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
const stringUseCase = () => {
|
|
1244
|
-
return entityUseCase();
|
|
1245
|
-
};
|
|
1246
|
-
const booleanUseCase = () => {
|
|
1247
|
-
return entityUseCase();
|
|
1248
|
-
};
|
|
1249
|
-
const TestChildComponent = () => {
|
|
1250
|
-
const [numberValue] = useUseCase(numberUseCase);
|
|
1251
|
-
const [stringValue] = useUseCase(stringUseCase);
|
|
1252
|
-
const [booleanValue] = useUseCase(booleanUseCase);
|
|
1253
|
-
useMount(() => {
|
|
1254
|
-
onNumberMount(numberValue);
|
|
1255
|
-
onStringMount(stringValue);
|
|
1256
|
-
onBooleanMount(booleanValue);
|
|
1257
|
-
});
|
|
1258
|
-
return null;
|
|
1259
|
-
};
|
|
1260
|
-
const TestParentComponent = () => {
|
|
1261
|
-
const [, , NumberProvider] = useUseCase(11, numberUseCase);
|
|
1262
|
-
const [, , StringProvider] = useUseCase('hello', stringUseCase);
|
|
1263
|
-
const [, , BooleanProvider] = useUseCase(true, booleanUseCase);
|
|
1264
|
-
return (_jsx(NumberProvider, { with: [StringProvider, BooleanProvider], children: _jsx(TestChildComponent, {}) }));
|
|
1265
|
-
};
|
|
1266
|
-
render(_jsx(TestParentComponent, {}));
|
|
1267
|
-
expect(onNumberMount).toHaveBeenCalledWith(11);
|
|
1268
|
-
expect(onStringMount).toHaveBeenCalledWith('hello');
|
|
1269
|
-
expect(onBooleanMount).toHaveBeenCalledWith(true);
|
|
1878
|
+
};
|
|
1879
|
+
const B = () => {
|
|
1880
|
+
const _useUseCase34 = useUseCase('', stringUseCase),
|
|
1881
|
+
_useUseCase35 = _slicedToArray(_useUseCase34, 3),
|
|
1882
|
+
Provider = _useUseCase35[2];
|
|
1883
|
+
return _jsx(Provider, {
|
|
1884
|
+
children: _jsx(A, {})
|
|
1270
1885
|
});
|
|
1886
|
+
};
|
|
1887
|
+
render(_jsx(B, {}));
|
|
1888
|
+
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
1889
|
+
expect(addReducer).toHaveBeenCalledWith('', 'x');
|
|
1890
|
+
expect(addReducer).toHaveReturnedWith('x');
|
|
1891
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
1892
|
+
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
1271
1893
|
});
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
test('`usecase` should not be called at child component', () => {
|
|
1295
|
-
const mockUseCase = jest.fn(fileUseCase);
|
|
1296
|
-
const A = () => {
|
|
1297
|
-
useUseCase(mockUseCase);
|
|
1298
|
-
return _jsx(Fragment, {});
|
|
1299
|
-
};
|
|
1300
|
-
const B = () => {
|
|
1301
|
-
const [, , Provider] = useUseCase(defaultFile, mockUseCase);
|
|
1302
|
-
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1303
|
-
};
|
|
1304
|
-
render(_jsx(B, {}));
|
|
1305
|
-
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
1894
|
+
test('reducer call should not be cached if component is not at rendering phase in child components', () => {
|
|
1895
|
+
const buttonText = 'button';
|
|
1896
|
+
const addReducer = jest.fn((entity, substring) => {
|
|
1897
|
+
return entity + substring;
|
|
1898
|
+
});
|
|
1899
|
+
const stringUseCase = () => {
|
|
1900
|
+
const entityReducers = entityUseCase();
|
|
1901
|
+
return {
|
|
1902
|
+
...entityReducers,
|
|
1903
|
+
add: addReducer
|
|
1904
|
+
};
|
|
1905
|
+
};
|
|
1906
|
+
const A = () => {
|
|
1907
|
+
const _useUseCase36 = useUseCase(stringUseCase),
|
|
1908
|
+
_useUseCase37 = _slicedToArray(_useUseCase36, 2),
|
|
1909
|
+
add = _useUseCase37[1].add;
|
|
1910
|
+
const onClick = () => {
|
|
1911
|
+
add('x');
|
|
1912
|
+
};
|
|
1913
|
+
useMount(() => {
|
|
1914
|
+
add('x');
|
|
1915
|
+
add('x');
|
|
1306
1916
|
});
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
return entity + substring;
|
|
1311
|
-
});
|
|
1312
|
-
const stringUseCase = () => {
|
|
1313
|
-
const entityReducers = entityUseCase();
|
|
1314
|
-
return {
|
|
1315
|
-
...entityReducers,
|
|
1316
|
-
add: addReducer,
|
|
1317
|
-
};
|
|
1318
|
-
};
|
|
1319
|
-
const A = () => {
|
|
1320
|
-
const [, { add }] = useUseCase(stringUseCase);
|
|
1321
|
-
const update = useUpdate();
|
|
1322
|
-
const onClick = () => {
|
|
1323
|
-
update();
|
|
1324
|
-
};
|
|
1325
|
-
add('x');
|
|
1326
|
-
return _jsx("button", { onClick: onClick, children: buttonText });
|
|
1327
|
-
};
|
|
1328
|
-
const B = () => {
|
|
1329
|
-
const [, , Provider] = useUseCase('', stringUseCase);
|
|
1330
|
-
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1331
|
-
};
|
|
1332
|
-
render(_jsx(B, {}));
|
|
1333
|
-
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
1334
|
-
expect(addReducer).toHaveBeenCalledWith('', 'x');
|
|
1335
|
-
expect(addReducer).toHaveReturnedWith('x');
|
|
1336
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1337
|
-
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
1917
|
+
return _jsx("button", {
|
|
1918
|
+
onClick: onClick,
|
|
1919
|
+
children: buttonText
|
|
1338
1920
|
});
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
return {
|
|
1347
|
-
...entityReducers,
|
|
1348
|
-
add: addReducer,
|
|
1349
|
-
};
|
|
1350
|
-
};
|
|
1351
|
-
const A = () => {
|
|
1352
|
-
const [, { add }] = useUseCase(stringUseCase);
|
|
1353
|
-
const onClick = () => {
|
|
1354
|
-
add('x');
|
|
1355
|
-
};
|
|
1356
|
-
useMount(() => {
|
|
1357
|
-
add('x');
|
|
1358
|
-
add('x');
|
|
1359
|
-
});
|
|
1360
|
-
return _jsx("button", { onClick: onClick, children: buttonText });
|
|
1361
|
-
};
|
|
1362
|
-
const B = () => {
|
|
1363
|
-
const [, , Provider] = useUseCase('', stringUseCase);
|
|
1364
|
-
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1365
|
-
};
|
|
1366
|
-
render(_jsx(B, {}));
|
|
1367
|
-
expect(addReducer).toHaveBeenCalledTimes(2);
|
|
1368
|
-
expect(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
|
|
1369
|
-
expect(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
|
|
1370
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1371
|
-
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
1372
|
-
expect(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
|
|
1921
|
+
};
|
|
1922
|
+
const B = () => {
|
|
1923
|
+
const _useUseCase38 = useUseCase('', stringUseCase),
|
|
1924
|
+
_useUseCase39 = _slicedToArray(_useUseCase38, 3),
|
|
1925
|
+
Provider = _useUseCase39[2];
|
|
1926
|
+
return _jsx(Provider, {
|
|
1927
|
+
children: _jsx(A, {})
|
|
1373
1928
|
});
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1929
|
+
};
|
|
1930
|
+
render(_jsx(B, {}));
|
|
1931
|
+
expect(addReducer).toHaveBeenCalledTimes(2);
|
|
1932
|
+
expect(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
|
|
1933
|
+
expect(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
|
|
1934
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
1935
|
+
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
1936
|
+
expect(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
|
|
1937
|
+
});
|
|
1938
|
+
test('reducer call should not be cached if entity or parameters have changed in child components', () => {
|
|
1939
|
+
let count = 0;
|
|
1940
|
+
let addedText = 'x';
|
|
1941
|
+
const setButtonText = 'button';
|
|
1942
|
+
const updateButtonText = 'update';
|
|
1943
|
+
const addReducer = jest.fn((entity, substring) => {
|
|
1944
|
+
return entity + substring;
|
|
1945
|
+
});
|
|
1946
|
+
const stringUseCase = () => {
|
|
1947
|
+
const entityReducers = entityUseCase();
|
|
1948
|
+
return {
|
|
1949
|
+
...entityReducers,
|
|
1950
|
+
add: addReducer
|
|
1951
|
+
};
|
|
1952
|
+
};
|
|
1953
|
+
const A = () => {
|
|
1954
|
+
const _useUseCase40 = useUseCase(stringUseCase),
|
|
1955
|
+
_useUseCase41 = _slicedToArray(_useUseCase40, 2),
|
|
1956
|
+
_useUseCase41$ = _useUseCase41[1],
|
|
1957
|
+
add = _useUseCase41$.add,
|
|
1958
|
+
setEntity = _useUseCase41$.setEntity;
|
|
1959
|
+
const update = useUpdate();
|
|
1960
|
+
add(addedText);
|
|
1961
|
+
const onSet = () => {
|
|
1962
|
+
setEntity(`${count++}`);
|
|
1963
|
+
};
|
|
1964
|
+
const onUpdate = () => {
|
|
1965
|
+
update();
|
|
1966
|
+
};
|
|
1967
|
+
return _jsxs("div", {
|
|
1968
|
+
children: [_jsx("button", {
|
|
1969
|
+
onClick: onSet,
|
|
1970
|
+
children: setButtonText
|
|
1971
|
+
}), _jsx("button", {
|
|
1972
|
+
onClick: onUpdate,
|
|
1973
|
+
children: updateButtonText
|
|
1974
|
+
})]
|
|
1419
1975
|
});
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
const onChangeC = jest.fn(updateChangeTimes);
|
|
1428
|
-
const buttonText = 'my button';
|
|
1429
|
-
const A = ({ children }) => {
|
|
1430
|
-
useUseCase(fileUseCase, { onChange: onChangeA });
|
|
1431
|
-
return _jsx(Fragment, { children: children });
|
|
1432
|
-
};
|
|
1433
|
-
const B = () => {
|
|
1434
|
-
useUseCase(fileUseCase, { onChange: onChangeB });
|
|
1435
|
-
return _jsx(Fragment, {});
|
|
1436
|
-
};
|
|
1437
|
-
const C = () => {
|
|
1438
|
-
const [, { setPath }, Provider] = useUseCase(defaultFile, fileUseCase, {
|
|
1439
|
-
onChange: onChangeC,
|
|
1440
|
-
});
|
|
1441
|
-
const onFirstClick = () => {
|
|
1442
|
-
setPath(PATH_1);
|
|
1443
|
-
};
|
|
1444
|
-
return (_jsxs(Provider, { children: [_jsx(A, { children: _jsx(B, {}) }), _jsx("button", { onClick: onFirstClick, children: buttonText })] }));
|
|
1445
|
-
};
|
|
1446
|
-
render(_jsx(C, {}));
|
|
1447
|
-
expect(changeTimes).toBe(0);
|
|
1448
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1449
|
-
expect(onChangeA).toHaveReturnedWith(2);
|
|
1450
|
-
expect(onChangeB).toHaveReturnedWith(3);
|
|
1451
|
-
expect(onChangeC).toHaveReturnedWith(1);
|
|
1976
|
+
};
|
|
1977
|
+
const B = () => {
|
|
1978
|
+
const _useUseCase42 = useUseCase('', stringUseCase),
|
|
1979
|
+
_useUseCase43 = _slicedToArray(_useUseCase42, 3),
|
|
1980
|
+
Provider = _useUseCase43[2];
|
|
1981
|
+
return _jsx(Provider, {
|
|
1982
|
+
children: _jsx(A, {})
|
|
1452
1983
|
});
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
expect(onFirstChange).toHaveBeenCalledTimes(1);
|
|
1483
|
-
expect(onSecondChange).toHaveBeenCalledTimes(1);
|
|
1484
|
-
expect(onSecondChange).toHaveBeenLastCalledWith(defaultFile, { ...defaultFile, ext: EXT_1, path: PATH_1 });
|
|
1984
|
+
};
|
|
1985
|
+
render(_jsx(B, {}));
|
|
1986
|
+
expect(addReducer).toHaveBeenCalledTimes(1);
|
|
1987
|
+
expect(addReducer).toHaveBeenCalledWith('', 'x');
|
|
1988
|
+
fireEvent.click(screen.getByText(setButtonText));
|
|
1989
|
+
expect(addReducer).toHaveBeenCalledTimes(2);
|
|
1990
|
+
expect(addReducer).toHaveBeenCalledWith('0', 'x');
|
|
1991
|
+
expect(addReducer).toHaveReturnedWith('0x');
|
|
1992
|
+
addedText = 'y';
|
|
1993
|
+
fireEvent.click(screen.getByText(updateButtonText));
|
|
1994
|
+
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
1995
|
+
expect(addReducer).toHaveBeenCalledWith('0', 'y');
|
|
1996
|
+
expect(addReducer).toHaveReturnedWith('0y');
|
|
1997
|
+
fireEvent.click(screen.getByText(updateButtonText));
|
|
1998
|
+
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
1999
|
+
});
|
|
2000
|
+
test('`options.onChange` event should be trigger in orders', () => {
|
|
2001
|
+
let changeTimes = 0;
|
|
2002
|
+
const updateChangeTimes = () => {
|
|
2003
|
+
return ++changeTimes;
|
|
2004
|
+
};
|
|
2005
|
+
const onChangeA = jest.fn(updateChangeTimes);
|
|
2006
|
+
const onChangeB = jest.fn(updateChangeTimes);
|
|
2007
|
+
const onChangeC = jest.fn(updateChangeTimes);
|
|
2008
|
+
const buttonText = 'my button';
|
|
2009
|
+
const A = _ref5 => {
|
|
2010
|
+
let children = _ref5.children;
|
|
2011
|
+
useUseCase(fileUseCase, {
|
|
2012
|
+
onChange: onChangeA
|
|
1485
2013
|
});
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
const firstButtonText = 'first button';
|
|
1489
|
-
const A = () => {
|
|
1490
|
-
const [, { setPath }] = useUseCase(fileUseCase, {
|
|
1491
|
-
watch: {
|
|
1492
|
-
ext: onExtChange,
|
|
1493
|
-
},
|
|
1494
|
-
});
|
|
1495
|
-
const onFirstClick = () => {
|
|
1496
|
-
setPath(PATH_1);
|
|
1497
|
-
};
|
|
1498
|
-
return _jsx("button", { onClick: onFirstClick, children: firstButtonText });
|
|
1499
|
-
};
|
|
1500
|
-
const B = () => {
|
|
1501
|
-
const [, , Provider] = useUseCase(defaultFile, fileUseCase, {});
|
|
1502
|
-
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1503
|
-
};
|
|
1504
|
-
render(_jsx(B, {}));
|
|
1505
|
-
expect(onExtChange).toHaveBeenCalledTimes(0);
|
|
1506
|
-
fireEvent.click(screen.getByText(firstButtonText));
|
|
1507
|
-
expect(onExtChange).toHaveBeenCalledTimes(1);
|
|
1508
|
-
expect(onExtChange).toHaveBeenLastCalledWith({
|
|
1509
|
-
fieldPaths: ['ext'],
|
|
1510
|
-
newEntity: { ...defaultFile, ext: EXT_1, path: PATH_1 },
|
|
1511
|
-
oldEntity: defaultFile,
|
|
1512
|
-
newValue: EXT_1,
|
|
1513
|
-
oldValue: '',
|
|
1514
|
-
});
|
|
2014
|
+
return _jsx(Fragment, {
|
|
2015
|
+
children: children
|
|
1515
2016
|
});
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
return ++changeTimes;
|
|
1521
|
-
};
|
|
1522
|
-
const onChangeA = jest.fn(updateChangeTimes);
|
|
1523
|
-
const onChangeB = jest.fn(updateChangeTimes);
|
|
1524
|
-
const onChangeC = jest.fn(updateChangeTimes);
|
|
1525
|
-
const buttonText = 'my button';
|
|
1526
|
-
const A = ({ children }) => {
|
|
1527
|
-
useUseCase(fileUseCase, {
|
|
1528
|
-
watch: {
|
|
1529
|
-
ext: onChangeA,
|
|
1530
|
-
},
|
|
1531
|
-
});
|
|
1532
|
-
return _jsx(Fragment, { children: children });
|
|
1533
|
-
};
|
|
1534
|
-
const B = () => {
|
|
1535
|
-
useUseCase(fileUseCase, {
|
|
1536
|
-
watch: {
|
|
1537
|
-
ext: onChangeB,
|
|
1538
|
-
},
|
|
1539
|
-
});
|
|
1540
|
-
return _jsx(Fragment, {});
|
|
1541
|
-
};
|
|
1542
|
-
const C = () => {
|
|
1543
|
-
const [, { setPath }, Provider] = useUseCase(defaultFile, fileUseCase, {
|
|
1544
|
-
watch: {
|
|
1545
|
-
ext: onChangeC,
|
|
1546
|
-
},
|
|
1547
|
-
});
|
|
1548
|
-
const onFirstClick = () => {
|
|
1549
|
-
setPath(PATH_1);
|
|
1550
|
-
};
|
|
1551
|
-
return (_jsxs(Provider, { children: [_jsx(A, { children: _jsx(B, {}) }), _jsx("button", { onClick: onFirstClick, children: buttonText })] }));
|
|
1552
|
-
};
|
|
1553
|
-
render(_jsx(C, {}));
|
|
1554
|
-
expect(changeTimes).toBe(0);
|
|
1555
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1556
|
-
expect(onChangeA).toHaveReturnedWith(2);
|
|
1557
|
-
expect(onChangeB).toHaveReturnedWith(3);
|
|
1558
|
-
expect(onChangeC).toHaveReturnedWith(1);
|
|
2017
|
+
};
|
|
2018
|
+
const B = () => {
|
|
2019
|
+
useUseCase(fileUseCase, {
|
|
2020
|
+
onChange: onChangeB
|
|
1559
2021
|
});
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
return (_jsxs(Fragment, { children: [_jsx("button", { onClick: onFirstClick, children: firstButtonText }), _jsx("button", { onClick: onSecondClick, children: secondButtonText })] }));
|
|
1580
|
-
};
|
|
1581
|
-
const B = () => {
|
|
1582
|
-
const [, , Provider] = useUseCase(defaultFile, fileUseCase);
|
|
1583
|
-
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1584
|
-
};
|
|
1585
|
-
render(_jsx(B, {}));
|
|
1586
|
-
expect(onFirstExtChange).toHaveBeenCalledTimes(0);
|
|
1587
|
-
fireEvent.click(screen.getByText(firstButtonText));
|
|
1588
|
-
expect(onFirstExtChange).toHaveBeenCalledTimes(1);
|
|
1589
|
-
expect(onSecondExtChange).toHaveBeenCalledTimes(0);
|
|
1590
|
-
fireEvent.click(screen.getByText(secondButtonText));
|
|
1591
|
-
expect(onFirstExtChange).toHaveBeenCalledTimes(1);
|
|
1592
|
-
expect(onSecondExtChange).toHaveBeenCalledTimes(1);
|
|
1593
|
-
expect(onSecondExtChange).toHaveBeenLastCalledWith({
|
|
1594
|
-
fieldPaths: ['ext'],
|
|
1595
|
-
newEntity: defaultFile,
|
|
1596
|
-
oldEntity: { ...defaultFile, ext: EXT_1, path: PATH_1 },
|
|
1597
|
-
newValue: '',
|
|
1598
|
-
oldValue: EXT_1,
|
|
1599
|
-
});
|
|
2022
|
+
return _jsx(Fragment, {});
|
|
2023
|
+
};
|
|
2024
|
+
const C = () => {
|
|
2025
|
+
const _useUseCase44 = useUseCase(defaultFile, fileUseCase, {
|
|
2026
|
+
onChange: onChangeC
|
|
2027
|
+
}),
|
|
2028
|
+
_useUseCase45 = _slicedToArray(_useUseCase44, 3),
|
|
2029
|
+
setPath = _useUseCase45[1].setPath,
|
|
2030
|
+
Provider = _useUseCase45[2];
|
|
2031
|
+
const onFirstClick = () => {
|
|
2032
|
+
setPath(PATH_1);
|
|
2033
|
+
};
|
|
2034
|
+
return _jsxs(Provider, {
|
|
2035
|
+
children: [_jsx(A, {
|
|
2036
|
+
children: _jsx(B, {})
|
|
2037
|
+
}), _jsx("button", {
|
|
2038
|
+
onClick: onFirstClick,
|
|
2039
|
+
children: buttonText
|
|
2040
|
+
})]
|
|
1600
2041
|
});
|
|
2042
|
+
};
|
|
2043
|
+
render(_jsx(C, {}));
|
|
2044
|
+
expect(changeTimes).toBe(0);
|
|
2045
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
2046
|
+
expect(onChangeA).toHaveReturnedWith(2);
|
|
2047
|
+
expect(onChangeB).toHaveReturnedWith(3);
|
|
2048
|
+
expect(onChangeC).toHaveReturnedWith(1);
|
|
1601
2049
|
});
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
2050
|
+
test('`options.onChange` should always trigger the latest one in child components', () => {
|
|
2051
|
+
const onFirstChange = jest.fn();
|
|
2052
|
+
const onSecondChange = jest.fn();
|
|
2053
|
+
let onChange = onFirstChange;
|
|
2054
|
+
const firstButtonText = 'first button';
|
|
2055
|
+
const secondButtonText = 'second button';
|
|
2056
|
+
const A = () => {
|
|
2057
|
+
const _useUseCase46 = useUseCase(fileUseCase, {
|
|
2058
|
+
onChange
|
|
2059
|
+
}),
|
|
2060
|
+
_useUseCase47 = _slicedToArray(_useUseCase46, 2),
|
|
2061
|
+
setPath = _useUseCase47[1].setPath;
|
|
2062
|
+
const onFirstClick = () => {
|
|
2063
|
+
setPath(PATH_1);
|
|
2064
|
+
onChange = onSecondChange;
|
|
2065
|
+
};
|
|
2066
|
+
const onSecondClick = () => {
|
|
2067
|
+
setPath('');
|
|
2068
|
+
};
|
|
2069
|
+
return _jsxs(Fragment, {
|
|
2070
|
+
children: [_jsx("button", {
|
|
2071
|
+
onClick: onFirstClick,
|
|
2072
|
+
children: firstButtonText
|
|
2073
|
+
}), _jsx("button", {
|
|
2074
|
+
onClick: onSecondClick,
|
|
2075
|
+
children: secondButtonText
|
|
2076
|
+
})]
|
|
1609
2077
|
});
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
2078
|
+
};
|
|
2079
|
+
const B = () => {
|
|
2080
|
+
const _useUseCase48 = useUseCase(defaultFile, fileUseCase),
|
|
2081
|
+
_useUseCase49 = _slicedToArray(_useUseCase48, 3),
|
|
2082
|
+
Provider = _useUseCase49[2];
|
|
2083
|
+
return _jsx(Provider, {
|
|
2084
|
+
children: _jsx(A, {})
|
|
1617
2085
|
});
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
2086
|
+
};
|
|
2087
|
+
render(_jsx(B, {}));
|
|
2088
|
+
expect(onFirstChange).toHaveBeenCalledTimes(0);
|
|
2089
|
+
fireEvent.click(screen.getByText(firstButtonText));
|
|
2090
|
+
expect(onFirstChange).toHaveBeenCalledTimes(1);
|
|
2091
|
+
expect(onSecondChange).toHaveBeenCalledTimes(0);
|
|
2092
|
+
fireEvent.click(screen.getByText(secondButtonText));
|
|
2093
|
+
expect(onFirstChange).toHaveBeenCalledTimes(1);
|
|
2094
|
+
expect(onSecondChange).toHaveBeenCalledTimes(1);
|
|
2095
|
+
expect(onSecondChange).toHaveBeenLastCalledWith(defaultFile, {
|
|
2096
|
+
...defaultFile,
|
|
2097
|
+
ext: EXT_1,
|
|
2098
|
+
path: PATH_1
|
|
2099
|
+
});
|
|
2100
|
+
});
|
|
2101
|
+
test('`options.watch` should be trigger at child elements', () => {
|
|
2102
|
+
const onExtChange = jest.fn();
|
|
2103
|
+
const firstButtonText = 'first button';
|
|
2104
|
+
const A = () => {
|
|
2105
|
+
const _useUseCase50 = useUseCase(fileUseCase, {
|
|
2106
|
+
watch: {
|
|
2107
|
+
ext: onExtChange
|
|
2108
|
+
}
|
|
2109
|
+
}),
|
|
2110
|
+
_useUseCase51 = _slicedToArray(_useUseCase50, 2),
|
|
2111
|
+
setPath = _useUseCase51[1].setPath;
|
|
2112
|
+
const onFirstClick = () => {
|
|
2113
|
+
setPath(PATH_1);
|
|
2114
|
+
};
|
|
2115
|
+
return _jsx("button", {
|
|
2116
|
+
onClick: onFirstClick,
|
|
2117
|
+
children: firstButtonText
|
|
1626
2118
|
});
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2119
|
+
};
|
|
2120
|
+
const B = () => {
|
|
2121
|
+
const _useUseCase52 = useUseCase(defaultFile, fileUseCase, {}),
|
|
2122
|
+
_useUseCase53 = _slicedToArray(_useUseCase52, 3),
|
|
2123
|
+
Provider = _useUseCase53[2];
|
|
2124
|
+
return _jsx(Provider, {
|
|
2125
|
+
children: _jsx(A, {})
|
|
1635
2126
|
});
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
2127
|
+
};
|
|
2128
|
+
render(_jsx(B, {}));
|
|
2129
|
+
expect(onExtChange).toHaveBeenCalledTimes(0);
|
|
2130
|
+
fireEvent.click(screen.getByText(firstButtonText));
|
|
2131
|
+
expect(onExtChange).toHaveBeenCalledTimes(1);
|
|
2132
|
+
expect(onExtChange).toHaveBeenLastCalledWith({
|
|
2133
|
+
fieldPaths: ['ext'],
|
|
2134
|
+
newEntity: {
|
|
2135
|
+
...defaultFile,
|
|
2136
|
+
ext: EXT_1,
|
|
2137
|
+
path: PATH_1
|
|
2138
|
+
},
|
|
2139
|
+
oldEntity: defaultFile,
|
|
2140
|
+
newValue: EXT_1,
|
|
2141
|
+
oldValue: ''
|
|
2142
|
+
});
|
|
2143
|
+
});
|
|
2144
|
+
test('`options.watch` should be trigger in orders', () => {
|
|
2145
|
+
let changeTimes = 0;
|
|
2146
|
+
const updateChangeTimes = e => {
|
|
2147
|
+
void e;
|
|
2148
|
+
return ++changeTimes;
|
|
2149
|
+
};
|
|
2150
|
+
const onChangeA = jest.fn(updateChangeTimes);
|
|
2151
|
+
const onChangeB = jest.fn(updateChangeTimes);
|
|
2152
|
+
const onChangeC = jest.fn(updateChangeTimes);
|
|
2153
|
+
const buttonText = 'my button';
|
|
2154
|
+
const A = _ref6 => {
|
|
2155
|
+
let children = _ref6.children;
|
|
2156
|
+
useUseCase(fileUseCase, {
|
|
2157
|
+
watch: {
|
|
2158
|
+
ext: onChangeA
|
|
2159
|
+
}
|
|
1645
2160
|
});
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
const CacheTestComponent = () => {
|
|
1649
|
-
const { subtraction } = useUseCase(mathUseCase);
|
|
1650
|
-
const update = useUpdate();
|
|
1651
|
-
const onClick = () => {
|
|
1652
|
-
update();
|
|
1653
|
-
};
|
|
1654
|
-
subtraction(5, 3);
|
|
1655
|
-
return _jsx("button", { onClick: onClick, children: buttonText });
|
|
1656
|
-
};
|
|
1657
|
-
render(_jsx(CacheTestComponent, {}));
|
|
1658
|
-
expect(subtractionReducer).toHaveBeenCalledTimes(1);
|
|
1659
|
-
expect(subtractionReducer).toHaveBeenCalledWith(5, 3);
|
|
1660
|
-
expect(subtractionReducer).toHaveReturnedWith(2);
|
|
1661
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1662
|
-
expect(subtractionReducer).toHaveBeenCalledTimes(2);
|
|
1663
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1664
|
-
expect(subtractionReducer).toHaveBeenCalledTimes(3);
|
|
2161
|
+
return _jsx(Fragment, {
|
|
2162
|
+
children: children
|
|
1665
2163
|
});
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
};
|
|
1673
|
-
useMount(() => {
|
|
1674
|
-
subtraction(5, 3);
|
|
1675
|
-
subtraction(5, 3);
|
|
1676
|
-
});
|
|
1677
|
-
return _jsx("button", { onClick: onClick, children: buttonText });
|
|
1678
|
-
};
|
|
1679
|
-
render(_jsx(CacheTestComponent, {}));
|
|
1680
|
-
expect(subtractionReducer).toHaveBeenCalledTimes(2);
|
|
1681
|
-
expect(subtractionReducer).toHaveBeenNthCalledWith(1, 5, 3);
|
|
1682
|
-
expect(subtractionReducer).toHaveNthReturnedWith(1, 2);
|
|
1683
|
-
expect(subtractionReducer).toHaveBeenNthCalledWith(2, 5, 3);
|
|
1684
|
-
expect(subtractionReducer).toHaveNthReturnedWith(2, 2);
|
|
1685
|
-
fireEvent.click(screen.getByText(buttonText));
|
|
1686
|
-
expect(subtractionReducer).toHaveBeenCalledTimes(3);
|
|
1687
|
-
expect(subtractionReducer).toHaveBeenNthCalledWith(3, 5, 3);
|
|
1688
|
-
expect(subtractionReducer).toHaveNthReturnedWith(3, 2);
|
|
2164
|
+
};
|
|
2165
|
+
const B = () => {
|
|
2166
|
+
useUseCase(fileUseCase, {
|
|
2167
|
+
watch: {
|
|
2168
|
+
ext: onChangeB
|
|
2169
|
+
}
|
|
1689
2170
|
});
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
2171
|
+
return _jsx(Fragment, {});
|
|
2172
|
+
};
|
|
2173
|
+
const C = () => {
|
|
2174
|
+
const _useUseCase54 = useUseCase(defaultFile, fileUseCase, {
|
|
2175
|
+
watch: {
|
|
2176
|
+
ext: onChangeC
|
|
2177
|
+
}
|
|
2178
|
+
}),
|
|
2179
|
+
_useUseCase55 = _slicedToArray(_useUseCase54, 3),
|
|
2180
|
+
setPath = _useUseCase55[1].setPath,
|
|
2181
|
+
Provider = _useUseCase55[2];
|
|
2182
|
+
const onFirstClick = () => {
|
|
2183
|
+
setPath(PATH_1);
|
|
2184
|
+
};
|
|
2185
|
+
return _jsxs(Provider, {
|
|
2186
|
+
children: [_jsx(A, {
|
|
2187
|
+
children: _jsx(B, {})
|
|
2188
|
+
}), _jsx("button", {
|
|
2189
|
+
onClick: onFirstClick,
|
|
2190
|
+
children: buttonText
|
|
2191
|
+
})]
|
|
1709
2192
|
});
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
2193
|
+
};
|
|
2194
|
+
render(_jsx(C, {}));
|
|
2195
|
+
expect(changeTimes).toBe(0);
|
|
2196
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
2197
|
+
expect(onChangeA).toHaveReturnedWith(2);
|
|
2198
|
+
expect(onChangeB).toHaveReturnedWith(3);
|
|
2199
|
+
expect(onChangeC).toHaveReturnedWith(1);
|
|
2200
|
+
});
|
|
2201
|
+
test('`options.watch` should trigger the latest one in child components', () => {
|
|
2202
|
+
const onFirstExtChange = jest.fn();
|
|
2203
|
+
const onSecondExtChange = jest.fn();
|
|
2204
|
+
let onExtChange = onFirstExtChange;
|
|
2205
|
+
const firstButtonText = 'first button';
|
|
2206
|
+
const secondButtonText = 'second button';
|
|
2207
|
+
const A = () => {
|
|
2208
|
+
const _useUseCase56 = useUseCase(fileUseCase, {
|
|
2209
|
+
watch: {
|
|
2210
|
+
ext: onExtChange
|
|
2211
|
+
}
|
|
2212
|
+
}),
|
|
2213
|
+
_useUseCase57 = _slicedToArray(_useUseCase56, 2),
|
|
2214
|
+
setPath = _useUseCase57[1].setPath;
|
|
2215
|
+
const onFirstClick = () => {
|
|
2216
|
+
setPath(PATH_1);
|
|
2217
|
+
onExtChange = onSecondExtChange;
|
|
2218
|
+
};
|
|
2219
|
+
const onSecondClick = () => {
|
|
2220
|
+
setPath('');
|
|
2221
|
+
};
|
|
2222
|
+
return _jsxs(Fragment, {
|
|
2223
|
+
children: [_jsx("button", {
|
|
2224
|
+
onClick: onFirstClick,
|
|
2225
|
+
children: firstButtonText
|
|
2226
|
+
}), _jsx("button", {
|
|
2227
|
+
onClick: onSecondClick,
|
|
2228
|
+
children: secondButtonText
|
|
2229
|
+
})]
|
|
1717
2230
|
});
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
onUpdate();
|
|
1726
|
-
}, [reducers]);
|
|
1727
|
-
useDeepCompareUpdate(() => {
|
|
1728
|
-
onDeepUpdate();
|
|
1729
|
-
}, [reducers]);
|
|
1730
|
-
return setExtraValue;
|
|
1731
|
-
});
|
|
1732
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1733
|
-
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
1734
|
-
act(() => {
|
|
1735
|
-
result.current(3);
|
|
1736
|
-
});
|
|
1737
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1738
|
-
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2231
|
+
};
|
|
2232
|
+
const B = () => {
|
|
2233
|
+
const _useUseCase58 = useUseCase(defaultFile, fileUseCase),
|
|
2234
|
+
_useUseCase59 = _slicedToArray(_useUseCase58, 3),
|
|
2235
|
+
Provider = _useUseCase59[2];
|
|
2236
|
+
return _jsx(Provider, {
|
|
2237
|
+
children: _jsx(A, {})
|
|
1739
2238
|
});
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
2239
|
+
};
|
|
2240
|
+
render(_jsx(B, {}));
|
|
2241
|
+
expect(onFirstExtChange).toHaveBeenCalledTimes(0);
|
|
2242
|
+
fireEvent.click(screen.getByText(firstButtonText));
|
|
2243
|
+
expect(onFirstExtChange).toHaveBeenCalledTimes(1);
|
|
2244
|
+
expect(onSecondExtChange).toHaveBeenCalledTimes(0);
|
|
2245
|
+
fireEvent.click(screen.getByText(secondButtonText));
|
|
2246
|
+
expect(onFirstExtChange).toHaveBeenCalledTimes(1);
|
|
2247
|
+
expect(onSecondExtChange).toHaveBeenCalledTimes(1);
|
|
2248
|
+
expect(onSecondExtChange).toHaveBeenLastCalledWith({
|
|
2249
|
+
fieldPaths: ['ext'],
|
|
2250
|
+
newEntity: defaultFile,
|
|
2251
|
+
oldEntity: {
|
|
2252
|
+
...defaultFile,
|
|
2253
|
+
ext: EXT_1,
|
|
2254
|
+
path: PATH_1
|
|
2255
|
+
},
|
|
2256
|
+
newValue: '',
|
|
2257
|
+
oldValue: EXT_1
|
|
2258
|
+
});
|
|
2259
|
+
});
|
|
2260
|
+
});
|
|
2261
|
+
describe('`useUseCase` should work the same as `useReducers`', () => {
|
|
2262
|
+
test('`entity` should equal `defaultFile`', () => {
|
|
2263
|
+
const _renderHook32 = renderHook(() => {
|
|
2264
|
+
return useUseCase(mathUseCase);
|
|
2265
|
+
}),
|
|
2266
|
+
result = _renderHook32.result;
|
|
2267
|
+
const reducers = result.current;
|
|
2268
|
+
expect(Array.isArray(reducers)).toBe(false);
|
|
2269
|
+
});
|
|
2270
|
+
test('returned reducer should work', () => {
|
|
2271
|
+
const _renderHook33 = renderHook(() => {
|
|
2272
|
+
return useUseCase(mathUseCase);
|
|
2273
|
+
}),
|
|
2274
|
+
result = _renderHook33.result;
|
|
2275
|
+
const reducers = result.current;
|
|
2276
|
+
const add = reducers.add;
|
|
2277
|
+
expect(add(1, 2)).toBe(3);
|
|
2278
|
+
});
|
|
2279
|
+
test('`usecase` should be called only once if deps has not provided', () => {
|
|
2280
|
+
const mockUseCase = jest.fn(mathUseCase);
|
|
2281
|
+
const _renderHook34 = renderHook(() => {
|
|
2282
|
+
return useUseCase(mockUseCase);
|
|
2283
|
+
}),
|
|
2284
|
+
rerender = _renderHook34.rerender;
|
|
2285
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2286
|
+
rerender();
|
|
2287
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2288
|
+
});
|
|
2289
|
+
test('`usecase` should be called only once if deps has not changed', () => {
|
|
2290
|
+
const mockUseCase = jest.fn(mathUseCase);
|
|
2291
|
+
const _renderHook35 = renderHook(() => {
|
|
2292
|
+
return useUseCase(mockUseCase, {}, [1, 'x']);
|
|
2293
|
+
}),
|
|
2294
|
+
rerender = _renderHook35.rerender;
|
|
2295
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2296
|
+
rerender();
|
|
2297
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2298
|
+
});
|
|
2299
|
+
test('`usecase` should be called if deps has changed', () => {
|
|
2300
|
+
let i = 0;
|
|
2301
|
+
const mockUseCase = jest.fn(mathUseCase);
|
|
2302
|
+
const _renderHook36 = renderHook(() => {
|
|
2303
|
+
return useUseCase(mockUseCase, {}, [i++, 'x']);
|
|
2304
|
+
}),
|
|
2305
|
+
rerender = _renderHook36.rerender;
|
|
2306
|
+
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2307
|
+
rerender();
|
|
2308
|
+
expect(mockUseCase).toHaveBeenCalledTimes(2);
|
|
2309
|
+
});
|
|
2310
|
+
test('reducer call should not be cached if component is at rendering phase', () => {
|
|
2311
|
+
const buttonText = 'button';
|
|
2312
|
+
const CacheTestComponent = () => {
|
|
2313
|
+
const _useUseCase60 = useUseCase(mathUseCase),
|
|
2314
|
+
subtraction = _useUseCase60.subtraction;
|
|
2315
|
+
const update = useUpdate();
|
|
2316
|
+
const onClick = () => {
|
|
2317
|
+
update();
|
|
2318
|
+
};
|
|
2319
|
+
subtraction(5, 3);
|
|
2320
|
+
return _jsx("button", {
|
|
2321
|
+
onClick: onClick,
|
|
2322
|
+
children: buttonText
|
|
1761
2323
|
});
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
2324
|
+
};
|
|
2325
|
+
render(_jsx(CacheTestComponent, {}));
|
|
2326
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(1);
|
|
2327
|
+
expect(subtractionReducer).toHaveBeenCalledWith(5, 3);
|
|
2328
|
+
expect(subtractionReducer).toHaveReturnedWith(2);
|
|
2329
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
2330
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(2);
|
|
2331
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
2332
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(3);
|
|
2333
|
+
});
|
|
2334
|
+
test('reducer call should not be cached if component is not at rendering phase', () => {
|
|
2335
|
+
const buttonText = 'button';
|
|
2336
|
+
const CacheTestComponent = () => {
|
|
2337
|
+
const _useUseCase61 = useUseCase(mathUseCase),
|
|
2338
|
+
subtraction = _useUseCase61.subtraction;
|
|
2339
|
+
const onClick = () => {
|
|
2340
|
+
subtraction(5, 3);
|
|
2341
|
+
};
|
|
2342
|
+
useMount(() => {
|
|
2343
|
+
subtraction(5, 3);
|
|
2344
|
+
subtraction(5, 3);
|
|
1783
2345
|
});
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
1788
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2346
|
+
return _jsx("button", {
|
|
2347
|
+
onClick: onClick,
|
|
2348
|
+
children: buttonText
|
|
1789
2349
|
});
|
|
2350
|
+
};
|
|
2351
|
+
render(_jsx(CacheTestComponent, {}));
|
|
2352
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(2);
|
|
2353
|
+
expect(subtractionReducer).toHaveBeenNthCalledWith(1, 5, 3);
|
|
2354
|
+
expect(subtractionReducer).toHaveNthReturnedWith(1, 2);
|
|
2355
|
+
expect(subtractionReducer).toHaveBeenNthCalledWith(2, 5, 3);
|
|
2356
|
+
expect(subtractionReducer).toHaveNthReturnedWith(2, 2);
|
|
2357
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
2358
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(3);
|
|
2359
|
+
expect(subtractionReducer).toHaveBeenNthCalledWith(3, 5, 3);
|
|
2360
|
+
expect(subtractionReducer).toHaveNthReturnedWith(3, 2);
|
|
1790
2361
|
});
|
|
1791
|
-
|
|
2362
|
+
test('reducer call should not be cached if parameters have changed', () => {
|
|
2363
|
+
let count = 0;
|
|
2364
|
+
const buttonText = 'button';
|
|
2365
|
+
const StringUseCaseTestComponent = () => {
|
|
2366
|
+
const _useUseCase62 = useUseCase(mathUseCase),
|
|
2367
|
+
subtraction = _useUseCase62.subtraction;
|
|
2368
|
+
const update = useUpdate();
|
|
2369
|
+
subtraction(5, count++);
|
|
2370
|
+
const onUpdate = () => {
|
|
2371
|
+
update();
|
|
2372
|
+
};
|
|
2373
|
+
return _jsx("div", {
|
|
2374
|
+
children: _jsx("button", {
|
|
2375
|
+
onClick: onUpdate,
|
|
2376
|
+
children: buttonText
|
|
2377
|
+
})
|
|
2378
|
+
});
|
|
2379
|
+
};
|
|
2380
|
+
render(_jsx(StringUseCaseTestComponent, {}));
|
|
2381
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(1);
|
|
2382
|
+
expect(subtractionReducer).toHaveBeenCalledWith(5, 0);
|
|
2383
|
+
fireEvent.click(screen.getByText(buttonText));
|
|
2384
|
+
expect(subtractionReducer).toHaveBeenCalledTimes(2);
|
|
2385
|
+
expect(subtractionReducer).toHaveBeenCalledWith(5, 1);
|
|
2386
|
+
expect(subtractionReducer).toHaveReturnedWith(4);
|
|
2387
|
+
});
|
|
2388
|
+
test('`options.extraValue` should be added after call `add` method', () => {
|
|
2389
|
+
const _renderHook37 = renderHook(() => {
|
|
2390
|
+
return useUseCase(mathUseCase, {
|
|
2391
|
+
extraValue: 5
|
|
2392
|
+
});
|
|
2393
|
+
}),
|
|
2394
|
+
result = _renderHook37.result;
|
|
2395
|
+
const reducers = result.current;
|
|
2396
|
+
const add = reducers.add;
|
|
2397
|
+
expect(add(1, 2)).toBe(8);
|
|
2398
|
+
});
|
|
2399
|
+
test('when `options` has changed, it should not trigger update', () => {
|
|
2400
|
+
const onUpdate = jest.fn();
|
|
2401
|
+
const onDeepUpdate = jest.fn();
|
|
2402
|
+
const _renderHook38 = renderHook(() => {
|
|
2403
|
+
const _useState7 = useState(0),
|
|
2404
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
2405
|
+
extraValue = _useState8[0],
|
|
2406
|
+
setExtraValue = _useState8[1];
|
|
2407
|
+
const reducers = useUseCase(mathUseCase, {
|
|
2408
|
+
extraValue
|
|
2409
|
+
});
|
|
2410
|
+
useUpdateEffect(() => {
|
|
2411
|
+
onUpdate();
|
|
2412
|
+
}, [reducers]);
|
|
2413
|
+
useDeepCompareUpdate(() => {
|
|
2414
|
+
onDeepUpdate();
|
|
2415
|
+
}, [reducers]);
|
|
2416
|
+
return setExtraValue;
|
|
2417
|
+
}),
|
|
2418
|
+
result = _renderHook38.result;
|
|
2419
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2420
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2421
|
+
act(() => {
|
|
2422
|
+
result.current(3);
|
|
2423
|
+
});
|
|
2424
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2425
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2426
|
+
});
|
|
2427
|
+
test('when `deps` change, it should update reducers', () => {
|
|
2428
|
+
const onUpdate = jest.fn();
|
|
2429
|
+
const onDeepUpdate = jest.fn();
|
|
2430
|
+
const _renderHook39 = renderHook(() => {
|
|
2431
|
+
const _useState9 = useState(0),
|
|
2432
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
2433
|
+
extraValue = _useState0[0],
|
|
2434
|
+
setExtraValue = _useState0[1];
|
|
2435
|
+
const reducers = useUseCase(mathUseCase, {
|
|
2436
|
+
extraValue
|
|
2437
|
+
}, [extraValue]);
|
|
2438
|
+
useUpdateEffect(() => {
|
|
2439
|
+
onUpdate();
|
|
2440
|
+
}, [reducers]);
|
|
2441
|
+
useDeepCompareUpdate(() => {
|
|
2442
|
+
onDeepUpdate();
|
|
2443
|
+
}, [reducers]);
|
|
2444
|
+
return setExtraValue;
|
|
2445
|
+
}),
|
|
2446
|
+
result = _renderHook39.result;
|
|
2447
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2448
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2449
|
+
act(() => {
|
|
2450
|
+
result.current(3);
|
|
2451
|
+
});
|
|
2452
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
2453
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(1);
|
|
2454
|
+
});
|
|
2455
|
+
test('empty `deps` should not update reducers', () => {
|
|
2456
|
+
const onUpdate = jest.fn();
|
|
2457
|
+
const onDeepUpdate = jest.fn();
|
|
2458
|
+
const _renderHook40 = renderHook(() => {
|
|
2459
|
+
const _useState1 = useState(0),
|
|
2460
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
2461
|
+
extraValue = _useState10[0],
|
|
2462
|
+
setExtraValue = _useState10[1];
|
|
2463
|
+
const reducers = useUseCase(mathUseCase, {
|
|
2464
|
+
extraValue
|
|
2465
|
+
}, []);
|
|
2466
|
+
useUpdateEffect(() => {
|
|
2467
|
+
onUpdate();
|
|
2468
|
+
}, [reducers]);
|
|
2469
|
+
useDeepCompareUpdate(() => {
|
|
2470
|
+
onDeepUpdate();
|
|
2471
|
+
}, [reducers]);
|
|
2472
|
+
return setExtraValue;
|
|
2473
|
+
}),
|
|
2474
|
+
result = _renderHook40.result;
|
|
2475
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2476
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2477
|
+
act(() => {
|
|
2478
|
+
result.current(3);
|
|
2479
|
+
});
|
|
2480
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2481
|
+
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2482
|
+
});
|
|
2483
|
+
test('should not trigger update', () => {
|
|
2484
|
+
const onUpdate = jest.fn();
|
|
2485
|
+
render(_jsx(MathParent, {
|
|
2486
|
+
onUpdate: onUpdate
|
|
2487
|
+
}));
|
|
2488
|
+
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
2489
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2490
|
+
});
|
|
2491
|
+
});
|
|
2492
|
+
});
|