123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- var window = require("global/window")
- var test = require("tape")
- var forEach = require("for-each")
- var xhr = require("../index.js")
- test("constructs and calls callback without throwing", { timeout: 500 }, function(assert) {
- xhr({}, function(err, resp, body) {
- assert.ok(true, "got here")
- assert.end()
- })
- })
- test("[func] Can GET a url (cross-domain)", { timeout: 2000 }, function(assert) {
- xhr({
- uri: "http://www.mocky.io/v2/55a02cb72651260b1a94f024",
- useXDR: true
- }, function(err, resp, body) {
- assert.ifError(err, "no err")
- assert.equal(resp.statusCode, 200)
- assert.equal(typeof resp.rawRequest, "object")
- assert.notEqual(resp.body.length, 0)
- assert.equal(resp.body, '{"a":1}')
- assert.notEqual(body.length, 0)
- assert.end()
- })
- })
- test("[func] Returns http error responses like npm's request (cross-domain)", { timeout: 2000 }, function(assert) {
- if (!window.XDomainRequest) {
- xhr({
- uri: "http://www.mocky.io/v2/55a02d63265126221a94f025",
- }, function(err, resp, body) {
- assert.ifError(err, "no err")
- assert.equal(resp.statusCode, 404)
- assert.equal(typeof resp.rawRequest, "object")
- assert.end()
- })
- } else {
- assert.end();
- }
- })
- test("[func] Request to domain with not allowed cross-domain", { timeout: 2000 }, function(assert) {
- xhr({
- uri: "http://www.mocky.io/v2/57bb70c21000002f175850bd",
- }, function(err, resp, body) {
- assert.ok(err instanceof Error, "should return error")
- assert.equal(resp.statusCode, 0)
- assert.equal(typeof resp.rawRequest, "object")
- assert.end()
- })
- })
- test("[func] Returns a falsy body for 2xx responses", { timeout: 500 }, function(assert) {
- assert.plan(8)
- xhr({
- uri: "/mock/no-content/200"
- }, function(err, resp, body) {
- assert.notOk(body, "body should be falsy")
- assert.equal(resp.statusCode, 200)
- })
- xhr({
- uri: "/mock/no-content/201"
- }, function(err, resp, body) {
- assert.notOk(body, "body should be falsy")
- assert.equal(resp.statusCode, 201)
- })
- xhr({
- uri: "/mock/no-content/204"
- }, function(err, resp, body) {
- assert.notOk(body, "body should be falsy")
- assert.equal(resp.statusCode, 204)
- })
- xhr({
- uri: "/mock/no-content/205"
- }, function(err, resp, body) {
- assert.notOk(body, "body should be falsy")
- assert.equal(resp.statusCode, 205)
- })
- })
- test("[func] Calls the callback at most once even if error is thrown issue #127", { timeout: 500 }, function(assert) {
- //double call happened in chrome
- var count = 0;
- setTimeout(function() {
- assert.ok(count <= 1, "expected at most one call")
- assert.end()
- }, 100)
- try {
- xhr({
- uri: "instanterror://foo"
- }, function(err, resp, body) {
- count++;
- throw Error("dummy error")
- })
- } catch(e){}
- })
- test("[func] Times out to an error ", { timeout: 500 }, function(assert) {
- xhr({
- timeout: 1,
- uri: "/mock/timeout"
- }, function(err, resp, body) {
- assert.ok(err instanceof Error, "should return error")
- assert.equal(err.message, "XMLHttpRequest timeout")
- assert.equal(err.code, "ETIMEDOUT")
- assert.equal(resp.statusCode, 0)
- assert.end()
- })
- })
- test("withCredentials option", { timeout: 500 }, function(assert) {
- if (!window.XDomainRequest) {
- var req = xhr({}, function() {})
- assert.ok(!req.withCredentials,
- "withCredentials not true"
- )
- req = xhr({
- withCredentials: true
- }, function() {})
- assert.ok(
- req.withCredentials,
- "withCredentials set to true"
- )
- }
- assert.end()
- })
- test("withCredentials ignored when using synchronous requests", { timeout: 500 }, function(assert) {
- if (!window.XDomainRequest) {
- var req = xhr({
- withCredentials: true,
- sync: true
- }, function() {})
- assert.ok(!req.withCredentials,
- "sync overrides withCredentials"
- )
- }
- assert.end()
- })
- test("XDR usage (run on IE8 or 9)", { timeout: 500 }, function(assert) {
- var req = xhr({
- useXDR: true,
- uri: window.location.href,
- }, function() {})
- assert.ok(!window.XDomainRequest || window.XDomainRequest === req.constructor,
- "Uses XDR when told to"
- )
- if (!!window.XDomainRequest) {
- assert.throws(function() {
- xhr({
- useXDR: true,
- uri: window.location.href,
- headers: {
- "foo": "bar"
- }
- }, function() {})
- }, true, "Throws when trying to send headers with XDR")
- }
- assert.end()
- })
- test("handles errorFunc call with no arguments provided", { timeout: 500 }, function(assert) {
- var req = xhr({}, function(err) {
- assert.ok(err instanceof Error, "callback should get an error")
- assert.equal(err.message, "Unknown XMLHttpRequest Error", "error message incorrect")
- })
- assert.doesNotThrow(function() {
- req.onerror()
- }, "should not throw when error handler called without arguments")
- assert.end()
- })
- test("constructs and calls callback without throwing", { timeout: 500 }, function(assert) {
- assert.throws(function() {
- xhr({})
- }, "callback is not optional")
- assert.end()
- })
- if (!window.XDomainRequest) {
- var methods = ["get", "put", "post", "patch"]
- } else {
- var methods = ["get", "post"]
- }
- test("[func] xhr[method] get, put, post, patch", { timeout: 500 }, function(assert) {
- var i = 0
- forEach(methods, function(method) {
- xhr[method]({
- uri: "/mock/200ok"
- }, function(err, resp, body) {
- i++
- assert.ifError(err, "no err")
- assert.equal(resp.statusCode, 200)
- assert.equal(resp.method, method.toUpperCase())
- if (i === methods.length) assert.end()
- })
- })
- })
- test("xhr[method] get, put, post, patch with url shorthands", { timeout: 500 }, function(assert) {
- var i = 0
- forEach(methods, function(method) {
- var req = xhr[method]("/some-test", function() {})
- i++
- assert.equal(req.method, method.toUpperCase())
- if (i === methods.length) assert.end()
- })
- })
- test("[func] sends options.body as json body when options.json === true", { timeout: 500 }, function(assert) {
- xhr.post("/mock/echo", {
- json: true,
- body: {
- foo: "bar"
- }
- }, function(err, resp, body) {
- assert.equal(resp.rawRequest.headers["Content-Type"], "application/json")
- assert.deepEqual(body, {
- foo: "bar"
- })
- assert.end()
- })
- })
- test("[func] doesn't freak out when json option is false", { timeout: 500 }, function(assert) {
- xhr.post("/mock/echo", {
- json: false,
- body: "{\"a\":1}"
- }, function(err, resp, body) {
- assert.notEqual(resp.rawRequest.headers["Content-Type"], "application/json")
- assert.equal(body, "{\"a\":1}")
- assert.end()
- })
- })
- test("[func] sends options.json as body when it's not a boolean", { timeout: 500 }, function(assert) {
- xhr.post("/mock/echo", {
- json: {
- foo: "bar"
- }
- }, function(err, resp, body) {
- assert.equal(resp.rawRequest.headers["Content-Type"], "application/json")
- assert.deepEqual(body, {
- foo: "bar"
- })
- assert.end()
- })
- })
- test("xhr[method] get, put, post, patch with url shorthands and options", { timeout: 500 }, function(assert) {
- var i = 0
- forEach(methods, function(method) {
- var req = xhr[method]("/some-test", {
- headers: {
- foo: 'bar'
- }
- }, function(err, resp, body) {
- i++
- assert.equal(resp.rawRequest.headers.foo, 'bar')
- assert.equal(resp.method, method.toUpperCase())
- if (i === methods.length) assert.end()
- })
- })
- })
- if (!window.XDomainRequest) {
- test("[func] xhr.head", function(assert) {
- xhr.head({
- uri: "/mock/200ok",
- }, function(err, resp, body) {
- assert.ifError(err, "no err")
- assert.equal(resp.statusCode, 200)
- assert.equal(resp.method, "HEAD")
- assert.notOk(resp.body)
- assert.end()
- })
- })
- test("xhr.head url shorthand", { timeout: 500 }, function(assert) {
- xhr.head("/mock/200ok", function(err, resp, body) {
- assert.equal(resp.method, "HEAD")
- assert.end()
- })
- })
- test("[func] xhr.del", { timeout: 500 }, function(assert) {
- xhr.del({
- uri: "/mock/200ok"
- }, function(err, resp, body) {
- assert.ifError(err, "no err")
- assert.equal(resp.statusCode, 200)
- assert.equal(resp.method, "DELETE")
- assert.end()
- })
- })
- test("xhr.del url shorthand", { timeout: 500 }, function(assert) {
- xhr.del("/mock/200ok", function(err, resp, body) {
- assert.equal(resp.method, "DELETE")
- assert.end()
- })
- })
- }
- test("url signature without object", { timeout: 500 }, function(assert) {
- xhr("/some-test", function(err, resp, body) {
- assert.equal(resp.url, '/some-test')
- assert.end()
- })
- })
- test("url signature with object", { timeout: 500 }, function(assert) {
- xhr("/some-test", {
- headers: {
- "foo": "bar"
- }
- }, function(err, resp, body) {
- assert.equal(resp.url, '/some-test')
- assert.equal(resp.rawRequest.headers.foo, 'bar')
- assert.end()
- })
- })
- test("aborting XHR immediately prevents callback from being called", { timeout: 500 }, function(assert) {
- var req = xhr({ uri: "/mock/200ok" }, function(err, response) {
- assert.fail('this callback should not be called');
- });
- req.abort();
- setTimeout(function() {
- assert.end()
- }, 2)
- })
- test("aborting XHR asynchronously still prevents callback from being called", { timeout: 500 }, function(assert) {
- var req = xhr({ uri: "/mock/timeout" }, function(err, response) {
- assert.fail('this callback should not be called');
- });
- setTimeout(function() {
- req.abort();
- }, 0)
- setTimeout(function() {
- assert.end()
- }, 2)
- })
- test("XHR can be overridden", { timeout: 500 }, function(assert) {
- var xhrs = 0
- var noop = function() {}
- var fakeXHR = function() {
- xhrs++
- this.open = this.send = noop
- }
- var xdrs = 0
- var fakeXDR = function() {
- xdrs++
- this.open = this.send = noop
- }
- xhr.XMLHttpRequest = fakeXHR
- xhr({}, function() {})
- assert.equal(xhrs, 1, "created the custom XHR")
- xhr.XDomainRequest = fakeXDR
- xhr({
- useXDR: true
- }, function() {});
- assert.equal(xdrs, 1, "created the custom XDR")
- assert.end()
- })
|