@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
2,153 lines • 88.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
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 _jsxRuntime = require("react/jsx-runtime");
var _usecases = require("@mic-rexjs/usecases");
var _globals = require("@jest/globals");
var _react = require("@testing-library/react");
var _ = require(".");
var _ahooks = require("ahooks");
var _react2 = require("react");
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.objectUseCase)();
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 _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return function () {
return newEntity;
};
case 2:
case "end":
return _context.stop();
}
}, _callee);
})();
};
var setPath = /*#__PURE__*/_regenerator["default"].mark(function setPath(entity, path) {
var _path$match;
var oldPath, newPath;
return _regenerator["default"].wrap(function setPath$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
oldPath = entity.path;
newPath = pathPrefix + path;
_context2.next = 4;
return _objectSpread(_objectSpread({}, entity), {}, {
path: newPath,
ext: ((_path$match = path.match(/\.[^.]+$/)) === null || _path$match === void 0 ? void 0 : _path$match[0]) || ''
});
case 4:
onPathChange === null || onPathChange === void 0 || onPathChange(newPath, oldPath);
case 5:
case "end":
return _context2.stop();
}
}, setPath);
});
var readFile = /*#__PURE__*/function () {
var _ref = (0, _wrapAsyncGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(entity, path) {
var size;
return _regenerator["default"].wrap(function _callee2$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
size = 2000;
return _context3.delegateYield((0, _asyncGeneratorDelegate2["default"])(_asyncIterator(setPath(entity, path)), _awaitAsyncGenerator2["default"]), "t0", 2);
case 2:
_context3.next = 4;
return (0, _awaitAsyncGenerator2["default"])(Promise.resolve(null));
case 4:
_context3.next = 6;
return function (oldEntity) {
return _objectSpread(_objectSpread({}, oldEntity), {}, {
size: size
});
};
case 6:
return _context3.abrupt("return", size);
case 7:
case "end":
return _context3.stop();
}
}, _callee2);
}));
return function readFile(_x, _x2) {
return _ref.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.objectUseCase)();
};
var Child = function Child(_ref2) {
var _ref2$textPrefix = _ref2.textPrefix,
textPrefix = _ref2$textPrefix === void 0 ? '' : _ref2$textPrefix,
onUpdate = _ref2.onUpdate,
onPathChange = _ref2.onPathChange,
onUndefinedEntity = _ref2.onUndefinedEntity;
var _useUseCase = (0, _.useUseCase)(fileUseCase),
_useUseCase2 = (0, _slicedToArray2["default"])(_useUseCase, 2),
file = _useUseCase2[0],
setPath = _useUseCase2[1].setPath;
var _ref3 = file || {},
path = _ref3.path,
ext = _ref3.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(_ref4) {
var children = _ref4.children,
onUpdate = _ref4.onUpdate,
onSetPath = _ref4.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(_ref5) {
var _ref5$extraValue = _ref5.extraValue,
extraValue = _ref5$extraValue === void 0 ? 0 : _ref5$extraValue,
onUpdate = _ref5.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);
(0, _react2.useEffect)(function () {
return function () {
isFirstRef.current = false;
};
});
_ahooks.useDeepCompareEffect.call(null, function () {
if (isFirstRef.current) {
return;
}
callback();
}, deps);
};
(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).toBe(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)('`reducers` should be returned as an object', function () {
var _renderHook6 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook6.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 _renderHook7 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook7.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 _renderHook8 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, mockUseCase);
}),
result = _renderHook8.result,
rerender = _renderHook8.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 _renderHook9 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [1, 'x']);
}),
result = _renderHook9.result,
rerender = _renderHook9.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 _renderHook10 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [i++, 'x']);
}),
result = _renderHook10.result,
rerender = _renderHook10.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(2);
rerender();
(0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(3);
});
(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 _renderHook11 = (0, _react.renderHook)(function () {
var context = (0, _.useUseCase)(defaultFile, fileUseCase);
var _context4 = (0, _slicedToArray2["default"])(context, 2),
reducers = _context4[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 = _renderHook11.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 _renderHook12 = (0, _react.renderHook)(function () {
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
});
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook12.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 _callee3() {
var onUpdate, _renderHook13, result, cores, _cores8, entity, reducers, readFile, promise;
return _regenerator["default"].wrap(function _callee3$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
onUpdate = _globals.jest.fn();
_renderHook13 = (0, _react.renderHook)(function () {
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
});
return (0, _.useUseCase)(defaultFile, fileUseCase);
}), result = _renderHook13.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);
_context5.next = 11;
return promise;
case 11:
(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 18:
case "end":
return _context5.stop();
}
}, _callee3);
})));
(0, _globals.test)('after `yield entity` callbacks, it should trigger update', function () {
var onUpdate = _globals.jest.fn();
var _renderHook14 = (0, _react.renderHook)(function () {
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
});
return (0, _.useUseCase)(defaultFile, fileUseCase);
}),
result = _renderHook14.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');
_react.fireEvent.click(_react.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');
_react.fireEvent.click(_react.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 _useUseCase10 = (0, _.useUseCase)('', stringUseCase),
_useUseCase11 = (0, _slicedToArray2["default"])(_useUseCase10, 2),
_useUseCase11$ = _useUseCase11[1],
add = _useUseCase11$.add,
setEntity = _useUseCase11$.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');
_react.fireEvent.click(_react.screen.getByText(setButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
addedText = 'y';
_react.fireEvent.click(_react.screen.getByText(updateButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
_react.fireEvent.click(_react.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 _renderHook15 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
onChange: onChange
});
}),
result = _renderHook15.result;
var cores = result.current;
var _cores10 = (0, _slicedToArray2["default"])(cores, 2),
reducers = _cores10[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 _renderHook16 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
onChange: onChange
}, []);
}),
result = _renderHook16.result;
var cores = result.current;
var _cores11 = (0, _slicedToArray2["default"])(cores, 2),
reducers = _cores11[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 _renderHook17 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
pathPrefix: 'xyz/',
options: {
pathPrefix: '123/'
}
});
}),
result = _renderHook17.result;
var cores = result.current;
var _cores12 = (0, _slicedToArray2["default"])(cores, 2),
path = _cores12[0].path,
reducers = _cores12[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)('when `options` has changed, it should not trigger update', function () {
var onUpdate = _globals.jest.fn();
var onDeepUpdate = _globals.jest.fn();
var _renderHook18 = (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 = _renderHook18.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 _renderHook19 = (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 = _renderHook19.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 _renderHook20 = (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 = _renderHook20.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 _renderHook21 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
onPathChange: onPathChange
});
}),
result = _renderHook21.result;
var context = result.current;
var _context6 = (0, _slicedToArray2["default"])(context, 2),
setPath = _context6[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 _renderHook22 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
watch: {
path: onPathChange,
size: onSizeChange
}
});
}),
result = _renderHook22.result;
var cores = result.current;
var _cores13 = (0, _slicedToArray2["default"])(cores, 2),
setPath = _cores13[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 trigger the latest one', function () {
var onPathChange1 = _globals.jest.fn();
var onPathChange2 = _globals.jest.fn();
var onPathChange = onPathChange1;
var _renderHook23 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(defaultFile, fileUseCase, {
watch: {
path: onPathChange
}
});
}),
result = _renderHook23.result;
var cores = result.current;
var _cores14 = (0, _slicedToArray2["default"])(cores, 2),
_cores14$ = _cores14[1],
setPath = _cores14$.setPath,
setEntity = _cores14$.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 _renderHook24 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(initialData, fieldPathUseCase, {
watch: {
'list.ext': onExtChange,
'list.size': onSizeChange
}
});
}),
result = _renderHook24.result;
var cores = result.current;
var _cores15 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores15[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]
},
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]
},
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]
},
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]
},
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 {};
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(9);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(6);
(0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(7, {
fieldPaths: ['list', '0', 'ext'],
newEntity: {},
oldEntity: {
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: {},
oldEntity: {
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: {},
oldEntity: {
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: {},
oldEntity: {
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: {},
oldEntity: {
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: {},
oldEntity: {
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 onEntityLengthChange = _globals.jest.fn();
var onListLengthChange = _globals.jest.fn();
var lengthUseCase = function lengthUseCase() {
return (0, _usecases.entityUseCase)();
};
var _renderHook25 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)([], lengthUseCase, {
watch: {
length: onEntityLengthChange,
'list.length': onListLengthChange
}
});
}),
result = _renderHook25.result;
var cores = result.current;
var _cores16 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores16[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 _renderHook26 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(initialData, fieldPathUseCase, {
watch: {
'nestedList.size': onChange
}
});
}),
result = _renderHook26.result;
var cores = result.current;
var _cores17 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores17[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 _renderHook27 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(initialData, fieldPathUseCase, {
watch: {
'obj.file.ext': onExtChange,
'obj.file.size': onSizeChange
}
});
}),
result = _renderHook27.result;
var cores = result.current;
var _cores18 = (0, _slicedToArray2["default"])(cores, 2),
setEntity = _cores18[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 {};
});
});
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(2);
(0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
(0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
fieldPaths: ['obj', 'file', 'ext'],
newEntity: {},
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.describe)('`useUseCase` should work the same as `useContextualCoreCollection`', function () {
(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
})
})
}));
_react.fireEvent.click(_react.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);
_react.fireEvent.click(_react.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 _useUseCase24 = (0, _.useUseCase)(defaultFile, mockUseCase),
_useUseCase25 = (0, _slicedToArray2["default"])(_useUseCase24, 3),
Provider = _useUseCase25[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 _useUseCase26 = (0, _.useUseCase)(stringUseCase),
_useUseCase27 = (0, _slicedToArray2["default"])(_useUseCase26, 2),
add = _useUseCase27[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 _useUseCase28 = (0, _.useUseCase)('', stringUseCase),
_useUseCase29 = (0, _slicedToArray2["default"])(_useUseCase28, 3),
Provider = _useUseCase29[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');
_react.fireEvent.click(_react.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 _useUseCase30 = (0, _.useUseCase)(stringUseCase),
_useUseCase31 = (0, _slicedToArray2["default"])(_useUseCase30, 2),
add = _useUseCase31[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 _useUseCase32 = (0, _.useUseCase)('', stringUseCase),
_useUseCase33 = (0, _slicedToArray2["default"])(_useUseCase32, 3),
Provider = _useUseCase33[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');
_react.fireEvent.click(_react.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 _useUseCase34 = (0, _.useUseCase)(stringUseCase),
_useUseCase35 = (0, _slicedToArray2["default"])(_useUseCase34, 2),
_useUseCase35$ = _useUseCase35[1],
add = _useUseCase35$.add,
setEntity = _useUseCase35$.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 _useUseCase36 = (0, _.useUseCase)('', stringUseCase),
_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)(addReducer).toHaveBeenCalledTimes(1);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
_react.fireEvent.click(_react.screen.getByText(setButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
addedText = 'y';
_react.fireEvent.click(_react.screen.getByText(updateButtonText));
(0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
(0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
(0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
_react.fireEvent.click(_react.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(_ref7) {
var children = _ref7.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 _useUseCase38 = (0, _.useUseCase)(defaultFile, fileUseCase, {
onChange: onChangeC
}),
_useUseCase39 = (0, _slicedToArray2["default"])(_useUseCase38, 3),
setPath = _useUseCase39[1].setPath,
Provider = _useUseCase39[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);
_react.fireEvent.click(_react.screen.getByText(buttonText));
(0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
(0, _globals.expect)(onChangeB).toHaveReturnedWith(1);
(0, _globals.expect)(onChangeC).toHaveReturnedWith(3);
});
(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 _useUseCase40 = (0, _.useUseCase)(fileUseCase, {
onChange: onChange
}),
_useUseCase41 = (0, _slicedToArray2["default"])(_useUseCase40, 2),
setPath = _useUseCase41[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 _useUseCase42 = (0, _.useUseCase)(defaultFile, fileUseCase),
_useUseCase43 = (0, _slicedToArray2["default"])(_useUseCase42, 3),
Provider = _useUseCase43[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(0);
_react.fireEvent.click(_react.screen.getByText(firstButtonText));
(0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondChange).toHaveBeenCalledTimes(0);
_react.fireEvent.click(_react.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 _useUseCase44 = (0, _.useUseCase)(fileUseCase, {
watch: {
ext: onExtChange
}
}),
_useUseCase45 = (0, _slicedToArray2["default"])(_useUseCase44, 2),
setPath = _useUseCase45[1].setPath;
var onFirstClick = function onFirstClick() {
setPath(PATH_1);
};
return (0, _jsxRuntime.jsx)("button", {
onClick: onFirstClick,
children: firstButtonText
});
};
var B = function B() {
var _useUseCase46 = (0, _.useUseCase)(defaultFile, fileUseCase, {}),
_useUseCase47 = (0, _slicedToArray2["default"])(_useUseCase46, 3),
Provider = _useUseCase47[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(0);
_react.fireEvent.click(_react.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(_ref8) {
var children = _ref8.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 _useUseCase48 = (0, _.useUseCase)(defaultFile, fileUseCase, {
watch: {
ext: onChangeC
}
}),
_useUseCase49 = (0, _slicedToArray2["default"])(_useUseCase48, 3),
setPath = _useUseCase49[1].setPath,
Provider = _useUseCase49[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);
_react.fireEvent.click(_react.screen.getByText(buttonText));
(0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
(0, _globals.expect)(onChangeB).toHaveReturnedWith(1);
(0, _globals.expect)(onChangeC).toHaveReturnedWith(3);
});
(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 _useUseCase50 = (0, _.useUseCase)(fileUseCase, {
watch: {
ext: onExtChange
}
}),
_useUseCase51 = (0, _slicedToArray2["default"])(_useUseCase50, 2),
setPath = _useUseCase51[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 _useUseCase52 = (0, _.useUseCase)(defaultFile, fileUseCase),
_useUseCase53 = (0, _slicedToArray2["default"])(_useUseCase52, 3),
Provider = _useUseCase53[2];
return (0, _jsxRuntime.jsx)(Provider, {
children: (0, _jsxRuntime.jsx)(A, {})
});
};
(0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
(0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(0);
_react.fireEvent.click(_react.screen.getByText(firstButtonText));
(0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(1);
(0, _globals.expect)(onSecondExtChange).toHaveBeenCalledTimes(0);
_react.fireEvent.click(_react.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 _renderHook28 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mathUseCase);
}),
result = _renderHook28.result;
var reducers = result.current;
(0, _globals.expect)(Array.isArray(reducers)).toBe(false);
});
(0, _globals.test)('returned reducer should work', function () {
var _renderHook29 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mathUseCase);
}),
result = _renderHook29.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 _renderHook30 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mockUseCase);
}),
rerender = _renderHook30.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 _renderHook31 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mockUseCase, {}, [1, 'x']);
}),
rerender = _renderHook31.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 _renderHook32 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mockUseCase, {}, [i++, 'x']);
}),
rerender = _renderHook32.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 _useUseCase54 = (0, _.useUseCase)(mathUseCase),
subtraction = _useUseCase54.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);
_react.fireEvent.click(_react.screen.getByText(buttonText));
(0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
_react.fireEvent.click(_react.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 _useUseCase55 = (0, _.useUseCase)(mathUseCase),
subtraction = _useUseCase55.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);
_react.fireEvent.click(_react.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 _useUseCase56 = (0, _.useUseCase)(mathUseCase),
subtraction = _useUseCase56.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);
_react.fireEvent.click(_react.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 _renderHook33 = (0, _react.renderHook)(function () {
return (0, _.useUseCase)(mathUseCase, {
extraValue: 5
});
}),
result = _renderHook33.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 _renderHook34 = (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 = _renderHook34.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 _renderHook35 = (0, _react.renderHook)(function () {
var _useState9 = (0, _react2.useState)(0),
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
extraValue = _useState10[0],
setExtraValue = _useState10[1];
var reducers = (0, _.useUseCase)(mathUseCase, {
extraValue: extraValue
}, [extraValue]);
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [reducers]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [reducers]);
return setExtraValue;
}),
result = _renderHook35.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 _renderHook36 = (0, _react.renderHook)(function () {
var _useState11 = (0, _react2.useState)(0),
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
extraValue = _useState12[0],
setExtraValue = _useState12[1];
var reducers = (0, _.useUseCase)(mathUseCase, {
extraValue: extraValue
}, []);
(0, _ahooks.useUpdateEffect)(function () {
onUpdate();
}, [reducers]);
useDeepCompareUpdate(function () {
onDeepUpdate();
}, [reducers]);
return setExtraValue;
}),
result = _renderHook36.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
}));
_react.fireEvent.click(_react.screen.getByText(PARENT_BUTTON_TEXT));
(0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
});
});
});