UNPKG

@girders-elements/core

Version:

Girders Elements is an architectural framework that assists with building data-driven apps with React or React Native.

168 lines (111 loc) 7 kB
'use strict';var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[typeof Symbol==='function'?Symbol.iterator:'@@iterator'](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"])_i["return"]();}finally{if(_d)throw _e;}}return _arr;}return function(arr,i){if(Array.isArray(arr)){return arr;}else if((typeof Symbol==='function'?Symbol.iterator:'@@iterator')in Object(arr)){return sliceIterator(arr,i);}else{throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}(); var _immutable=require('immutable'); var _action=require('../../action');var actions=_interopRequireWildcard(_action); var _subsystem=require('../../subsystem');var Subsystem=_interopRequireWildcard(_subsystem); var _kernel=require('../../kernel');var Kernel=_interopRequireWildcard(_kernel); var _=require('..');var _2=_interopRequireDefault(_);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}} describe('effects API',function(){var _this=this; var data=(0,_immutable.fromJS)({ element1:{ element2:{ element3:{ kind:['article','specific']}, kind:['container']}, kind:['container']}, kind:'root'}); var app=Subsystem.create(function(){return{ name:'app'};});var effect=app.effect; describe('Effects',function(){ var specificEffect=jest.fn(); var specificEffect2=jest.fn(); var specificEffect3=jest.fn(); var articleEffect=jest.fn(); var componentEffect=jest.fn(); afterEach(function(){ ;[ specificEffect, specificEffect2, specificEffect3, articleEffect, componentEffect]. forEach(function(m){return m.mockClear();}); }); effect.register(['article'],'mark',function _callee(context,action){return regeneratorRuntime.async(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:_context.next=2;return regeneratorRuntime.awrap( sleep(50));case 2:return _context.abrupt('return', function(el){return el.set('marked',action.type);});case 3:case'end':return _context.stop();}}},null,_this);}); effect.forKind(['article','specific'],function(effects){ effects.register('toggle',specificEffect); effects.register('toggle2',specificEffect2); effects.register('toggle3',specificEffect3); effects.register('noop',function _callee2(){return regeneratorRuntime.async(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:case'end':return _context2.stop();}}},null,_this);}); effects.register('noop2',function(){}); }); effect.register(['article'],'toggle',articleEffect); effect.register(['container'],'.toggle',componentEffect); effect.register(['container'],'fireOnSub',function _callee3(context){return regeneratorRuntime.async(function _callee3$(_context3){while(1){switch(_context3.prev=_context3.next){case 0: context.focusOn(['element3']).dispatch({type:'toggle3'});case 1:case'end':return _context3.stop();}}},null,_this);}); describe('effect context',function(){ var kernel=Kernel.create([_2.default,app],data,{}); test('normal action',function _callee4(){var _specificEffect$mock$,context,action;return regeneratorRuntime.async(function _callee4$(_context4){while(1){switch(_context4.prev=_context4.next){case 0: kernel. focusOn(['element1','element2','element3']). dispatch({type:'toggle'});_context4.next=3;return regeneratorRuntime.awrap( sleep(50));case 3: expect(specificEffect).toHaveBeenCalled(); expect(specificEffect2).not.toHaveBeenCalled();_specificEffect$mock$=_slicedToArray( specificEffect.mock.calls[ specificEffect.mock.calls.length-1],2),context=_specificEffect$mock$[0],action=_specificEffect$mock$[1]; expect(action.type).toEqual('toggle'); expect(actions.actionMeta(action).keyPath).toEqual([ 'element1', 'element2', 'element3']); expect(context.query().get('kind')).toEqualI( _immutable.List.of('article','specific')); context.dispatch({type:'toggle2'});_context4.next=12;return regeneratorRuntime.awrap( sleep(50));case 12: expect(specificEffect2).toHaveBeenCalled();case 13:case'end':return _context4.stop();}}},null,_this);}); test('global action',function _callee5(){var _componentEffect$mock,context,action,_componentEffect$mock2,context2,action2;return regeneratorRuntime.async(function _callee5$(_context5){while(1){switch(_context5.prev=_context5.next){case 0: kernel. focusOn(['element1','element2','element3']). dispatch({type:'.toggle'}); expect(componentEffect).toHaveBeenCalled();_componentEffect$mock=_slicedToArray( componentEffect.mock.calls[0],2),context=_componentEffect$mock[0],action=_componentEffect$mock[1]; expect(context.query().get('kind')).toEqualI(_immutable.List.of('container')); expect(actions.actionMeta(action).keyPath).toEqual([ 'element1', 'element2', 'element3']); expect(context.query()._keyPath).toEqual(['element1','element2']); expect(action.type).toEqual('.toggle'); kernel.focusOn(['element1']).dispatch({type:'.toggle'});_context5.next=10;return regeneratorRuntime.awrap( sleep(50));case 10:_componentEffect$mock2=_slicedToArray( componentEffect.mock.calls[1],2),context2=_componentEffect$mock2[0],action2=_componentEffect$mock2[1]; expect(context2.query()._keyPath).toEqual(['element1']); expect(action2.type).toEqual('.toggle');case 13:case'end':return _context5.stop();}}},null,_this);}); describe('action on sub-element',function _callee6(){return regeneratorRuntime.async(function _callee6$(_context6){while(1){switch(_context6.prev=_context6.next){case 0: kernel.focusOn(['element1','element2']).dispatch({type:'fireOnSub'});_context6.next=3;return regeneratorRuntime.awrap( sleep(50));case 3: expect(specificEffect3).toHaveBeenCalled();case 4:case'end':return _context6.stop();}}},null,_this);}); }); describe("Effect's return value",function(){ var kernel=Kernel.create([_2.default,app],data,{}); test('Effect can return an updating fn state => newState',function _callee7(){var focus;return regeneratorRuntime.async(function _callee7$(_context7){while(1){switch(_context7.prev=_context7.next){case 0: focus=kernel.focusOn(['element1','element2','element3']); focus.dispatch({type:'mark'});_context7.next=4;return regeneratorRuntime.awrap( sleep(25));case 4: expect(focus.query().get('marked')).not.toEqual('mark');_context7.next=7;return regeneratorRuntime.awrap( sleep(50));case 7: expect(focus.query().get('marked')).toEqual('mark');case 8:case'end':return _context7.stop();}}},null,_this);}); test('An async effect can return undefined',function(){ var focus=kernel.focusOn(['element1','element2','element3']); focus.dispatch({type:'noop2'}); focus.dispatch({type:'noop'}); }); }); }); }); function sleep(ms){ return new Promise(function(resolve){return setTimeout(resolve,ms);}); }