upjs-rails 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -1
  3. data/dist/up.js +929 -374
  4. data/dist/up.min.js +2 -2
  5. data/lib/assets/javascripts/up/browser.js.coffee +31 -14
  6. data/lib/assets/javascripts/up/bus.js.coffee +87 -22
  7. data/lib/assets/javascripts/up/flow.js.coffee +119 -43
  8. data/lib/assets/javascripts/up/form.js.coffee +188 -57
  9. data/lib/assets/javascripts/up/link.js.coffee +57 -21
  10. data/lib/assets/javascripts/up/modal.js.coffee +77 -63
  11. data/lib/assets/javascripts/up/motion.js.coffee +10 -9
  12. data/lib/assets/javascripts/up/popup.js.coffee +54 -40
  13. data/lib/assets/javascripts/up/proxy.js.coffee +46 -17
  14. data/lib/assets/javascripts/up/rails.js.coffee +22 -4
  15. data/lib/assets/javascripts/up/syntax.js.coffee +2 -2
  16. data/lib/assets/javascripts/up/util.js.coffee +100 -16
  17. data/lib/upjs/rails/inspector.rb +3 -3
  18. data/lib/upjs/rails/version.rb +1 -1
  19. data/spec_app/Gemfile.lock +1 -4
  20. data/spec_app/app/controllers/test_controller.rb +2 -2
  21. data/spec_app/spec/controllers/test_controller_spec.rb +5 -5
  22. data/spec_app/spec/javascripts/helpers/browser_switches.js.coffee +9 -0
  23. data/spec_app/spec/javascripts/helpers/knife.js.coffee +0 -1
  24. data/spec_app/spec/javascripts/helpers/reset_path.js.coffee +4 -5
  25. data/spec_app/spec/javascripts/helpers/to_be_present.js.coffee +5 -0
  26. data/spec_app/spec/javascripts/helpers/to_have_request_method.js.coffee +8 -0
  27. data/spec_app/spec/javascripts/up/bus_spec.js.coffee +26 -0
  28. data/spec_app/spec/javascripts/up/flow_spec.js.coffee +203 -91
  29. data/spec_app/spec/javascripts/up/form_spec.js.coffee +244 -49
  30. data/spec_app/spec/javascripts/up/history_spec.js.coffee +8 -2
  31. data/spec_app/spec/javascripts/up/link_spec.js.coffee +83 -30
  32. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +23 -17
  33. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +4 -4
  34. data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +1 -1
  35. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +26 -16
  36. data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +45 -13
  37. data/spec_app/spec/javascripts/up/rails_spec.js.coffee +48 -0
  38. data/spec_app/spec/javascripts/up/util_spec.js.coffee +48 -0
  39. metadata +5 -2
@@ -14,7 +14,7 @@ describe 'up.history', ->
14
14
 
15
15
  describe '[up-back]', ->
16
16
 
17
- if up.browser.canPushState()
17
+ describeCapability 'canPushState', ->
18
18
 
19
19
  it 'sets an [up-href] attribute to the previous URL and sets the up-restore-scroll attribute to "true"', ->
20
20
  up.history.push('/one')
@@ -29,9 +29,15 @@ describe 'up.history', ->
29
29
 
30
30
  it 'does not set an up-href attribute if there is no previous URL'
31
31
 
32
+ describeFallback 'canPushState', ->
33
+
34
+ it 'does not change the element', ->
35
+ $element = up.hello(affix('a[href="/three"][up-back]').text('text'))
36
+ expect($element.attr('up-href')).toBeUndefined()
37
+
32
38
  describe 'scroll restauration', ->
33
39
 
34
- if up.browser.canPushState()
40
+ describeCapability 'canPushState', ->
35
41
 
36
42
  afterEach ->
37
43
  $('.viewport').remove()
@@ -5,8 +5,8 @@ describe 'up.link', ->
5
5
  describe 'Javascript functions', ->
6
6
 
7
7
  describe 'up.follow', ->
8
-
9
- if up.browser.canPushState()
8
+
9
+ describeCapability 'canPushState', ->
10
10
 
11
11
  it 'loads the given link via AJAX and replaces the response in the given target', (done) ->
12
12
  affix('.before').text('old-before')
@@ -32,7 +32,7 @@ describe 'up.link', ->
32
32
  $link = affix('a[href="/path"][data-method="PUT"]')
33
33
  up.follow($link)
34
34
  request = @lastRequest()
