Commit e36fff78 authored by ColinEberhardt's avatar ColinEberhardt

Merge pull request #801 from passy/browser-tests-style

Update browser-tests JS style
parents bacfede5 4a4016ff
module.exports = function (grunt) { module.exports = function (grunt) {
'use strict';
grunt.loadNpmTasks('grunt-simple-mocha'); grunt.loadNpmTasks('grunt-simple-mocha');
var gruntConfig = { grunt.initConfig({
simplemocha: { simplemocha: {
options: { options: {
reporter: 'mocha-known-issues-reporter' reporter: 'mocha-known-issues-reporter'
...@@ -11,8 +11,7 @@ module.exports = function (grunt) { ...@@ -11,8 +11,7 @@ module.exports = function (grunt) {
src: 'allTests.js' src: 'allTests.js'
} }
} }
}; });
grunt.initConfig(gruntConfig);
// build tasks // build tasks
grunt.registerTask('test', ['simplemocha']); grunt.registerTask('test', ['simplemocha']);
......
var testSuite = require('./test.js'), 'use strict';
fs = require('fs'),
argv = require('optimist').default('laxMode', false).argv,
rootUrl = "http://localhost:8000/",
frameworkNamePattern = /^[a-z-_]+$/;
// collect together the framework names from each of the subfolders var testSuite = require('./test.js');
var list = fs.readdirSync("../architecture-examples/") var fs = require('fs');
.map(function(folderName) { return { name : folderName, path : "architecture-examples/" + folderName} }); var argv = require('optimist').default('laxMode', false).argv;
var rootUrl = 'http://localhost:8000/';
list = list.concat(fs.readdirSync("../labs/architecture-examples/") var frameworkNamePattern = /^[a-z-_]+$/;
.map(function(folderName) { return { name : folderName, path: "labs/architecture-examples/" + folderName} }));
list = list.concat(fs.readdirSync("../labs/dependency-examples/")
.map(function(folderName) { return { name : folderName, path: "labs/dependency-examples/" + folderName} }));
list = list.concat(fs.readdirSync("../dependency-examples/") // collect together the framework names from each of the subfolders
.map(function(folderName) { return { name : folderName, path: "dependency-examples/" + folderName} })); var list = fs.readdirSync('../architecture-examples/')
.map(function (folderName) {
return { name: folderName, path: 'architecture-examples/' + folderName };
})
.concat(fs.readdirSync('../labs/architecture-examples/')
.map(function (folderName) {
return { name: folderName, path: 'labs/architecture-examples/' + folderName };
})
)
.concat(fs.readdirSync('../labs/dependency-examples/')
.map(function (folderName) {
return { name: folderName, path: 'labs/dependency-examples/' + folderName };
})
)
.concat(fs.readdirSync('../dependency-examples/')
.map(function (folderName) {
return { name: folderName, path: 'dependency-examples/' + folderName };
})
);
// apps that are not hosted at the root of their folder need to be handled explicitly // apps that are not hosted at the root of their folder need to be handled explicitly
var exceptions = [ var exceptions = [
{ name : "chaplin-brunch", path : "labs/dependency-examples/chaplin-brunch/public" } { name: 'chaplin-brunch', path: 'labs/dependency-examples/chaplin-brunch/public' }
]; ];
list = list.map(function(framework) {
var exception = exceptions.filter(function(exFramework) { return exFramework.name === framework.name}); list = list.map(function (framework) {
var exception = exceptions.filter(function (exFramework) {
return exFramework.name === framework.name;
});
return exception.length > 0 ? exception[0] : framework; return exception.length > 0 ? exception[0] : framework;
}); });
// filter out any folders that are not frameworks (.e.g hidden files) // filter out any folders that are not frameworks (.e.g hidden files)
list = list.filter(function(framework) { return frameworkNamePattern.test(framework.name); }); list = list.filter(function (framework) {
return frameworkNamePattern.test(framework.name);
});
// if a specific framework has been named, just run this one // if a specific framework has been named, just run this one
if (argv.framework) { if (argv.framework) {
list = list.filter(function(framework) { return framework.name === argv.framework}); list = list.filter(function (framework) {
return framework.name === argv.framework;
});
} }
// run the tests for each framework // run the tests for each framework
var testIndex = 1; list.forEach(function (framework) {
list.forEach(function(framework) { testSuite.todoMVCTest(
testSuite.todoMVCTest(framework.name, framework.name,
rootUrl + framework.path + "/index.html", argv.speedMode, argv.laxMode); rootUrl + framework.path + '/index.html', argv.speedMode,
argv.laxMode
);
}); });
module.exports = [ module.exports = [
// the following are covered by the following issue: // the following are covered by the following issue:
// https://github.com/tastejs/todomvc/issues/789 // https://github.com/tastejs/todomvc/issues/789
"TodoMVC - agilityjs, Editing, should cancel edits on escape", 'TodoMVC - agilityjs, Editing, should cancel edits on escape',
"TodoMVC - angularjs-perf, Editing, should cancel edits on escape", 'TodoMVC - angularjs-perf, Editing, should cancel edits on escape',
"TodoMVC - closure, Editing, should cancel edits on escape", 'TodoMVC - closure, Editing, should cancel edits on escape',
"TodoMVC - jquery, Editing, should cancel edits on escape", 'TodoMVC - jquery, Editing, should cancel edits on escape',
"TodoMVC - knockback, Editing, should cancel edits on escape", 'TodoMVC - knockback, Editing, should cancel edits on escape',
"TodoMVC - spine, Editing, should cancel edits on escape", 'TodoMVC - spine, Editing, should cancel edits on escape',
"TodoMVC - yui, Editing, should cancel edits on escape", 'TodoMVC - yui, Editing, should cancel edits on escape',
// all the following are covered by this issue: // all the following are covered by this issue:
// https://github.com/tastejs/todomvc/issues/790 // https://github.com/tastejs/todomvc/issues/790
// these implementations filter the view rather than the model when routing // these implementations filter the view rather than the model when routing
"TodoMVC - agilityjs, Routing, should allow me to display active items", 'TodoMVC - agilityjs, Routing, should allow me to display active items',
"TodoMVC - agilityjs, Routing, should allow me to display completed items", 'TodoMVC - agilityjs, Routing, should allow me to display completed items',
"TodoMVC - backbone, Routing, should allow me to display active items", 'TodoMVC - backbone, Routing, should allow me to display active items',
"TodoMVC - backbone, Routing, should allow me to display completed items", 'TodoMVC - backbone, Routing, should allow me to display completed items',
"TodoMVC - maria, Routing, should allow me to display active items", 'TodoMVC - maria, Routing, should allow me to display active items',
"TodoMVC - maria, Routing, should allow me to display completed items", 'TodoMVC - maria, Routing, should allow me to display completed items',
"TodoMVC - dojo, Routing, should allow me to display active items", 'TodoMVC - dojo, Routing, should allow me to display active items',
"TodoMVC - dojo, Routing, should allow me to display completed items", 'TodoMVC - dojo, Routing, should allow me to display completed items',
// the following are covered by this issue: // the following are covered by this issue:
// https://github.com/tastejs/todomvc/issues/795 // https://github.com/tastejs/todomvc/issues/795
"TodoMVC - spine, Mark all as completed, complete all checkbox should update state when items are completed / cleared", 'TodoMVC - spine, Mark all as completed, complete all checkbox should update state when items are completed / cleared',
"TodoMVC - angularjs-perf, Mark all as completed, complete all checkbox should update state when items are completed / cleared", 'TodoMVC - angularjs-perf, Mark all as completed, complete all checkbox should update state when items are completed / cleared',
// the following implementations do not support routing // the following implementations do not support routing
"TodoMVC - jquery, Routing, should allow me to display active items", 'TodoMVC - jquery, Routing, should allow me to display active items',
"TodoMVC - jquery, Routing, should allow me to display completed items", 'TodoMVC - jquery, Routing, should allow me to display completed items',
"TodoMVC - jquery, Routing, should allow me to display all items", 'TodoMVC - jquery, Routing, should allow me to display all items',
"TodoMVC - jquery, Routing, should highlight the currently applied filter", 'TodoMVC - jquery, Routing, should highlight the currently applied filter',
// ----------------- Test framework issues ----------- // ----------------- Test framework issues -----------
// for some reason the persistence test fails for knockout, even though persistence is working // for some reason the persistence test fails for knockout, even though persistence is working
// just fine. Perhaps there is something asynchronous going on that is causing the assert // just fine. Perhaps there is something asynchronous going on that is causing the assert
// to be executed early? // to be executed early?
"TodoMVC - knockoutjs, Persistence, should persist its data", 'TodoMVC - knockoutjs, Persistence, should persist its data',
// ----------------- Unsupported implementations!! ----------- // ----------------- Unsupported implementations!! -----------
...@@ -46,53 +46,53 @@ module.exports = [ ...@@ -46,53 +46,53 @@ module.exports = [
// tests, and as a result have numerous failures. // tests, and as a result have numerous failures.
// polymer - does not follow the HTML spec // polymer - does not follow the HTML spec
"TodoMVC - polymer, New Todo, should allow me to add todo items", 'TodoMVC - polymer, New Todo, should allow me to add todo items',
"TodoMVC - polymer, New Todo, should clear text input field when an item is added", 'TodoMVC - polymer, New Todo, should clear text input field when an item is added',
"TodoMVC - polymer, New Todo, should trim text input", 'TodoMVC - polymer, New Todo, should trim text input',
"TodoMVC - polymer, New Todo, should show #main and #footer when items added", 'TodoMVC - polymer, New Todo, should show #main and #footer when items added',
"TodoMVC - polymer, Mark all as completed, should allow me to mark all items as completed", 'TodoMVC - polymer, Mark all as completed, should allow me to mark all items as completed',
"TodoMVC - polymer, Mark all as completed, should allow me to clear the completion state of all items", 'TodoMVC - polymer, Mark all as completed, should allow me to clear the completion state of all items',
"TodoMVC - polymer, Mark all as completed, complete all checkbox should update state when items are completed / cleared", 'TodoMVC - polymer, Mark all as completed, complete all checkbox should update state when items are completed / cleared',
"TodoMVC - polymer, Item, should allow me to mark items as complete", 'TodoMVC - polymer, Item, should allow me to mark items as complete',
"TodoMVC - polymer, Item, should allow me to un-mark items as complete", 'TodoMVC - polymer, Item, should allow me to un-mark items as complete',
"TodoMVC - polymer, Item, should allow me to edit an item", 'TodoMVC - polymer, Item, should allow me to edit an item',
"TodoMVC - polymer, Editing, should hide other controls when editing", 'TodoMVC - polymer, Editing, should hide other controls when editing',
"TodoMVC - polymer, Editing, should save edits on enter", 'TodoMVC - polymer, Editing, should save edits on enter',
"TodoMVC - polymer, Editing, should save edits on blur", 'TodoMVC - polymer, Editing, should save edits on blur',
"TodoMVC - polymer, Editing, should trim entered text", 'TodoMVC - polymer, Editing, should trim entered text',
"TodoMVC - polymer, Editing, should remove the item if an empty text string was entered", 'TodoMVC - polymer, Editing, should remove the item if an empty text string was entered',
"TodoMVC - polymer, Editing, should cancel edits on escape", 'TodoMVC - polymer, Editing, should cancel edits on escape',
"TodoMVC - polymer, Counter, should display the current number of todo items", 'TodoMVC - polymer, Counter, should display the current number of todo items',
"TodoMVC - polymer, Clear completed button, should display the number of completed items", 'TodoMVC - polymer, Clear completed button, should display the number of completed items',
"TodoMVC - polymer, Clear completed button, should remove completed items when clicked", 'TodoMVC - polymer, Clear completed button, should remove completed items when clicked',
"TodoMVC - polymer, Clear completed button, should be hidden when there are no items that are completed", 'TodoMVC - polymer, Clear completed button, should be hidden when there are no items that are completed',
"TodoMVC - polymer, Persistence, should persist its data", 'TodoMVC - polymer, Persistence, should persist its data',
"TodoMVC - polymer, Routing, should allow me to display active items", 'TodoMVC - polymer, Routing, should allow me to display active items',
"TodoMVC - polymer, Routing, should allow me to display completed items", 'TodoMVC - polymer, Routing, should allow me to display completed items',
"TodoMVC - polymer, Routing, should allow me to display all items", 'TodoMVC - polymer, Routing, should allow me to display all items',
"TodoMVC - polymer, Routing, should highlight the currently applied filter", 'TodoMVC - polymer, Routing, should highlight the currently applied filter',
// gwt - does not follow the HTML spec closely eough for testing // gwt - does not follow the HTML spec closely eough for testing
"TodoMVC - gwt, New Todo, should allow me to add todo items", 'TodoMVC - gwt, New Todo, should allow me to add todo items',
"TodoMVC - gwt, New Todo, should trim text input", 'TodoMVC - gwt, New Todo, should trim text input',
"TodoMVC - gwt, Mark all as completed, should allow me to mark all items as completed", 'TodoMVC - gwt, Mark all as completed, should allow me to mark all items as completed',
"TodoMVC - gwt, Mark all as completed, should allow me to clear the completion state of all items", 'TodoMVC - gwt, Mark all as completed, should allow me to clear the completion state of all items',
"TodoMVC - gwt, Mark all as completed, complete all checkbox should update state when items are completed / cleared", 'TodoMVC - gwt, Mark all as completed, complete all checkbox should update state when items are completed / cleared',
"TodoMVC - gwt, Item, should allow me to mark items as complete", 'TodoMVC - gwt, Item, should allow me to mark items as complete',
"TodoMVC - gwt, Item, should allow me to un-mark items as complete", 'TodoMVC - gwt, Item, should allow me to un-mark items as complete',
"TodoMVC - gwt, Item, should allow me to edit an item", 'TodoMVC - gwt, Item, should allow me to edit an item',
"TodoMVC - gwt, Editing, should hide other controls when editing", 'TodoMVC - gwt, Editing, should hide other controls when editing',
"TodoMVC - gwt, Editing, should save edits on enter", 'TodoMVC - gwt, Editing, should save edits on enter',
"TodoMVC - gwt, Editing, should save edits on blur", 'TodoMVC - gwt, Editing, should save edits on blur',
"TodoMVC - gwt, Editing, should trim entered text", 'TodoMVC - gwt, Editing, should trim entered text',
"TodoMVC - gwt, Editing, should remove the item if an empty text string was entered", 'TodoMVC - gwt, Editing, should remove the item if an empty text string was entered',
"TodoMVC - gwt, Editing, should cancel edits on escape", 'TodoMVC - gwt, Editing, should cancel edits on escape',
"TodoMVC - gwt, Clear completed button, should display the number of completed items", 'TodoMVC - gwt, Clear completed button, should display the number of completed items',
"TodoMVC - gwt, Clear completed button, should remove completed items when clicked", 'TodoMVC - gwt, Clear completed button, should remove completed items when clicked',
"TodoMVC - gwt, Clear completed button, should be hidden when there are no items that are completed", 'TodoMVC - gwt, Clear completed button, should be hidden when there are no items that are completed',
"TodoMVC - gwt, Persistence, should persist its data", 'TodoMVC - gwt, Persistence, should persist its data',
"TodoMVC - gwt, Routing, should allow me to display active items", 'TodoMVC - gwt, Routing, should allow me to display active items',
"TodoMVC - gwt, Routing, should allow me to display completed items", 'TodoMVC - gwt, Routing, should allow me to display completed items',
"TodoMVC - gwt, Routing, should allow me to display all items", 'TodoMVC - gwt, Routing, should allow me to display all items',
"TodoMVC - gwt, Routing, should highlight the currently applied filter", 'TodoMVC - gwt, Routing, should highlight the currently applied filter',
]; ];
'use strict';
var webdriver = require('selenium-webdriver'); var webdriver = require('selenium-webdriver');
function Page(browser, laxMode) { module.exports = function Page(browser) {
// ----------------- utility methods // ----------------- utility methods
this.xPathForItemAtIndex = function(index) { this.xPathForItemAtIndex = function (index) {
// why is XPath the only language silly enough to be 1-indexed? // why is XPath the only language silly enough to be 1-indexed?
return "//ul[@id='todo-list']/li[" + (index + 1) + "]"; return '//ul[@id="todo-list"]/li[' + (index + 1) + ']';
} };
// ----------------- try / get methods // ----------------- try / get methods
...@@ -16,99 +18,99 @@ function Page(browser, laxMode) { ...@@ -16,99 +18,99 @@ function Page(browser, laxMode) {
// and test that the length is zero. These methods are used to obtain // and test that the length is zero. These methods are used to obtain
// elements which *might* be present in the DOM, hence the try/get name. // elements which *might* be present in the DOM, hence the try/get name.
this.tryGetMainSectionElement = function() { this.tryGetMainSectionElement = function () {
return browser.findElements(webdriver.By.xpath("//section[@id='main']")); return browser.findElements(webdriver.By.xpath('//section[@id="main"]'));
} };
this.tryGetFooterElement = function() { this.tryGetFooterElement = function () {
return browser.findElements(webdriver.By.xpath("//footer[@id='footer']")); return browser.findElements(webdriver.By.xpath('//footer[@id="footer"]'));
} };
this.tryGetClearCompleteButton = function() { this.tryGetClearCompleteButton = function () {
return browser.findElements(webdriver.By.xpath("//button[@id='clear-completed']")); return browser.findElements(webdriver.By.xpath('//button[@id="clear-completed"]'));
} };
this.tryGetToggleForItemAtIndex = function(index) { this.tryGetToggleForItemAtIndex = function (index) {
var xpath = this.xPathForItemAtIndex(index) + "//input[contains(@class,'toggle')]"; var xpath = this.xPathForItemAtIndex(index) + '//input[contains(@class,"toggle")]';
return browser.findElements(webdriver.By.xpath(xpath)); return browser.findElements(webdriver.By.xpath(xpath));
} };
this.tryGetItemLabelAtIndex = function(index) { this.tryGetItemLabelAtIndex = function (index) {
return browser.findElements(webdriver.By.xpath(this.xPathForItemAtIndex(index) + "//label")); return browser.findElements(webdriver.By.xpath(this.xPathForItemAtIndex(index) + '//label'));
} };
// ----------------- DOM element access methods // ----------------- DOM element access methods
this.getEditInputForItemAtIndex = function(index) { this.getEditInputForItemAtIndex = function (index) {
var xpath = this.xPathForItemAtIndex(index) + "//input[contains(@class,'edit')]"; var xpath = this.xPathForItemAtIndex(index) + '//input[contains(@class,"edit")]';
return browser.findElement(webdriver.By.xpath(xpath)); return browser.findElement(webdriver.By.xpath(xpath));
} };
this.getItemInputField = function() { this.getItemInputField = function () {
return browser.findElement(webdriver.By.xpath("//input[@id='new-todo']")); return browser.findElement(webdriver.By.xpath('//input[@id="new-todo"]'));
} };
this.getMarkAllCompletedCheckBox = function() { this.getMarkAllCompletedCheckBox = function () {
return browser.findElement(webdriver.By.xpath("//input[@id='toggle-all']")); return browser.findElement(webdriver.By.xpath('//input[@id="toggle-all"]'));
} };
this.getItemElements = function() { this.getItemElements = function () {
return browser.findElements(webdriver.By.xpath("//ul[@id='todo-list']/li")); return browser.findElements(webdriver.By.xpath('//ul[@id="todo-list"]/li'));
} };
this.getNonCompletedItemElements = function() { this.getNonCompletedItemElements = function () {
return browser.findElements(webdriver.By.xpath("//ul[@id='todo-list']/li[not(contains(@class,'completed'))]")); return browser.findElements(webdriver.By.xpath('//ul[@id="todo-list"]/li[not(contains(@class,"completed"))]'));
} };
this.getItemsCountElement = function() { this.getItemsCountElement = function () {
return browser.findElement(webdriver.By.id("todo-count")); return browser.findElement(webdriver.By.id('todo-count'));
} };
this.getItemLabelAtIndex = function(index) { this.getItemLabelAtIndex = function (index) {
return browser.findElement(webdriver.By.xpath(this.xPathForItemAtIndex(index) + "//label")); return browser.findElement(webdriver.By.xpath(this.xPathForItemAtIndex(index) + '//label'));
} };
this.getFilterElements = function() { this.getFilterElements = function () {
return browser.findElements(webdriver.By.xpath("//ul[@id='filters']//a")); return browser.findElements(webdriver.By.xpath('//ul[@id="filters"]//a'));
} };
// ----------------- page actions // ----------------- page actions
this.clickMarkAllCompletedCheckBox = function() { this.clickMarkAllCompletedCheckBox = function () {
return this.getMarkAllCompletedCheckBox().then(function(checkbox){ return this.getMarkAllCompletedCheckBox().then(function (checkbox) {
checkbox.click(); checkbox.click();
}); });
} };
this.clickClearCompleteButton = function() { this.clickClearCompleteButton = function () {
return this.tryGetClearCompleteButton().then(function(elements) { return this.tryGetClearCompleteButton().then(function (elements) {
var button = elements[0]; var button = elements[0];
button.click(); button.click();
}); });
} };
this.enterItem = function(itemText) { this.enterItem = function (itemText) {
var textField = this.getItemInputField(); var textField = this.getItemInputField();
textField.sendKeys(itemText); textField.sendKeys(itemText);
textField.sendKeys(webdriver.Key.ENTER); textField.sendKeys(webdriver.Key.ENTER);
}; };
this.toggleItemAtIndex = function(index) { this.toggleItemAtIndex = function (index) {
return this.tryGetToggleForItemAtIndex(index).then(function(elements) { return this.tryGetToggleForItemAtIndex(index).then(function (elements) {
var toggleElement = elements[0]; var toggleElement = elements[0];
toggleElement.click(); toggleElement.click();
}); });
} };
this.editItemAtIndex = function(index, itemText) { this.editItemAtIndex = function (index, itemText) {
return this.getEditInputForItemAtIndex(index) return this.getEditInputForItemAtIndex(index)
.then(function(itemEditField) { .then(function (itemEditField) {
// send 50 delete keypresses, just to be sure the item text is deleted // send 50 delete keypresses, just to be sure the item text is deleted
var deleteKeyPresses = ""; var deleteKeyPresses = '';
for (var i=0;i<50;i++) { for (var i = 0; i < 50; i++) {
deleteKeyPresses += webdriver.Key.BACK_SPACE deleteKeyPresses += webdriver.Key.BACK_SPACE;
} }
itemEditField.sendKeys(deleteKeyPresses); itemEditField.sendKeys(deleteKeyPresses);
// update the item with the new text. // update the item with the new text.
...@@ -116,34 +118,32 @@ function Page(browser, laxMode) { ...@@ -116,34 +118,32 @@ function Page(browser, laxMode) {
}); });
}; };
this.doubleClickItemAtIndex = function(index) { this.doubleClickItemAtIndex = function (index) {
return this.getItemLabelAtIndex(index).then(function(itemLabel) { return this.getItemLabelAtIndex(index).then(function (itemLabel) {
// double click is not 'natively' supported, so we need to send the event direct to the element // double click is not 'natively' supported, so we need to send the
// see: http://stackoverflow.com/questions/3982442/selenium-2-webdriver-how-to-double-click-a-table-row-which-opens-a-new-window // event direct to the element see:
browser.executeScript("var evt = document.createEvent('MouseEvents');" + // http://stackoverflow.com/questions/3982442/selenium-2-webdriver-how-to-double-click-a-table-row-which-opens-a-new-window
"evt.initMouseEvent('dblclick',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + browser.executeScript('var evt = document.createEvent("MouseEvents");' +
"arguments[0].dispatchEvent(evt);", itemLabel); 'evt.initMouseEvent("dblclick",true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);' +
'arguments[0].dispatchEvent(evt);', itemLabel);
}); });
} };
this.filterByActiveItems = function(index) { this.filterByActiveItems = function () {
return this.getFilterElements().then(function(filters) { return this.getFilterElements().then(function (filters) {
filters[1].click(); filters[1].click();
}); });
} };
this.filterByCompletedItems = function(index) { this.filterByCompletedItems = function () {
return this.getFilterElements().then(function(filters) { return this.getFilterElements().then(function (filters) {
filters[2].click(); filters[2].click();
}); });
} };
this.filterByAllItems = function(index) { this.filterByAllItems = function () {
return this.getFilterElements().then(function(filters) { return this.getFilterElements().then(function (filters) {
filters[0].click(); filters[0].click();
}); });
} };
} };
module.exports = Page;
\ No newline at end of file
var webdriver = require('selenium-webdriver'), 'use strict';
Page = require("./page");
function PageLaxMode(browser) { var webdriver = require('selenium-webdriver');
var Page = require('./page');
module.exports = function PageLaxMode(browser) {
Page.apply(this, [browser]); Page.apply(this, [browser]);
this.tryGetToggleForItemAtIndex = function(index) { this.tryGetToggleForItemAtIndex = function (index) {
// the specification dictates that the checkbox should have the 'toggle' CSS class. Some implementations deviate from // the specification dictates that the checkbox should have the 'toggle' CSS class. Some implementations deviate from
// this, hence in lax mode we simply look for any checkboxes within the specified 'li'. // this, hence in lax mode we simply look for any checkboxes within the specified 'li'.
var xpath = this.xPathForItemAtIndex(index) + "//input[@type='checkbox']"; var xpath = this.xPathForItemAtIndex(index) + '//input[@type="checkbox"]';
return browser.findElements(webdriver.By.xpath(xpath)); return browser.findElements(webdriver.By.xpath(xpath));
} };
this.getEditInputForItemAtIndex = function(index) { this.getEditInputForItemAtIndex = function (index) {
// the specification dictates that the input element that allows the user to edit a todo item should have a CSS // the specification dictates that the input element that allows the user to edit a todo item should have a CSS
// class of 'edit'. In lax mode, we also look for an input of type 'text'. // class of 'edit'. In lax mode, we also look for an input of type 'text'.
var xpath = "(" + this.xPathForItemAtIndex(index) + "//input[@type='text']" + "|" + var xpath = '(' + this.xPathForItemAtIndex(index) + '//input[@type="text"]' + '|' +
this.xPathForItemAtIndex(index) + "//input[contains(@class,'edit')]" + ")"; this.xPathForItemAtIndex(index) + '//input[contains(@class,"edit")]' + ')';
return browser.findElement(webdriver.By.xpath(xpath)); return browser.findElement(webdriver.By.xpath(xpath));
} };
} };
module.exports = PageLaxMode;
\ No newline at end of file
var webdriver = require('selenium-webdriver'), 'use strict';
test = require('selenium-webdriver/testing'),
assert = require("assert"), var webdriver = require('selenium-webdriver');
Page = require("./page"), var test = require('selenium-webdriver/testing');
PageLaxMode = require("./pageLaxMode"), var Page = require('./page');
TestOperations = require("./testOperations"); var PageLaxMode = require('./pageLaxMode');
var TestOperations = require('./testOperations');
exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
module.exports.todoMVCTest = function (frameworkName, baseUrl, speedMode, laxMode) {
test.describe('TodoMVC - ' + frameworkName, function () { test.describe('TodoMVC - ' + frameworkName, function () {
var otherUrl = "http://localhost:8000/"; var otherUrl = 'http://localhost:8000/';
var TODO_ITEM_ONE = "buy some cheese"; var TODO_ITEM_ONE = 'buy some cheese';
var TODO_ITEM_TWO = "feed the cat"; var TODO_ITEM_TWO = 'feed the cat';
var TODO_ITEM_THREE = "book a doctors appointment"; var TODO_ITEM_THREE = 'book a doctors appointment';
var browser, testOps, page; var browser, testOps, page;
...@@ -23,7 +24,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -23,7 +24,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
function launchBrowser() { function launchBrowser() {
browser = new webdriver.Builder() browser = new webdriver.Builder()
.withCapabilities({browserName : "chrome" }) .withCapabilities({browserName : 'chrome' })
.build(); .build();
browser.get(baseUrl); browser.get(baseUrl);
...@@ -51,7 +52,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -51,7 +52,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
page.getItemElements().then(function (items) { page.getItemElements().then(function (items) {
if (items.length > 0) { if (items.length > 0) {
// find any items that are not complete // find any items that are not complete
page.getNonCompletedItemElements().then(function(nonCompleteItems) { page.getNonCompletedItemElements().then(function (nonCompleteItems) {
if (nonCompleteItems.length > 0) { if (nonCompleteItems.length > 0) {
page.clickMarkAllCompletedCheckBox(); page.clickMarkAllCompletedCheckBox();
} }
...@@ -91,11 +92,11 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -91,11 +92,11 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
test.it('should clear text input field when an item is added', function () { test.it('should clear text input field when an item is added', function () {
page.enterItem(TODO_ITEM_ONE); page.enterItem(TODO_ITEM_ONE);
testOps.assertItemInputFieldText(""); testOps.assertItemInputFieldText('');
}); });
test.it('should trim text input', function () { test.it('should trim text input', function () {
page.enterItem(" " + TODO_ITEM_ONE + " "); page.enterItem(' ' + TODO_ITEM_ONE + ' ');
testOps.assertItemText(0, TODO_ITEM_ONE); testOps.assertItemText(0, TODO_ITEM_ONE);
}); });
...@@ -173,10 +174,10 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -173,10 +174,10 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
createStandardItems(); createStandardItems();
page.doubleClickItemAtIndex(1); page.doubleClickItemAtIndex(1);
page.editItemAtIndex(1, "buy some sausages" + webdriver.Key.ENTER); page.editItemAtIndex(1, 'buy some sausages' + webdriver.Key.ENTER);
testOps.assertItemText(0, TODO_ITEM_ONE); testOps.assertItemText(0, TODO_ITEM_ONE);
testOps.assertItemText(1, "buy some sausages"); testOps.assertItemText(1, 'buy some sausages');
testOps.assertItemText(2, TODO_ITEM_THREE); testOps.assertItemText(2, TODO_ITEM_THREE);
}); });
...@@ -198,10 +199,10 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -198,10 +199,10 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
createStandardItems(); createStandardItems();
page.doubleClickItemAtIndex(1); page.doubleClickItemAtIndex(1);
page.editItemAtIndex(1, "buy some sausages" + webdriver.Key.ENTER); page.editItemAtIndex(1, 'buy some sausages' + webdriver.Key.ENTER);
testOps.assertItemText(0, TODO_ITEM_ONE); testOps.assertItemText(0, TODO_ITEM_ONE);
testOps.assertItemText(1, "buy some sausages"); testOps.assertItemText(1, 'buy some sausages');
testOps.assertItemText(2, TODO_ITEM_THREE); testOps.assertItemText(2, TODO_ITEM_THREE);
}); });
...@@ -209,13 +210,13 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -209,13 +210,13 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
createStandardItems(); createStandardItems();
page.doubleClickItemAtIndex(1); page.doubleClickItemAtIndex(1);
page.editItemAtIndex(1, "buy some sausages"); page.editItemAtIndex(1, 'buy some sausages');
// click a toggle button so that the blur() event is fired // click a toggle button so that the blur() event is fired
page.toggleItemAtIndex(0); page.toggleItemAtIndex(0);
testOps.assertItemText(0, TODO_ITEM_ONE); testOps.assertItemText(0, TODO_ITEM_ONE);
testOps.assertItemText(1, "buy some sausages"); testOps.assertItemText(1, 'buy some sausages');
testOps.assertItemText(2, TODO_ITEM_THREE); testOps.assertItemText(2, TODO_ITEM_THREE);
}); });
...@@ -223,10 +224,10 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -223,10 +224,10 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
createStandardItems(); createStandardItems();
page.doubleClickItemAtIndex(1); page.doubleClickItemAtIndex(1);
page.editItemAtIndex(1, " buy some sausages " + webdriver.Key.ENTER); page.editItemAtIndex(1, ' buy some sausages ' + webdriver.Key.ENTER);
testOps.assertItemText(0, TODO_ITEM_ONE); testOps.assertItemText(0, TODO_ITEM_ONE);
testOps.assertItemText(1, "buy some sausages"); testOps.assertItemText(1, 'buy some sausages');
testOps.assertItemText(2, TODO_ITEM_THREE); testOps.assertItemText(2, TODO_ITEM_THREE);
}); });
...@@ -245,7 +246,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -245,7 +246,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
createStandardItems(); createStandardItems();
page.doubleClickItemAtIndex(1); page.doubleClickItemAtIndex(1);
page.editItemAtIndex(1, "foo" + webdriver.Key.ESCAPE); page.editItemAtIndex(1, 'foo' + webdriver.Key.ESCAPE);
testOps.assertItemCount(3); testOps.assertItemCount(3);
testOps.assertItemText(0, TODO_ITEM_ONE); testOps.assertItemText(0, TODO_ITEM_ONE);
...@@ -257,9 +258,9 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -257,9 +258,9 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
test.describe('Counter', function () { test.describe('Counter', function () {
test.it('should display the current number of todo items', function () { test.it('should display the current number of todo items', function () {
page.enterItem(TODO_ITEM_ONE); page.enterItem(TODO_ITEM_ONE);
testOps.assertItemCountText("1 item left"); testOps.assertItemCountText('1 item left');
page.enterItem(TODO_ITEM_TWO); page.enterItem(TODO_ITEM_TWO);
testOps.assertItemCountText("2 items left"); testOps.assertItemCountText('2 items left');
}); });
}); });
...@@ -268,9 +269,9 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -268,9 +269,9 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
test.it('should display the number of completed items', function () { test.it('should display the number of completed items', function () {
createStandardItems(); createStandardItems();
page.toggleItemAtIndex(1); page.toggleItemAtIndex(1);
testOps.assertClearCompleteButtonText("Clear completed (1)"); testOps.assertClearCompleteButtonText('Clear completed (1)');
page.toggleItemAtIndex(2); page.toggleItemAtIndex(2);
testOps.assertClearCompleteButtonText("Clear completed (2)"); testOps.assertClearCompleteButtonText('Clear completed (2)');
}); });
test.it('should remove completed items when clicked', function () { test.it('should remove completed items when clicked', function () {
...@@ -353,7 +354,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -353,7 +354,7 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
testOps.assertItemText(2, TODO_ITEM_THREE); testOps.assertItemText(2, TODO_ITEM_THREE);
}); });
test.it('should highlight the currently applied filter', function() { test.it('should highlight the currently applied filter', function () {
createStandardItems(); createStandardItems();
// initially 'all' should be selected // initially 'all' should be selected
...@@ -367,4 +368,4 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) { ...@@ -367,4 +368,4 @@ exports.todoMVCTest = function(frameworkName, baseUrl, speedMode, laxMode) {
}); });
}); });
}); });
} };
var assert = require("assert"); 'use strict';
var assert = require('assert');
function TestOperations(page) { function TestOperations(page) {
...@@ -8,153 +10,154 @@ function TestOperations(page) { ...@@ -8,153 +10,154 @@ function TestOperations(page) {
// it is either not in the DOM, or is in the DOM but not visible. // it is either not in the DOM, or is in the DOM but not visible.
function testIsHidden(elements) { function testIsHidden(elements) {
if (elements.length === 1) { if (elements.length === 1) {
elements[0].isDisplayed().then(function(isDisplayed) { elements[0].isDisplayed().then(function (isDisplayed) {
assert(!isDisplayed); assert(!isDisplayed);
}) });
} }
} }
function testIsVisible(elements) { function testIsVisible(elements) {
assert.equal(1, elements.length); assert.equal(1, elements.length);
elements[0].isDisplayed().then(function(isDisplayed) { elements[0].isDisplayed().then(function (isDisplayed) {
assert(isDisplayed); assert(isDisplayed);
}); });
} }
this.assertClearCompleteButtonIsHidden = function() { this.assertClearCompleteButtonIsHidden = function () {
page.tryGetClearCompleteButton().then(function(element) { page.tryGetClearCompleteButton().then(function (element) {
testIsHidden(element); testIsHidden(element);
}); });
} };
this.assertClearCompleteButtonIsVisible = function() { this.assertClearCompleteButtonIsVisible = function () {
page.tryGetClearCompleteButton().then(function(element) { page.tryGetClearCompleteButton().then(function (element) {
testIsVisible(element); testIsVisible(element);
}); });
} };
this.assertItemCount = function(itemCount) { this.assertItemCount = function (itemCount) {
page.getItemElements().then(function(toDoItems){ page.getItemElements().then(function (toDoItems) {
assert.equal(itemCount, toDoItems.length); assert.equal(itemCount, toDoItems.length);
}); });
} };
this.assertClearCompleteButtonText = function(buttonText) { this.assertClearCompleteButtonText = function (buttonText) {
page.tryGetClearCompleteButton().then(function(elements) { page.tryGetClearCompleteButton().then(function (elements) {
var button = elements[0]; var button = elements[0];
button.getText().then(function(text) { button.getText().then(function (text) {
assert.equal(buttonText, text); assert.equal(buttonText, text);
}); });
}); });
} };
this.assertMainSectionIsHidden = function() { this.assertMainSectionIsHidden = function () {
page.tryGetMainSectionElement().then(function(mainSection) { page.tryGetMainSectionElement().then(function (mainSection) {
testIsHidden(mainSection); testIsHidden(mainSection);
}); });
} };
this.assertFooterIsHidden = function() { this.assertFooterIsHidden = function () {
page.tryGetFooterElement().then(function(footer) { page.tryGetFooterElement().then(function (footer) {
testIsHidden(footer); testIsHidden(footer);
}); });
} };
this.assertMainSectionIsVisible = function() { this.assertMainSectionIsVisible = function () {
page.tryGetMainSectionElement().then(function(mainSection) { page.tryGetMainSectionElement().then(function (mainSection) {
testIsVisible(mainSection); testIsVisible(mainSection);
}); });
} };
this.assertItemToggleIsHidden = function() { this.assertItemToggleIsHidden = function () {
page.tryGetToggleForItemAtIndex().then(function(toggleItem) { page.tryGetToggleForItemAtIndex().then(function (toggleItem) {
testIsHidden(toggleItem); testIsHidden(toggleItem);
}); });
} };
this.assertItemLabelIsHidden = function() { this.assertItemLabelIsHidden = function () {
page.tryGetItemLabelAtIndex().then(function(toggleItem) { page.tryGetItemLabelAtIndex().then(function (toggleItem) {
testIsHidden(toggleItem); testIsHidden(toggleItem);
}); });
} };
this.assertFooterIsVisible = function() { this.assertFooterIsVisible = function () {
page.tryGetFooterElement().then(function(footer) { page.tryGetFooterElement().then(function (footer) {
testIsVisible(footer); testIsVisible(footer);
}); });
} };
this.assertItemInputFieldText = function(text) { this.assertItemInputFieldText = function (text) {
page.getItemInputField().getText().then(function(inputFieldText) { page.getItemInputField().getText().then(function (inputFieldText) {
assert.equal(text, inputFieldText); assert.equal(text, inputFieldText);
}); });
} };
this.assertItemText = function(itemIndex, textToAssert) { this.assertItemText = function (itemIndex, textToAssert) {
page.getItemLabelAtIndex(itemIndex).getText().then(function(text) { page.getItemLabelAtIndex(itemIndex).getText().then(function (text) {
assert.equal(textToAssert, text.trim()); assert.equal(textToAssert, text.trim());
}); });
} };
this.assertItemCountText = function(textToAssert) { this.assertItemCountText = function (textToAssert) {
page.getItemsCountElement().getText().then(function(text) { page.getItemsCountElement().getText().then(function (text) {
assert.equal(textToAssert, text.trim()); assert.equal(textToAssert, text.trim());
}); });
} };
// tests for the presence of the 'completed' CSS class for the item at the given index // tests for the presence of the 'completed' CSS class for the item at the given index
this.assertItemAtIndexIsCompleted = function(index) { this.assertItemAtIndexIsCompleted = function (index) {
page.getItemElements().then(function(toDoItems) { page.getItemElements().then(function (toDoItems) {
toDoItems[index].getAttribute("class").then(function(cssClass) { toDoItems[index].getAttribute('class').then(function (cssClass) {
assert(cssClass.indexOf("completed") !== -1); assert(cssClass.indexOf('completed') !== -1);
}); });
}); });
} };
this.assertItemAtIndexIsNotCompleted = function(index) { this.assertItemAtIndexIsNotCompleted = function (index) {
page.getItemElements().then(function(toDoItems) { page.getItemElements().then(function (toDoItems) {
toDoItems[index].getAttribute("class").then(function(cssClass) { toDoItems[index].getAttribute('class').then(function (cssClass) {
// the maria implementation uses an 'incompleted' CSS class which is redundant // the maria implementation uses an 'incompleted' CSS class which is redundant
// TODO: this should really be moved into the pageLaxMode // TODO: this should really be moved into the pageLaxMode
assert(cssClass.indexOf("completed") === -1 || cssClass.indexOf("incompleted") !== -1); assert(cssClass.indexOf('completed') === -1 || cssClass.indexOf('incompleted') !== -1);
}); });
}); });
} };
function isSelected(cssClass) { function isSelected(cssClass) {
return cssClass.indexOf("selected") !== -1; return cssClass.indexOf('selected') !== -1;
} }
this.assertFilterAtIndexIsSelected = function(index) { this.assertFilterAtIndexIsSelected = function (index) {
page.getFilterElements().then(function(filterElements) { page.getFilterElements().then(function (filterElements) {
filterElements[0].getAttribute("class").then(function(cssClass) { filterElements[0].getAttribute('class').then(function (cssClass) {
assert(index == 0 ? isSelected(cssClass) : !isSelected(cssClass)); assert(index === 0 ? isSelected(cssClass) : !isSelected(cssClass));
}); });
filterElements[1].getAttribute("class").then(function(cssClass) { filterElements[1].getAttribute('class').then(function (cssClass) {
assert(index == 1 ? isSelected(cssClass) : !isSelected(cssClass)); assert(index === 1 ? isSelected(cssClass) : !isSelected(cssClass));
}); });
filterElements[2].getAttribute("class").then(function(cssClass) { filterElements[2].getAttribute('class').then(function (cssClass) {
assert(index == 2 ? isSelected(cssClass) : !isSelected(cssClass)); assert(index === 2 ? isSelected(cssClass) : !isSelected(cssClass));
}); });
}); });
} };
this.assertCompleteAllIsClear = function() { this.assertCompleteAllIsClear = function () {
page.getMarkAllCompletedCheckBox().then(function(markAllCompleted) { page.getMarkAllCompletedCheckBox().then(function (markAllCompleted) {
markAllCompleted.isSelected().then(function(isSelected){ markAllCompleted.isSelected().then(function (isSelected) {
assert(!isSelected); assert(!isSelected);
})
}); });
} });
};
this.assertCompleteAllIsChecked = function() { this.assertCompleteAllIsChecked = function () {
page.getMarkAllCompletedCheckBox().then(function(markAllCompleted) { page.getMarkAllCompletedCheckBox().then(function (markAllCompleted) {
markAllCompleted.isSelected().then(function(isSelected){ markAllCompleted.isSelected().then(function (isSelected) {
assert(isSelected); assert(isSelected);
})
}); });
} });
};
} }
module.exports = TestOperations; module.exports = TestOperations;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment