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.js268
1 files changed, 268 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 0000000000..781af2ecde
--- /dev/null
+++ b/dom/tests/mochitest/fetch/test_fetch_basic_http.js
@@ -0,0 +1,268 @@
+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]
+ );
+ if (entry[0] != "file_XHR_pass3.txt") {
+ 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]
+ );
+ if (entry[0] != "file_XHR_pass3.txt") {
+ 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 => {
+ is(r.status, 200, "status should match");
+ return r.blob().then(b => {
+ is(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 => {
+ is(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.
+}