35
- expect(request.method).toBe('PUT')
35
+ expect(request).toHaveRequestMethod('PUT')
36
36
 
37
37
  it 'allows to refer to the link itself as "&" in the CSS selector', ->
38
38
  $container = affix('div')
@@ -142,7 +142,26 @@ describe 'up.link', ->
142
142
  #
143
143
  # it "doesn't make a request and reveals the target of a #hash in the URL"
144
144
 
145
- else
145
+ describe 'with { confirm } option', ->
146
+
147
+ it 'follows the link after the user OKs a confirmation dialog', ->
148
+ deferred = $.Deferred()
149
+ spyOn(up.browser, 'confirm').and.returnValue(deferred)
150
+ spyOn(up, 'replace')
151
+ $link = affix('a[href="/danger"][up-target=".middle"]')
152
+ up.follow($link, confirm: 'Do you really want to go there?')
153
+ expect(up.browser.confirm).toHaveBeenCalledWith('Do you really want to go there?')
154
+ expect(up.replace).not.toHaveBeenCalled()
155
+ deferred.resolve()
156
+ expect(up.replace).toHaveBeenCalled()
157
+
158
+ it 'does not show a confirmation dialog if the option is not a present string', ->
159
+ spyOn(up, 'replace')
160
+ $link = affix('a[href="/danger"][up-target=".middle"]')
161
+ up.follow($link, confirm: '')
162
+ expect(up.replace).toHaveBeenCalled()
163
+
164
+ describeFallback 'canPushState', ->
146
165
 
147
166
  it 'follows the given link', ->
148
167
  $link = affix('a[href="/path"]')
@@ -172,23 +191,25 @@ describe 'up.link', ->
172
191
  $form.click()
173
192
  expect(followSpy).not.toHaveBeenCalled()
174
193
 
175
- it 'adds a history entry', ->
176
- affix('.target')
177
- $link = affix('a[href="/path"][up-target=".target"]')
178
- $link.click()
179
- @respondWith('<div class="target">new text</div>')
180
- expect($('.target')).toHaveText('new text')
181
- expect(location.pathname).toEqual('/path')
182
-
183
- it 'respects a X-Up-Location header that the server sends in case of a redirect', ->
184
- affix('.target')
185
- $link = affix('a[href="/path"][up-target=".target"]')
186
- $link.click()
187
- @respondWith
188
- responseText: '<div class="target">new text</div>'
189
- responseHeaders: { 'X-Up-Location': '/other/path' }
190
- expect($('.target')).toHaveText('new text')
191
- expect(location.pathname).toEqual('/other/path')
194
+ describeCapability 'canPushState', ->
195
+
196
+ it 'adds a history entry', ->
197
+ affix('.target')
198
+ $link = affix('a[href="/path"][up-target=".target"]')
199
+ $link.click()
200
+ @respondWith('<div class="target">new text</div>')
201
+ expect($('.target')).toHaveText('new text')
202
+ expect(location.pathname).toEqual('/path')
203
+
204
+ it 'respects a X-Up-Location header that the server sends in case of a redirect', ->
205
+ affix('.target')
206
+ $link = affix('a[href="/path"][up-target=".target"]')
207
+ $link.click()
208
+ @respondWith
209
+ responseText: '<div class="target">new text</div>'
210
+ responseHeaders: { 'X-Up-Location': '/other/path' }
211
+ expect($('.target')).toHaveText('new text')
212
+ expect(location.pathname).toEqual('/other/path')
192
213
 
193
214
  it 'does not add a history entry when an up-history attribute is set to "false"', ->
194
215
  oldPathname = location.pathname
@@ -212,9 +233,11 @@ describe 'up.link', ->
212
233
  Trigger.click(@$link)
213
234
  expect(@followSpy).toHaveBeenCalledWith(@$link)
214
235
 
215
- it 'does nothing if the right mouse button is used', ->
216
- Trigger.click(@$link, button: 2)
217
- expect(@followSpy).not.toHaveBeenCalled()
236
+ # IE does not call Javascript and always performs the default action on right clicks
237
+ unless navigator.userAgent.match(/Trident/)
238
+ it 'does nothing if the right mouse button is used', ->
239
+ Trigger.click(@$link, button: 2)
240
+ expect(@followSpy).not.toHaveBeenCalled()
218
241
 
219
242
  it 'does nothing if shift is pressed during the click', ->
220
243
  Trigger.click(@$link, shiftKey: true)
@@ -224,9 +247,9 @@ describe 'up.link', ->
224
247
  Trigger.click(@$link, ctrlKey: true)
