spec_app/spec/javascripts/up/proxy_spec.js.coffee in unpoly-rails-0.56.7 vs spec_app/spec/javascripts/up/proxy_spec.js.coffee in unpoly-rails-0.57.0
- old
+ new
@@ -5,23 +5,32 @@
describe 'JavaScript functions', ->
describe 'up.request', ->
it 'makes a request with the given URL and params', ->
- up.request('/foo', data: { key: 'value' }, method: 'post')
+ up.request('/foo', params: { key: 'value' }, method: 'post')
request = @lastRequest()
expect(request.url).toMatchUrl('/foo')
expect(request.data()).toEqual(key: ['value'])
expect(request.method).toEqual('POST')
it 'also allows to pass the URL as a { url } option instead', ->
- up.request(url: '/foo', data: { key: 'value' }, method: 'post')
+ up.request(url: '/foo', params: { key: 'value' }, method: 'post')
request = @lastRequest()
expect(request.url).toMatchUrl('/foo')
expect(request.data()).toEqual(key: ['value'])
expect(request.method).toEqual('POST')
+ it 'allows to pass in an up.Request instance instead of an options object', ->
+ requestArg = new up.Request(url: '/foo', params: { key: 'value' }, method: 'post')
+ up.request(requestArg)
+
+ jasmineRequest = @lastRequest()
+ expect(jasmineRequest.url).toMatchUrl('/foo')
+ expect(jasmineRequest.data()).toEqual(key: ['value'])
+ expect(jasmineRequest.method).toEqual('POST')
+
it 'submits the replacement targets as HTTP headers, so the server may choose to only frender the requested fragments', asyncSpec (next) ->
up.request(url: '/foo', target: '.target', failTarget: '.fail-target')
next =>
request = @lastRequest()
@@ -29,11 +38,11 @@
expect(request.requestHeaders['X-Up-Fail-Target']).toEqual('.fail-target')
it 'resolves to a Response object that contains information about the response and request', (done) ->
promise = up.request(
url: '/url'
- data: { key: 'value' }
+ params: { key: 'value' }
method: 'post'
target: '.target'
)
u.nextFrame =>
@@ -42,11 +51,11 @@
responseText: 'response-text'
)
promise.then (response) ->
expect(response.request.url).toMatchUrl('/url')
- expect(response.request.data).toEqual(key: 'value')
+ expect(response.request.params).toEqual(key: 'value')
expect(response.request.method).toEqual('POST')
expect(response.request.target).toEqual('.target')
expect(response.request.hash).toBeBlank()
expect(response.url).toMatchUrl('/url') # If the server signaled a redirect with X-Up-Location, this would be reflected here
@@ -55,10 +64,26 @@
expect(response.status).toEqual(201)
expect(response.xhr).toBePresent()
done()
+ it 'resolves to a Response that contains the response headers', (done) ->
+ promise = up.request(url: '/url')
+
+ u.nextFrame =>
+ @respondWith
+ responseHeaders: { 'foo': 'bar', 'baz': 'bam' }
+ responseText: 'hello'
+
+ promise.then (response) ->
+ expect(response.getHeader('foo')).toEqual('bar')
+
+ # Lookup is case-insensitive
+ expect(response.getHeader('BAZ')).toEqual('bam')
+
+ done()
+
it "preserves the URL hash in a separate { hash } property, since although it isn't sent to server, code might need it to process the response", (done) ->
promise = up.request('/url#hash')
u.nextFrame =>
request = @lastRequest()
@@ -75,11 +100,11 @@
describe 'when the server responds with an X-Up-Method header', ->
it 'updates the { method } property in the response object', (done) ->
promise = up.request(
url: '/url'
- data: { key: 'value' }
+ params: { key: 'value' }
method: 'post'
target: '.target'
)
u.nextFrame =>
@@ -162,12 +187,12 @@
next =>
# See that an additional request was made
expect(jasmine.Ajax.requests.count()).toEqual(2)
- it "does not explode if the original request's { data } is a FormData object", asyncSpec (next) ->
- up.request('/foo', method: 'post', data: new FormData()) # POST requests are not cached
+ it "does not explode if the original request's { params } is a FormData object", asyncSpec (next) ->
+ up.request('/foo', method: 'post', params: new FormData()) # POST requests are not cached
next =>
expect(jasmine.Ajax.requests.count()).toEqual(1)
@respondWith
responseHeaders:
@@ -284,23 +309,23 @@
up.request('/path', method: 'post', headers: { 'X-Requested-With': 'Love' })
next =>
headers = @lastRequest().requestHeaders
expect(headers['X-Requested-With']).toEqual('Love')
- describe 'with { data } option', ->
+ describe 'with { params } option', ->
it "uses the given params as a non-GET request's payload", asyncSpec (next) ->
givenParams = { 'foo-key': 'foo-value', 'bar-key': 'bar-value' }
- up.request(url: '/path', method: 'put', data: givenParams)
+ up.request(url: '/path', method: 'put', params: givenParams)
next =>
expect(@lastRequest().data()['foo-key']).toEqual(['foo-value'])
expect(@lastRequest().data()['bar-key']).toEqual(['bar-value'])
it "encodes the given params into the URL of a GET request", (done) ->
givenParams = { 'foo-key': 'foo-value', 'bar-key': 'bar-value' }
- promise = up.request(url: '/path', method: 'get', data: givenParams)
+ promise = up.request(url: '/path', method: 'get', params: givenParams)
u.nextFrame =>
expect(@lastRequest().url).toMatchUrl('/path?foo-key=foo-value&bar-key=bar-value')
expect(@lastRequest().data()).toBeBlank()
@@ -308,11 +333,11 @@
promise.then (response) ->
# See that the response object has been updated by moving the data options
# to the URL. This is important for up.dom code that works on response.request.
expect(response.request.url).toMatchUrl('/path?foo-key=foo-value&bar-key=bar-value')
- expect(response.request.data).toBeBlank()
+ expect(response.request.params).toBeBlank()
done()
it 'caches server responses for the configured duration', asyncSpec (next) ->
up.proxy.config.cacheExpiry = 200 # 1 second for test
@@ -382,12 +407,12 @@
next => up.request(url: '/path', target: '.a')
next => up.request(url: '/path', target: '.b')
next => expect(jasmine.Ajax.requests.count()).toEqual(2)
it "doesn't reuse responses when asked for the same path, but different params", asyncSpec (next) ->
- next => up.request(url: '/path', data: { query: 'foo' })
- next => up.request(url: '/path', data: { query: 'bar' })
+ next => up.request(url: '/path', params: { query: 'foo' })
+ next => up.request(url: '/path', params: { query: 'bar' })
next => expect(jasmine.Ajax.requests.count()).toEqual(2)
it "reuses a response for an 'html' selector when asked for the same path and any other selector", asyncSpec (next) ->
next => up.request(url: '/path', target: 'html')
next => up.request(url: '/path', target: 'body')
@@ -458,10 +483,11 @@
next =>
request = @lastRequest()
expect(request.method).toEqual('POST')
expect(request.data()['_method']).toEqual([method])
+# expect(request.data()['foo']).toEqual('bar')
describe 'with config.maxRequests set', ->
beforeEach ->
@oldMaxRequests = up.proxy.config.maxRequests
@@ -654,25 +680,25 @@
'up:proxy:recover'
])
it 'does not emit up:proxy:recover if a delayed up:proxy:slow was never emitted due to a fast response', asyncSpec (next) ->
next =>
- up.proxy.config.slowDelay = 100
+ up.proxy.config.slowDelay = 200
up.request(url: '/foo')
next =>
expect(@events).toEqual([
'up:proxy:load'
])
- next.after 50, =>
+ next.after 100, =>
jasmine.Ajax.requests.at(0).respondWith
status: 200
contentType: 'text/html'
responseText: 'foo'
- next.after 150, =>
+ next.after 250, =>
expect(@events).toEqual([
'up:proxy:load',
'up:proxy:loaded'
])
@@ -754,16 +780,29 @@
next =>
cachedPromise = up.proxy.get(url: '/path', target: '.target')
expect(u.isPromise(cachedPromise)).toBe(true)
- it "does not load a link whose method has side-effects", asyncSpec (next) ->
- $link = affix('a[href="/path"][data-method="post"]')
- up.proxy.preload($link)
+ it "does not load a link whose method has side-effects", (done) ->
+ affix('.target')
+ $link = affix('a[href="/path"][up-target=".target"][data-method="post"]')
+ preloadPromise = up.proxy.preload($link)
- next => expect(up.proxy.get(url: '/path')).toBeUndefined()
+ promiseState(preloadPromise).then (result) ->
+ expect(result.state).toEqual('rejected')
+ expect(up.proxy.get(url: '/path', target: '.target')).toBeUndefined()
+ done()
+ it 'accepts options', asyncSpec (next) ->
+ affix('.target')
+ $link = affix('a[href="/path"][up-target=".target"]')
+ up.proxy.preload($link, url: '/options-path')
+
+ next =>
+ cachedPromise = up.proxy.get(url: '/options-path', target: '.target')
+ expect(u.isPromise(cachedPromise)).toBe(true)
+
describe 'for an [up-target] link', ->
it 'includes the [up-target] selector as an X-Up-Target header if the targeted element is currently on the page', asyncSpec (next) ->
affix('.target')
$link = affix('a[href="/path"][up-target=".target"]')
@@ -782,11 +821,11 @@
$link = affix('a[href="/path"][up-target=".target"]')
up.proxy.preload($link)
next =>
- expect(requestSpy).toHaveBeenCalledWith(jasmine.objectContaining(url: '/path', preload: true))
+ expect(requestSpy).toHaveBeenCalledWith(jasmine.objectContaining(preload: true))
describe 'for an [up-modal] link', ->
beforeEach ->
up.motion.config.enabled = false
@@ -849,11 +888,11 @@
$link = affix('a[href="/path"][up-modal=".target"]')
up.proxy.preload($link)
next =>
- expect(requestSpy).toHaveBeenCalledWith(jasmine.objectContaining(url: '/path', preload: true))
+ expect(requestSpy).toHaveBeenCalledWith(jasmine.objectContaining(preload: true))
describe 'for an [up-popup] link', ->
beforeEach ->
up.motion.config.enabled = false
@@ -919,11 +958,11 @@
$link = affix('a[href="/path"][up-popup=".target"]')
up.proxy.preload($link)
next =>
- expect(requestSpy).toHaveBeenCalledWith(jasmine.objectContaining(url: '/path', preload: true))
+ expect(requestSpy).toHaveBeenCalledWith(jasmine.objectContaining(preload: true))
describeFallback 'canPushState', ->
it "does nothing", asyncSpec (next) ->
affix('.target')
@@ -933,20 +972,20 @@
expect(jasmine.Ajax.requests.count()).toBe(0)
describe 'up.proxy.get', ->
it 'returns an existing cache entry for the given request', ->
- promise1 = up.request(url: '/foo', data: { key: 'value' })
- promise2 = up.proxy.get(url: '/foo', data: { key: 'value' })
+ promise1 = up.request(url: '/foo', params: { key: 'value' })
+ promise2 = up.proxy.get(url: '/foo', params: { key: 'value' })
expect(promise1).toBe(promise2)
it 'returns undefined if the given request is not cached', ->
- promise = up.proxy.get(url: '/foo', data: { key: 'value' })
+ promise = up.proxy.get(url: '/foo', params: { key: 'value' })
expect(promise).toBeUndefined()
- it "returns undefined if the given request's { data } is a FormData object", ->
- promise = up.proxy.get(url: '/foo', data: new FormData())
+ it "returns undefined if the given request's { params } is a FormData object", ->
+ promise = up.proxy.get(url: '/foo', params: new FormData())
expect(promise).toBeUndefined()
describe 'up.proxy.set', ->
it 'should have tests'
@@ -960,11 +999,11 @@
it 'removes the cache entry for the given request'
it 'does nothing if the given request is not cached'
it 'does not crash when passed a request with FormData (bugfix)', ->
- removal = -> up.proxy.remove(url: '/path', data: new FormData())
+ removal = -> up.proxy.remove(url: '/path', params: new FormData())
expect(removal).not.toThrowError()
describe 'up.proxy.clear', ->
it 'removes all cache entries'
@@ -1039,11 +1078,11 @@
$link = affix('a[href="/foo"][up-target=".target"][up-preload]')
up.hello($link)
Trigger.hoverSequence($link)
- next.after 2, =>
+ next.after 50, =>
expect(jasmine.Ajax.requests.count()).toEqual(1)
@respondWith
status: 500
responseText: """
@@ -1065,27 +1104,27 @@
# Since there isn't anyone who could handle the rejection inside
# the event handler, our handler mutes the rejection.
expect(window).not.toHaveUnhandledRejections() if REJECTION_EVENTS_SUPPORTED
it 'triggers a separate AJAX request when hovered multiple times and the cache expires between hovers', asyncSpec (next) ->
- up.proxy.config.cacheExpiry = 50
+ up.proxy.config.cacheExpiry = 100
up.proxy.config.preloadDelay = 0
$element = affix('a[href="/foo"][up-preload]')
up.hello($element)
Trigger.hoverSequence($element)
- next.after 1, =>
+ next.after 10, =>
expect(jasmine.Ajax.requests.count()).toEqual(1)
- next.after 1, =>
+ next.after 10, =>
Trigger.hoverSequence($element)
- next.after 1, =>
+ next.after 10, =>
expect(jasmine.Ajax.requests.count()).toEqual(1)
- next.after 60, =>
+ next.after 150, =>
Trigger.hoverSequence($element)
- next.after 1, =>
+ next.after 30, =>
expect(jasmine.Ajax.requests.count()).toEqual(2)