fune/dom/tests/unit/test_Fetch.js
Andrew McCreight 5dec0e0beb Bug 1432992, part 1 - Remove definitions of Ci, Cr, Cc, and Cu. r=florian
This patch was autogenerated by my decomponents.py

It covers almost every file with the extension js, jsm, html, py,
xhtml, or xul.

It removes blank lines after removed lines, when the removed lines are
preceded by either blank lines or the start of a new block. The "start
of a new block" is defined fairly hackily: either the line starts with
//, ends with */, ends with {, <![CDATA[, """ or '''. The first two
cover comments, the third one covers JS, the fourth covers JS embedded
in XUL, and the final two cover JS embedded in Python. This also
applies if the removed line was the first line of the file.

It covers the pattern matching cases like "var {classes: Cc,
interfaces: Ci, utils: Cu, results: Cr} = Components;". It'll remove
the entire thing if they are all either Ci, Cr, Cc or Cu, or it will
remove the appropriate ones and leave the residue behind. If there's
only one behind, then it will turn it into a normal, non-pattern
matching variable definition. (For instance, "const { classes: Cc,
Constructor: CC, interfaces: Ci, utils: Cu } = Components" becomes
"const CC = Components.Constructor".)

MozReview-Commit-ID: DeSHcClQ7cG

--HG--
extra : rebase_source : d9c41878036c1ef7766ef5e91a7005025bc1d72b
2018-02-06 09:36:57 -08:00

