chai-backbone-rails 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -39,12 +39,19 @@ this can also be chained further:
39
39
  "page/3".should.route.to myRouter, "openPage", arguments: ["3"]
40
40
  "page/3".should.route.to myRouter, "openPage", considering: [conflictingRouter]
41
41
 
42
- ### Changes
42
+ Using Changes Chai matchers
43
+ ---------------------------
44
+
45
+ #= require chai-changes
46
+
47
+ Plain change checking:
48
+
49
+ expect(-> result).to.change.when -> result += 1
50
+ expect(-> result).to.not.change.when -> somethingElse()
43
51
 
44
52
  Changes by delta: 'change.by'
45
53
 
46
54
  expect(-> view.$('p').length).to.change.by(4).when -> collection.add [{}, {}, {}, {}]
47
- expect(-> result).to.not.change.when -> somethingElse()
48
55
 
49
56
  Changes to end result: 'change.to'
50
57
 
@@ -129,6 +136,20 @@ You can also yield results:
129
136
  Factory.create('abc') => 'a'
130
137
  Factory.create('abc') => 'b'
131
138
 
139
+ Running the tests
140
+ =================
141
+
142
+ You can runn the tests by including:
143
+
144
+ #= require chai-backbone_spec
145
+
146
+ or you can run the suites seperately:
147
+
148
+ #= require spec/chai-backbone_spec
149
+ #= require spec/chai-sinon_spec
150
+ #= require spec/chai-changes_spec
151
+ #= require spec/factory_spec
152
+
132
153
 
133
154
  Contributing
134
155
  ------------
@@ -1,7 +1,7 @@
1
1
  module Chai
2
2
  module Backbone
3
3
  module Rails
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.1"
5
5
  end
6
6
  end
7
7
  end
@@ -1,4 +1,5 @@
1
1
  #= require underscore
2
+ #= require ./chai-changes
2
3
 
