summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/fetch/test_fetch_basic_http.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/mochitest/fetch/test_fetch_basic_http.js')
-rw-r--r--dom/tests/mochitest/fetch/test_fetch_basic_http.js201
1 files changed, 201 insertions, 0 deletions
diff --git a/dom/tests/mochitest/fetch/test_fetch_basic_http.js b/dom/tests/mochitest/fetch/test_fetch_basic_http.js
new file mode 100644
index 000000000..4cd326ea8
--- /dev/null
+++ b/dom/tests/mochitest/fetch/test_fetch_basic_http.js
@@ -0,0 +1,201 @@
+var path = "/tests/dom/xhr/tests/";
+
+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.
+}