UNPKG

@girders-elements/core

Version:

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

239 lines (167 loc) 9.8 kB
'use strict';var _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();var _get=function get(object,property,receiver){if(object===null)object=Function.prototype;var desc=Object.getOwnPropertyDescriptor(object,property);if(desc===undefined){var parent=Object.getPrototypeOf(object);if(parent===null){return undefined;}else{return get(parent,property,receiver);}}else if("value"in desc){return desc.value;}else{var getter=desc.get;if(getter===undefined){return undefined;}return getter.call(receiver);}};var _jsxFileName='packages/core/src/engine/__tests__/engine.js'; var _enzyme=require('enzyme'); var _ramda=require('ramda');var _ramda2=_interopRequireDefault(_ramda); var _react=require('react');var _react2=_interopRequireDefault(_react); var _subsystem=require('../../subsystem');var Subsystem=_interopRequireWildcard(_subsystem); var _kernel=require('../../kernel');var Kernel=_interopRequireWildcard(_kernel); var _=require('..'); var _core=require('../../core'); var _2=require('../..');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;}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}function _toConsumableArray(arr){if(Array.isArray(arr)){for(var i=0,arr2=Array(arr.length);i<arr.length;i++){arr2[i]=arr[i];}return arr2;}else{return Array.from(arr);}} describe('Engine: wiring everything together',function(){ describe('EntryPoint',function(){ var app=Subsystem.create(function(){return{ name:'app'};}); var Foo=function Foo(_ref){var element=_ref.element;return( _react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:23}}, element.get('kind'),': ',element.get('text')));}; app.ui.register('c1',Foo); app.ui.register('c2',Foo); var capitalize=function capitalize(e){return e.update('text',_ramda2.default.toUpper);}; var capitalizeTitles=function capitalizeTitles(n){return n.update('scenes',function(ss){return ss.map(capitalize);});}; app.update.register('nav','.capitalize',capitalizeTitles); app.update.register('c1','capitalize',capitalize); var kernel=void 0; beforeEach( function(){return( kernel=Kernel.create([].concat(_toConsumableArray(_core.defaultSubsystems),[app]),{ kind:'nav', scenes:[ { kind:'c1', text:'Scene 1'}, { kind:'c2', text:'Scene 2'}]}));}); test('multiple entrypoints can be linked with a single kernel inst.',function(){ var ep1=(0,_enzyme.mount)(_react2.default.createElement(_.EntryPoint,{kernel:kernel,keyPath:['scenes',0],__source:{fileName:_jsxFileName,lineNumber:56}})); var ep2=(0,_enzyme.mount)(_react2.default.createElement(_.EntryPoint,{kernel:kernel,keyPath:['scenes',1],__source:{fileName:_jsxFileName,lineNumber:57}})); expect(ep1).toIncludeText('c1: Scene 1'); expect(ep2).toIncludeText('c2: Scene 2'); }); test('updates work accross different entrypoints',function(){ var ep1=(0,_enzyme.mount)(_react2.default.createElement(_.EntryPoint,{kernel:kernel,keyPath:['scenes',0],__source:{fileName:_jsxFileName,lineNumber:64}})); var ep2=(0,_enzyme.mount)(_react2.default.createElement(_.EntryPoint,{kernel:kernel,keyPath:['scenes',1],__source:{fileName:_jsxFileName,lineNumber:65}})); ep1. find(Foo). at(0). props(). dispatch({type:'capitalize'}); expect(ep1).toIncludeText('c1: SCENE 1'); ep1. find(Foo). at(0). props(). dispatch({type:'.capitalize'}); expect(ep2).toIncludeText('c2: SCENE 2'); }); }); describe('Entrypoint with mixins',function(){ var Wrapper=function Wrapper(Superclass){return function(_Superclass){_inherits(_class,_Superclass);function _class(){_classCallCheck(this,_class);return _possibleConstructorReturn(this,(_class.__proto__||Object.getPrototypeOf(_class)).apply(this,arguments));}_createClass(_class,[{key:'render',value:function render() { return _react2.default.createElement('section',{id:'wrapper',__source:{fileName:_jsxFileName,lineNumber:89}},_get(_class.prototype.__proto__||Object.getPrototypeOf(_class.prototype),'render',this).call(this)); }}]);return _class;}(Superclass);}; var app=Subsystem.create(function(){return{ name:'app', engineMixins:[Wrapper]};}); var Foo=function Foo(_ref2){var element=_ref2.element;return( _react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:99}}, element.get('kind'),': ',element.get('text')));}; app.ui.register('c1',Foo); var kernel=Kernel.create([].concat(_toConsumableArray(_core.defaultSubsystems),[app]),{ kind:'c1', text:'wrapped'}); test('mixins are applied around the entrypoint',function(){ var e=(0,_enzyme.mount)(_react2.default.createElement(_.EntryPoint,{kernel:kernel,keyPath:[],__source:{fileName:_jsxFileName,lineNumber:112}})); expect(e.find('section#wrapper')).toBePresent(); }); }); describe('Engine',function(){ afterEach(function(){ _2.ui.reset(); }); var twiddlingMiddleware=_ramda2.default.curry(function(store,next,action){ var nextAction=void 0; if(action.type==='twiddle'){ nextAction=_extends({},action,{type:'capitalize'}); }else{ nextAction=action; } return next(nextAction); }); test('classic use (deprecations expected)',function(){ var Foo=function Foo(_ref3){var element=_ref3.element;return _react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:133}},'Hello from ',element.get('text'));}; _2.ui.register('s1',Foo); _2.update.register('s1',function(updates){ updates.register('capitalize',function(e){return e.update('text',_ramda2.default.toUpper);}); }); var e=(0,_enzyme.mount)(_react2.default.createElement(_.Engine,{initState:{kind:'s1',text:'s1'},__source:{fileName:_jsxFileName,lineNumber:140}})); expect(e).toIncludeText('Hello from s1'); e. find(Foo). at(0). props(). dispatch({type:'capitalize'}); expect(e).toIncludeText('Hello from S1'); }); test('custom middleware',function(){ var Foo=function Foo(_ref4){var element=_ref4.element;return _react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:153}},'Hello from ',element.get('text'));}; _2.ui.register('m1',Foo); _2.update.register('m1',function(updates){ updates.register('capitalize',function(e){return e.update('text',_ramda2.default.toUpper);}); }); var e=(0,_enzyme.mount)( _react2.default.createElement(_.Engine,{ initState:{kind:'m1',text:'m1'}, customMiddleware:[twiddlingMiddleware],__source:{fileName:_jsxFileName,lineNumber:161}})); expect(e).toIncludeText('Hello from m1'); e. find(Foo). at(0). props(). dispatch({type:'twiddle'}); expect(e).toIncludeText('Hello from M1'); }); test('additionalSubsystems',function(){ var Foo=function Foo(_ref5){var element=_ref5.element;return _react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:178}},'Hello from ',element.get('text'));}; _2.ui.register('ss1',Foo); _2.update.register('ss1',function(updates){ updates.register('capitalize',function(e){return e.update('text',_ramda2.default.toUpper);}); }); var twiddler=Subsystem.create(function(){return{ name:'twiddler', middleware:twiddlingMiddleware};}); var e=(0,_enzyme.mount)( _react2.default.createElement(_.Engine,{ initState:{kind:'ss1',text:'ss1'}, additionalSubsystems:[twiddler],__source:{fileName:_jsxFileName,lineNumber:191}})); expect(e).toIncludeText('Hello from ss1'); e. find(Foo). at(0). props(). dispatch({type:'twiddle'}); expect(e).toIncludeText('Hello from SS1'); }); test('subsystems',function(){ var Foo=function Foo(_ref6){var element=_ref6.element;return _react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:209}},'Hello from ',element.get('text'));}; _2.ui.register('ssx1',Foo); _2.update.register('ssx1',function(updates){ updates.register('capitalize',function(e){return e.update('text',_ramda2.default.toUpper);}); }); var twiddler=Subsystem.create(function(){return{ name:'twiddler', middleware:twiddlingMiddleware};}); var e=(0,_enzyme.mount)( _react2.default.createElement(_.Engine,{ initState:{kind:'ssx1',text:'ssx1'}, subsystems:[].concat(_toConsumableArray(_core.defaultSubsystems),[twiddler]),__source:{fileName:_jsxFileName,lineNumber:222}})); expect(e).toIncludeText('Hello from ssx1'); e. find(Foo). at(0). props(). dispatch({type:'twiddle'}); expect(e).toIncludeText('Hello from SSX1'); }); }); });