3
4
  ((chaiBackbone) ->
4
5
  # Module systems magic dance.
@@ -50,13 +51,6 @@
50
51
  flag(context, 'negate', negate)
51
52
  flag(this, 'whenActions', definedActions)
52
53
 
53
- chai.Assertion.addMethod 'when', (val) ->
54
- definedActions = flag(this, 'whenActions') || []
55
-
56
- action.before?(this) for action in definedActions
57
- val() # execute the 'when'
58
- action.after?(this) for action in definedActions
59
-
60
54
  # Verify if a url fragment is routed to a certain method on the router
61
55
  # Options:
62
56
  # - you can consider multiple routers to test routing priorities
@@ -113,168 +107,12 @@
113
107
  "expected `#{methodName}` to be called with #{inspect options.arguments}, but was called with #{inspect spy.args[0]} instead",
114
108
  "expected `#{methodName}` not to be called with #{inspect options.arguments}, but was"
115
109
 
116
- chai.Assertion.addChainableMethod 'to', routeTo, -> this
117
-
118
-
119
- ###
120
- #
121
- # Changes Matchers
122
- #
123
- ###
124
-
125
- noChangeAssert = (context) ->
126
- relevant = flag(context, 'no-change')
127
- return unless relevant
128
-
129
- negate = flag(context, 'negate')
130
- flag(context, 'negate', @negate)
131
- object = flag(context, 'object')
132
-
133
- startValue = flag(context, 'changeStart')
134
- endValue = object()
135
- actualDelta = endValue - startValue
136
-
137
- result = (0 is actualDelta)
138
- result = !result if negate
139
- context.assert result,
140
- "not supported"
141
- "expected `#{formatFunction object}` not to change, but it changed by #{actualDelta}",
142
- flag(context, 'negate', negate)
143
-
144
- changeByAssert = (context) ->
145
- negate = flag(context, 'negate')
146
- flag(context, 'negate', @negate)
147
- object = flag(context, 'object')
148
-
149
- startValue = flag(context, 'changeStart')
150
- endValue = object()
151
- actualDelta = endValue - startValue
152
-
153
- result = (@expectedDelta is actualDelta)
154
- result = !result if negate
155
- context.assert result,
156
- "expected `#{formatFunction object}` to change by #{@expectedDelta}, but it changed by #{actualDelta}",
157
- "not supported"
158
- flag(context, 'negate', negate)
159
-
160
- changeToBeginAssert = (context) ->
161
- negate = flag(context, 'negate')
162
- flag(context, 'negate', @negate)
163
- object = flag(context, 'object')
164
-
165
- startValue = object()
166
-
167
- result = !utils.eql(startValue, @expectedEndValue)
168
- result = !result if negate
169
- context.assert result,
170
- "expected `#{formatFunction object}` to change to #{utils.inspect @expectedEndValue}, but it was already #{utils.inspect startValue}",
171
- "not supported"
172
- flag(context, 'negate', negate)
173
-
174
- changeToAssert = (context) ->
175
- negate = flag(context, 'negate')
176
- flag(context, 'negate', @negate)
177
- object = flag(context, 'object')
178
-
179
- endValue = object()
180
-
181
- result = utils.eql(endValue, @expectedEndValue)
182
- result = !result if negate
183
- context.assert result,
184
- "expected `#{formatFunction object}` to change to #{utils.inspect @expectedEndValue}, but it changed to #{utils.inspect endValue}",
185
- "not supported"
186
- flag(context, 'negate', negate)
187
-
188
- changeFromBeginAssert = (context) ->
189
- negate = flag(context, 'negate')
190
- flag(context, 'negate', @negate)
191
- object = flag(context, 'object')
192
-
193
- startValue = object()
194
-
195
- result = utils.eql(startValue, @expectedStartValue)
196
- result = !result if negate
197
- context.assert result,
198
- "expected `#{formatFunction object}` to change from #{utils.inspect @expectedStartValue}, but it changed from #{utils.inspect startValue}",
199
- "not supported"
200
- flag(context, 'negate', negate)
201
-
202
- changeFromAssert = (context) ->
203
- negate = flag(context, 'negate')
204
- flag(context, 'negate', @negate)
205
- object = flag(context, 'object')
206
-
207
- startValue = flag(context, 'changeStart')
208
- endValue = object()
209
-
210
- result = !utils.eql(startValue, endValue)
211
- result = !result if negate
212
- context.assert result,
213
- "expected `#{formatFunction object}` to change from #{utils.inspect @expectedStartValue}, but it did not change"
214
- "not supported"
215
- flag(context, 'negate', negate)
216
-
217
- # Verifies if the subject return value changes by given delta 'when' events happen
218
- #
219
- # Examples:
220
- # (-> resultValue).should.change.by(1).when -> resultValue += 1
221
- #
222
- chai.Assertion.addProperty 'change', ->
223
- flag(this, 'no-change', true)
224
-
225
- definedActions = flag(this, 'whenActions') || []
226
- # Add a around filter to the when actions
227
- definedActions.push
228
- negate: flag(this, 'negate')
229
-
230
- # set up the callback to trigger
231
- before: (context) ->
232
- startValue = flag(context, 'object')()
233
- flag(context, 'changeStart', startValue)
234
- after: noChangeAssert
235
-
236
- flag(this, 'whenActions', definedActions)
237
-
238
- formatFunction = (func) ->
239
- func.toString().replace(/^\s*function \(\) {\s*/, '').replace(/\s+}$/, '').replace(/\s*return\s*/, '')
240
-
241
- changeBy = (delta) ->
242
- flag(this, 'no-change', false)
243
- definedActions = flag(this, 'whenActions') || []
244
- # Add a around filter to the when actions
245
- definedActions.push
246
- negate: flag(this, 'negate')
247
- expectedDelta: delta
248
- after: changeByAssert
249
- flag(this, 'whenActions', definedActions)
250
-
251
- chai.Assertion.addChainableMethod 'by', changeBy, -> this
252
-
253
- changeTo = (endValue) ->
254
- flag(this, 'no-change', false)
255
- definedActions = flag(this, 'whenActions') || []
256
- # Add a around filter to the when actions
257
- definedActions.push
258
- negate: flag(this, 'negate')
259
- expectedEndValue: endValue
260
- before: changeToBeginAssert
261
- after: changeToAssert
262
- flag(this, 'whenActions', definedActions)
263
-
264
- chai.Assertion.addChainableMethod 'to', changeTo, -> this
265
-
266
- changeFrom = (startValue) ->
267
- flag(this, 'no-change', false)
268
- definedActions = flag(this, 'whenActions') || []
269
- # Add a around filter to the when actions
270
- definedActions.push
271
- negate: flag(this, 'negate')
272
- expectedStartValue: startValue
273
- before: changeFromBeginAssert
274
- after: changeFromAssert
275
- flag(this, 'whenActions', definedActions)
276
-
277
- chai.Assertion.addChainableMethod 'from', changeFrom, -> this
110
+ chai.Assertion.overwriteProperty 'to', (_super) ->
111
+ ->
112
+ if flag(this, 'routing')
113
+ routeTo
114
+ else
115
+ _super.apply(this, arguments)
278
116
 
279
117
  )
