diff --git a/test/assert.js b/test/assert.js index b6d78f74..a0180290 100644 --- a/test/assert.js +++ b/test/assert.js @@ -90,6 +90,32 @@ function typeOf(object, expected) { ++total; } +function waitFor(condition, callback, options) { + callback = callback || function() {}; + options = options || {}; + var poolMs = options.poolMs || 10; + var timeoutMs = options.timeoutMs || 1000; + var cutoffMs = timeoutMs + new Date().getTime(); + + var waitForInternal = function () { + if (condition()) { + ++total; + callback(); + } else { + var now = new Date().getTime(); + if (now < cutoffMs) { + window.setTimeout(waitForInternal, poolMs); + } else { + console.error("Timeout while waiting for ''", + condition.toString(), "'"); + showError(); + } + } + } + + waitForInternal(); +} + exports.timeout = timeout; exports.isTrue = isTrue; exports.equal = equal; @@ -97,3 +123,4 @@ exports.jsonEqual = jsonEqual; exports.notEqual = notEqual; exports.strictEqual = strictEqual; exports.typeOf = typeOf; +exports.waitFor = waitFor; diff --git a/test/basics/onerror.js b/test/basics/onerror.js deleted file mode 100644 index 4c8cb45a..00000000 --- a/test/basics/onerror.js +++ /dev/null @@ -1,20 +0,0 @@ -var assert = require('../assert'); - -phantom.onError = undefined; -assert.typeOf(phantom.onError, 'undefined'); - -var onErrorFunc1 = function() { return !"x"; }; -phantom.onError = onErrorFunc1; -asssert.deepEqual(phantom.onError, onErrorFunc1); - -var onErrorFunc2 = function() { return !!"y"; }; -phantom.onError = onErrorFunc2; -asssert.deepEqual(phantom.onError, onErrorFunc2); -asssert.isTrue(phantom.onError != onErrorFunc1); - -// Will only allow setting to a function value, so setting it to `null` returns `undefined` -phantom.onError = null; -assert.typeOf(phantom.onError, 'undefined'); - -phantom.onError = undefined; -assert.typeOf(phantom.onError, 'undefined'); diff --git a/test/module/webpage/confirm.js b/test/module/webpage/confirm.js deleted file mode 100644 index 14b2355a..00000000 --- a/test/module/webpage/confirm.js +++ /dev/null @@ -1,14 +0,0 @@ -var assert = require('../../assert'); -var page = require('webpage').create(); - -var msg = "message body", - result, - expected = true; -page.onConfirm = function(msg) { - return true; -}; -result = page.evaluate(function(m) { - return window.confirm(m); -}, msg); - -assert.equal(result, expected); diff --git a/test/module/webpage/mouseclick-event.js b/test/module/webpage/mouseclick-event.js new file mode 100644 index 00000000..ffc22f1b --- /dev/null +++ b/test/module/webpage/mouseclick-event.js @@ -0,0 +1,36 @@ +var assert = require('../../assert'); +var page = require('webpage').create(); + +page.evaluate(function() { + window.addEventListener('mousedown', function(event) { + window.loggedEvent = window.loggedEvent || {}; + window.loggedEvent.mousedown = event; + }, false); + window.addEventListener('mouseup', function(event) { + window.loggedEvent = window.loggedEvent || {}; + window.loggedEvent.mouseup = event; + }, false); +}); +page.sendEvent('click', 42, 217); + +var event = page.evaluate(function() { + return window.loggedEvent; +}); +assert.equal(event.mouseup.clientX, 42); +assert.equal(event.mouseup.clientY, 217); +assert.equal(event.mousedown.clientX, 42); +assert.equal(event.mousedown.clientY, 217); + +// click with modifier key +page.evaluate(function() { + window.addEventListener('click', function(event) { + window.loggedEvent = window.loggedEvent || {}; + window.loggedEvent.click = event; + }, false); +}); +page.sendEvent('click', 100, 100, 'left', page.event.modifier.shift); + +var event = page.evaluate(function() { + return window.loggedEvent.click; +}); +assert.isTrue(event.shiftKey); diff --git a/test/module/webpage/mousedoubleclick-event.js b/test/module/webpage/mousedoubleclick-event.js new file mode 100644 index 00000000..e6b72f0e --- /dev/null +++ b/test/module/webpage/mousedoubleclick-event.js @@ -0,0 +1,29 @@ +var assert = require('../../assert'); +var page = require('webpage').create(); + +page.content = ''; +var point = page.evaluate(function () { + var el = document.querySelector('input'); + var rect = el.getBoundingClientRect(); + return { x: rect.left + Math.floor(rect.width / 2), y: rect.top + (rect.height / 2) }; +}); +page.sendEvent('doubleclick', point.x, point.y); + +var text = page.evaluate(function () { + return document.querySelector('input').value; +}); +assert.equal(text, "doubleclicked"); + +// click with modifier key +page.evaluate(function() { + window.addEventListener('dblclick', function(event) { + window.loggedEvent = window.loggedEvent || {}; + window.loggedEvent.dblclick = event; + }, false); +}); +page.sendEvent('doubleclick', 100, 100, 'left', page.event.modifier.shift); + +var event = page.evaluate(function() { + return window.loggedEvent.dblclick; +}); +assert.isTrue(event.shiftKey); diff --git a/test/module/webpage/mousedown-event.js b/test/module/webpage/mousedown-event.js index 51e78e6e..3c68e08b 100644 --- a/test/module/webpage/mousedown-event.js +++ b/test/module/webpage/mousedown-event.js @@ -1,7 +1,5 @@ var assert = require('../../assert'); -var webpage = require('webpage'); - -var page = webpage.create(); +var page = require('webpage').create(); page.evaluate(function() { window.addEventListener('mousedown', function(event) { diff --git a/test/module/webpage/mousemove-event.js b/test/module/webpage/mousemove-event.js index e287e1a5..6df34888 100644 --- a/test/module/webpage/mousemove-event.js +++ b/test/module/webpage/mousemove-event.js @@ -1,7 +1,5 @@ var assert = require('../../assert'); -var webpage = require('webpage'); - -var page = webpage.create(); +var page = require('webpage').create(); page.evaluate(function() { window.addEventListener('mousemove', function(event) { diff --git a/test/module/webpage/on-confirm.js b/test/module/webpage/on-confirm.js new file mode 100644 index 00000000..14ea8b99 --- /dev/null +++ b/test/module/webpage/on-confirm.js @@ -0,0 +1,31 @@ +var assert = require('../../assert'); +var page = require('webpage').create(); + +var msg = "message body", + result, + expected = true; + +assert.equal(page.onConfirm, undefined); + +var onConfirmTrue = function(msg) { + return true; +}; +page.onConfirm = onConfirmTrue; +assert.equal(page.onConfirm, onConfirmTrue); + +result = page.evaluate(function(m) { + return window.confirm(m); +}, msg); + +assert.equal(result, expected); + +var onConfirmFunc = function() { return !!"y"; }; +page.onConfirm = onConfirmFunc2; +assert.equal(page.onConfirm, onConfirmFunc); +assert.notEqual(page.onConfirm, onConfirmTrue); + +page.onConfirm = null; +// Will only allow setting to a function value, so setting it to `null` returns `undefined` +assert.equal(page.onConfirm, undefined); +page.onConfirm = undefined; +assert.equal(page.onConfirm, undefined); diff --git a/test/module/webpage/on-error.js b/test/module/webpage/on-error.js new file mode 100644 index 00000000..93653659 --- /dev/null +++ b/test/module/webpage/on-error.js @@ -0,0 +1,59 @@ +var assert = require('../../assert'); +var page = require('webpage').create(); + +assert.notEqual(page.onError, undefined); + +var onErrorFunc1 = function() { return !"x"; }; +page.onError = onErrorFunc1; +assert.equal(page.onError, onErrorFunc1); + +var onErrorFunc2 = function() { return !!"y"; }; +page.onError = onErrorFunc2; +assert.equal(page.onError, onErrorFunc2); +assert.notEqual(page.onError, onErrorFunc1); + +page.onError = null; +// Will only allow setting to a function value, so setting it to `null` returns `undefined` +assert.equal(page.onError, undefined); +page.onError = undefined; +assert.equal(page.onError, undefined); + +// reports error +var lastError = null; +page.onError = function(message) { lastError = message; }; + +page.evaluate(function() { referenceError2(); }); +assert.equal(lastError, "ReferenceError: Can't find variable: referenceError2"); + +page.evaluate(function() { throw "foo"; }); +assert.equal(lastError, "foo"); + +page.evaluate(function() { throw Error("foo"); }); +assert.equal(lastError, "Error: foo"); + +// don't report handled errors +var hadError = false; +var caughtError = false; + +page.onError = function() { hadError = true; }; +page.evaluate(function() { + caughtError = false; + + try { + referenceError(); + } catch(e) { + caughtError = true; + } +}); + +assert.equal(hadError, false); +assert.isTrue(page.evaluate(function() { return caughtError; })); + +// even with async +page.evaluate(function() { + setTimeout(function() { referenceError(); }, 0); +}); + +assert.waitFor(function() { + return lastError == "ReferenceError: Can't find variable: referenceError"; +}); diff --git a/test/module/webpage/on-initialized.js b/test/module/webpage/on-initialized.js new file mode 100644 index 00000000..e41fbc48 --- /dev/null +++ b/test/module/webpage/on-initialized.js @@ -0,0 +1,20 @@ +var assert = require('../../assert'); +var page = require('webpage').create(); + +assert.equal(page.onInitialized, undefined); + +var onInitialized1 = function() { var x = "x"; }; +page.onInitialized = onInitialized1; +assert.equal(page.onInitialized, onInitialized1); + +var onInitialized2 = function() { var y = "y"; }; +page.onInitialized = onInitialized2; +assert.equal(page.onInitialized, onInitialized2); +assert.notEqual(page.onInitialized, onInitialized1); + +page.onInitialized = null; +// Will only allow setting to a function value, so setting it to `null` returns `undefined` +assert.equal(page.onInitialized, undefined); + +page.onInitialized = undefined; +assert.equal(page.onInitialized, undefined); diff --git a/test/webpage-spec.js b/test/webpage-spec.js index 9433b751..a4c519b0 100644 --- a/test/webpage-spec.js +++ b/test/webpage-spec.js @@ -1,148 +1,6 @@ describe("WebPage object", function() { var page = new WebPage(); - it("should be able to get any signal handler that are currently set on it", function() { - page.onInitialized = undefined; - expect(page.onInitialized).toBeUndefined(); - var onInitialized1 = function() { var x = "x"; }; - page.onInitialized = onInitialized1; - expect(page.onInitialized).toEqual(onInitialized1); - var onInitialized2 = function() { var y = "y"; }; - page.onInitialized = onInitialized2; - expect(page.onInitialized).toEqual(onInitialized2); - expect(page.onInitialized).toNotEqual(onInitialized1); - page.onInitialized = null; - // Will only allow setting to a function value, so setting it to `null` returns `undefined` - expect(page.onInitialized).toBeUndefined(); - page.onInitialized = undefined; - expect(page.onInitialized).toBeUndefined(); - }); - - it("should be able to get any callback handler that are currently set on it", function() { - page.onConfirm = undefined; - expect(page.onConfirm).toBeUndefined(); - var onConfirmFunc1 = function() { return !"x"; }; - page.onConfirm = onConfirmFunc1; - expect(page.onConfirm).toEqual(onConfirmFunc1); - var onConfirmFunc2 = function() { return !!"y"; }; - page.onConfirm = onConfirmFunc2; - expect(page.onConfirm).toEqual(onConfirmFunc2); - expect(page.onConfirm).toNotEqual(onConfirmFunc1); - page.onConfirm = null; - // Will only allow setting to a function value, so setting it to `null` returns `undefined` - expect(page.onConfirm).toBeUndefined(); - page.onConfirm = undefined; - expect(page.onConfirm).toBeUndefined(); - }); - - it("should be able to get the error signal handler that is currently set on it (currently a special 1-off case)", function() { - page.onError = undefined; - expect(page.onError).toBeUndefined(); - var onErrorFunc1 = function() { return !"x"; }; - page.onError = onErrorFunc1; - expect(page.onError).toEqual(onErrorFunc1); - var onErrorFunc2 = function() { return !!"y"; }; - page.onError = onErrorFunc2; - expect(page.onError).toEqual(onErrorFunc2); - expect(page.onError).toNotEqual(onErrorFunc1); - page.onError = null; - // Will only allow setting to a function value, so setting it to `null` returns `undefined` - expect(page.onError).toBeUndefined(); - page.onError = undefined; - expect(page.onError).toBeUndefined(); - }); - - it("should handle click event", function() { - runs(function() { - page.evaluate(function() { - window.addEventListener('mousedown', function(event) { - window.loggedEvent = window.loggedEvent || {}; - window.loggedEvent.mousedown = event; - }, false); - window.addEventListener('mouseup', function(event) { - window.loggedEvent = window.loggedEvent || {}; - window.loggedEvent.mouseup = event; - }, false); - }); - page.sendEvent('click', 42, 217); - }); - - waits(50); - - runs(function() { - var event = page.evaluate(function() { - return window.loggedEvent; - }); - expect(event.mouseup.clientX).toEqual(42); - expect(event.mouseup.clientY).toEqual(217); - expect(event.mousedown.clientX).toEqual(42); - expect(event.mousedown.clientY).toEqual(217); - }); - }); - - it("should handle doubleclick event", function () { - runs(function () { - page.content = ''; - var point = page.evaluate(function () { - var el = document.querySelector('input'); - var rect = el.getBoundingClientRect(); - return { x: rect.left + Math.floor(rect.width / 2), y: rect.top + (rect.height / 2) }; - }); - page.sendEvent('doubleclick', point.x, point.y); - }); - - waits(50); - - runs(function () { - var text = page.evaluate(function () { - return document.querySelector('input').value; - }); - expect(text).toEqual("doubleclicked"); - }); - }); - - it("should handle click with modifier keys", function() { - runs(function() { - page.evaluate(function() { - window.addEventListener('click', function(event) { - window.loggedEvent = window.loggedEvent || {}; - window.loggedEvent.click = event; - }, false); - }); - page.sendEvent('click', 100, 100, 'left', page.event.modifier.shift); - }); - - waits(50); - - runs(function() { - var event = page.evaluate(function() { - return window.loggedEvent.click; - }); - expect(event.shiftKey).toEqual(true); - }); - }); - - it("should handle doubleclick with modifier keys", function() { - runs(function() { - page.evaluate(function() { - window.addEventListener('dblclick', function(event) { - window.loggedEvent = window.loggedEvent || {}; - window.loggedEvent.dblclick = event; - }, false); - }); - page.sendEvent('doubleclick', 100, 100, 'left', page.event.modifier.shift); - }); - - waits(50); - - runs(function() { - var event = page.evaluate(function() { - return window.loggedEvent.dblclick; - }); - expect(event.shiftKey).toEqual(true); - }); - }); - xit("should handle file uploads", function() { runs(function() { page.content = '\n' + @@ -181,78 +39,6 @@ describe("WebPage object", function() { }); }); - it("reports unhandled errors", function() { - var lastError = null; - - var page = new require('webpage').create(); - page.onError = function(message) { lastError = message; }; - - runs(function() { - page.evaluate(function() { - setTimeout(function() { referenceError(); }, 0); - }); - }); - - waits(0); - - runs(function() { - expect(lastError).toEqual("ReferenceError: Can't find variable: referenceError"); - - page.evaluate(function() { referenceError2(); }); - expect(lastError).toEqual("ReferenceError: Can't find variable: referenceError2"); - - page.evaluate(function() { throw "foo"; }); - expect(lastError).toEqual("foo"); - - page.evaluate(function() { throw Error("foo"); }); - expect(lastError).toEqual("Error: foo"); - }); - }); - - it("doesn't report handled errors", function() { - var hadError = false; - var caughtError = false; - var page = require('webpage').create(); - - runs(function() { - page.onError = function() { hadError = true; }; - page.evaluate(function() { - caughtError = false; - - try { - referenceError(); - } catch(e) { - caughtError = true; - } - }); - - expect(hadError).toEqual(false); - expect(page.evaluate(function() { return caughtError; })).toEqual(true); - }); - }); - - it("reports the sourceURL and line of errors", function() { - runs(function() { - var e1, e2; - - try { - referenceError(); - } catch (e) { - e1 = e; - } - - try { - referenceError(); - } catch (e) { - e2 = e; - } - - expect(e1.sourceURL).toMatch(/webpage-spec.js$/); - expect(e1.line).toBeGreaterThan(1); - expect(e2.line).toEqual(e1.line + 6); - }); - }); - xit("reports the stack of errors", function() { var helperFile = "./fixtures/error-helper.js"; phantom.injectJs(helperFile); @@ -293,22 +79,6 @@ describe("WebPage object", function() { }); }); - it("reports errors that occur in the main context", function() { - var error; - phantom.onError = function(e) { error = e; }; - - runs(function() { - setTimeout(function() { zomg(); }, 0); - }); - - waits(0); - - runs(function() { - expect(error.toString()).toEqual("ReferenceError: Can't find variable: zomg"); - phantom.onError = phantom.defaultErrorHandler; - }); - }); - it("should process request body properly for POST", function() { var server = require('webserver').create(); server.listen(12345, function(request, response) { @@ -602,65 +372,6 @@ describe("WebPage object", function() { }); }); - it("should pass variables to functions properly", function() { - var testPrimitiveArgs = function() { - var samples = [ - true, - 0, - "`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?", - undefined, - null - ]; - for (var i = 0; i < samples.length; i++) { - if (samples[i] !== arguments[i]) { - console.log("FAIL"); - } - } - }; - - var testComplexArgs = function() { - var samples = [ - {a:true, b:0, c:"string"}, - function() { return true; }, - [true, 0, "string"], - /\d+\w*\// - ]; - for (var i = 0; i < samples.length; i++) { - if (typeof samples[i] !== typeof arguments[i] || - samples[i].toString() !== arguments[i].toString()) { - console.log("FAIL"); - } - } - }; - - var message; - runs(function() { - page.onConsoleMessage = function (msg) { - message = msg; - }; - }); - - waits(0); - - runs(function() { - page.evaluate(function() { - console.log("PASS"); - }); - page.evaluate(testPrimitiveArgs, - true, - 0, - "`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?", - undefined, - null); - page.evaluate(testComplexArgs, - {a:true, b:0, c:"string"}, - function() { return true; }, - [true, 0, "string"], - /\d+\w*\//); - expect(message).toEqual("PASS"); - }); - }); - it('should open url using secure connection', function() { var page = require('webpage').create(); var url = 'https://httpbin.org/';