dojo
Version:
Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.
405 lines (356 loc) • 9.2 kB
JavaScript
define([
'intern!object',
'intern/chai!assert',
'../../../_base/kernel',
'../../../_base/xhr',
'../../../_base/Deferred',
'../../../topic',
'dojo/_base/array',
'dojo/query',
'dojo/json',
'dojo/dom-construct',
'dojo/Deferred',
'dojo/promise/all',
'dojo/domReady!'
], function (registerSuite, assert, dojo, xhr, baseDeferred, topic,
array, query, JSON, domConstruct, Deferred, all) {
var form, topicCount, remover;
registerSuite({
name: 'dojo/_base/xhr',
'text content handler': function () {
assert.strictEqual(
dojo._contentHandlers.text({
responseText: 'foo bar baz '
}),
'foo bar baz '
);
},
'json content handler': function () {
var object = {
foo: 'bar',
baz: [
{ thonk: 'blarg' },
'xyzzy!'
]
};
assert.deepEqual(
dojo._contentHandlers.json({
responseText: JSON.stringify(object)
}),
object
);
},
'json-comment-filtered handler': function () {
var object = {
foo: 'bar',
baz: [
{ thonk: 'blarg' },
'xyzzy!'
]
};
assert.throws(function () {
dojo._contentHandlers['json-comment-filtered']({
responseText: JSON.stringify(object)
});
});
assert.deepEqual(
dojo._contentHandlers['json-comment-filtered']({
responseText: '\tblag\n/*' + JSON.stringify(object) + '*/\n\r\t\r'
}),
object
);
assert.deepEqual(
dojo._contentHandlers['json-comment-optional']({
responseText: '\tblag\n/*' + JSON.stringify(object) + '*/\n\r\t\r'
}),
object
);
},
'javascript content handler': function () {
var object = {
foo: 'bar',
baz: [
{ thonk: 'blarg' },
'xyzzy!'
]
};
assert.deepEqual(
dojo._contentHandlers['javascript']({
responseText: '(' + JSON.stringify(object) + ')'
}),
object
);
assert.ok(
dojo._contentHandlers['javascript']({
responseText: 'true;'
})
);
assert.ok(
!dojo._contentHandlers['javascript']({
responseText: 'false;'
})
);
},
'xml content handler': function () {
var fakeXHR = {
responseText: '<foo><bar baz="thonk">blarg</bar></foo>'
};
if ('DOMParser' in dojo.global) {
var parser = new DOMParser();
fakeXHR.responseXML = parser.parseFromString(fakeXHR.responseText, 'text/xml');
}
var xmlDoc = dojo._contentHandlers['xml'](fakeXHR);
assert.strictEqual(xmlDoc.documentElement.tagName, 'foo');
},
'.get': {
success: function () {
var dfd = this.async(30000, 2),
xdfd = xhr.get({
url: '/__services/request/xhr',
preventCache: true,
handleAs: 'json',
load: dfd.callback(function (data, ioArgs) {
assert.strictEqual(ioArgs.xhr.readyState, 4);
return data;
})
});
assert.instanceOf(xdfd, baseDeferred);
xdfd.addCallback(dfd.callback(function (data) {
assert.strictEqual(data.method, 'GET');
}));
xdfd.addErrback(dfd.reject);
},
'404 status': function () {
var dfd = this.async(30000, 2),
xdfd = xhr.get({
url: 'xhr_blarg.html',
error: dfd.callback(function (err, ioArgs) {
assert.strictEqual(ioArgs.xhr.status, 404);
return err;
})
});
xdfd.addCallback(dfd.reject);
xdfd.addErrback(dfd.resolve);
},
content: function () {
var dfd = this.async(),
xdfd = xhr.get({
url: '/__services/request/xhr?color=blue',
content: {
foo: [ 'bar', 'baz' ],
thud: 'thonk',
xyzzy: 3
}
});
xdfd.addCallback(dfd.callback(function () {
assert.strictEqual(
xdfd.ioArgs.url,
'/__services/request/xhr?color=blue&foo=bar&foo=baz&thud=thonk&xyzzy=3'
);
}));
},
form: {
setup: function () {
form = domConstruct.place('<form id="f3" style="border: 1px solid black;"><input id="f3_spaces" type="hidden" name="spaces" value="string with spaces"></form>', document.body);
},
teardown: function () {
domConstruct.destroy(form);
form = null;
},
'serialize': function () {
var dfd = this.async(),
xdfd = xhr.get({
url: '/__services/request/xhr',
form: 'f3'
});
xdfd.addCallback(dfd.callback(function () {
assert.strictEqual(
xdfd.ioArgs.url,
'/__services/request/xhr?spaces=string%20with%20spaces'
);
}));
},
'with content': function () {
var dfd = this.async(),
xdfd = xhr.get({
url: '/__services/request/xhr',
form: 'f3',
content: { spaces: 'blah' }
});
xdfd.addCallback(dfd.callback(function () {
assert.strictEqual(
xdfd.ioArgs.url,
'/__services/request/xhr?spaces=blah'
);
}));
}
}
},
'.post': {
success: function () {
var dfd = this.async();
xhr.post({
url: '/__services/request/xhr?foo=bar',
content: { color: 'blue' },
handleAs: 'json',
handle: dfd.callback(function (data) {
assert.strictEqual(data.method, 'POST');
assert.deepEqual(data.query, { foo: 'bar' });
assert.deepEqual(data.payload, { color: 'blue' });
})
});
},
'with content': function () {
var dfd = this.async(),
xdfd = xhr.post({
url: '/__services/request/xhr',
content: {
foo: [ 'bar', 'baz' ],
thud: 'thonk',
xyzzy: 3
}
});
xdfd.addCallback(dfd.callback(function () {
assert.strictEqual(xdfd.ioArgs.query, 'foo=bar&foo=baz&thud=thonk&xyzzy=3');
}));
xdfd.addErrback(dfd.reject);
},
form: {
setup: function () {
form = domConstruct.place('<form id="f4" style="border: 1px solid black;" action="/__services/request/xhr"><input id="f4_action" type="hidden" name="action" value="Form with input named action"></form>', document.body);
},
teardown: function () {
domConstruct.destroy(form);
form = null;
},
'serialize': function () {
var dfd = this.async(),
xdfd = xhr.post({
form: 'f4'
});
xdfd.addCallback(dfd.resolve);
xdfd.addErrback(dfd.reject);
}
},
raw: function () {
var dfd = this.async(),
xdfd = xhr.post({
url: '/__services/request/xhr',
postData: 'foo=bar&color=blue&height=average',
handleAs: 'json'
});
xdfd.addCallback(dfd.callback(function (data) {
assert.deepEqual(data.payload, {
foo: 'bar',
color: 'blue',
height: 'average'
});
}));
xdfd.addErrback(dfd.reject);
}
},
'.put': function () {
var dfd = this.async(),
xdfd = xhr.put({
url: '/__services/request/xhr?foo=bar',
content: { color: 'blue' },
handleAs: 'json'
});
xdfd.addCallback(dfd.callback(function (data) {
assert.strictEqual(data.method, 'PUT');
assert.deepEqual(data.query, { foo: 'bar' });
assert.deepEqual(data.payload, { color: 'blue' });
}));
xdfd.addErrback(dfd.reject);
},
'.del': function () {
var dfd = this.async(),
xdfd = xhr.del({
url: '/__services/request/xhr',
preventCache: true,
handleAs: 'json'
});
xdfd.addCallback(dfd.callback(function (data) {
assert.strictEqual(data.method, 'DELETE');
}));
xdfd.addErrback(dfd.reject);
},
cancel: function () {
var dfd = this.async(),
xdfd = xhr.post({
url: '/__services/request/xhr?delay=3000'
});
xdfd.addCallback(dfd.reject);
xdfd.addErrback(dfd.callback(function (error) {
assert.instanceOf(error, Error);
assert.strictEqual(error.dojoType, 'cancel');
}));
xdfd.cancel();
},
'xml queryable': function () {
var dfd = this.async(),
xdfd = xhr.get({
url: '/__services/request/xhr/xml',
handleAs: 'xml'
});
xdfd.addCallback(dfd.callback(function (xmlDoc) {
var results = query('bar', xmlDoc);
assert.strictEqual(results.length, 2);
}));
xdfd.addErrback(dfd.reject);
},
ioPublish: {
setup: function () {
dojo.config.ioPublish = true;
topicCount = {};
var handles = [];
remover = function () {
array.forEach(handles, function (handle) {
handle.remove();
});
handles = null;
};
array.forEach(
[ 'start', 'send', 'load', 'error', 'done' ],
function (name) {
topicCount[name] = 0;
handles.push(
topic.subscribe('/dojo/io/' + name, function () {
topicCount[name] += 1;
})
);
}
);
},
teardown: function () {
dojo.config.ioPublish = false;
remover();
},
counts: function () {
var dfd = this.async(),
dfd1 = new Deferred(),
xdfd1 = xhr.get({ url: '/__services/request/xhr?delay=1000' }),
dfd2 = new Deferred(),
xdfd2 = xhr.get({ url: '/__services/request/xhr?delay=1000' });
xdfd1.addCallback(dfd1.resolve);
xdfd1.addErrback(dfd1.reject);
xdfd2.addCallback(dfd2.resolve);
xdfd2.addErrback(dfd2.reject);
all([dfd1, dfd2]).then(
function () {
setTimeout(dfd.callback(function () {
assert.deepEqual(topicCount, {
start: 1,
send: 2,
load: 2,
error: 0,
done: 2
});
}), 100);
},
dfd.reject
);
}
}
});
});