-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.js
88 lines (76 loc) · 2.29 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* global describe, it, beforeEach, afterEach */
import should from 'should'
import sinon from 'sinon'
import React from 'react'
import EventEmitter from 'eventemitter3'
import jsdom from 'mocha-jsdom'
import make from './source'
function makeMockStore () {
let store = new EventEmitter()
sinon.spy(store, 'addListener')
sinon.spy(store, 'removeListener')
store.state = {}
return store
}
class TestComponent {
render () {
return <div/>
}
}
describe('makeUniflowComponent()', () => {
jsdom()
let domNode
let storeA
let storeB
beforeEach(() => {
domNode = document.createElement('div')
storeA = makeMockStore()
storeB = makeMockStore()
sinon.stub(console, 'warn')
})
afterEach(() => {
console.warn.restore()
})
it('subscribes to all props after mounting', () => {
let Component = make(TestComponent, {a: storeA, b: storeB})
React.render(<Component/>, domNode)
sinon.assert.called(storeA.addListener)
sinon.assert.called(storeB.addListener)
})
it('throws when rendered with non-store props', () => {
let Component = make(TestComponent, {a: 'foo'})
let fn = () => React.render(<Component/>, domNode)
fn.should.throw()
})
it('unsubscribes to all props when unmounting', () => {
let Component = make(TestComponent, {a: storeA, b: storeB})
React.render(<Component/>, domNode)
React.render(<div/>, domNode)
sinon.assert.called(storeA.removeListener)
sinon.assert.called(storeB.removeListener)
})
it('it adds the state of each store as a prop to the component', () => {
class Child extends React.Component {
render () {
this.props.a.should.equal(storeA.state)
this.props.b.should.equal(storeB.state)
return <div/>
}
}
Child.propTypes = {
a: React.PropTypes.object,
b: React.PropTypes.object
}
let Component = make(Child, {a: storeA, b: storeB})
React.render(<Component/>, domNode)
})
it('re-renders when any store prop emits change event', () => {
let Component = make(TestComponent, {a: storeA})
let render = sinon.spy(Component.prototype, 'render')
React.render(<Component/>, domNode)
sinon.assert.calledOnce(render)
storeA.emit('change')
sinon.assert.calledTwice(render)
Component.prototype.render.restore()
})
})