diff options
author | tg(x) <*@tg-x.net> | 2016-10-05 00:02:10 +0200 |
---|---|---|
committer | tg(x) <*@tg-x.net> | 2016-10-05 00:02:10 +0200 |
commit | ec62d29c90958aa8d41474ed2fe5a179d6fafed7 (patch) | |
tree | 367cc55bc6772cf194ed6c4778cd344d581d3d7c /thirdparty/preact/test/browser/spec.js | |
parent | fda241d74d5c1c39203b64da676c684d4dc9d800 (diff) | |
parent | d3ccf4103900b8d990b1970d135695b938d94eae (diff) | |
download | wallet-core-ec62d29c90958aa8d41474ed2fe5a179d6fafed7.tar.xz |
Merge branch 'master' of taler.net:/var/git/wallet-webex
Diffstat (limited to 'thirdparty/preact/test/browser/spec.js')
-rw-r--r-- | thirdparty/preact/test/browser/spec.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/thirdparty/preact/test/browser/spec.js b/thirdparty/preact/test/browser/spec.js new file mode 100644 index 000000000..eb48151f0 --- /dev/null +++ b/thirdparty/preact/test/browser/spec.js @@ -0,0 +1,124 @@ +import { h, render, rerender, Component } from '../../src/preact'; +/** @jsx h */ + +describe('Component spec', () => { + let scratch; + + before( () => { + scratch = document.createElement('div'); + (document.body || document.documentElement).appendChild(scratch); + }); + + beforeEach( () => { + scratch.innerHTML = ''; + }); + + after( () => { + scratch.parentNode.removeChild(scratch); + scratch = null; + }); + + describe('defaultProps', () => { + it('should apply default props on initial render', () => { + class WithDefaultProps extends Component { + constructor(props, context) { + super(props, context); + expect(props).to.be.deep.equal({ + fieldA: 1, fieldB: 2, + fieldC: 1, fieldD: 2 + }); + } + render() { + return <div />; + } + } + WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 }; + render(<WithDefaultProps fieldA={1} fieldB={2} fieldD={2} />, scratch); + }); + + it('should apply default props on rerender', () => { + let doRender; + class Outer extends Component { + constructor() { + super(); + this.state = { i:1 }; + } + componentDidMount() { + doRender = () => this.setState({ i: 2 }); + } + render(props, { i }) { + return <WithDefaultProps fieldA={1} fieldB={i} fieldD={i} />; + } + } + class WithDefaultProps extends Component { + constructor(props, context) { + super(props, context); + this.ctor(props, context); + } + ctor(){} + componentWillReceiveProps() {} + render() { + return <div />; + } + } + WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 }; + + let proto = WithDefaultProps.prototype; + sinon.spy(proto, 'ctor'); + sinon.spy(proto, 'componentWillReceiveProps'); + sinon.spy(proto, 'render'); + + render(<Outer />, scratch); + doRender(); + + const PROPS1 = { + fieldA: 1, fieldB: 1, + fieldC: 1, fieldD: 1 + }; + + const PROPS2 = { + fieldA: 1, fieldB: 2, + fieldC: 1, fieldD: 2 + }; + + expect(proto.ctor).to.have.been.calledWith(PROPS1); + expect(proto.render).to.have.been.calledWith(PROPS1); + + rerender(); + + // expect(proto.ctor).to.have.been.calledWith(PROPS2); + expect(proto.componentWillReceiveProps).to.have.been.calledWith(PROPS2); + expect(proto.render).to.have.been.calledWith(PROPS2); + }); + + // @TODO: migrate this to preact-compat + xit('should cache default props', () => { + class WithDefaultProps extends Component { + constructor(props, context) { + super(props, context); + expect(props).to.be.deep.equal({ + fieldA: 1, fieldB: 2, + fieldC: 1, fieldD: 2, + fieldX: 10 + }); + } + getDefaultProps() { + return { fieldA: 1, fieldB: 1 }; + } + render() { + return <div />; + } + } + WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 }; + sinon.spy(WithDefaultProps.prototype, 'getDefaultProps'); + render(( + <div> + <WithDefaultProps fieldB={2} fieldD={2} fieldX={10} /> + <WithDefaultProps fieldB={2} fieldD={2} fieldX={10} /> + <WithDefaultProps fieldB={2} fieldD={2} fieldX={10} /> + </div> + ), scratch); + expect(WithDefaultProps.prototype.getDefaultProps).to.be.calledOnce; + }); + }); +}); |