341 lines
9.9 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
Cu.importGlobalProperties(['fetch']);
ChromeUtils.import("resource://testing-common/httpd.js");
const BinaryInputStream = Components.Constructor("@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "setInputStream");
var server;
function getBaseUrl () {
return "http://localhost:" + server.identity.primaryPort;
}
// a way to create some test defaults
function createTestData(testPath) {
return {
testPath: testPath,
request: {
headers: {},
contentType: "application/json",
},
response: {
headers: {},
contentType: "application/json",
body: "{\"Look\": \"Success!\"}",
status: 200,
statusText: "OK"
},
};
}
// read body and content type information from a request
function readDataFromRequest(aRequest) {
let requestData = {};
if (aRequest.method == "POST" || aRequest.method == "PUT") {
if (aRequest.bodyInputStream) {
let inputStream = new BinaryInputStream(aRequest.bodyInputStream);
let bytes = [];
let available;
while ((available = inputStream.available()) > 0) {
Array.prototype.push.apply(bytes, inputStream.readByteArray(available));
}
requestData.body = String.fromCharCode.apply(null, bytes);
requestData.contentType = aRequest.getHeader("Content-Type");
}
}
return requestData;
}
// write status information, content type information and body to a response
function writeDataToResponse(aData, aResponse) {
aResponse.setStatusLine(null, aData.status, aData.statusText);
aResponse.setHeader("Content-Type", aData.contentType);
for (let header in aData.headers) {
aResponse.setHeader(header, aData.headers[header]);
}
aResponse.write(aData.body);
}
// test some GET functionality
add_test(function test_GetData() {
do_test_pending();
let testData = createTestData("/getData");
// set up some headers to test
let headerNames = ["x-test-header", "x-other-test-header"];
for (let headerName of headerNames) {
testData.request.headers[headerName] = "test-value-for-" + headerName;
}
server.registerPathHandler(testData.testPath, function(aRequest, aResponse) {
try {
// check our request headers made it OK
for (let headerName of headerNames) {
Assert.equal(testData.request.headers[headerName],
aRequest.getHeader(headerName));
}
// send a response
writeDataToResponse(testData.response, aResponse);
} catch (e) {
do_report_unexpected_exception(e);
}
});
// fetch, via GET, with some request headers set
fetch(getBaseUrl() + testData.testPath, {headers: testData.request.headers})
.then(function(response){
// check response looks as expected
Assert.ok(response.ok);
Assert.equal(response.status, testData.response.status);
Assert.equal(response.statusText, testData.response.statusText);
// check a response header looks OK:
Assert.equal(response.headers.get("Content-Type"),
testData.response.contentType);
// ... and again to check header names are case insensitive
Assert.equal(response.headers.get("content-type"),
testData.response.contentType);
// ensure response.text() returns a promise that resolves appropriately
response.text().then(function(text) {
Assert.equal(text, testData.response.body);
do_test_finished();
run_next_test();
});
}).catch(function(e){
do_report_unexpected_exception(e);
do_test_finished();
run_next_test();
});
});
// test a GET with no init
add_test(function test_GetDataNoInit() {
do_test_pending();
let testData = createTestData("/getData");
server.registerPathHandler(testData.testPath, function(aRequest, aResponse) {
try {
// send a response
writeDataToResponse(testData.response, aResponse);
} catch (e) {
do_report_unexpected_exception(e);
}
});
fetch(getBaseUrl() + testData.testPath, {headers: testData.request.headers})
.then(function(response){
// check response looks as expected
Assert.ok(response.ok);
Assert.equal(response.status, testData.response.status);
// ensure response.text() returns a promise that resolves appropriately
response.text().then(function(text) {
Assert.equal(text, testData.response.body);
do_test_finished();
run_next_test();
});
}).catch(function(e){
do_report_unexpected_exception(e);
do_test_finished();
run_next_test();
});
});
// test some error responses
add_test(function test_get40x() {
do_test_pending();
// prepare a response with some 40x error - a 404 will do
let notFoundData = createTestData("/getNotFound");
notFoundData.response.status = 404;
notFoundData.response.statusText = "Not found";
notFoundData.response.body = null;
// No need to register a path handler - httpd will return 404 anyway.
// Fetch, via GET, the resource that doesn't exist
fetch(getBaseUrl() + notFoundData.testPath).then(function(response){
Assert.equal(response.status, 404);
do_test_finished();
run_next_test();
});
});
add_test(function test_get50x() {
do_test_pending();
// prepare a response with some server error - a 500 will do
let serverErrorData = createTestData("/serverError");
serverErrorData.response.status = 500;
serverErrorData.response.statusText = "The server broke";
serverErrorData.response.body = null;
server.registerPathHandler(serverErrorData.testPath,
function(aRequest, aResponse) {
try {
// send the error response
writeDataToResponse(serverErrorData.response, aResponse);
} catch (e) {
do_report_unexpected_exception(e);
}
});
// fetch, via GET, the resource that creates a server error
fetch(getBaseUrl() + serverErrorData.testPath).then(function(response){
Assert.equal(response.status, 500);
do_test_finished();
run_next_test();
});
});
// test a failure to connect
add_test(function test_getTestFailedConnect() {
do_test_pending();
// try a server that's not there
fetch("http://localhost:4/should/fail").then(response => {
do_throw("Request should not succeed");
}).catch(err => {
Assert.equal(true, err instanceof TypeError);
do_test_finished();
run_next_test();
});
});
add_test(function test_mozError() {
do_test_pending();
// try a server that's not there
fetch("http://localhost:4/should/fail", { mozErrors: true }).then(response => {
do_throw("Request should not succeed");
}).catch(err => {
Assert.equal(err.result, Cr.NS_ERROR_CONNECTION_REFUSED);
do_test_finished();
run_next_test();
});
});
add_test(function test_request_mozError() {
do_test_pending();
// try a server that's not there
const r = new Request("http://localhost:4/should/fail", { mozErrors: true });
fetch(r).then(response => {
do_throw("Request should not succeed");
}).catch(err => {
Assert.equal(err.result, Cr.NS_ERROR_CONNECTION_REFUSED);
do_test_finished();
run_next_test();
});
});
// test POSTing some JSON data
add_test(function test_PostJSONData() {
do_test_pending();
let testData = createTestData("/postJSONData");
testData.request.body = "{\"foo\": \"bar\"}";
server.registerPathHandler(testData.testPath, function(aRequest, aResponse) {
try {
let requestData = readDataFromRequest(aRequest);
// Check the request body is OK
Assert.equal(requestData.body, testData.request.body);
// Check the content type is as expected
Assert.equal(requestData.contentType, testData.request.contentType);
writeDataToResponse(testData.response, aResponse);
} catch (e) {
Assert.ok(false);
}
});
fetch(getBaseUrl() + testData.testPath, {
method: "POST",
body: testData.request.body,
headers: {
'Content-Type': 'application/json'
}
}).then(function(aResponse) {
Assert.ok(aResponse.ok);
Assert.equal(aResponse.status, testData.response.status);
Assert.equal(aResponse.statusText, testData.response.statusText);
do_test_finished();
run_next_test();
}).catch(function(e) {
do_report_unexpected_exception(e);
do_test_finished();
run_next_test();
});
});
// test POSTing some text
add_test(function test_PostTextData() {
do_test_pending();
let testData = createTestData("/postTextData");
testData.request.body = "A plain text body";
testData.request.contentType = "text/plain";
let responseHeaderName = "some-response-header";
testData.response.headers[responseHeaderName] = "some header value";
server.registerPathHandler(testData.testPath, function(aRequest, aResponse) {
try {
let requestData = readDataFromRequest(aRequest);
// Check the request body is OK
Assert.equal(requestData.body, testData.request.body);
// Check the content type is as expected
Assert.equal(requestData.contentType, testData.request.contentType);
writeDataToResponse(testData.response, aResponse);
} catch (e) {
Assert.ok(false);
}
});
fetch(getBaseUrl() + testData.testPath, {
method: "POST",
body: testData.request.body,
headers: {
'Content-Type': testData.request.contentType
}
}).then(function(aResponse) {
Assert.ok(aResponse.ok);
Assert.equal(aResponse.status, testData.response.status);
Assert.equal(aResponse.statusText, testData.response.statusText);
// check the response header is set OK
Assert.equal(aResponse.headers.get(responseHeaderName),
testData.response.headers[responseHeaderName]);
do_test_finished();
run_next_test();
}).catch(function(e) {
do_report_unexpected_exception(e);
do_test_finished();
run_next_test();
});
});
function run_test() {
// Set up an HTTP Server
server = new HttpServer();
server.start(-1);
run_next_test();
registerCleanupFunction(function() {
server.stop(function() { });
});
}