diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/tests/mochitest/fetch/test_fetch_basic_http.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/tests/mochitest/fetch/test_fetch_basic_http.js')
-rw-r--r-- | dom/tests/mochitest/fetch/test_fetch_basic_http.js | 268 |
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. +} |