@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
JavaScript
;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');
});
});
});