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
;
}
}
WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 };
render(, 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 ;
}
}
class WithDefaultProps extends Component {
constructor(props, context) {
super(props, context);
this.ctor(props, context);
}
ctor(){}
componentWillReceiveProps() {}
render() {
return ;
}
}
WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 };
let proto = WithDefaultProps.prototype;
sinon.spy(proto, 'ctor');
sinon.spy(proto, 'componentWillReceiveProps');
sinon.spy(proto, 'render');
render(, 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 ;
}
}
WithDefaultProps.defaultProps = { fieldC: 1, fieldD: 1 };
sinon.spy(WithDefaultProps.prototype, 'getDefaultProps');
render((
), scratch);
expect(WithDefaultProps.prototype.getDefaultProps).to.be.calledOnce;
});
});
});