225
248
  expect(@followSpy).not.toHaveBeenCalled()
226
249
 
227
- # it 'does nothing if meta is pressed during the click', ->
228
- # Trigger.click(@$link, metaKey: true)
229
- # expect(@followSpy).not.toHaveBeenCalled()
250
+ it 'does nothing if meta is pressed during the click', ->
251
+ Trigger.click(@$link, metaKey: true)
252
+ expect(@followSpy).not.toHaveBeenCalled()
230
253
 
231
254
  describe 'with [up-instant] modifier', ->
232
255
 
@@ -245,9 +268,11 @@ describe 'up.link', ->
245
268
  Trigger.click(@$link)
246
269
  expect(@followSpy).not.toHaveBeenCalled()
247
270
 
248
- it 'does nothing if the right mouse button is pressed down', ->
249
- Trigger.mousedown(@$link, button: 2)
250
- expect(@followSpy).not.toHaveBeenCalled()
271
+ # IE does not call Javascript and always performs the default action on right clicks
272
+ unless navigator.userAgent.match(/Trident/)
273
+ it 'does nothing if the right mouse button is pressed down', ->
274
+ Trigger.mousedown(@$link, button: 2)
275
+ expect(@followSpy).not.toHaveBeenCalled()
251
276
 
252
277
  it 'does nothing if shift is pressed during mousedown', ->
253
278
  Trigger.mousedown(@$link, shiftKey: true)
@@ -275,6 +300,13 @@ describe 'up.link', ->
275
300
  up.hello($area)
276
301
  expect($area.attr('up-href')).toEqual('/path')
277
302
 
303
+ it 'copies attributes from the first link if there are multiple links', ->
304
+ $area = affix('div[up-expand]')
305
+ $link1 = $area.affix('a[href="/path1"]')
306
+ $link2 = $area.affix('a[href="/path2"]')
307
+ up.hello($area)
308
+ expect($area.attr('up-href')).toEqual('/path1')
309
+
278
310
  it "copies an contained non-link element with up-href attribute", ->
279
311
  $area = affix('div[up-expand] span[up-follow][up-href="/path"]')
280
312
  up.hello($area)
@@ -285,3 +317,24 @@ describe 'up.link', ->
285
317
  up.hello($area)
286
318
  expect($area.attr('up-follow')).toEqual('')
287
319
 
320
+ describe 'with a CSS selector in the property value', ->
321
+
322
+ it "expands the contained link that matches the selector", ->
323
+ $area = affix('div[up-expand=".second"]')
324
+ $link1 = $area.affix('a.first[href="/path1"]')
325
+ $link2 = $area.affix('a.second[href="/path2"]')
326
+ up.hello($area)
327
+ expect($area.attr('up-href')).toEqual('/path2')
328
+
329
+ it 'does nothing if no contained link matches the selector', ->
330
+ $area = affix('div[up-expand=".foo"]')
331
+ $link = $area.affix('a[href="/path1"]')
332
+ up.hello($area)
333
+ expect($area.attr('up-href')).toBeUndefined()
334
+
335
+ it 'does not match an element that is not a descendant', ->
336
+ $area = affix('div[up-expand=".second"]')
337
+ $link1 = $area.affix('a.first[href="/path1"]')
338
+ $link2 = affix('a.second[href="/path2"]') # not a child of $area
339
+ up.hello($area)
340
+ expect($area.attr('up-href')).toBeUndefined()
@@ -75,15 +75,17 @@ describe 'up.modal', ->
75
75
 
76
76
  describe 'up.modal.coveredUrl', ->
77
77
 
78
- it 'returns the URL behind the modal overlay', (done) ->
79
- up.history.replace('/foo')
80
- expect(up.modal.coveredUrl()).toBeUndefined()
81
- up.modal.visit('/bar', target: '.container')
82
- @respondWith('<div class="container">text</div>')
83
- expect(up.modal.coveredUrl()).toEndWith('/foo')
84
- up.modal.close().then ->
78
+ describeCapability 'canPushState', ->
79
+
80
+ it 'returns the URL behind the modal overlay', (done) ->
81
+ up.history.replace('/foo')
85
82
  expect(up.modal.coveredUrl()).toBeUndefined()
86
- done()
83
+ up.modal.visit('/bar', target: '.container')
84
+ @respondWith('<div class="container">text</div>')
85
+ expect(up.modal.coveredUrl()).toEndWith('/foo')
86
+ up.modal.close().then ->
87
+ expect(up.modal.coveredUrl()).toBeUndefined()
88
+ done()
87
89
 