280
118
 
@@ -1,6 +1,4 @@
1
- #= require ./chai-backbone
2
1
  #= require ./spec/chai-backbone_spec
3
- #= require ./chai-sinon
4
2
  #= require ./spec/chai-sinon_spec
5
- #= require ./factories
3
+ #= require ./spec/chai-changes_spec
6
4
  #= require ./spec/factory_spec
@@ -0,0 +1,183 @@
1
+
2
+ ((chaiChanges) ->
3
+ # Module systems magic dance.
4
+ if (typeof require == "function" && typeof exports == "object" && typeof module == "object")
5
+ # NodeJS
6
+ module.exports = chaiChanges
7
+ else if (typeof define == "function" && define.amd)
8
+ # AMD
9
+ define -> chaiChanges
10
+ else
11
+ # Other environment (usually <script> tag): plug in to global chai instance directly.
12
+ chai.use chaiChanges
13
+ )((chai, utils) ->
14
+ inspect = utils.inspect
15
+ flag = utils.flag
16
+
17
+ ###
18
+ #
19
+ # Changes Matchers
20
+ #
21
+ ###
22
+
23
+ chai.Assertion.addMethod 'when', (val) ->
24
+ definedActions = flag(this, 'whenActions') || []
25
+
26
+ action.before?(this) for action in definedActions
27
+ val() # execute the 'when'
28
+ action.after?(this) for action in definedActions
29
+
30
+ noChangeAssert = (context) ->
31
+ relevant = flag(context, 'no-change')
32
+ return unless relevant
33
+
34
+ negate = flag(context, 'negate')
35
+ flag(context, 'negate', @negate)
36
+ object = flag(context, 'object')
37
+
38
+ startValue = flag(context, 'changeStart')
39
+ endValue = object()
40
+
41
+ result = !utils.eql(endValue, startValue)
42
+ context.assert result,
43
+ "expected `#{formatFunction object}` to change, but it stayed #{utils.inspect startValue}",
44
+ "expected `#{formatFunction object}` not to change, but it changed from #{utils.inspect startValue} to #{utils.inspect endValue}",
45
+ flag(context, 'negate', negate)
46
+
47
+ changeByAssert = (context) ->
48
+ negate = flag(context, 'negate')
49
+ flag(context, 'negate', @negate)
50
+ object = flag(context, 'object')
51
+
52
+ startValue = flag(context, 'changeStart')
53
+ endValue = object()
54
+ actualDelta = endValue - startValue
55
+
56
+ result = (@expectedDelta is actualDelta)
57
+ result = !result if negate
58
+ context.assert result,
59
+ "expected `#{formatFunction object}` to change by #{@expectedDelta}, but it changed by #{actualDelta}",
60
+ "not supported"
61
+ flag(context, 'negate', negate)
62
+
63
+ changeToBeginAssert = (context) ->
64
+ negate = flag(context, 'negate')
65
+ flag(context, 'negate', @negate)
66
+ object = flag(context, 'object')
67
+
68
+ startValue = object()
69
+
70
+ result = !utils.eql(startValue, @expectedEndValue)
71
+ result = !result if negate
72
+ context.assert result,
73
+ "expected `#{formatFunction object}` to change to #{utils.inspect @expectedEndValue}, but it was already #{utils.inspect startValue}",
74
+ "not supported"
75
+ flag(context, 'negate', negate)
76
+
77
+ changeToAssert = (context) ->
78
+ negate = flag(context, 'negate')
79
+ flag(context, 'negate', @negate)
80
+ object = flag(context, 'object')
81
+
82
+ endValue = object()
83
+
84
+ result = utils.eql(endValue, @expectedEndValue)
85
+ result = !result if negate
86
+ context.assert result,
87
+ "expected `#{formatFunction object}` to change to #{utils.inspect @expectedEndValue}, but it changed to #{utils.inspect endValue}",
88
+ "not supported"
89
+ flag(context, 'negate', negate)
90
+
91
+ changeFromBeginAssert = (context) ->
92
+ negate = flag(context, 'negate')
93
+ flag(context, 'negate', @negate)
94
+ object = flag(context, 'object')
95
+
96
+ startValue = object()
97
+
98
+ result = utils.eql(startValue, @expectedStartValue)
99
+ result = !result if negate
100
+ context.assert result,
101
+ "expected `#{formatFunction object}` to change from #{utils.inspect @expectedStartValue}, but it changed from #{utils.inspect startValue}",
102
+ "not supported"
103
+ flag(context, 'negate', negate)
104
+
105
+ changeFromAssert = (context) ->
106
+ negate = flag(context, 'negate')
107
+ flag(context, 'negate', @negate)
108
+ object = flag(context, 'object')
109
+
110
+ startValue = flag(context, 'changeStart')
111
+ endValue = object()
112
+
113
+ result = !utils.eql(startValue, endValue)
114
+ result = !result if negate
115
+ context.assert result,
116
+ "expected `#{formatFunction object}` to change from #{utils.inspect @expectedStartValue}, but it did not change"
117
+ "not supported"
118
+ flag(context, 'negate', negate)
119
+
120
+ # Verifies if the subject return value changes by given delta 'when' events happen
121
+ #
122
+ # Examples:
123
+ # (-> resultValue).should.change.by(1).when -> resultValue += 1
124
+ #
125
+ chai.Assertion.addProperty 'change', ->
126
+ flag(this, 'no-change', true)
127
+
128
+ definedActions = flag(this, 'whenActions') || []
129
+ # Add a around filter to the when actions
130
+ definedActions.push
131
+ negate: flag(this, 'negate')
132
+
133
+ # set up the callback to trigger
134
+ before: (context) ->
135
+ startValue = flag(context, 'object')()
136
+ flag(context, 'changeStart', startValue)
137
+ after: noChangeAssert
138
+
139
+ flag(this, 'whenActions', definedActions)
140
+
141
+ formatFunction = (func) ->
142
+ func.toString().replace(/^\s*function \(\) {\s*/, '').replace(/\s+}$/, '').replace(/\s*return\s*/, '')
143
+
144
+ changeBy = (delta) ->
145
+ flag(this, 'no-change', false)
146
+ definedActions = flag(this, 'whenActions') || []
147
+ # Add a around filter to the when actions
148
+ definedActions.push
149
+ negate: flag(this, 'negate')
150
+ expectedDelta: delta
151
+ after: changeByAssert
152
+ flag(this, 'whenActions', definedActions)
153
+
154
+ chai.Assertion.addChainableMethod 'by', changeBy, -> this
155
+
156
+ changeTo = (endValue) ->
157
+ flag(this, 'no-change', false)
158
+ definedActions = flag(this, 'whenActions') || []
159
+ # Add a around filter to the when actions
160
+ definedActions.push
161
+ negate: flag(this, 'negate')
162
+ expectedEndValue: endValue
163
+ before: changeToBeginAssert
164
+ after: changeToAssert
165
+ flag(this, 'whenActions', definedActions)
166
+
167
+ chai.Assertion.addChainableMethod 'to', changeTo, -> this
168
+
169
+ changeFrom = (startValue) ->
170
+ flag(this, 'no-change', false)
171
+ definedActions = flag(this, 'whenActions') || []
172
+ # Add a around filter to the when actions
173
+ definedActions.push
174
+ negate: flag(this, 'negate')
175
+ expectedStartValue: startValue
176
+ before: changeFromBeginAssert
177
+ after: changeFromAssert
178
+ flag(this, 'whenActions', definedActions)
179
+
180
+ chai.Assertion.addChainableMethod 'from', changeFrom, -> this
181
+
182
+ )
183
+
@@ -1,3 +1,4 @@
1
+ #= require ./../chai-backbone
1
2
 
