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)