88
90
 
89
91
  describe 'up.modal.close', ->
@@ -109,9 +111,11 @@ describe 'up.modal', ->
109
111
  Trigger.click(@$link)
110
112
  expect(@followSpy).toHaveBeenCalledWith(@$link)
111
113
 
112
- it 'does nothing if the right mouse button is used', ->
113
- Trigger.click(@$link, button: 2)
114
- expect(@followSpy).not.toHaveBeenCalled()
114
+ # IE does not call Javascript and always performs the default action on right clicks
115
+ unless navigator.userAgent.match(/Trident/)
116
+ it 'does nothing if the right mouse button is used', ->
117
+ Trigger.click(@$link, button: 2)
118
+ expect(@followSpy).not.toHaveBeenCalled()
115
119
 
116
120
  it 'does nothing if shift is pressed during the click', ->
117
121
  Trigger.click(@$link, shiftKey: true)
@@ -121,9 +125,9 @@ describe 'up.modal', ->
121
125
  Trigger.click(@$link, ctrlKey: true)
122
126
  expect(@followSpy).not.toHaveBeenCalled()
123
127
 
124
- # it 'does nothing if meta is pressed during the click', ->
125
- # Trigger.click(@$link, metaKey: true)
126
- # expect(@followSpy).not.toHaveBeenCalled()
128
+ it 'does nothing if meta is pressed during the click', ->
129
+ Trigger.click(@$link, metaKey: true)
130
+ expect(@followSpy).not.toHaveBeenCalled()
127
131
 
128
132
  describe 'with [up-instant] modifier', ->
129
133
 
@@ -142,9 +146,11 @@ describe 'up.modal', ->
142
146
  Trigger.click(@$link)
143
147
  expect(@followSpy).not.toHaveBeenCalled()
144
148
 
145
- it 'does nothing if the right mouse button is pressed down', ->
146
- Trigger.mousedown(@$link, button: 2)
147
- expect(@followSpy).not.toHaveBeenCalled()
149
+ # IE does not call Javascript and always performs the default action on right clicks
150
+ unless navigator.userAgent.match(/Trident/)
151
+ it 'does nothing if the right mouse button is pressed down', ->
152
+ Trigger.mousedown(@$link, button: 2)
153
+ expect(@followSpy).not.toHaveBeenCalled()
148
154
 
149
155
  it 'does nothing if shift is pressed during mousedown', ->
150
156
  Trigger.mousedown(@$link, shiftKey: true)
@@ -4,7 +4,7 @@ describe 'up.motion', ->
4
4
 
5
5
  describe 'up.animate', ->
6
6
 
7
- if up.browser.canCssTransition()
7
+ describeCapability 'canCssTransition', ->
8
8
 
9
9
  it 'animates the given element', (done) ->
10
10
  $element = affix('.element').text('content')
@@ -35,7 +35,7 @@ describe 'up.motion', ->
35
35
  up.animate($element, { 'font-size': '40px' }, duration: 10000, easing: 'linear')
36
36
  expect($element.css('font-size')).toEqual('40px')
37
37
 
38
- else
38
+ describeFallback 'canCssTransition', ->
39
39
 
40
40
  it "doesn't animate and directly sets the last frame instead", ->
41
41
  $element = affix('.element').text('content')
@@ -45,7 +45,7 @@ describe 'up.motion', ->
45
45
 
46
46
  describe 'up.morph', ->
47
47
 
48
- if up.browser.canCssTransition()
48
+ describeCapability 'canCssTransition', ->
49
49
 
50
50
  it 'transitions between two element by animating two copies while keeping the originals in the background', (done) ->
51
51
 
@@ -209,7 +209,7 @@ describe 'up.motion', ->
209
209
  expect($new).toBeVisible()
210
210
  expect($new.css('opacity')).toEqual('1')
211
211
 
212
- else
212
+ describeFallback 'canCssTransition', ->
213
213
 
214
214
  it "doesn't animate and hides the old element instead", ->
215
215
  $old = affix('.old').text('old content')
@@ -44,7 +44,7 @@ describe 'up.navigation', ->
44
44
  $currentLink = up.hello(affix('a[href="/foo"]'))
45
45
  expect($currentLink).toHaveClass('highlight up-current')
46
46
 
47
- if up.browser.canPushState()
47
+ describeCapability 'canPushState', ->
48
48
 
