diff --git a/test/module/webpage/add-header.js b/test/module/webpage/add-header.js new file mode 100644 index 00000000..23edacea --- /dev/null +++ b/test/module/webpage/add-header.js @@ -0,0 +1,23 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +page.onResourceRequested = function(requestData, request) { + assert.typeOf(request.setHeader, 'function'); + request.setHeader('CustomHeader', 'CustomValue'); +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + headers = json.headers; + assert.isTrue(headers.hasOwnProperty('customheader')); + assert.equal(headers.customheader, 'CustomValue'); +}); + diff --git a/test/module/webpage/custom-headers.js b/test/module/webpage/custom-headers.js new file mode 100644 index 00000000..430c5a6b --- /dev/null +++ b/test/module/webpage/custom-headers.js @@ -0,0 +1,30 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +page.customHeaders = { + 'Custom-Key': 'Custom-Value', + 'User-Agent': 'Overriden-UA', + 'Referer': 'Overriden-Referer' +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + assert.typeOf(json, 'object'); + headers = json.headers; + assert.typeOf(headers, 'object'); + + assert.isTrue(headers.hasOwnProperty('custom-key')); + assert.isTrue(headers.hasOwnProperty('user-agent')); + assert.isTrue(headers.hasOwnProperty('referer')); + assert.equal(headers['custom-key'], 'Custom-Value'); + assert.equal(headers['user-agent'], 'Overriden-UA'); + assert.equal(headers['referer'], 'Overriden-Referer'); +}); diff --git a/test/module/webpage/modify-header.js b/test/module/webpage/modify-header.js new file mode 100644 index 00000000..7f870d85 --- /dev/null +++ b/test/module/webpage/modify-header.js @@ -0,0 +1,25 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +page.customHeaders = { 'CustomHeader': 'ModifiedCustomValue' }; + +page.onResourceRequested = function(requestData, request) { + assert.typeOf(request.setHeader, 'function'); + request.setHeader('CustomHeader', 'ModifiedCustomValue'); +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + headers = json.headers; + assert.isTrue(headers.hasOwnProperty('customheader')); + assert.equal(headers.customheader, 'ModifiedCustomValue'); +}); + diff --git a/test/module/webpage/remove-header.js b/test/module/webpage/remove-header.js new file mode 100644 index 00000000..57ed04c3 --- /dev/null +++ b/test/module/webpage/remove-header.js @@ -0,0 +1,25 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +page.customHeaders = { 'CustomHeader': 'ModifiedCustomValue' }; + +page.onResourceRequested = function(requestData, request) { + assert.typeOf(request.setHeader, 'function'); + request.setHeader('CustomHeader', null); +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + headers = json.headers; + assert.isTrue(!headers.hasOwnProperty('customheader')); + assert.isTrue(!headers.hasOwnProperty('CustomHeader')); +}); + diff --git a/test/run-tests.py b/test/run-tests.py index 9c35325a..7feb751e 100755 --- a/test/run-tests.py +++ b/test/run-tests.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import inspect +import json import optparse import os import posixpath @@ -12,6 +13,7 @@ import sys import threading import time import urllib +import urlparse TIMEOUT = 35 # Maximum duration of PhantomJS execution (in seconds) @@ -26,6 +28,10 @@ TESTS = [ 'basics/version.js', 'module/webpage/open.js', 'module/webpage/loading.js', + 'module/webpage/custom-headers.js', + 'module/webpage/add-header.js', + 'module/webpage/remove-header.js', + 'module/webpage/modify-header.js', 'module/system/system.js', 'module/system/args.js', 'module/system/os.js', @@ -40,7 +46,32 @@ TESTS = [ ] -class FileHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): +class FileHandler(SimpleHTTPServer.SimpleHTTPRequestHandler, object): + + def do_GET(self): + url = urlparse.urlparse(self.path) + if url.path == '/echo': + headers = {} + for name, value in self.headers.items(): + headers[name] = value.rstrip() + d = dict( + command=self.command, + version=self.protocol_version, + origin=self.client_address, + url=self.path, + path=url.path, + params=url.params, + query=url.query, + fragment=url.fragment, + headers=headers + ) + + self.send_response(200) + self.send_header('Content-Type', 'application/json') + self.end_headers() + self.wfile.write(json.dumps(d, indent=2) + '\r\n') + else: + super(FileHandler, self).do_GET() # silent, do not pollute stdout nor stderr. def log_message(self, format, *args): diff --git a/test/webpage-spec.js b/test/webpage-spec.js index fe20076e..65eb4c92 100644 --- a/test/webpage-spec.js +++ b/test/webpage-spec.js @@ -183,11 +183,6 @@ describe("WebPage object", function() { expect(page.settings).toNotEqual({}); }); - expectHasProperty(page, 'customHeaders'); - it("should have customHeaders as an empty object", function() { - expect(page.customHeaders).toEqual({}); - }); - expectHasProperty(page, 'zoomFactor'); it("should have zoomFactor of 1", function() { expect(page.zoomFactor).toEqual(1.0); @@ -780,49 +775,6 @@ describe("WebPage object", function() { }); }); - it("should set custom headers properly", function() { - var server = require('webserver').create(); - server.listen(12345, function(request, response) { - // echo received request headers in response body - response.write(JSON.stringify(request.headers)); - response.close(); - }); - - var url = "http://localhost:12345/foo/headers.txt?ab=cd"; - var customHeaders = { - "Custom-Key" : "Custom-Value", - "User-Agent" : "Overriden-UA", - "Referer" : "Overriden-Referer" - }; - page.customHeaders = customHeaders; - - var handled = false; - runs(function() { - expect(handled).toEqual(false); - page.open(url, function (status) { - expect(status == 'success').toEqual(true); - handled = true; - - var echoedHeaders = JSON.parse(page.plainText); - // console.log(JSON.stringify(echoedHeaders, null, 4)); - // console.log(JSON.stringify(customHeaders, null, 4)); - - expect(echoedHeaders["Custom-Key"]).toEqual(customHeaders["Custom-Key"]); - expect(echoedHeaders["User-Agent"]).toEqual(customHeaders["User-Agent"]); - expect(echoedHeaders["Referer"]).toEqual(customHeaders["Referer"]); - - }); - }); - - waits(50); - - runs(function() { - expect(handled).toEqual(true); - server.close(); - }); - - }); - it("should process request body properly for POST", function() { var server = require('webserver').create(); server.listen(12345, function(request, response) { @@ -2168,103 +2120,3 @@ describe("WebPage render image", function(){ }); }); -describe("WebPage network request headers handling", function() { - it("should add HTTP header to a network request", function() { - var page = require("webpage").create(); - var server = require("webserver").create(); - var isCustomHeaderPresented = false; - - server.listen(12345, function(response) { - if (response.headers["CustomHeader"] && response.headers["CustomHeader"] === "CustomValue") { - isCustomHeaderPresented = true; - } - }); - - page.onResourceRequested = function(requestData, request) { - expect(typeof request.setHeader).toEqual("function"); - request.setHeader("CustomHeader", "CustomValue"); - }; - - runs(function() { - page.open("http://localhost:12345", function(status) { - expect(status).toEqual("success"); - }); - }); - - waitsFor(function() { - return isCustomHeaderPresented; - }, "isCustomHeaderPresented should be received", 3000); - - runs(function() { - page.close(); - server.close(); - }); - }); - - xit("should remove HTTP header from a network request", function() { - var page = require("webpage").create(); - page.customHeaders = {"CustomHeader": "CustomValue"}; - - var server = require("webserver").create(); - var handled = false; - - server.listen(12345, function(request) { - if (request.headers["CustomHeader"] == null) { - handled = true; - } - }); - - page.onResourceRequested = function(requestData, request) { - expect(typeof request.setHeader).toEqual("function"); - request.setHeader("CustomHeader", null); - }; - - runs(function() { - page.open("http://localhost:12345", function(status) { - expect(status).toEqual("success"); - }); - }); - - waits(3000); - - runs(function() { - expect(handled).toBeTruthy(); - page.close(); - server.close(); - }); - }); - - xit("should set HTTP header value for a network request", function() { - var page = require("webpage").create(); - page.customHeaders = {"CustomHeader": "CustomValue"}; - - var server = require("webserver").create(); - var handled = false; - - server.listen(12345, function(request) { - if (request.headers["CustomHeader"] && - request.headers["CustomHeader"] === "ChangedCustomValue") { - handled = true; - } - }); - - page.onResourceRequested = function(requestData, request) { - expect(typeof request.setHeader).toEqual("function"); - request.setHeader("CustomHeader", "ChangedCustomValue"); - }; - - runs(function() { - page.open("http://localhost:12345", function(status) { - expect(status).toEqual("success"); - }); - }); - - waits(3000); - - runs(function() { - expect(handled).toBeTruthy(); - page.close(); - server.close(); - }); - }); -});