xhr2
Version:
XMLHttpRequest emulation for node.js
205 lines (183 loc) • 7.34 kB
text/coffeescript
describe 'XMLHttpRequest', ->
beforeEach ->
= new XMLHttpRequest
= 'http://localhost:8912/_/drip'
= drips: 3, size: 1000, ms: 50, length: true
describe 'level 2 events', ->
beforeEach ->
= []
= false
.check = -> null # replaced by tests
.addEventListener 'loadstart', (event) =>
expect(event.type).to.equal 'loadstart'
expect().to.equal false
.push event
.addEventListener 'progress', (event) =>
expect(event.type).to.equal 'progress'
expect().to.equal false
.push event
.addEventListener 'load', (event) =>
expect(event.type).to.equal 'load'
expect().to.equal false
.push event
.addEventListener 'loadend', (event) =>
expect(event.type).to.equal 'loadend'
expect().to.equal false
= 'loadend already fired'
.push event
.check()
.addEventListener 'error', (event) =>
expect(event.type).to.equal 'error'
expect().to.equal false
.push event
.addEventListener 'abort', (event) =>
expect(event.type).to.equal 'abort'
expect().to.equal false
.push event
describe 'for a successful fetch with Content-Length set', ->
beforeEach ->
.open 'POST',
.send JSON.stringify()
it 'events have the correct target', (done) ->
.check = =>
for event in
expect(event.target).to.equal
done()
it 'events have the correct bubbling setup', (done) ->
.check = =>
for event in
expect(event.bubbles).to.equal false
expect(event.cancelable).to.equal false
done()
it 'events have the correct progress info', (done) ->
.check = =>
for event in
switch event.type
when 'loadstart'
expect(event.loaded).to.equal 0
expect(event.lengthComputable).to.equal false
expect(event.total).to.equal 0
when 'load', 'loadend'
expect(event.loaded).to.equal 3000
expect(event.lengthComputable).to.equal true
expect(event.total).to.equal 3000
when 'progress'
if event.lengthComputable
expect(event.loaded).to.be.gte 0
expect(event.loaded).to.be.lte 3000
expect(event.total).to.equal 3000
else
expect(event.loaded).to.be.gte 0
expect(event.total).to.equal 0
done()
it 'events include at least one intermediate progress event', (done) ->
.check = =>
found = 'no suitable progress event emitted'
for event in
continue unless event.type is 'progress'
continue unless event.loaded > 0
continue unless event.loaded < event.total
found = true
expect(found).to.equal true
done()
describe 'for a successful fetch without Content-Length set', ->
beforeEach ->
.open 'POST',
.length = false
.send JSON.stringify()
it 'events have the correct progress info', (done) ->
.check = =>
for event in
expect(event.lengthComputable).to.equal false
expect(event.total).to.equal 0
switch event.type
when 'loadstart'
expect(event.loaded).to.equal 0
when 'load', 'loadend'
expect(event.loaded).to.equal 3000
when 'progress'
expect(event.loaded).to.be.gte 0
done()
it 'events include at least one intermediate progress event', (done) ->
.check = =>
found = 'no suitable progress event emitted'
for event in
continue unless event.type is 'progress'
continue if event.loaded is 0
continue if event.loaded is 3000
found = true
expect(found).to.equal true
done()
describe 'for a network error due to bad DNS', (done) ->
beforeEach ->
.open 'GET', 'https://broken.to.cause.an.xhrnetworkerror.com'
.send()
it 'no progress or load is emitted', (done) ->
.check = =>
for event in
expect(event.type).not.to.equal 'load'
expect(event.type).not.to.equal 'progress'
done()
it 'events include an error event', (done) ->
.check = =>
found = 'no suitable error emitted'
for event in
continue unless event.type is 'error'
found = true
expect(found).to.equal true
done()
describe 'readystatechange', ->
beforeEach ->
= []
= []
= false
.check = -> null # replaced by tests
.addEventListener 'readystatechange', (event) =>
expect(event.type).to.equal 'readystatechange'
expect().to.equal false
.push event
.push event.target.readyState
if event.target.readyState is XMLHttpRequest.DONE
= 'DONE already fired'
.check()
describe 'for a successful fetch with Content-Length set', ->
beforeEach ->
.open 'POST',
.send JSON.stringify()
it 'events have the correct target', (done) ->
.check = =>
for event in
expect(event.target).to.equal
done()
it 'events have the correct bubbling setup', (done) ->
.check = =>
for event in
expect(event.bubbles).to.equal false
expect(event.cancelable).to.equal false
done()
it 'events states are in the correct order', (done) ->
.check = =>
expect().to.deep.equal [XMLHttpRequest.OPENED,
XMLHttpRequest.HEADERS_RECEIVED,
XMLHttpRequest.LOADING, XMLHttpRequest.DONE]
done()
describe 'for a successful fetch without Content-Length set', ->
beforeEach ->
.open 'POST',
.length = false
.send JSON.stringify()
it 'events states are in the correct order', (done) ->
.check = =>
expect().to.deep.equal [XMLHttpRequest.OPENED,
XMLHttpRequest.HEADERS_RECEIVED, XMLHttpRequest.LOADING,
XMLHttpRequest.DONE]
done()
describe 'for a network error due to bad DNS', (done) ->
beforeEach ->
.open 'GET', 'https://broken.to.cause.an.xhrnetworkerror.com'
.send()
it 'events states are in the correct order', (done) ->
.check = =>
expect().to.deep.equal [XMLHttpRequest.OPENED,
XMLHttpRequest.DONE]
done()