49
49
  it 'marks a link as .up-current if it links to the current URL, but is missing a trailing slash', ->
50
50
  $link = affix('a[href="/foo"][up-target=".main"]')
@@ -45,17 +45,19 @@ describe 'up.popup', ->
45
45
 
46
46
  describe 'up.popup.coveredUrl', ->
47
47
 
48
- it 'returns the URL behind the popup', (done) ->
49
- up.history.replace('/foo')
50
- expect(up.popup.coveredUrl()).toBeUndefined()
51
-
52
- $popupLink = affix('a[href="/bar"][up-popup=".container"]')
53
- $popupLink.click()
54
- @respondWith('<div class="container">text</div>')
55
- expect(up.popup.coveredUrl()).toEndWith('/foo')
56
- up.popup.close().then ->
48
+ describeCapability 'canPushState', ->
49
+
50
+ it 'returns the URL behind the popup', (done) ->
51
+ up.history.replace('/foo')
57
52
  expect(up.popup.coveredUrl()).toBeUndefined()
58
- done()
53
+
54
+ $popupLink = affix('a[href="/bar"][up-popup=".container"]')
55
+ $popupLink.click()
56
+ @respondWith('<div class="container">text</div>')
57
+ expect(up.popup.coveredUrl()).toEndWith('/foo')
58
+ up.popup.close().then ->
59
+ expect(up.popup.coveredUrl()).toBeUndefined()
60
+ done()
59
61
 
60
62
  describe 'up.popup.close', ->
61
63
 
@@ -78,9 +80,11 @@ describe 'up.popup', ->
78
80
  Trigger.click(@$link)
79
81
  expect(@attachSpy).toHaveBeenCalledWith(@$link)
80
82
 
81
- it 'does nothing if the right mouse button is used', ->
82
- Trigger.click(@$link, button: 2)
83
- expect(@attachSpy).not.toHaveBeenCalled()
83
+ # IE does not call Javascript and always performs the default action on right clicks
84
+ unless navigator.userAgent.match(/Trident/)
85
+ it 'does nothing if the right mouse button is used', ->
86
+ Trigger.click(@$link, button: 2)
87
+ expect(@attachSpy).not.toHaveBeenCalled()
84
88
 
85
89
  it 'does nothing if shift is pressed during the click', ->
86
90
  Trigger.click(@$link, shiftKey: true)
@@ -90,6 +94,10 @@ describe 'up.popup', ->
90
94
  Trigger.click(@$link, ctrlKey: true)
91
95
  expect(@attachSpy).not.toHaveBeenCalled()
92
96
 
97
+ it 'does nothing if meta is pressed during the click', ->
98
+ Trigger.click(@$link, metaKey: true)
99
+ expect(@attachSpy).not.toHaveBeenCalled()
100
+
93
101
  describe 'with [up-instant] modifier', ->
94
102
 
95
103
  beforeEach ->
@@ -107,9 +115,11 @@ describe 'up.popup', ->
107
115
  Trigger.click(@$link)
108
116
  expect(@attachSpy).not.toHaveBeenCalled()
109
117
 
110
- it 'does nothing if the right mouse button is pressed down', ->
111
- Trigger.mousedown(@$link, button: 2)
112
- expect(@attachSpy).not.toHaveBeenCalled()
118
+ # IE does not call Javascript and always performs the default action on right clicks
119
+ unless navigator.userAgent.match(/Trident/)
120
+ it 'does nothing if the right mouse button is pressed down', ->
121
+ Trigger.mousedown(@$link, button: 2)
122
+ expect(@attachSpy).not.toHaveBeenCalled()
113
123
 
114
124
  it 'does nothing if shift is pressed during mousedown', ->
115
125
  Trigger.mousedown(@$link, shiftKey: true)
@@ -41,26 +41,26 @@ describe 'up.proxy', ->
41
41
  expect(responses).toEqual(['foo', 'foo', 'bar'])
42
42
 
43
43
  it "doesn't reuse responses when asked for the same path, but different selectors", ->
44
- up.proxy.ajax(url: '/path', selector: '.a')
45
- up.proxy.ajax(url: '/path', selector: '.b')
44
+ up.proxy.ajax(url: '/path', target: '.a')
45
+ up.proxy.ajax(url: '/path', target: '.b')
46
46
  expect(jasmine.Ajax.requests.count()).toEqual(2)
47
47
 
48
48
  it "reuses a response for an 'html' selector when asked for the same path and any other selector", ->
