@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
2,850 lines • 117 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator"));
var _asyncGeneratorDelegate2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncGeneratorDelegate"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _jsxRuntime = require("react/jsx-runtime");
var _ = require(".");
var _useDepsKey = require("../useDepsKey");
var _globals = require("@jest/globals");
var _usecases = require("@mic-rexjs/usecases");
var _dom = require("@testing-library/dom");
var _react = require("@testing-library/react");
var _ahooks = require("ahooks");
var _react2 = require("react");
var _reactDom = require("react-dom");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(r) { var n = this.s["return"]; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, "throw": function _throw(r) { var n = this.s["return"]; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
var EXT_1 = '.png';
var EXT_2 = '.jpg';
var PATH_1 = "hello".concat(EXT_1);
var PATH_2 = "hello".concat(EXT_2);
var PARENT_BUTTON_TEXT = 'parent button';
var CHILD_BUTTON_TEXT = 'child button';
var defaultFile = {
path: '',
ext: '',
size: 0
};
var fileUseCase = function fileUseCase() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var entityReducers = (0, _usecases.entityUseCase)();
var _options$pathPrefix = options.pathPrefix,
pathPrefix = _options$pathPrefix === void 0 ? '' : _options$pathPrefix,
onPathChange = options.onPathChange;
var init = function init(entity) {
var newEntity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultFile;
return /*#__PURE__*/_regenerator["default"].mark(function _callee() {
return _regenerator["default"].wrap(function (_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 1;
return function () {
return newEntity;
};
case 1:
case "end":
return _context3.stop();
}
}, _callee);
})();
};
var setPath = /*#__PURE__*/_regenerator["default"].mark(function setPath(entity, path) {
var _path$match, oldPath, newPath;
return _regenerator["default"].wrap(function (_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
oldPath = entity.path;
newPath = pathPrefix + path;
_context4.next = 1;
return _objectSpread(_objectSpread({}, entity), {}, {
path: newPath,
ext: ((_path$match = path.match(/\.[^.]+$/)) === null || _path$match === void 0 ? void 0 : _path$match[0]) || ''
});
case 1:
onPathChange === null || onPathChange === void 0 || onPathChange(newPath, oldPath);
case 2:
case "end":
return _context4.stop();
}
}, setPath);
});
var readFile = /*#__PURE__*/function () {
var _ref8 = (0, _wrapAsyncGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(entity, path) {
var size;
return _regenerator["default"].wrap(function (_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
size = 2000;
return _context5.delegateYield((0, _asyncGeneratorDelegate2["default"])(_asyncIterator(setPath(entity, path)), _awaitAsyncGenerator2["default"]), "t0", 1);
case 1:
_context5.next = 2;
return (0, _awaitAsyncGenerator2["default"])(Promise.resolve(null));
case 2:
_context5.next = 3;
return function (oldEntity) {
return _objectSpread(_objectSpread({}, oldEntity), {}, {
size: size
});
};
case 3:
return _context5.abrupt("return", size);
case 4:
case "end":
return _context5.stop();
}
}, _callee2);
}));
return function readFile(_x, _x2) {
return _ref8.apply(this, arguments);
};
}();
var isImage = function isImage(entity) {
var ext = entity.ext;
return [EXT_1, EXT_2].includes(ext);
};
return _objectSpread(_objectSpread({}, entityReducers), {}, {
init: init,
setPath: setPath,
readFile: readFile,
isImage: isImage
});
};
var subtractionReducer = _globals.jest.fn(function (value1, value2) {
return value1 - value2;
});
var mathUseCase = function mathUseCase() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _options$extraValue = options.extraValue,
extraValue = _options$extraValue === void 0 ? 0 : _options$extraValue;
var add = function add(value1, value2) {
return value1 + value2 + extraValue;
};
return {
add: add,
subtraction: subtractionReducer
};
};
var fieldPathUseCase = function fieldPathUseCase() {
return (0, _usecases.entityUseCase)();
};
var Child = function Child(_ref) {
var _ref$textPrefix = _ref.textPrefix,
textPrefix = _ref$textPrefix === void 0 ? '' : _ref$textPrefix,
onUpdate = _ref.onUpdate,
onPathChange = _ref.onPathChange,
onUndefinedEntity = _ref.onUndefinedEntity;
var _useUseCase = (0, _.useUseCase)(fileUseCase),
_useUseCase2 = (0, _slicedToArray2["default"])(_useUseCase, 2),
file = _useUseCase2[0],
setPath = _useUseCase2[1].setPath;
var _ref2 = file || {},
path = _ref2.path,
ext = _ref2.ext;
var onClick = function onClick() {
setPath(PATH_2);
};
var undefinedEntity = (0, _ahooks.useMemoizedFn)(function () {
onUndefinedEntity === null || onUndefinedEntity === void 0 || onUndefinedEntity();
});
(0, _ahooks.useUpdateEffect)(function () {
onUpdate === null || onUpdate === void 0 || onUpdate();
});
(0, _react2.useEffect)(function () {
if (file === void 0) {
undefinedEntity();
}
}, [file, undefinedEntity]);
var pathChange = (0, _ahooks.useMemoizedFn)(function () {
onPathChange === null || onPathChange === void 0 || onPathChange(path);
});
(0, _ahooks.useUpdateEffect)(pathChange, [path, pathChange]);
return (0, _jsxRuntime.jsxs)("div", {
children: [(0, _jsxRuntime.jsxs)("main", {
children: ["child path: ", path, (0, _jsxRuntime.jsx)("br", {}), "child ext: ", ext]
}), (0, _jsxRuntime.jsx)("footer", {
children: (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: textPrefix + CHILD_BUTTON_TEXT
})
})]
});
};
var Parent = function Parent(_ref3) {
var children = _ref3.children,
onUpdate = _ref3.onUpdate,
onSetPath = _ref3.onSetPath;
var _useUseCase3 = (0, _.useUseCase)(defaultFile, fileUseCase),
_useUseCase4 = (0, _slicedToArray2["default"])(_useUseCase3, 3),
_useUseCase4$ = _useUseCase4[0],
path = _useUseCase4$.path,
ext = _useUseCase4$.ext,
setPath = _useUseCase4[1].setPath,
Provider = _useUseCase4[2];
var onClick = function onClick() {
setPath((onSetPath === null || onSetPath === void 0 ? void 0 : onSetPath()) || '');
};
(0, _ahooks.useUpdateEffect)(function () {
onUpdate === null || onUpdate === void 0 || onUpdate();
});
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsxs)("div", {
children: [(0, _jsxRuntime.jsxs)("header", {
children: ["parent path: ", path, (0, _jsxRuntime.jsx)("br", {}), "parent ext: ", ext]
}), (0, _jsxRuntime.jsx)("main", {
children: children
}), (0, _jsxRuntime.jsx)("footer", {
children: (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: PARENT_BUTTON_TEXT
})
})]
})
});
};
var MathParent = function MathParent(_ref4) {
var _ref4$extraValue = _ref4.extraValue,
extraValue = _ref4$extraValue === void 0 ? 0 : _ref4$extraValue,
onUpdate = _ref4.onUpdate;
var _useUseCase5 = (0, _.useUseCase)(mathUseCase, {
extraValue: extraValue
}, [extraValue]),
add = _useUseCase5.add;
var onClick = function onClick() {
add(1, 2);
};
(0, _ahooks.useUpdateEffect)(function () {
onUpdate === null || onUpdate === void 0 || onUpdate();
});
return (0, _jsxRuntime.jsx)("div", {
children: (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: PARENT_BUTTON_TEXT
})
});
};
var useDeepCompareUpdate = function useDeepCompareUpdate(callback, deps) {
var isFirstRef = (0, _react2.useRef)(true);
var memoizedCallback = (0, _ahooks.useMemoizedFn)(callback);
var depsKey = (0, _useDepsKey.useDepsKey)(deps);
(0, _react2.useEffect)(function () {
return function () {
isFirstRef.current = false;
};
});
(0, _ahooks.useDeepCompareEffect)(function () {
if (isFirstRef.current) {
return;
}
memoizedCallback();
}, [depsKey, memoizedCallback]);
};
(0, _globals.beforeEach)(function () {
subtractionReducer.mockClear();
});
(0, _globals.describe)('useUseCase', function () {
(0, _globals.describe)('`useUseCase` should work the same as `useRootCoreCollection`', function () {
(0, _globals.test)('check context type', function () {
var _renderHook = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook.result;
var cores = result.current;
(0, _globals.expect)(Array.isArray(cores)).toBe(true);
(0, _globals.expect)(cores).toHaveLength(3);
});
(0, _globals.test)('`entity` should equal `defaultFile`', function () {
var _renderHook2 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook2.result;
var cores = result.current;
var _cores = (0, _slicedToArray2["default"])(cores, 1),
entity = _cores[0];
(0, _globals.expect)(entity).toEqual(defaultFile);
});
(0, _globals.test)('Should return the `EntityStore.value` if root entity has not changed', function () {
var _renderHook3 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook3.result;
var collection = result.current;
var _collection = (0, _slicedToArray2["default"])(collection, 2),
setPath = _collection[1].setPath;
(0, _react.act)(function () {
setPath(PATH_1);
});
(0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1
}));
});
(0, _globals.test)('Should return the root entity if root entity has changed', function () {
var file = defaultFile;
var _renderHook4 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(file, fileUseCase);
}),
result = _renderHook4.result,
rerender = _renderHook4.rerender;
file = _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
});
rerender();
(0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
}));
// 渲染多一次,避免第二次渲染的 `entity` 没变化而取错缓存的情况
rerender();
(0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
}));
});
(0, _globals.test)('Should return the root entity if root entity has changed even with entity state changed', function () {
var file = defaultFile;
var _renderHook5 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(file, fileUseCase);
}),
result = _renderHook5.result;
var collection = result.current;
var _collection2 = (0, _slicedToArray2["default"])(collection, 2),
setPath = _collection2[1].setPath;
(0, _react.act)(function () {
file = _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
});
setPath(PATH_1);
});
(0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
}));
});
(0, _globals.test)('Should support entity initializer', function () {
var file = defaultFile;
var _renderHook6 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(function () {
return file;
}, fileUseCase);
}),
result = _renderHook6.result;
var _result$current = (0, _slicedToArray2["default"])(result.current, 1),
currentFile = _result$current[0];
(0, _globals.expect)(currentFile).toEqual(file);
});
(0, _globals.test)('Should support entity initializer with generator', function () {
var file = defaultFile;
var onChange = _globals.jest.fn();
var _renderHook7 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(function () {
var currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
return /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
return _regenerator["default"].wrap(function (_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 1;
return _objectSpread(_objectSpread({}, currentFile), {}, {
size: 5000
});
case 1:
case "end":
return _context6.stop();
}
}, _callee3);
})();
}, fileUseCase, {
onChange: onChange
});
}),
result = _renderHook7.result;
var _result$current2 = (0, _slicedToArray2["default"])(result.current, 1),
currentFile = _result$current2[0];
(0, _globals.expect)(currentFile).toEqual(_objectSpread(_objectSpread({}, file), {}, {
size: 5000
}));
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
});
(0, _globals.test)('Should support entity initializer with async callback generator', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
var file, onChange, onUpate, _Promise$withResolver, promise, resolve, _renderHook8, result, _result$current3, currentFile1, newFile1, newFile2, newFile3;
return _regenerator["default"].wrap(function (_context0) {
while (1) switch (_context0.prev = _context0.next) {
case 0:
file = defaultFile;
onChange = _globals.jest.fn();
onUpate = _globals.jest.fn();
_Promise$withResolver = Promise.withResolvers(), promise = _Promise$withResolver.promise, resolve = _Promise$withResolver.resolve;
_renderHook8 = (0, _react.renderHook)(function () {
(0, _react2.useEffect)(function () {
onUpate();
});
return (0, _.useUseCase)(function () {
var entity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
return /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
var newEntity1, newEntity2;
return _regenerator["default"].wrap(function (_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
_context8.next = 1;
return _objectSpread(_objectSpread({}, entity), {}, {
size: 1
});
case 1:
newEntity1 = _context8.sent;
_context8.next = 2;
return _objectSpread(_objectSpread({}, newEntity1), {}, {
size: newEntity1.size + 1
});
case 2:
_context8.next = 3;
return /*#__PURE__*/function () {
var _ref0 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(currentEntity) {
return _regenerator["default"].wrap(function (_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 1;
return promise;
case 1:
return _context7.abrupt("return", _objectSpread(_objectSpread({}, currentEntity), {}, {
size: currentEntity.size + 1
}));
case 2:
case "end":
return _context7.stop();
}
}, _callee4);
}));
return function (_x3) {
return _ref0.apply(this, arguments);
};
}();
case 3:
newEntity2 = _context8.sent;
_context8.next = 4;
return _objectSpread(_objectSpread({}, newEntity2), {}, {
size: newEntity2.size + 1
});
case 4:
case "end":
return _context8.stop();
}
}, _callee5);
})();
}, fileUseCase, {
onChange: onChange
});
}), result = _renderHook8.result;
_result$current3 = (0, _slicedToArray2["default"])(result.current, 1), currentFile1 = _result$current3[0];
newFile1 = _objectSpread(_objectSpread({}, file), {}, {
size: 2
});
(0, _globals.expect)(currentFile1).toEqual(newFile1);
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onUpate).toHaveBeenCalledTimes(1);
_context0.next = 1;
return (0, _react.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
return _regenerator["default"].wrap(function (_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
resolve();
_context9.next = 1;
return promise;
case 1:
case "end":
return _context9.stop();
}
}, _callee6);
})));
case 1:
newFile2 = _objectSpread(_objectSpread({}, file), {}, {
size: 3
});
newFile3 = _objectSpread(_objectSpread({}, file), {}, {
size: 4
});
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onUpate).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onChange).toHaveBeenNthCalledWith(1, newFile2, newFile1);
(0, _globals.expect)(onChange).toHaveBeenNthCalledWith(2, newFile3, newFile2);
case 2:
case "end":
return _context0.stop();
}
}, _callee7);
})));
(0, _globals.test)('Entity initializer should provide the current entity', function () {
var updateIndex = 0;
var file = defaultFile;
var onFile = _globals.jest.fn();
var _renderHook9 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(function (currentFile) {
onFile(currentFile);
return currentFile !== null && currentFile !== void 0 ? currentFile : file;
}, fileUseCase, {}, [updateIndex++]);
}),
result = _renderHook9.result;
var _result$current4 = (0, _slicedToArray2["default"])(result.current, 2),
setPath1 = _result$current4[1].setPath;
(0, _globals.expect)(onFile).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onFile).toHaveBeenCalledWith(void 0);
(0, _react.act)(function () {
setPath1(PATH_1);
});
var _result$current5 = (0, _slicedToArray2["default"])(result.current, 2),
setPath2 = _result$current5[1].setPath;
(0, _globals.expect)(onFile).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, file), {}, {
ext: EXT_1,
path: PATH_1
}));
(0, _react.act)(function () {
setPath2(PATH_2);
});
(0, _globals.expect)(onFile).toHaveBeenCalledTimes(3);
(0, _globals.expect)(onFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, file), {}, {
ext: EXT_2,
path: PATH_2
}));
});
(0, _globals.test)('Do not update entity when the initializer has yielded some constant entity properties', function () {
var updateIndex = 0;
var _renderHook0 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
return _regenerator["default"].wrap(function (_context1) {
while (1) switch (_context1.prev = _context1.next) {
case 0:
_context1.next = 1;
return defaultFile;
case 1:
_context1.next = 2;
return {
path: PATH_1
};
case 2:
case "end":
return _context1.stop();
}
}, _callee8);
}), fileUseCase, {}, [updateIndex++]);
}),
result = _renderHook0.result;
var current1 = result.current;
var _current = (0, _slicedToArray2["default"])(current1, 2),
entity1 = _current[0],
setEntity = _current[1].setEntity;
(0, _globals.expect)(entity1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}));
(0, _react.act)(function () {
setEntity({
path: PATH_2
});
});
var current2 = result.current;
var _current2 = (0, _slicedToArray2["default"])(current2, 1),
entity2 = _current2[0];
(0, _globals.expect)(entity2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
}));
});
(0, _globals.test)('Should update entity when the initializer has returned some cconstant entity properties after `setEntity`', function () {
var updateIndex = 0;
var _renderHook1 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
return _regenerator["default"].wrap(function (_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
_context10.next = 1;
return defaultFile;
case 1:
return _context10.abrupt("return", {
path: PATH_1
});
case 2:
case "end":
return _context10.stop();
}
}, _callee9);
}), fileUseCase, {}, [updateIndex++]);
}),
result = _renderHook1.result;
var current1 = result.current;
var _current3 = (0, _slicedToArray2["default"])(current1, 2),
entity1 = _current3[0],
setEntity = _current3[1].setEntity;
(0, _globals.expect)(entity1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}));
(0, _react.act)(function () {
setEntity({
path: PATH_2
});
});
var current2 = result.current;
var _current4 = (0, _slicedToArray2["default"])(current2, 1),
entity2 = _current4[0];
(0, _globals.expect)(entity2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}));
});
(0, _globals.test)('Entity property accessors should be reserved in initializer', function () {
var updateIndex = 0;
var defaultFileWithAccessors = _objectSpread(_objectSpread({}, defaultFile), {}, {
get text() {
var path = this.path;
return "xyz-".concat(path);
}
});
var _renderHook10 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
return _regenerator["default"].wrap(function (_context11) {
while (1) switch (_context11.prev = _context11.next) {
case 0:
_context11.next = 1;
return defaultFileWithAccessors;
case 1:
_context11.next = 2;
return {
path: PATH_1
};
case 2:
case "end":
return _context11.stop();
}
}, _callee0);
}), fileUseCase, {}, [updateIndex++]);
}),
result = _renderHook10.result;
var current1 = result.current;
var _current5 = (0, _slicedToArray2["default"])(current1, 2),
entity1 = _current5[0],
setEntity = _current5[1].setEntity;
(0, _globals.expect)(entity1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
text: "xyz-".concat(PATH_1)
}));
(0, _react.act)(function () {
setEntity({
path: PATH_2
});
});
var current2 = result.current;
var _current6 = (0, _slicedToArray2["default"])(current2, 1),
entity2 = _current6[0];
(0, _globals.expect)(entity2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2,
text: "xyz-".concat(PATH_2)
}));
});
(0, _globals.test)('Entity property getter should always return the same object if nothing changed after component update', function () {
var updateTimes = 0;
var data = {
x: 1,
get obj() {
return {};
}
};
var _renderHook11 = (0, _react.renderHook)(function () {
var collection = (0, _.useUseCase)(data, _usecases.entityUseCase);
var _collection3 = (0, _slicedToArray2["default"])(collection, 1),
obj = _collection3[0].obj;
(0, _react2.useMemo)(function () {
void obj;
updateTimes++;
}, [obj]);
return collection;
}),
rerender = _renderHook11.rerender;
(0, _globals.expect)(updateTimes).toEqual(1);
(0, _react.act)(function () {
rerender();
});
(0, _globals.expect)(updateTimes).toEqual(1);
});
(0, _globals.test)('Entity property getter should always return a new object if something changed after component update', function () {
var updateTimes = 0;
var data = {
x: 1,
get obj() {
return {};
}
};
var _renderHook12 = (0, _react.renderHook)(function () {
var collection = (0, _.useUseCase)(data, _usecases.entityUseCase);
var _collection4 = (0, _slicedToArray2["default"])(collection, 1),
obj = _collection4[0].obj;
(0, _react2.useMemo)(function () {
void obj;
updateTimes++;
}, [obj]);
return collection;
}),
result = _renderHook12.result;
var current = result.current;
var _current7 = (0, _slicedToArray2["default"])(current, 2),
setEntity = _current7[1].setEntity;
(0, _globals.expect)(updateTimes).toEqual(1);
(0, _react.act)(function () {
setEntity({
x: 2
});
});
(0, _globals.expect)(updateTimes).toEqual(2);
});
(0, _globals.test)('Entity initializer should provide the first argument with current entity when deps has change.', function () {
var entityArg;
var times = 0;
var file = defaultFile;
var _renderHook13 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(function () {
var entity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : file;
var path = entity.path;
entityArg = entity;
return _objectSpread(_objectSpread({}, entity), {}, {
path: path + '1'
});
}, fileUseCase, {}, [times++]);
}),
result = _renderHook13.result;
var collection1 = result.current;
var _collection5 = (0, _slicedToArray2["default"])(collection1, 2),
currentFile1 = _collection5[0],
setPath = _collection5[1].setPath;
(0, _globals.expect)(entityArg).toEqual(defaultFile);
(0, _globals.expect)(currentFile1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: '1'
}));
(0, _react.act)(function () {
setPath('2');
});
var collection2 = result.current;
var _collection6 = (0, _slicedToArray2["default"])(collection2, 1),
currentFile2 = _collection6[0];
(0, _globals.expect)(entityArg).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: '2'
}));
(0, _globals.expect)(currentFile2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: '21'
}));
});
(0, _globals.test)('`reducers` should be returned as an object', function () {
var _renderHook14 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook14.result;
var cores = result.current;
var _cores2 = (0, _slicedToArray2["default"])(cores, 2),
reducers = _cores2[1];
(0, _globals.expect)((0, _typeof2["default"])(reducers)).toBe('object');
});
(0, _globals.test)('`Provider` should be returned as a function', function () {
var _renderHook15 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook15.result;
var cores = result.current;
var _cores3 = (0, _slicedToArray2["default"])(cores, 3),
Provider = _cores3[2];
(0, _globals.expect)((0, _typeof2["default"])(Provider)).toBe('function');
});
(0, _globals.test)('`usecase` should be called only once if deps has not provided', function () {
var mockUseCase = _globals.jest.fn(fileUseCase);
var _renderHook16 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, mockUseCase);
}),
result = _renderHook16.result,
rerender = _renderHook16.rerender;
var cores = result.current;
var _cores4 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores4[1].setEntity;
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
(0, _react.act)(function () {
setEntity(_objectSpread({}, defaultFile));
});
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('`usecase` should be called only once if deps has not changed', function () {
var mockUseCase = _globals.jest.fn(fileUseCase);
var _renderHook17 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [1, 'x']);
}),
result = _renderHook17.result,
rerender = _renderHook17.rerender;
var cores = result.current;
var _cores5 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores5[1].setEntity;
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
(0, _react.act)(function () {
setEntity(_objectSpread({}, defaultFile));
});
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('`usecase` should be called if deps has changed', function () {
var i = 0;
var mockUseCase = _globals.jest.fn(fileUseCase);
var _renderHook18 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [i++, 'x']);
}),
result = _renderHook18.result,
rerender = _renderHook18.rerender;
var cores = result.current;
var _cores6 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores6[1].setEntity;
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
(0, _react.act)(function () {
setEntity(_objectSpread({}, defaultFile));
});
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(2);
});
(0, _globals.test)('after call non-generator reducer, it should not trigger update', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook19 = (0, _react.renderHook)(function () {
var context = (0, _.useUseCase)(defaultFile, fileUseCase);
var _context = (0, _slicedToArray2["default"])(context, 2),
reducers = _context[1];
var isImage = reducers.isImage;
var update = (0, _ahooks.useUpdate)();
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [context]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [context]);
return function (shouldUpdate) {
isImage();
if (!shouldUpdate) {
return;
}
update();
};
}),
result = _renderHook19.result;
(0, _react.act)(function () {
result.current();
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current(true);
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
});
(0, _globals.test)('after `yield entity`, it should trigger update', function () {
var onUpdate = _globals.jest.fn();
var _renderHook20 = (0, _react.renderHook)(function () {
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
});
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook20.result;
var cores = result.current;
var _cores7 = (0, _slicedToArray2["default"])(cores, 2),
entity = _cores7[0],
reducers = _cores7[1];
var setPath = reducers.setPath,
setEntity = reducers.setEntity;
(0, _react.act)(function () {
setPath(PATH_1);
setEntity({
size: 5000
});
});
(0, _globals.expect)(result.current).not.toBe(cores);
(0, _globals.expect)(result.current[0]).not.toBe(entity);
(0, _globals.expect)(result.current[1]).not.toBe(reducers);
(0, _globals.expect)(result.current[1].setPath).not.toBe(setPath);
(0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1,
size: 5000
}));
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('after `yield entity` on async mode, it should trigger update', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
var onUpdate, _renderHook21, result, cores, _cores8, entity, reducers, readFile, promise;
return _regenerator["default"].wrap(function (_context12) {
while (1) switch (_context12.prev = _context12.next) {
case 0:
onUpdate = _globals.jest.fn();
_renderHook21 = (0, _react.renderHook)(function () {
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
});
return (0, _.useUseCase)(defaultFile, fileUseCase);
}), result = _renderHook21.result;
cores = result.current;
_cores8 = (0, _slicedToArray2["default"])(cores, 2), entity = _cores8[0], reducers = _cores8[1];
readFile = reducers.readFile;
promise = (0, _react.act)(function () {
return readFile(PATH_1);
});
(0, _globals.expect)(result.current).toBe(cores);
(0, _globals.expect)(result.current).toEqual(cores);
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
_context12.next = 1;
return promise;
case 1:
(0, _globals.expect)(result.current[0]).not.toBe(entity);
(0, _globals.expect)(result.current[1]).not.toBe(reducers);
(0, _globals.expect)(result.current[1].readFile).not.toBe(readFile);
(0, _globals.expect)(result.current[0].path).toBe(PATH_1);
(0, _globals.expect)(result.current[0].ext).toBe(EXT_1);
(0, _globals.expect)(result.current[0].size).toBe(2000);
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
case 2:
case "end":
return _context12.stop();
}
}, _callee1);
})));
(0, _globals.test)('after `yield entity` callbacks, it should trigger update', function () {
var onUpdate = _globals.jest.fn();
var _renderHook22 = (0, _react.renderHook)(function () {
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
});
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook22.result;
var cores = result.current;
var _cores9 = (0, _slicedToArray2["default"])(cores, 2),
reducers = _cores9[1];
var init = reducers.init;
(0, _react.act)(function () {
init(_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 5000
}));
});
(0, _globals.expect)(result.current[0].size).toBe(5000);
(0, _globals.expect)(result.current[1]).not.toBe(reducers);
(0, _globals.expect)(result.current[1].init).not.toBe(init);
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('reducer call should be cached if component is at rendering phase', function () {
var buttonText = 'button';
var addReducer = _globals.jest.fn(function (entity, substring) {
return entity + substring;
});
var stringUseCase = function stringUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
add: addReducer
});
};
var CacheTestComponent = function CacheTestComponent() {
var _useUseCase6 = (0, _.useUseCase)('', stringUseCase),
_useUseCase7 = (0, _slicedToArray2["default"])(_useUseCase6, 2),
add = _useUseCase7[1].add;
var update = (0, _ahooks.useUpdate)();
var onClick = function onClick() {
update();
};
add('x');
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
(0, _globals.expect)(addReducer).toHaveReturnedWith('x');
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('reducer call should not be cached if component is not at rendering phase', function () {
var buttonText = 'button';
var addReducer = _globals.jest.fn(function (entity, substring) {
return entity + substring;
});
var stringUseCase = function stringUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
add: addReducer
});
};
var CacheTestComponent = function CacheTestComponent() {
var _useUseCase8 = (0, _.useUseCase)('', stringUseCase),
_useUseCase9 = (0, _slicedToArray2["default"])(_useUseCase8, 2),
add = _useUseCase9[1].add;
var onClick = function onClick() {
add('x');
};
(0, _ahooks.useMount)(function () {
add('x');
add('x');
});
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
(0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
});
(0, _globals.test)('reducer call should not be cached if entity or parameters have changed', function () {
var count = 0;
var addedText = 'x';
var setButtonText = 'button';
var updateButtonText = 'update';
var addReducer = _globals.jest.fn(function (entity, substring) {
return entity + substring;
});
var stringUseCase = function stringUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
add: addReducer
});
};
var CacheTestComponent = function CacheTestComponent() {
var _useUseCase0 = (0, _.useUseCase)('', stringUseCase),
_useUseCase1 = (0, _slicedToArray2["default"])(_useUseCase0, 2),
_useUseCase1$ = _useUseCase1[1],
add = _useUseCase1$.add,
setEntity = _useUseCase1$.setEntity;
var update = (0, _ahooks.useUpdate)();
add(addedText);
var onSet = function onSet() {
setEntity("".concat(count++));
};
var onUpdate = function onUpdate() {
update();
};
return (0, _jsxRuntime.jsxs)("div", {
children: [(0, _jsxRuntime.jsx)("button", {
onClick: onSet,
children: setButtonText
}), (0, _jsxRuntime.jsx)("button", {
onClick: onUpdate,
children: updateButtonText
})]
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
_dom.fireEvent.click(_dom.screen.getByText(setButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
addedText = 'y';
_dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
_dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
});
(0, _globals.test)('`options.onChange` should be trigger when entity has changed', function () {
var onChange = _globals.jest.fn();
var _renderHook23 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
onChange: onChange
});
}),
result = _renderHook23.result;
var cores = result.current;
var _cores0 = (0, _slicedToArray2["default"])(cores, 2),
reducers = _cores0[1];
var setPath = reducers.setPath;
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setPath(PATH_1);
});
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onChange).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1
}), defaultFile);
});
(0, _globals.test)('`options.onChange` should always trigger the latest one', function () {
var onChange1 = _globals.jest.fn();
var onChange2 = _globals.jest.fn();
var onChange = onChange1;
var _renderHook24 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
onChange: onChange
}, []);
}),
result = _renderHook24.result;
var cores = result.current;
var _cores1 = (0, _slicedToArray2["default"])(cores, 2),
reducers = _cores1[1];
var setPath = reducers.setPath;
(0, _globals.expect)(onChange1).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setPath(PATH_1);
onChange = onChange2;
});
(0, _globals.expect)(onChange2).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onChange1).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onChange1).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1
}), defaultFile);
(0, _react.act)(function () {
setPath(PATH_2);
});
(0, _globals.expect)(onChange1).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onChange2).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onChange2).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2,
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1
}));
});
(0, _globals.test)('`options.options` should override rest options', function () {
var _renderHook25 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
pathPrefix: 'xyz/',
options: {
pathPrefix: '123/'
}
});
}),
result = _renderHook25.result;
var cores = result.current;
var _cores10 = (0, _slicedToArray2["default"])(cores, 2),
path = _cores10[0].path,
reducers = _cores10[1];
var setPath = reducers.setPath;
(0, _globals.expect)(path).toBe('');
(0, _react.act)(function () {
setPath(PATH_1);
});
(0, _globals.expect)(result.current[0].path).toBe('123/' + PATH_1);
});
(0, _globals.test)('Option functions: use `T` (not `S`) when `S extends T`', function () {
var testUseCase = function testUseCase() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var entityReducers = (0, _usecases.entityUseCase)();
void options;
return _objectSpread({}, entityReducers);
};
(0, _react.renderHook)(function () {
(0, _.useUseCase)(defaultFile, testUseCase, {
onUpdate: function onUpdate(data) {
void data;
return Promise.reject();
}
});
});
// 这个测试仅仅是为了确保类型不会报错,不验证实际逻辑
(0, _globals.expect)(1).toBe(1);
});
(0, _globals.test)('when `options` has changed, it should not trigger update', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook26 = (0, _react.renderHook)(function () {
var _useState = (0, _react2.useState)('user/'),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
pathPrefix = _useState2[0],
setPathPrefix = _useState2[1];
var context = (0, _.useUseCase)(defaultFile, fileUseCase, {
pathPrefix: pathPrefix
});
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [context]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [context]);
return setPathPrefix;
}),
result = _renderHook26.result;
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current('my/');
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
});
(0, _globals.test)('when `deps` has changed, it should trigger update', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook27 = (0, _react.renderHook)(function () {
var _useState3 = (0, _react2.useState)('user/'),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
pathPrefix = _useState4[0],
setPathPrefix = _useState4[1];
var context = (0, _.useUseCase)(defaultFile, fileUseCase, {
pathPrefix: pathPrefix
}, [pathPrefix]);
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [context]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [context]);
return setPathPrefix;
}),
result = _renderHook27.result;
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current('my/');
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('empty `deps` should not trigger update', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook28 = (0, _react.renderHook)(function () {
var _useState5 = (0, _react2.useState)('user/'),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
pathPrefix = _useState6[0],
setPathPrefix = _useState6[1];
var context = (0, _.useUseCase)(defaultFile, fileUseCase, {
pathPrefix: pathPrefix
}, []);
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [context]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [context]);
return setPathPrefix;
}),
result = _renderHook28.result;
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current('my/');
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
});
(0, _globals.test)("should call latest functions of usecase options even deps has not change", function () {
var onPathChange1 = _globals.jest.fn();
var onPathChange2 = _globals.jest.fn();
var onPathChange = onPathChange1;
var _renderHook29 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
onPathChange: onPathChange
});
}),
result = _renderHook29.result;
var context = result.current;
var _context2 = (0, _slicedToArray2["default"])(context, 2),
setPath = _context2[1].setPath;
(0, _react.act)(function () {
setPath(PATH_1);
onPathChange = onPathChange2;
});
(0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange2).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onPathChange1).toHaveBeenLastCalledWith(PATH_1, '');
(0, _react.act)(function () {
setPath(PATH_2);
});
(0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange2).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange2).toHaveBeenLastCalledWith(PATH_2, PATH_1);
});
(0, _globals.test)('`options.watch` should be trigger after entity changed', function () {
var onPathChange = _globals.jest.fn();
var onSizeChange = _globals.jest.fn();
var _renderHook30 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
watch: {
path: onPathChange,
size: onSizeChange
}
});
}),
result = _renderHook30.result;
var cores = result.current;
var _cores11 = (0, _slicedToArray2["default"])(cores, 2),
setPath = _cores11[1].setPath;
(0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setPath(PATH_1);
});
(0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1
}),
oldEntity: defaultFile,
newValue: PATH_1,
oldValue: ''
});
});
(0, _globals.test)('`options.watch` should be trigger after update entity by entity initializer', function () {
var onPathChange = _globals.jest.fn();
var _renderHook31 = (0, _react.renderHook)(function () {
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
return (0, _.useUseCase)(function () {
var currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
return _objectSpread(_objectSpread({}, currentFile), {}, {
path: path
});
}, fileUseCase, {
watch: {
path: onPathChange
}
}, [path]);
}),
rerender = _renderHook31.rerender;
(0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
rerender(PATH_1);
});
(0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}),
oldEntity: defaultFile,
newValue: PATH_1,
oldValue: ''
});
(0, _react.act)(function () {
rerender(PATH_2);
});
(0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
}),
oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}),
newValue: PATH_2,
oldValue: PATH_1
});
});
(0, _globals.test)('`options.watch` should be trigger after update entity by entity initializer at child component', function () {
var onPathChange = _globals.jest.fn();
var TestChild = function TestChild() {
(0, _.useUseCase)(fileUseCase, {
watch: {
path: onPathChange
}
});
return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
};
var TestParent = function TestParent(_ref5) {
var file = _ref5.file;
var path = file.path;
var _useUseCase10 = (0, _.useUseCase)(function () {
var currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
return _objectSpread(_objectSpread({}, currentFile), {}, {
path: path
});
}, fileUseCase, {}, [path]),
_useUseCase11 = (0, _slicedToArray2["default"])(_useUseCase10, 3),
Provider = _useUseCase11[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(TestChild, {})
});
};
var _render = (0, _react.render)((0, _jsxRuntime.jsx)(TestParent, {
file: _objectSpread({}, defaultFile)
})),
rerender = _render.rerender;
(0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
rerender((0, _jsxRuntime.jsx)(TestParent, {
file: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
})
}));
});
(0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}),
oldEntity: defaultFile,
newValue: PATH_1,
oldValue: ''
});
(0, _react.act)(function () {
rerender((0, _jsxRuntime.jsx)(TestParent, {
file: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
})
}));
});
(0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_2
}),
oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1
}),
newValue: PATH_2,
oldValue: PATH_1
});
});
(0, _globals.test)('`options.watch` should trigger the latest one', function () {
var onPathChange1 = _globals.jest.fn();
var onPathChange2 = _globals.jest.fn();
var onPathChange = onPathChange1;
var _renderHook32 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
watch: {
path: onPathChange
}
});
}),
result = _renderHook32.result;
var cores = result.current;
var _cores12 = (0, _slicedToArray2["default"])(cores, 2),
_cores12$ = _cores12[1],
setPath = _cores12$.setPath,
setEntity = _cores12$.setEntity;
(0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setPath(PATH_1);
setEntity({
size: 5000
});
onPathChange = onPathChange2;
});
(0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange1).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1
}),
oldEntity: defaultFile,
newValue: PATH_1,
oldValue: ''
});
(0, _react.act)(function () {
setPath('');
});
(0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange2).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange2).toHaveBeenLastCalledWith({
fieldPaths: ['path'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
size: 5000
}),
oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
path: PATH_1,
ext: EXT_1,
size: 5000
}),
newValue: '',
oldValue: PATH_1
});
});
(0, _globals.test)('`options.watch` should work with array field path of array', function () {
var initialData = {};
var onExtChange = _globals.jest.fn();
var onSizeChange = _globals.jest.fn();
var _renderHook33 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(initialData, fieldPathUseCase, {
watch: {
'list.ext': onExtChange,
'list.size': onSizeChange
}
});
}),
result = _renderHook33.result;
var cores = result.current;
var _cores13 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores13[1].setEntity;
(0, _react.act)(function () {
setEntity({
list: [defaultFile]
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
fieldPaths: ['list', '0', 'ext'],
newEntity: {
list: [defaultFile]
},
oldEntity: {},
newValue: '',
oldValue: void 0
});
(0, _globals.expect)(onSizeChange).toHaveBeenCalledWith({
fieldPaths: ['list', '0', 'size'],
newEntity: {
list: [defaultFile]
},
oldEntity: {},
newValue: 0,
oldValue: void 0
});
(0, _react.act)(function () {
setEntity({
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
})]
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
fieldPaths: ['list', '0', 'ext'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
})]
},
oldEntity: {
list: [defaultFile]
},
newValue: EXT_1,
oldValue: ''
});
(0, _react.act)(function () {
setEntity({
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})]
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(3);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
fieldPaths: ['list', '1', 'ext'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})]
},
oldEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
})]
},
newValue: EXT_2,
oldValue: void 0
});
(0, _globals.expect)(onSizeChange).toHaveBeenCalledWith({
fieldPaths: ['list', '1', 'size'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})]
},
oldEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
})]
},
newValue: 0,
oldValue: void 0
});
(0, _react.act)(function () {
setEntity({
nestedList: []
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(3);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(2);
(0, _react.act)(function () {
setEntity(function () {
return {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
};
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(6);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(3);
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(4, {
fieldPaths: ['list', '0', 'ext'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile],
nestedList: []
},
oldEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})],
nestedList: []
},
newValue: EXT_2,
oldValue: EXT_1
});
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(5, {
fieldPaths: ['list', '1', 'ext'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile],
nestedList: []
},
oldEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})],
nestedList: []
},
newValue: EXT_1,
oldValue: EXT_2
});
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(6, {
fieldPaths: ['list', '2', 'ext'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile],
nestedList: []
},
oldEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})],
nestedList: []
},
newValue: '',
oldValue: void 0
});
(0, _globals.expect)(onSizeChange).toHaveBeenCalledWith({
fieldPaths: ['list', '2', 'size'],
newEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile],
nestedList: []
},
oldEntity: {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
})],
nestedList: []
},
newValue: 0,
oldValue: void 0
});
(0, _react.act)(function () {
setEntity(function () {
return {
list: []
};
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(9);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(6);
var newEntity1 = {
list: [],
nestedList: []
};
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(7, {
fieldPaths: ['list', '0', 'ext'],
newEntity: newEntity1,
oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
}),
newValue: void 0,
oldValue: EXT_2
});
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(8, {
fieldPaths: ['list', '1', 'ext'],
newEntity: newEntity1,
oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
}),
newValue: void 0,
oldValue: EXT_1
});
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(9, {
fieldPaths: ['list', '2', 'ext'],
newEntity: newEntity1,
oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
}),
newValue: void 0,
oldValue: ''
});
(0, _globals.expect)(onSizeChange).toHaveBeenNthCalledWith(4, {
fieldPaths: ['list', '0', 'size'],
newEntity: newEntity1,
oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
}),
newValue: void 0,
oldValue: 0
});
(0, _globals.expect)(onSizeChange).toHaveBeenNthCalledWith(5, {
fieldPaths: ['list', '1', 'size'],
newEntity: newEntity1,
oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
}),
newValue: void 0,
oldValue: 0
});
(0, _globals.expect)(onSizeChange).toHaveBeenNthCalledWith(6, {
fieldPaths: ['list', '2', 'size'],
newEntity: newEntity1,
oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), defaultFile]
}),
newValue: void 0,
oldValue: 0
});
});
(0, _globals.test)('`options.watch` should work with field path of array length', function () {
var defaultList = [];
var onEntityLengthChange = _globals.jest.fn();
var onListLengthChange = _globals.jest.fn();
var lengthUseCase = function lengthUseCase() {
return (0, _usecases.entityUseCase)();
};
var _renderHook34 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultList, lengthUseCase, {
watch: {
length: onEntityLengthChange,
'list.length': onListLengthChange
}
});
}),
result = _renderHook34.result;
var cores = result.current;
var _cores14 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores14[1].setEntity;
(0, _globals.expect)(onEntityLengthChange).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onListLengthChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setEntity([{
list: [defaultFile, defaultFile]
}]);
});
(0, _globals.expect)(onEntityLengthChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onListLengthChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onEntityLengthChange).toHaveBeenCalledWith({
fieldPaths: ['length'],
newEntity: [{
list: [defaultFile, defaultFile]
}],
oldEntity: [],
newValue: 1,
oldValue: 0
});
(0, _globals.expect)(onListLengthChange).toHaveBeenCalledWith({
fieldPaths: ['0', 'list', 'length'],
newEntity: [{
list: [defaultFile, defaultFile]
}],
oldEntity: [],
newValue: 2,
oldValue: void 0
});
});
(0, _globals.test)('`options.watch` should work with field path of nested array', function () {
var initialData = {};
var onChange = _globals.jest.fn();
var _renderHook35 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(initialData, fieldPathUseCase, {
watch: {
'nestedList.size': onChange
}
});
}),
result = _renderHook35.result;
var cores = result.current;
var _cores15 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores15[1].setEntity;
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setEntity({
nestedList: [[[defaultFile]]]
});
});
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onChange).toHaveBeenCalledWith({
fieldPaths: ['nestedList', '0', '0', '0', 'size'],
newEntity: {
nestedList: [[[defaultFile]]]
},
oldEntity: {},
newValue: 0,
oldValue: void 0
});
(0, _react.act)(function () {
setEntity({
nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 100
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
size: 200
})]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 300
})]]]
});
});
(0, _globals.expect)(onChange).toHaveBeenCalledTimes(4);
(0, _globals.expect)(onChange).toHaveBeenNthCalledWith(2, {
fieldPaths: ['nestedList', '0', '0', '0', 'size'],
newEntity: {
nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 100
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
size: 200
})]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 300
})]]]
},
oldEntity: {
nestedList: [[[defaultFile]]]
},
newValue: 100,
oldValue: 0
});
(0, _globals.expect)(onChange).toHaveBeenNthCalledWith(3, {
fieldPaths: ['nestedList', '0', '0', '1', 'size'],
newEntity: {
nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 100
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
size: 200
})]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 300
})]]]
},
oldEntity: {
nestedList: [[[defaultFile]]]
},
newValue: 200,
oldValue: void 0
});
(0, _globals.expect)(onChange).toHaveBeenNthCalledWith(4, {
fieldPaths: ['nestedList', '1', '0', '0', 'size'],
newEntity: {
nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 100
}), _objectSpread(_objectSpread({}, defaultFile), {}, {
size: 200
})]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
size: 300
})]]]
},
oldEntity: {
nestedList: [[[defaultFile]]]
},
newValue: 300,
oldValue: void 0
});
});
(0, _globals.test)('`options.watch` should work with field path of object', function () {
var initialData = {};
var onExtChange = _globals.jest.fn();
var onSizeChange = _globals.jest.fn();
var _renderHook36 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(initialData, fieldPathUseCase, {
watch: {
'obj.file.ext': onExtChange,
'obj.file.size': onSizeChange
}
});
}),
result = _renderHook36.result;
var cores = result.current;
var _cores16 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores16[1].setEntity;
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
setEntity({
obj: {
file: {
ext: EXT_1
}
}
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
fieldPaths: ['obj', 'file', 'ext'],
newEntity: {
obj: {
file: {
ext: EXT_1
}
}
},
oldEntity: {},
newValue: EXT_1,
oldValue: void 0
});
(0, _react.act)(function () {
setEntity(function () {
return {
obj: {
file: {}
}
};
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
fieldPaths: ['obj', 'file', 'ext'],
newEntity: {
obj: {
file: {}
}
},
oldEntity: {
obj: {
file: {
ext: EXT_1
}
}
},
newValue: void 0,
oldValue: EXT_1
});
});
(0, _globals.test)('multiple `Provider` should work', function () {
var onNumberMount = _globals.jest.fn();
var onStringMount = _globals.jest.fn();
var onBooleanMount = _globals.jest.fn();
var numberUseCase = function numberUseCase() {
return (0, _usecases.entityUseCase)();
};
var stringUseCase = function stringUseCase() {
return (0, _usecases.entityUseCase)();
};
var booleanUseCase = function booleanUseCase() {
return (0, _usecases.entityUseCase)();
};
var TestChildComponent = function TestChildComponent() {
var _useUseCase12 = (0, _.useUseCase)(numberUseCase),
_useUseCase13 = (0, _slicedToArray2["default"])(_useUseCase12, 1),
numberValue = _useUseCase13[0];
var _useUseCase14 = (0, _.useUseCase)(stringUseCase),
_useUseCase15 = (0, _slicedToArray2["default"])(_useUseCase14, 1),
stringValue = _useUseCase15[0];
var _useUseCase16 = (0, _.useUseCase)(booleanUseCase),
_useUseCase17 = (0, _slicedToArray2["default"])(_useUseCase16, 1),
booleanValue = _useUseCase17[0];
(0, _ahooks.useMount)(function () {
onNumberMount(numberValue);
onStringMount(stringValue);
onBooleanMount(booleanValue);
});
return null;
};
var TestParentComponent = function TestParentComponent() {
var _useUseCase18 = (0, _.useUseCase)(11, numberUseCase),
_useUseCase19 = (0, _slicedToArray2["default"])(_useUseCase18, 3),
NumberProvider = _useUseCase19[2];
var _useUseCase20 = (0, _.useUseCase)('hello', stringUseCase),
_useUseCase21 = (0, _slicedToArray2["default"])(_useUseCase20, 3),
StringProvider = _useUseCase21[2];
var _useUseCase22 = (0, _.useUseCase)(true, booleanUseCase),
_useUseCase23 = (0, _slicedToArray2["default"])(_useUseCase22, 3),
BooleanProvider = _useUseCase23[2];
return (0, _jsxRuntime.jsx)(NumberProvider, {
"with": [StringProvider, BooleanProvider],
children: (0, _jsxRuntime.jsx)(TestChildComponent, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(TestParentComponent, {}));
(0, _globals.expect)(onNumberMount).toHaveBeenCalledWith(11);
(0, _globals.expect)(onStringMount).toHaveBeenCalledWith('hello');
(0, _globals.expect)(onBooleanMount).toHaveBeenCalledWith(true);
});
(0, _globals.test)('`bindEntity` should be called when component mount', function () {
var bindEntity = _globals.jest.fn(function (entity) {
void entity;
});
var testUseCase = function testUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
bindEntity: bindEntity
});
};
(0, _react.renderHook)(function () {
var _useUseCase24 = (0, _.useUseCase)(5, testUseCase),
_useUseCase25 = (0, _slicedToArray2["default"])(_useUseCase24, 2),
setEntity = _useUseCase25[1].setEntity;
(0, _ahooks.useMount)(function () {
setEntity(100);
});
});
(0, _globals.expect)(bindEntity).toHaveBeenCalledTimes(1);
(0, _globals.expect)(bindEntity).toHaveBeenCalledWith(5);
});
(0, _globals.test)('`unbindEntity` should be called when component unmount', function () {
var unbindEntity = _globals.jest.fn(function (entity) {
void entity;
});
var testUseCase = function testUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
unbindEntity: unbindEntity
});
};
var _renderHook37 = (0, _react.renderHook)(function () {
var _useUseCase26 = (0, _.useUseCase)(5, testUseCase),
_useUseCase27 = (0, _slicedToArray2["default"])(_useUseCase26, 2),
setEntity = _useUseCase27[1].setEntity;
(0, _ahooks.useMount)(function () {
setEntity(100);
});
}),
unmount = _renderHook37.unmount;
(0, _globals.expect)(unbindEntity).toHaveBeenCalledTimes(0);
unmount();
(0, _globals.expect)(unbindEntity).toHaveBeenCalledTimes(1);
(0, _globals.expect)(unbindEntity).toHaveBeenCalledWith(100);
});
});
(0, _globals.describe)('`useUseCase` should work the same as `useContextualCoreCollection`', function () {
(0, _globals.test)('Provider should be returned in child component', function () {
var onCore = _globals.jest.fn();
var TestChild = function TestChild() {
var core = (0, _.useUseCase)(fileUseCase);
var length = core.length;
var _core = (0, _slicedToArray2["default"])(core, 3),
file = _core[0],
Provider = _core[2];
(0, _react2.useEffect)(function () {
onCore(file, length, (0, _typeof2["default"])(Provider));
});
return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
};
var TestParent = function TestParent() {
var _useUseCase28 = (0, _.useUseCase)(function () {
return _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
});
}, fileUseCase),
_useUseCase29 = (0, _slicedToArray2["default"])(_useUseCase28, 3),
Provider = _useUseCase29[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(TestChild, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(TestParent, {}));
(0, _globals.expect)(onCore).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}), 3, 'function');
});
(0, _globals.test)('Provider should work in child component or popup component', function () {
var onChange = _globals.jest.fn();
var onRootFile = _globals.jest.fn();
var onPopupFile = _globals.jest.fn();
var buttonText = 'button';
var Popup = function Popup() {
var _useUseCase30 = (0, _.useUseCase)(fileUseCase),
_useUseCase31 = (0, _slicedToArray2["default"])(_useUseCase30, 2),
file = _useUseCase31[0],
setEntity = _useUseCase31[1].setEntity;
var onClick = function onClick() {
setEntity({
ext: EXT_2
});
};
(0, _react2.useEffect)(function () {
onPopupFile(file);
}, [file]);
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
var TestChild = function TestChild() {
var _useUseCase32 = (0, _.useUseCase)(fileUseCase),
_useUseCase33 = (0, _slicedToArray2["default"])(_useUseCase32, 3),
Provider = _useUseCase33[2];
return (0, _reactDom.createPortal)((0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(Popup, {})
}), document.body);
};
var TestParent = function TestParent() {
var _useUseCase34 = (0, _.useUseCase)(function () {
return _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
});
}, fileUseCase, {
onChange: onChange
}),
_useUseCase35 = (0, _slicedToArray2["default"])(_useUseCase34, 3),
file = _useUseCase35[0],
Provider = _useUseCase35[2];
(0, _react2.useEffect)(function () {
onRootFile(file);
}, [file]);
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(TestChild, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(TestParent, {}));
(0, _globals.expect)(onRootFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}));
(0, _globals.expect)(onPopupFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1
}));
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(onRootFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}));
(0, _globals.expect)(onPopupFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_2
}));
});
(0, _globals.test)('Should trigger Parent & Child to update', function () {
var onParentUpdate = _globals.jest.fn();
var onChildUpdate = _globals.jest.fn();
var onPathChange = _globals.jest.fn();
var onUndefinedEntity = _globals.jest.fn();
var onSetPath = _globals.jest.fn(function () {
return PATH_1;
});
(0, _react.render)((0, _jsxRuntime.jsx)("div", {
children: (0, _jsxRuntime.jsx)(Parent, {
onSetPath: onSetPath,
onUpdate: onParentUpdate,
children: (0, _jsxRuntime.jsx)(Child, {
onUpdate: onChildUpdate,
onPathChange: onPathChange,
onUndefinedEntity: onUndefinedEntity
})
})
}));
_dom.fireEvent.click(_dom.screen.getByText(PARENT_BUTTON_TEXT));
(0, _globals.expect)(onSetPath).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onParentUpdate).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onChildUpdate).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onPathChange).toHaveBeenCalledWith(PATH_1);
_dom.fireEvent.click(_dom.screen.getByText(CHILD_BUTTON_TEXT));
(0, _globals.expect)(onSetPath).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onParentUpdate).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onChildUpdate).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onPathChange).toHaveBeenCalledWith(PATH_2);
(0, _globals.expect)(onUndefinedEntity).toHaveBeenCalledTimes(0);
});
(0, _globals.test)('`usecase` should not be called at child component', function () {
var mockUseCase = _globals.jest.fn(fileUseCase);
var A = function A() {
(0, _.useUseCase)(mockUseCase);
return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
};
var B = function B() {
var _useUseCase36 = (0, _.useUseCase)(defaultFile, mockUseCase),
_useUseCase37 = (0, _slicedToArray2["default"])(_useUseCase36, 3),
Provider = _useUseCase37[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('reducer call should be cached if component is at rendering phase in child components', function () {
var buttonText = 'button';
var addReducer = _globals.jest.fn(function (entity, substring) {
return entity + substring;
});
var stringUseCase = function stringUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
add: addReducer
});
};
var A = function A() {
var _useUseCase38 = (0, _.useUseCase)(stringUseCase),
_useUseCase39 = (0, _slicedToArray2["default"])(_useUseCase38, 2),
add = _useUseCase39[1].add;
var update = (0, _ahooks.useUpdate)();
var onClick = function onClick() {
update();
};
add('x');
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
var B = function B() {
var _useUseCase40 = (0, _.useUseCase)('', stringUseCase),
_useUseCase41 = (0, _slicedToArray2["default"])(_useUseCase40, 3),
Provider = _useUseCase41[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
(0, _globals.expect)(addReducer).toHaveReturnedWith('x');
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('reducer call should not be cached if component is not at rendering phase in child components', function () {
var buttonText = 'button';
var addReducer = _globals.jest.fn(function (entity, substring) {
return entity + substring;
});
var stringUseCase = function stringUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
add: addReducer
});
};
var A = function A() {
var _useUseCase42 = (0, _.useUseCase)(stringUseCase),
_useUseCase43 = (0, _slicedToArray2["default"])(_useUseCase42, 2),
add = _useUseCase43[1].add;
var onClick = function onClick() {
add('x');
};
(0, _ahooks.useMount)(function () {
add('x');
add('x');
});
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
var B = function B() {
var _useUseCase44 = (0, _.useUseCase)('', stringUseCase),
_useUseCase45 = (0, _slicedToArray2["default"])(_useUseCase44, 3),
Provider = _useUseCase45[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
(0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
});
(0, _globals.test)('reducer call should not be cached if entity or parameters have changed in child components', function () {
var count = 0;
var addedText = 'x';
var setButtonText = 'button';
var updateButtonText = 'update';
var addReducer = _globals.jest.fn(function (entity, substring) {
return entity + substring;
});
var stringUseCase = function stringUseCase() {
var entityReducers = (0, _usecases.entityUseCase)();
return _objectSpread(_objectSpread({}, entityReducers), {}, {
add: addReducer
});
};
var A = function A() {
var _useUseCase46 = (0, _.useUseCase)(stringUseCase),
_useUseCase47 = (0, _slicedToArray2["default"])(_useUseCase46, 2),
_useUseCase47$ = _useUseCase47[1],
add = _useUseCase47$.add,
setEntity = _useUseCase47$.setEntity;
var update = (0, _ahooks.useUpdate)();
add(addedText);
var onSet = function onSet() {
setEntity("".concat(count++));
};
var onUpdate = function onUpdate() {
update();
};
return (0, _jsxRuntime.jsxs)("div", {
children: [(0, _jsxRuntime.jsx)("button", {
onClick: onSet,
children: setButtonText
}), (0, _jsxRuntime.jsx)("button", {
onClick: onUpdate,
children: updateButtonText
})]
});
};
var B = function B() {
var _useUseCase48 = (0, _.useUseCase)('', stringUseCase),
_useUseCase49 = (0, _slicedToArray2["default"])(_useUseCase48, 3),
Provider = _useUseCase49[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
_dom.fireEvent.click(_dom.screen.getByText(setButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
addedText = 'y';
_dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
_dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
});
(0, _globals.test)('`options.onChange` event should be trigger in orders', function () {
var changeTimes = 0;
var updateChangeTimes = function updateChangeTimes() {
return ++changeTimes;
};
var onChangeA = _globals.jest.fn(updateChangeTimes);
var onChangeB = _globals.jest.fn(updateChangeTimes);
var onChangeC = _globals.jest.fn(updateChangeTimes);
var buttonText = 'my button';
var A = function A(_ref6) {
var children = _ref6.children;
(0, _.useUseCase)(fileUseCase, {
onChange: onChangeA
});
return (0, _jsxRuntime.jsx)(_react2.Fragment, {
children: children
});
};
var B = function B() {
(0, _.useUseCase)(fileUseCase, {
onChange: onChangeB
});
return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
};
var C = function C() {
var _useUseCase50 = (0, _.useUseCase)(defaultFile, fileUseCase, {
onChange: onChangeC
}),
_useUseCase51 = (0, _slicedToArray2["default"])(_useUseCase50, 3),
setPath = _useUseCase51[1].setPath,
Provider = _useUseCase51[2];
var onFirstClick = function onFirstClick() {
setPath(PATH_1);
};
return (0, _jsxRuntime.jsxs)(Provider, {
children: [(0, _jsxRuntime.jsx)(A, {
children: (0, _jsxRuntime.jsx)(B, {})
}), (0, _jsxRuntime.jsx)("button", {
onClick: onFirstClick,
children: buttonText
})]
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(C, {}));
(0, _globals.expect)(changeTimes).toBe(0);
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
(0, _globals.expect)(onChangeB).toHaveReturnedWith(3);
(0, _globals.expect)(onChangeC).toHaveReturnedWith(1);
});
(0, _globals.test)('`options.onChange` should always trigger the latest one in child components', function () {
var onFirstChange = _globals.jest.fn();
var onSecondChange = _globals.jest.fn();
var onChange = onFirstChange;
var firstButtonText = 'first button';
var secondButtonText = 'second button';
var A = function A() {
var _useUseCase52 = (0, _.useUseCase)(fileUseCase, {
onChange: onChange
}),
_useUseCase53 = (0, _slicedToArray2["default"])(_useUseCase52, 2),
setPath = _useUseCase53[1].setPath;
var onFirstClick = function onFirstClick() {
setPath(PATH_1);
onChange = onSecondChange;
};
var onSecondClick = function onSecondClick() {
setPath('');
};
return (0, _jsxRuntime.jsxs)(_react2.Fragment, {
children: [(0, _jsxRuntime.jsx)("button", {
onClick: onFirstClick,
children: firstButtonText
}), (0, _jsxRuntime.jsx)("button", {
onClick: onSecondClick,
children: secondButtonText
})]
});
};
var B = function B() {
var _useUseCase54 = (0, _.useUseCase)(defaultFile, fileUseCase),
_useUseCase55 = (0, _slicedToArray2["default"])(_useUseCase54, 3),
Provider = _useUseCase55[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(0);
_dom.fireEvent.click(_dom.screen.getByText(firstButtonText));
(0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondChange).toHaveBeenCalledTimes(0);
_dom.fireEvent.click(_dom.screen.getByText(secondButtonText));
(0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondChange).toHaveBeenLastCalledWith(defaultFile, _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1,
path: PATH_1
}));
});
(0, _globals.test)('`options.watch` should be trigger at child elements', function () {
var onExtChange = _globals.jest.fn();
var firstButtonText = 'first button';
var A = function A() {
var _useUseCase56 = (0, _.useUseCase)(fileUseCase, {
watch: {
ext: onExtChange
}
}),
_useUseCase57 = (0, _slicedToArray2["default"])(_useUseCase56, 2),
setPath = _useUseCase57[1].setPath;
var onFirstClick = function onFirstClick() {
setPath(PATH_1);
};
return (0, _jsxRuntime.jsx)("button", {
onClick: onFirstClick,
children: firstButtonText
});
};
var B = function B() {
var _useUseCase58 = (0, _.useUseCase)(defaultFile, fileUseCase, {}),
_useUseCase59 = (0, _slicedToArray2["default"])(_useUseCase58, 3),
Provider = _useUseCase59[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(0);
_dom.fireEvent.click(_dom.screen.getByText(firstButtonText));
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onExtChange).toHaveBeenLastCalledWith({
fieldPaths: ['ext'],
newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1,
path: PATH_1
}),
oldEntity: defaultFile,
newValue: EXT_1,
oldValue: ''
});
});
(0, _globals.test)('`options.watch` should be trigger in orders', function () {
var changeTimes = 0;
var updateChangeTimes = function updateChangeTimes(e) {
void e;
return ++changeTimes;
};
var onChangeA = _globals.jest.fn(updateChangeTimes);
var onChangeB = _globals.jest.fn(updateChangeTimes);
var onChangeC = _globals.jest.fn(updateChangeTimes);
var buttonText = 'my button';
var A = function A(_ref7) {
var children = _ref7.children;
(0, _.useUseCase)(fileUseCase, {
watch: {
ext: onChangeA
}
});
return (0, _jsxRuntime.jsx)(_react2.Fragment, {
children: children
});
};
var B = function B() {
(0, _.useUseCase)(fileUseCase, {
watch: {
ext: onChangeB
}
});
return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
};
var C = function C() {
var _useUseCase60 = (0, _.useUseCase)(defaultFile, fileUseCase, {
watch: {
ext: onChangeC
}
}),
_useUseCase61 = (0, _slicedToArray2["default"])(_useUseCase60, 3),
setPath = _useUseCase61[1].setPath,
Provider = _useUseCase61[2];
var onFirstClick = function onFirstClick() {
setPath(PATH_1);
};
return (0, _jsxRuntime.jsxs)(Provider, {
children: [(0, _jsxRuntime.jsx)(A, {
children: (0, _jsxRuntime.jsx)(B, {})
}), (0, _jsxRuntime.jsx)("button", {
onClick: onFirstClick,
children: buttonText
})]
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(C, {}));
(0, _globals.expect)(changeTimes).toBe(0);
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
(0, _globals.expect)(onChangeB).toHaveReturnedWith(3);
(0, _globals.expect)(onChangeC).toHaveReturnedWith(1);
});
(0, _globals.test)('`options.watch` should trigger the latest one in child components', function () {
var onFirstExtChange = _globals.jest.fn();
var onSecondExtChange = _globals.jest.fn();
var onExtChange = onFirstExtChange;
var firstButtonText = 'first button';
var secondButtonText = 'second button';
var A = function A() {
var _useUseCase62 = (0, _.useUseCase)(fileUseCase, {
watch: {
ext: onExtChange
}
}),
_useUseCase63 = (0, _slicedToArray2["default"])(_useUseCase62, 2),
setPath = _useUseCase63[1].setPath;
var onFirstClick = function onFirstClick() {
setPath(PATH_1);
onExtChange = onSecondExtChange;
};
var onSecondClick = function onSecondClick() {
setPath('');
};
return (0, _jsxRuntime.jsxs)(_react2.Fragment, {
children: [(0, _jsxRuntime.jsx)("button", {
onClick: onFirstClick,
children: firstButtonText
}), (0, _jsxRuntime.jsx)("button", {
onClick: onSecondClick,
children: secondButtonText
})]
});
};
var B = function B() {
var _useUseCase64 = (0, _.useUseCase)(defaultFile, fileUseCase),
_useUseCase65 = (0, _slicedToArray2["default"])(_useUseCase64, 3),
Provider = _useUseCase65[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(0);
_dom.fireEvent.click(_dom.screen.getByText(firstButtonText));
(0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondExtChange).toHaveBeenCalledTimes(0);
_dom.fireEvent.click(_dom.screen.getByText(secondButtonText));
(0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondExtChange).toHaveBeenLastCalledWith({
fieldPaths: ['ext'],
newEntity: defaultFile,
oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
ext: EXT_1,
path: PATH_1
}),
newValue: '',
oldValue: EXT_1
});
});
});
(0, _globals.describe)('`useUseCase` should work the same as `useReducers`', function () {
(0, _globals.test)('`entity` should equal `defaultFile`', function () {
var _renderHook38 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mathUseCase);
}),
result = _renderHook38.result;
var reducers = result.current;
(0, _globals.expect)(Array.isArray(reducers)).toBe(false);
});
(0, _globals.test)('returned reducer should work', function () {
var _renderHook39 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mathUseCase);
}),
result = _renderHook39.result;
var reducers = result.current;
var add = reducers.add;
(0, _globals.expect)(add(1, 2)).toBe(3);
});
(0, _globals.test)('`usecase` should be called only once if deps has not provided', function () {
var mockUseCase = _globals.jest.fn(mathUseCase);
var _renderHook40 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mockUseCase);
}),
rerender = _renderHook40.rerender;
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('`usecase` should be called only once if deps has not changed', function () {
var mockUseCase = _globals.jest.fn(mathUseCase);
var _renderHook41 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mockUseCase, {}, [1, 'x']);
}),
rerender = _renderHook41.rerender;
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('`usecase` should be called if deps has changed', function () {
var i = 0;
var mockUseCase = _globals.jest.fn(mathUseCase);
var _renderHook42 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mockUseCase, {}, [i++, 'x']);
}),
rerender = _renderHook42.rerender;
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(2);
});
(0, _globals.test)('reducer call should not be cached if component is at rendering phase', function () {
var buttonText = 'button';
var CacheTestComponent = function CacheTestComponent() {
var _useUseCase66 = (0, _.useUseCase)(mathUseCase),
subtraction = _useUseCase66.subtraction;
var update = (0, _ahooks.useUpdate)();
var onClick = function onClick() {
update();
};
subtraction(5, 3);
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledWith(5, 3);
(0, _globals.expect)(subtractionReducer).toHaveReturnedWith(2);
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(3);
});
(0, _globals.test)('reducer call should not be cached if component is not at rendering phase', function () {
var buttonText = 'button';
var CacheTestComponent = function CacheTestComponent() {
var _useUseCase67 = (0, _.useUseCase)(mathUseCase),
subtraction = _useUseCase67.subtraction;
var onClick = function onClick() {
subtraction(5, 3);
};
(0, _ahooks.useMount)(function () {
subtraction(5, 3);
subtraction(5, 3);
});
return (0, _jsxRuntime.jsx)("button", {
onClick: onClick,
children: buttonText
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(subtractionReducer).toHaveBeenNthCalledWith(1, 5, 3);
(0, _globals.expect)(subtractionReducer).toHaveNthReturnedWith(1, 2);
(0, _globals.expect)(subtractionReducer).toHaveBeenNthCalledWith(2, 5, 3);
(0, _globals.expect)(subtractionReducer).toHaveNthReturnedWith(2, 2);
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(subtractionReducer).toHaveBeenNthCalledWith(3, 5, 3);
(0, _globals.expect)(subtractionReducer).toHaveNthReturnedWith(3, 2);
});
(0, _globals.test)('reducer call should not be cached if parameters have changed', function () {
var count = 0;
var buttonText = 'button';
var StringUseCaseTestComponent = function StringUseCaseTestComponent() {
var _useUseCase68 = (0, _.useUseCase)(mathUseCase),
subtraction = _useUseCase68.subtraction;
var update = (0, _ahooks.useUpdate)();
subtraction(5, count++);
var onUpdate = function onUpdate() {
update();
};
return (0, _jsxRuntime.jsx)("div", {
children: (0, _jsxRuntime.jsx)("button", {
onClick: onUpdate,
children: buttonText
})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(StringUseCaseTestComponent, {}));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledWith(5, 0);
_dom.fireEvent.click(_dom.screen.getByText(buttonText));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledWith(5, 1);
(0, _globals.expect)(subtractionReducer).toHaveReturnedWith(4);
});
(0, _globals.test)('`options.extraValue` should be added after call `add` method', function () {
var _renderHook43 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mathUseCase, {
extraValue: 5
});
}),
result = _renderHook43.result;
var reducers = result.current;
var add = reducers.add;
(0, _globals.expect)(add(1, 2)).toBe(8);
});
(0, _globals.test)('when `options` has changed, it should not trigger update', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook44 = (0, _react.renderHook)(function () {
var _useState7 = (0, _react2.useState)(0),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
extraValue = _useState8[0],
setExtraValue = _useState8[1];
var reducers = (0, _.useUseCase)(mathUseCase, {
extraValue: extraValue
});
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [reducers]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [reducers]);
return setExtraValue;
}),
result = _renderHook44.result;
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current(3);
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
});
(0, _globals.test)('when `deps` change, it should update reducers', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook45 = (0, _react.renderHook)(function () {
var _useState9 = (0, _react2.useState)(0),
_useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
extraValue = _useState0[0],
setExtraValue = _useState0[1];
var reducers = (0, _.useUseCase)(mathUseCase, {
extraValue: extraValue
}, [extraValue]);
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [reducers]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [reducers]);
return setExtraValue;
}),
result = _renderHook45.result;
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current(3);
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(1);
});
(0, _globals.test)('empty `deps` should not update reducers', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook46 = (0, _react.renderHook)(function () {
var _useState1 = (0, _react2.useState)(0),
_useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
extraValue = _useState10[0],
setExtraValue = _useState10[1];
var reducers = (0, _.useUseCase)(mathUseCase, {
extraValue: extraValue
}, []);
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [reducers]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [reducers]);
return setExtraValue;
}),
result = _renderHook46.result;
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
(0, _react.act)(function () {
result.current(3);
});
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
});
(0, _globals.test)('should not trigger update', function () {
var onUpdate = _globals.jest.fn();
(0, _react.render)((0, _jsxRuntime.jsx)(MathParent, {
onUpdate: onUpdate
}));
_dom.fireEvent.click(_dom.screen.getByText(PARENT_BUTTON_TEXT));
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
});
});
});