import { setupRerender } from 'preact/test-utils'; import { createElement, render, Component, Fragment } from 'preact'; import { setupScratch, teardown } from '../../_util/helpers'; import { logCall, clearLog } from '../../_util/logCall'; /** @jsx createElement */ describe('Lifecycle methods', () => { /** @type {HTMLDivElement} */ let scratch; /** @type {() => void} */ let rerender; // function expectDomLogToBe(expectedOperations, message) { // expect(getLog()).to.deep.equal(expectedOperations, message); // } let resetInsertBefore; let resetRemoveChild; let resetRemove; before(() => { resetInsertBefore = logCall(Element.prototype, 'insertBefore'); resetRemoveChild = logCall(Element.prototype, 'appendChild'); resetRemove = logCall(Element.prototype, 'removeChild'); }); after(() => { resetInsertBefore(); resetRemoveChild(); resetRemove(); }); beforeEach(() => { scratch = setupScratch(); rerender = setupRerender(); clearLog(); }); afterEach(() => { teardown(scratch); }); describe('#shouldComponentUpdate', () => { let setState; class Should extends Component { constructor() { super(); this.state = { show: true }; setState = s => this.setState(s); } render(props, { show }) { return show ?
: null; } } class ShouldNot extends Should { shouldComponentUpdate() { return false; } } sinon.spy(Should.prototype, 'render'); sinon.spy(ShouldNot.prototype, 'shouldComponentUpdate'); beforeEach(() => Should.prototype.render.resetHistory()); it('should rerender component on change by default', () => { render({this.state.foo}
; } } class Wrapper extends Component { render() { wrapperSetState = this.setState.bind(this); return this.props.children; } } const App = () => (baz
'); wrapperSetState({ hi: 'world' }); childSetState({ foo: 'bar' }); rerender(); expect(scratch.innerHTML).to.equal('bar
'); }); it('should reorder non-updating nested Fragment children', () => { const rows = [ { id: '1', a: 5, b: 100 }, { id: '2', a: 50, b: 10 }, { id: '3', a: 25, b: 1000 } ]; function Cell({ id, a, b }) { // Return an array to really test out the reordering algorithm :) return (