49
- up.proxy.ajax(url: '/path', selector: 'html')
50
- up.proxy.ajax(url: '/path', selector: 'body')
51
- up.proxy.ajax(url: '/path', selector: 'p')
52
- up.proxy.ajax(url: '/path', selector: '.klass')
49
+ up.proxy.ajax(url: '/path', target: 'html')
50
+ up.proxy.ajax(url: '/path', target: 'body')
51
+ up.proxy.ajax(url: '/path', target: 'p')
52
+ up.proxy.ajax(url: '/path', target: '.klass')
53
53
  expect(jasmine.Ajax.requests.count()).toEqual(1)
54
54
 
55
55
  it "reuses a response for a 'body' selector when asked for the same path and any other selector other than 'html'", ->
56
- up.proxy.ajax(url: '/path', selector: 'body')
57
- up.proxy.ajax(url: '/path', selector: 'p')
58
- up.proxy.ajax(url: '/path', selector: '.klass')
56
+ up.proxy.ajax(url: '/path', target: 'body')
57
+ up.proxy.ajax(url: '/path', target: 'p')
58
+ up.proxy.ajax(url: '/path', target: '.klass')
59
59
  expect(jasmine.Ajax.requests.count()).toEqual(1)
60
60
 
61
61
  it "doesn't reuse a response for a 'body' selector when asked for the same path but an 'html' selector", ->
62
- up.proxy.ajax(url: '/path', selector: 'body')
63
- up.proxy.ajax(url: '/path', selector: 'html')
62
+ up.proxy.ajax(url: '/path', target: 'body')
63
+ up.proxy.ajax(url: '/path', target: 'html')
64
64
  expect(jasmine.Ajax.requests.count()).toEqual(2)
65
65
 
66
66
  it "doesn't reuse responses for different paths", ->
@@ -101,11 +101,43 @@ describe 'up.proxy', ->
101
101
 
102
102
  expect(jasmine.Ajax.requests.count()).toEqual(2)
103
103
 
104
+ describe 'with config.wrapMethods set', ->
105
+
106
+ it 'should be set by default', ->
107
+ expect(up.proxy.config.wrapMethods).toBePresent()
108
+
109
+ # beforeEach ->
110
+ # @oldWrapMethod = up.proxy.config.wrapMethod
111
+ # up.proxy.config.wrapMethod = true
112
+ #
113
+ # afterEach ->
114
+ # up.proxy.config.wrapMethod = @oldWrapMetod
115
+
116
+ u.each ['GET', 'POST', 'HEAD', 'OPTIONS'], (method) ->
117
+
118
+ it "does not change the method of a #{method} request", ->
119
+ up.proxy.ajax(url: '/foo', method: method)
120
+ request = @lastRequest()
121
+ expect(request.method).toEqual(method)
122
+ expect(request.data()['_method']).toBeUndefined()
123
+
124
+ u.each ['PUT', 'PATCH', 'DELETE'], (method) ->
125
+
126
+ it "turns a #{method} request into a POST request and sends the actual method as a { _method } param", ->
127
+ up.proxy.ajax(url: '/foo', method: method)
128
+ request = @lastRequest()
129
+ expect(request.method).toEqual('POST')
130
+ expect(request.data()['_method']).toEqual([method])
131
+
104
132
  describe 'with config.maxRequests set', ->
105
133
 
106
134
  beforeEach ->
135
+ @oldMaxRequests = up.proxy.config.maxRequests
107
136
  up.proxy.config.maxRequests = 1
108
137
 
138
+ afterEach ->
139
+ up.proxy.config.maxRequests = @oldMaxRequests
140
+
109
141
  it 'limits the number of concurrent requests', ->
110
142
  responses = []
111
143
  up.proxy.ajax(url: '/foo').then (html) -> responses.push(html)
@@ -283,7 +315,7 @@ describe 'up.proxy', ->
283
315
 
284
316
  describe 'up.proxy.preload', ->
285
317
 
286
- if up.browser.canPushState()
318
+ describeCapability 'canPushState', ->
287
319
 
288
320
  it "loads and caches the given link's destination", ->
289
321
  $link = affix('a[href="/path"]')
@@ -295,7 +327,7 @@ describe 'up.proxy', ->
295
327
  up.proxy.preload($link)
296
328
  expect(up.proxy.get(url: '/path')).toBeUndefined()
297
329
 
298
- else
330
+ describeFallback 'canPushState', ->
299
331
 
300
332
  it "does nothing", ->
301
333
  $link = affix('a[href="/path"]')