@girders-elements/core
Version:
Girders Elements is an architectural framework that assists with building data-driven apps with React or React Native.
116 lines (76 loc) • 4.46 kB
JavaScript
'use strict';var _jsxFileName='packages/core/src/ui/__tests__/shouldComponentUpdate.js';
var _enzyme=require('enzyme');
var _react=require('react');var _react2=_interopRequireDefault(_react);
var _propNames=require('../../propNames');var propNames=_interopRequireWildcard(_propNames);
var _subsystem=require('../../subsystem');var Subsystem=_interopRequireWildcard(_subsystem);
var _kernel=require('../../kernel');var Kernel=_interopRequireWildcard(_kernel);
var _engine=require('../../engine');
var _=require('..');var _2=_interopRequireDefault(_);
var _update=require('../../update');var _update2=_interopRequireDefault(_update);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 _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}
var app=Subsystem.create(function(){return{
name:'app'};});
var ui=app.ui;
var update=app.update;
describe('Should component update of element UI',function(){var _data;
var data=(_data={
kind:'container'},_defineProperty(_data,
propNames.children,'items'),_defineProperty(_data,'name',
'A Name'),_defineProperty(_data,'items',
[
{
kind:'item',
data:'a'},
{
kind:'item',
data:'b'}]),_data);
var renderItem=jest.fn();
renderItem.mockImplementation(function(_ref){var element=_ref.element;return(
_react2.default.createElement('div',{__source:{fileName:_jsxFileName,lineNumber:43}},'Element ',element.get('data')));});
var renderContainer=jest.fn();
renderContainer.mockImplementation(function(_ref2){var element=_ref2.element,uiFor=_ref2.uiFor;return(
_react2.default.createElement('ul',{__source:{fileName:_jsxFileName,lineNumber:48}},
_react2.default.createElement('li',{__source:{fileName:_jsxFileName,lineNumber:49}},'Name: ',element.get('name')),
_react2.default.createElement('li',{__source:{fileName:_jsxFileName,lineNumber:50}},uiFor(['items',0])),
_react2.default.createElement('li',{__source:{fileName:_jsxFileName,lineNumber:51}},uiFor(['items',1]))));});
afterEach(function(){
renderItem.mockClear();
renderContainer.mockClear();
});
ui.register('container',renderContainer);
ui.register('item',renderItem);
update.register('container','rename',function(c,_ref3){var name=_ref3.name;return c.set('name',name);});
update.register('item','data',function(i,_ref4){var data=_ref4.data;return i.set('data',data);});
test('when a child changes, all its ancestor rerender',function(){
var kernel=Kernel.create([_update2.default,_2.default,app],data,{});
(0,_enzyme.mount)(_react2.default.createElement(_engine.EntryPoint,{kernel:kernel,keyPath:[],__source:{fileName:_jsxFileName,lineNumber:69}}));
expect(renderContainer).toHaveBeenCalledTimes(1);
expect(renderItem).toHaveBeenCalledTimes(2);
renderContainer.mockClear();
renderItem.mockClear();
kernel.focusOn(['items',0]).dispatch({type:'data',data:'X'});
expect(renderContainer).toHaveBeenCalledTimes(1);
expect(renderItem).toHaveBeenCalledTimes(1);
});
test('when ancestor changes, children will not rerender',function(){
var kernel=Kernel.create([_update2.default,_2.default,app],data,{});
(0,_enzyme.mount)(_react2.default.createElement(_engine.EntryPoint,{kernel:kernel,keyPath:[],__source:{fileName:_jsxFileName,lineNumber:86}}));
expect(renderContainer).toHaveBeenCalledTimes(1);
expect(renderItem).toHaveBeenCalledTimes(2);
renderContainer.mockClear();
renderItem.mockClear();
kernel.focusOn([]).dispatch({type:'rename',name:'New Name'});
expect(renderContainer).toHaveBeenCalledTimes(1);
expect(renderItem).not.toHaveBeenCalled();
});
test('when by-value data remains the same, nothing rerenders',function(){
var kernel=Kernel.create([_update2.default,_2.default,app],data,{});
(0,_enzyme.mount)(_react2.default.createElement(_engine.EntryPoint,{kernel:kernel,keyPath:[],__source:{fileName:_jsxFileName,lineNumber:103}}));
expect(renderContainer).toHaveBeenCalledTimes(1);
expect(renderItem).toHaveBeenCalledTimes(2);
renderContainer.mockClear();
renderItem.mockClear();
kernel.focusOn([]).dispatch({type:'rename',name:'A Name'});
expect(renderContainer).not.toHaveBeenCalled();
expect(renderItem).not.toHaveBeenCalled();
});
});