phantomjs/test/webserver-spec.js

193 lines
7.0 KiB
JavaScript

describe("WebServer constructor", function() {
it("should not exist in window", function() {
expect(window.hasOwnProperty('WebServer')).toBeFalsy();
});
it("should be a function", function() {
var WebServer = require('webserver').create;
expect(typeof WebServer).toEqual('function');
});
});
var expectedPostData = false, expectedBinaryData = false;
function checkRequest(request, response) {
expect(typeof request).toEqual('object');
expect(request.hasOwnProperty('url')).toBeTruthy();
expect(request.hasOwnProperty('method')).toBeTruthy();
expect(request.hasOwnProperty('httpVersion')).toBeTruthy();
expect(request.hasOwnProperty('headers')).toBeTruthy();
expect(typeof request.headers).toEqual('object');
expect(typeof response).toEqual('object');
expect(response.hasOwnProperty('statusCode')).toBeTruthy();
expect(response.hasOwnProperty('headers')).toBeTruthy();
expect(typeof response['setHeaders']).toEqual('function');
expect(typeof response['setHeader']).toEqual('function');
expect(typeof response['header']).toEqual('function');
expect(typeof response['write']).toEqual('function');
expect(typeof response['writeHead']).toEqual('function');
if (expectedPostData !== false) {
expect(request.method).toEqual("POST");
expect(request.hasOwnProperty('post')).toBeTruthy();
jasmine.log("request.post => " + JSON.stringify(request.post, null, 4));
jasmine.log("expectedPostData => " + JSON.stringify(expectedPostData, null, 4));
jasmine.log("request.headers => " + JSON.stringify(request.headers, null, 4));
if (request.headers["Content-Type"] && request.headers["Content-Type"] === "application/x-www-form-urlencoded") {
expect(typeof request.post).toEqual('object');
expect(request.post).toEqual(expectedPostData);
expect(request.hasOwnProperty('postRaw')).toBeTruthy();
expect(typeof request.postRaw).toEqual('string');
} else {
expect(typeof request.post).toEqual('string');
expect(request.post).toNotEqual(expectedPostData);
expect(request.hasOwnProperty('postRaw')).toBeFalsy();
}
expectedPostData = false;
}
if (expectedBinaryData !== false) {
response.setEncoding('binary');
response.write(expectedBinaryData);
expectedBinaryData = false;
} else {
response.write("request handled");
}
response.close();
}
describe("WebServer object", function() {
var server = require('webserver').create();
it("should be creatable", function() {
expect(typeof server).toEqual('object');
expect(server).toNotEqual(null);
});
it("should have objectName as 'WebServer'", function() {
expect(server.objectName).toEqual('WebServer');
});
expectHasProperty(server, 'port');
it("should have port as string", function() {
expect(typeof server.port).toEqual('string');
});
it("should not listen to any port by default", function() {
expect(server.port).toEqual("");
});
/* TODO:
expectHasProperty(page, 'settings');
it("should have non-empty settings", function() {
expect(page.settings).toNotEqual(null);
expect(page.settings).toNotEqual({});
});
*/
expectHasFunction(server, 'listenOnPort');
expectHasFunction(server, 'newRequest');
expectHasFunction(server, 'close');
it("should fail to listen to blocked ports", function() {
//NOTE: is this really blocked everywhere?
expect(server.listen(1, function(){})).toEqual(false);
expect(server.port).toEqual("");
});
it("should be able to listen to some port", function() {
//NOTE: this can fail if the port is already being listend on...
expect(server.listen("1337", checkRequest)).toEqual(true);
expect(server.port).toEqual("1337");
});
it("should handle requests", function() {
var page = require('webpage').create();
var url = "http://localhost:1337/foo/bar.php?asdf=true";
var handled = false;
runs(function() {
expect(handled).toEqual(false);
page.open(url, function (status) {
expect(status == 'success').toEqual(true);
expect(page.plainText).toEqual("request handled");
handled = true;
});
});
waits(50);
runs(function() {
expect(handled).toEqual(true);
});
});
it("should handle post requests ('Content-Type' = 'application/x-www-form-urlencoded')", function() {
var page = require('webpage').create();
var url = "http://localhost:1337/foo/bar.txt?asdf=true";
//note: sorted by key (map)
expectedPostData = {'answer' : "42", 'universe' : "expanding"};
var handled = false;
runs(function() {
expect(handled).toEqual(false);
page.open(url, 'post', "universe=expanding&answer=42", { "Content-Type" : "application/x-www-form-urlencoded" }, function (status) {
expect(status == 'success').toEqual(true);
expect(page.plainText).toEqual("request handled");
handled = true;
});
});
waits(50);
runs(function() {
expect(handled).toEqual(true);
});
});
it("should handle post requests ('Content-Type' = 'ANY')", function() {
var page = require('webpage').create();
var url = "http://localhost:1337/foo/bar.txt?asdf=true";
//note: sorted by key (map)
expectedPostData = {'answer' : "42", 'universe' : "expanding"};
var handled = false;
runs(function() {
expect(handled).toEqual(false);
page.open(url, 'post', "universe=expanding&answer=42", { "Content-Type" : "application/json;charset=UTF-8" }, function (status) {
expect(status == 'success').toEqual(true);
expect(page.plainText).toEqual("request handled");
handled = true;
});
});
waits(50);
runs(function() {
expect(handled).toEqual(true);
});
});
xit("should handle binary data", function() {
var page = require('webpage').create();
var url = "http://localhost:1337/";
var fs = require('fs');
expectedBinaryData = fs.read('phantomjs.png', 'b');
var handled = false;
runs(function() {
expect(handled).toEqual(false);
page.open(url, 'get', function(status) {
expect(status == 'success').toEqual(true);
function checkImg() {
var img = document.querySelector('img');
return (img) && (img.width == 200) && (img.height == 200);
}
expect(page.evaluate(checkImg)).toEqual(true);
handled = true;
});
});
waits(50);
runs(function() {
expect(handled).toEqual(true);
});
});
});