tenfourfox/dom/tests/mochitest/fetch/test_fetch_basic_http.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

202 lines
7.1 KiB
JavaScript

var path = "/tests/dom/base/test/";
var passFiles = [['file_XHR_pass1.xml', 'GET', 200, 'OK', 'text/xml'],
['file_XHR_pass2.txt', 'GET', 200, 'OK', 'text/plain'],
['file_XHR_pass3.txt', 'GET', 200, 'OK', 'text/plain'],
];
function testURL() {
var promises = [];
passFiles.forEach(function(entry) {
var p = fetch(path + entry[0]).then(function(res) {
ok(res.type !== "error", "Response should not be an error for " + entry[0]);
is(res.status, entry[2], "Status should match expected for " + entry[0]);
is(res.statusText, entry[3], "Status text should match expected for " + entry[0]);
// This file redirects to pass2, but that is invisible if a SW is present.
if (entry[0] != "file_XHR_pass3.txt" || isSWPresent)
ok(res.url.endsWith(path + entry[0]), "Response url should match request for simple fetch for " + entry[0]);
else
ok(res.url.endsWith(path + "file_XHR_pass2.txt"), "Response url should match request for simple fetch for " + entry[0]);
is(res.headers.get('content-type'), entry[4], "Response should have content-type for " + entry[0]);
});
promises.push(p);
});
return Promise.all(promises);
}
var failFiles = [['ftp://localhost' + path + 'file_XHR_pass1.xml', 'GET']];
function testURLFail() {
var promises = [];
failFiles.forEach(function(entry) {
var p = fetch(entry[0]).then(function(res) {
ok(false, "Response should be an error for " + entry[0]);
}, function(e) {
ok(e instanceof TypeError, "Response should be an error for " + entry[0]);
});
promises.push(p);
});
return Promise.all(promises);
}
function testRequestGET() {
var promises = [];
passFiles.forEach(function(entry) {
var req = new Request(path + entry[0], { method: entry[1] });
var p = fetch(req).then(function(res) {
ok(res.type !== "error", "Response should not be an error for " + entry[0]);
is(res.status, entry[2], "Status should match expected for " + entry[0]);
is(res.statusText, entry[3], "Status text should match expected for " + entry[0]);
// This file redirects to pass2, but that is invisible if a SW is present.
if (entry[0] != "file_XHR_pass3.txt" || isSWPresent)
ok(res.url.endsWith(path + entry[0]), "Response url should match request for simple fetch for " + entry[0]);
else
ok(res.url.endsWith(path + "file_XHR_pass2.txt"), "Response url should match request for simple fetch for " + entry[0]);
is(res.headers.get('content-type'), entry[4], "Response should have content-type for " + entry[0]);
});
promises.push(p);
});
return Promise.all(promises);
}
function arraybuffer_equals_to(ab, s) {
is(ab.byteLength, s.length, "arraybuffer byteLength should match");
var u8v = new Uint8Array(ab);
is(String.fromCharCode.apply(String, u8v), s, "arraybuffer bytes should match");
}
function testResponses() {
var fetches = [
fetch(path + 'file_XHR_pass2.txt').then((res) => {
is(res.status, 200, "status should match");
return res.text().then((v) => is(v, "hello pass\n", "response should match"));
}),
fetch(path + 'file_XHR_binary1.bin').then((res) => {
is(res.status, 200, "status should match");
return res.arrayBuffer().then((v) =>
arraybuffer_equals_to(v, "\xaa\xee\0\x03\xff\xff\xff\xff\xbb\xbb\xbb\xbb")
)
}),
new Promise((resolve, reject) => {
var jsonBody = JSON.stringify({title: "aBook", author: "john"});
var req = new Request(path + 'responseIdentical.sjs', {
method: 'POST',
body: jsonBody,
});
var p = fetch(req).then((res) => {
is(res.status, 200, "status should match");
return res.json().then((v) => {
is(JSON.stringify(v), jsonBody, "json response should match");
});
});
resolve(p);
}),
new Promise((resolve, reject) => {
var req = new Request(path + 'responseIdentical.sjs', {
method: 'POST',
body: '{',
});
var p = fetch(req).then((res) => {
is(res.status, 200, "wrong status");
return res.json().then(
(v) => ok(false, "expected json parse failure"),
(e) => ok(true, "expected json parse failure")
);
});
resolve(p);
}),
];
return Promise.all(fetches);
}
function testBlob() {
return fetch(path + '/file_XHR_binary2.bin').then((r) => {
ok(r.status, 200, "status should match");
return r.blob().then((b) => {
ok(b.size, 65536, "blob should have size 65536");
return readAsArrayBuffer(b).then(function(ab) {
var u8 = new Uint8Array(ab);
for (var i = 0; i < 65536; i++) {
if (u8[i] !== (i & 255)) {
break;
}
}
is(i, 65536, "wrong value at offset " + i);
});
});
});
}
// This test is a copy of dom/html/test/formData_test.js testSend() modified to
// use the fetch API. Please change this if you change that.
function testFormDataSend() {
var file, blob = new Blob(['hey'], {type: 'text/plain'});
var fd = new FormData();
fd.append("string", "hey");
fd.append("empty", blob);
fd.append("explicit", blob, "explicit-file-name");
fd.append("explicit-empty", blob, "");
file = new File([blob], 'testname', {type: 'text/plain'});
fd.append("file-name", file);
file = new File([blob], '', {type: 'text/plain'});
fd.append("empty-file-name", file);
file = new File([blob], 'testname', {type: 'text/plain'});
fd.append("file-name-overwrite", file, "overwrite");
var req = new Request("/tests/dom/html/test/form_submit_server.sjs", {
method: 'POST',
body: fd,
});
return fetch(req).then((r) => {
ok(r.status, 200, "status should match");
return r.json().then((response) => {
for (var entry of response) {
if (entry.headers['Content-Disposition'] != 'form-data; name="string"') {
is(entry.headers['Content-Type'], 'text/plain');
}
is(entry.body, 'hey');
}
is(response[1].headers['Content-Disposition'],
'form-data; name="empty"; filename="blob"');
is(response[2].headers['Content-Disposition'],
'form-data; name="explicit"; filename="explicit-file-name"');
is(response[3].headers['Content-Disposition'],
'form-data; name="explicit-empty"; filename=""');
is(response[4].headers['Content-Disposition'],
'form-data; name="file-name"; filename="testname"');
is(response[5].headers['Content-Disposition'],
'form-data; name="empty-file-name"; filename=""');
is(response[6].headers['Content-Disposition'],
'form-data; name="file-name-overwrite"; filename="overwrite"');
});
});
}
function runTest() {
return Promise.resolve()
.then(testURL)
.then(testURLFail)
.then(testRequestGET)
.then(testResponses)
.then(testBlob)
.then(testFormDataSend)
// Put more promise based tests here.
}