UNPKG

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