2
3
  describe 'Chai-Backbone', ->
3
4
 
@@ -35,73 +36,16 @@ describe 'Chai-Backbone', ->
35
36
 
36
37
  it 'checks if a method is trigger by route', ->
37
38
  "route1/sub".should.route.to router, 'subRoute'
39
+ expect(->
40
+ "route1/ere".should.route.to router, 'subRoute'
41
+ ).to.throw 'expected `route1/ere` to route to subRoute'
38
42
 
39
43
  it 'verifies argument parsing', ->
40
- "route2/argVal".should.route.to router, 'routeWithArg', with: ['argVal']
44
+ "route2/argVal".should.route.to router, 'routeWithArg', arguments: ['argVal']
45
+ expect(->
46
+ "route2/ere".should.route.to router, 'routeWithArg', arguments: ['argVal']
47
+ ).to.throw 'expected `routeWithArg` to be called with [ \'argVal\' ], but was called with [ \'ere\' ] instead'
41
48
 
42
49
  it 'leaves the `to` keyword working properly', ->
43
50
  expect('1').to.be.equal '1'
44
51
 
45
- describe 'change', ->
46
-
47
- describe 'by delta', ->
48
-
49
- it 'asserts the delta of a change', ->
50
- result = 1
51
- expect(-> result).to.change.by(3).when -> result += 3
52
-
53
- it 'reports the contents of the subject method', ->
54
- result = 1
55
- expect(->
56
- (-> 1 + 3; result).should.change.by(3).when -> result += 2
57
- ).to.throw 'expected `1 + 3;result;` to change by 3, but it changed by 2'
58
-
59
- it 'can be negated to not.change', ->
60
- result = 1
61
- expect(->
62
- expect(-> result).to.not.change.when -> result += 2
63
- ).to.throw 'expected `result;` not to change, but it changed by 2'
64
- expect(-> result).to.not.change.when -> 1 + 3
65
-
66
- describe 'to', ->
67
-
68
- it 'asserts end values', ->
69
- result = ['a']
70
- expect(-> result).to.change.to(['b']).when -> result = ['b']
71
-
72
- it 'reports the mismatched end value', ->
73
- result = ['a']
74
- expect(->
75
- expect(-> result).to.change.to(['b']).when -> result = ['c']
76
- ).to.throw 'expected `result;` to change to [ \'b\' ], but it changed to [ \'c\' ]'
77
-
78
- it 'raises an error if there was no change', ->
79
- result = 'b'
80
- expect(->
81
- expect(-> result).to.change.to('b').when -> result = 'b'
82
- ).to.throw 'expected `result;` to change to \'b\', but it was already \'b\''
83
-
84
- describe 'from', ->
85
-
86
- it 'asserts start values', ->
87
- result = ['a']
88
- expect(-> result).to.change.from(['a']).when -> result = ['b']
89
-
90
- it 'reports the mismatched start value', ->
91
- result = ['a']
92
- expect(->
93
- expect(-> result).to.change.from(['b']).when -> result = ['c']
94
- ).to.throw 'expected `result;` to change from [ \'b\' ], but it changed from [ \'a\' ]'
95
-
96
- it 'raises an error if there was no change', ->
97
- result = 'b'
98
- expect(->
99
- expect(-> result).to.change.from('b').when -> result = 'b'
100
- ).to.throw 'expected `result;` to change from \'b\', but it did not change'
101
-
102
-
103
- describe 'mix and match', ->
104
-
105
- it 'can use from to and by in one sentence', ->
106
- result = 3
107
- expect(-> result).to.change.from(3).to(5).by(2).when -> result = 5
@@ -0,0 +1,76 @@
1
+ #= require ./../chai-changes
2
+
3
+ describe 'Chai-Changes', ->
4
+
5
+ describe 'change', ->
6
+
7
+ describe 'at all', ->
8
+
9
+ it 'detects changes', ->
10
+ result = 1
11
+ expect(->
12
+ expect(-> result).to.change.when -> result = 1
13
+ ).to.throw 'expected `result;` to change, but it stayed 1'
14
+ expect(-> result).to.change.when -> result += 1
15
+
16
+ it 'can be negated to not.change', ->
17
+ result = 1
18
+ expect(->
19
+ expect(-> result).to.not.change.when -> result += 2
20
+ ).to.throw 'expected `result;` not to change, but it changed from 1 to 3'
21
+ expect(-> result).to.not.change.when -> 1 + 3
22
+
23
+ describe 'by delta', ->
24
+
25
+ it 'asserts the delta of a change', ->
26
+ result = 1
27
+ expect(-> result).to.change.by(3).when -> result += 3
28
+
29
+ it 'reports the contents of the subject method', ->
30
+ result = 1
31
+ expect(->
32
+ (-> 1 + 3; result).should.change.by(3).when -> result += 2
33
+ ).to.throw 'expected `1 + 3;result;` to change by 3, but it changed by 2'
34
+
35
+ describe 'to', ->
36
+
37
+ it 'asserts end values', ->
38
+ result = ['a']
39
+ expect(-> result).to.change.to(['b']).when -> result = ['b']
40
+
41
+ it 'reports the mismatched end value', ->
42
+ result = ['a']
43
+ expect(->
44
+ expect(-> result).to.change.to(['b']).when -> result = ['c']
45
+ ).to.throw 'expected `result;` to change to [ \'b\' ], but it changed to [ \'c\' ]'
46
+
47
+ it 'raises an error if there was no change', ->
48
+ result = 'b'
49
+ expect(->
50
+ expect(-> result).to.change.to('b').when -> result = 'b'
51
+ ).to.throw 'expected `result;` to change to \'b\', but it was already \'b\''
52
+
53
+ describe 'from', ->
54
+
55
+ it 'asserts start values', ->
56
+ result = ['a']
57
+ expect(-> result).to.change.from(['a']).when -> result = ['b']
58
+
59
+ it 'reports the mismatched start value', ->
60
+ result = ['a']
61
+ expect(->
62
+ expect(-> result).to.change.from(['b']).when -> result = ['c']
63
+ ).to.throw 'expected `result;` to change from [ \'b\' ], but it changed from [ \'a\' ]'
64
+
65
+ it 'raises an error if there was no change', ->
66
+ result = 'b'
67
+ expect(->
68
+ expect(-> result).to.change.from('b').when -> result = 'b'
69
+ ).to.throw 'expected `result;` to change from \'b\', but it did not change'
70
+
71
+ describe 'mix and match', ->
72
+
73
+ it 'can use from to and by in one sentence', ->
74
+ result = 3
75
+ expect(-> result).to.change.from(3).to(5).by(2).when -> result = 5
76
+
@@ -1,3 +1,4 @@
1
+ #= require ./../chai-sinon
1
2
 
2
3
  describe "Sinon Chai Matchers", ->
3
4
 
@@ -1,3 +1,5 @@
1
+ #= require ./../factories
2
+
1
3
  describe 'Factory', ->
2
4
 
3
5
  beforeEach ->
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chai-backbone-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -28,10 +28,12 @@ files:
28
28
  - lib/chai-backbone-rails/version.rb
29
29
  - vendor/assets/javascripts/chai-backbone.js.coffee
30
30
  - vendor/assets/javascripts/chai-backbone_spec.js.coffee
31
+ - vendor/assets/javascripts/chai-changes.js.coffee
31
32
  - vendor/assets/javascripts/chai-sinon.js.coffee
32
33
  - vendor/assets/javascripts/factories.js.coffee
33
34
  - vendor/assets/javascripts/sinon-1.4.2.js
34
35
  - vendor/assets/javascripts/spec/chai-backbone_spec.js.coffee
36
+ - vendor/assets/javascripts/spec/chai-changes_spec.js.coffee
35
37
  - vendor/assets/javascripts/spec/chai-sinon_spec.js.coffee
36
38
  - vendor/assets/javascripts/spec/factory_spec.js.coffee
37
39
  homepage: https://github.com/matthijsgroen/chai-backbone-rails