/
es3-module-pattern.js
146 lines (113 loc) · 3.46 KB
/
es3-module-pattern.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import Alt from '../dist/alt-with-runtime'
import { assert } from 'chai'
import sinon from 'sinon'
const alt = new Alt()
const actions = alt.generateActions('fire')
function MyStore() {
var privateVariable = true
return {
displayName: 'MyStore',
state: {
data: 1
},
publicMethods: {
getData: function () {
return this.getState().data
}
},
testProperty: 4,
bindListeners: {
handleFire: actions.FIRE
},
handleFire: function (data) {
this.setState({ data })
}
}
}
const myStore = alt.createStore(MyStore())
export default {
'Creating store using ES3 module pattern': {
beforeEach() {
alt.recycle()
console.error = function () { }
},
'store method exists'() {
const storePrototype = Object.getPrototypeOf(myStore)
const assertMethods = ['constructor', 'listen', 'unlisten', 'getState']
assert.deepEqual(Object.getOwnPropertyNames(storePrototype), assertMethods, 'methods exist for store')
assert.isUndefined(myStore.addListener, 'event emitter methods not present')
assert.isUndefined(myStore.removeListener, 'event emitter methods not present')
assert.isUndefined(myStore.emit, 'event emitter methods not present')
},
'public methods available'() {
assert.isFunction(myStore.getData, 'public methods are available')
assert(myStore.getData() === 1, 'initial store data is set')
},
'private and instance variables are not available'() {
assert.isUndefined(myStore.privateVariable, 'encapsulated variables are not available')
assert.isUndefined(myStore.testProperty, 'instance variables are not available')
},
'firing an action'() {
actions.fire(2)
assert(myStore.getState().data === 2, 'action was fired and handled correctly')
},
'adding lifecycle events'() {
let spy = sinon.spy()
class TestStore {
constructor() {
this.lifecycle = { init: spy }
this.state = {
foo: 'bar'
}
}
}
const store = alt.createStore(new TestStore())
assert.ok(spy.calledOnce, 'lifecycle event was called')
assert(store.getState().foo === 'bar', 'state is set')
},
'set state'() {
const TestStore = {
state: { hello: null },
bindListeners: {
handleFire: actions.FIRE
},
handleFire(data) {
this.setState({
hello: data
})
this.setState()
}
}
const store = alt.createStore(TestStore)
assert.isNull(store.getState().hello, 'store state property has not been set yet')
actions.fire('world')
assert(store.getState().hello === 'world', 'store state was set using setState')
},
'set state in lifecycle'() {
const TestStore = {
state: { test: null },
lifecycle: {
init() {
this.state.test = 'i am here'
}
}
}
const store = alt.createStore(TestStore)
assert(store.getState().test === 'i am here', 'setting state on lifecycle')
},
'get instance works'() {
const TestStore = {
state: { test: null },
bindListeners: {
handleFire: actions.FIRE
},
handleFire() {
this.setState({ test: this.getInstance() })
}
}
const store = alt.createStore(TestStore)
actions.fire()
assert(store.getState().test === store)
},
}
}