/* * JBoss, Home of Professional Open Source * Copyright 2008, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.seam.example.tasks.test.selenium; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import org.jboss.seam.example.common.test.selenium.SeamSeleniumTest; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * This is the base class for Tasks functional tests. Uses jQuery library and * Selenium to match AJAX updates. * * @author kpiwko * */ public class SeleniumTasksTest extends SeamSeleniumTest { public static final String LOGIN_URL = "/login.seam"; public static final String TASKS_URL = "/tasks.seam"; public static final String LOGIN_USERNAME = "id=login:username"; public static final String LOGIN_PASSWORD = "id=login:password"; public static final String LOGIN_SUBMIT = "xpath=//input[@value='Login']"; public static final String ACTION_BUTTON_FORMATTER = "xpath=//td[contains(., '%s')]/ancestor::tr/descendant::img[@title='%s']"; public static final String RESOLVE_BTN_TITLE = "Resolve this task"; public static final String EDIT_BTN_TITLE = "Edit this task"; public static final String DELETE_BTN_TITLE = "Delete this task"; public static final String UNDO_BTN_TITLE = "Undo this task"; public static final String DELETE_BTN_CAT_TITLE = "Delete this category"; public static final String DEFAULT_USERNAME = "demo"; public static final String DEFAULT_PASSWORD = "demo"; public static final String TASKS_LINK = "xpath=//a[.='Tasks']"; public static final String RESOLVED_LINK = "xpath=//a[.='Resolved tasks']"; public static final String CATEGORIES_LINK = "xpath=//a[.='Categories']"; public static final String LOGOUT_LINK = "id=menuLogoutId"; public static final String EDIT_TASK_DESCRIPTION = "xpath=//form[@id='updateTask']/input[@class='nameField']"; public static final String EDIT_TASK_CATEGORY = "xpath=//form[@id='updateTask']/select[@id='editTaskCategory']"; public static final String EDIT_TASK_SUBMIT = "xpath=//form[@id='updateTask']/input[@id='update']"; public static final String NEW_TASK_DESCRIPTION = "xpath=//form[@id='newTask']/input[@id='editTaskName']"; public static final String NEW_TASK_CATEGORY = "xpath=//form[@id='newTask']/select[@id='editTaskCategory']"; public static final String NEW_TASK_SUBMIT = "xpath=//form[@id='newTask']/input[@id='editTaskSubmit']"; public static final String NEW_CATEGORY_DESCRIPTION = "xpath=//form[@id='newCategoryForm']/input[@id='editCategoryName']"; public static final String NEW_CATEGORY_SUBMIT = "xpath=//form[@id='newCategoryForm']/input[@id='editCategorySubmit']"; @BeforeMethod @Override public void setUp() { super.setUp(); browser.open(CONTEXT_PATH + LOGIN_URL); browser.type(LOGIN_USERNAME, DEFAULT_USERNAME); browser.type(LOGIN_PASSWORD, DEFAULT_PASSWORD); navigate(LOGIN_SUBMIT); assertTrue(browser.getLocation().contains(TASKS_URL), "Navigation failure. Tasks page expected."); } @Test(groups = { "school" }) public void resolveTuringTask() { String turing = "Build the Turing machine"; resolveTask(turing); buttonMissing(turing, RESOLVE_BTN_TITLE); navigate(RESOLVED_LINK); buttonPresent(turing, UNDO_BTN_TITLE); navigate(LOGOUT_LINK); } @Test public void deleteMilkTask() { String milk = "Buy milk"; deleteTask(milk); buttonMissing(milk, RESOLVE_BTN_TITLE); navigate(RESOLVED_LINK); buttonMissing(milk, UNDO_BTN_TITLE); navigate(LOGOUT_LINK); } @Test(groups = { "turtle", "school" }) public void undoTurtleTask() { String turtle = "Buy a turtle"; navigate(RESOLVED_LINK); undoTask(turtle); buttonMissing(turtle, UNDO_BTN_TITLE); navigate(TASKS_LINK); buttonPresent(turtle, RESOLVE_BTN_TITLE); navigate(LOGOUT_LINK); } @Test(dependsOnGroups = { "turtle" }) public void editTurtleTask() { String turtle = "Buy a turtle"; String newCategory = "Work"; String newDescription = "Buy a turtle and take it to work"; editTask(turtle, newCategory, newDescription); buttonPresent(newDescription, RESOLVE_BTN_TITLE); navigate(LOGOUT_LINK); } @Test(groups = { "qa" }) public void createQACategory() { String category = "JBoss QA"; navigate(CATEGORIES_LINK); newCategory(category); buttonPresent(category, DELETE_BTN_CAT_TITLE); navigate(LOGOUT_LINK); } @Test(dependsOnGroups = { "qa" }) public void createSeleniumTask() { String description = "Create selenium ftests for all available examples"; newTask("Work", description); buttonPresent(description, RESOLVE_BTN_TITLE); navigate(LOGOUT_LINK); } @Test(dependsOnGroups = { "school" }) public void deleteSchoolCategory() { String category = "School"; navigate(CATEGORIES_LINK); buttonPress(category, DELETE_BTN_CAT_TITLE); buttonMissing(category, DELETE_BTN_CAT_TITLE); // all tasks from category are deleted as well navigate(TASKS_LINK); buttonMissing("Finish the RESTEasy-Seam integration example", RESOLVE_BTN_TITLE); navigate(LOGOUT_LINK); } /** * Presses undo button for given task * * @param task The task name */ protected void undoTask(String task) { buttonPress(task, UNDO_BTN_TITLE); } /** * Presses resolve button for given task * * @param task The task name */ protected void resolveTask(String task) { buttonPress(task, RESOLVE_BTN_TITLE); } /** * Presses delete button for given task * * @param task The task name */ protected void deleteTask(String task) { buttonPress(task, DELETE_BTN_TITLE); } /** * Goes to another page and waits for dynamic reload * * @param anchor Locator of the anchor */ protected void navigate(String anchor) { browser.clickAndWait(anchor); browser.waitForAJAXUpdate(); } /** * Executes arbitrary button task, e.g. delete, undo, resolve * * @param description Name of task or description on which an action is * triggered * @param button Type of action to be triggered - title of the button */ protected void buttonPress(String description, String button) { String btn = buttonPresent(description, button); browser.click(btn); browser.waitForAJAXUpdate(); } /** * Checks whether button is present on page * * @param description The task/category associated with button * @param button Button type label * @return Button locator */ protected String buttonPresent(String description, String button) { String btn = String.format(ACTION_BUTTON_FORMATTER, description, button); assertTrue(browser.isElementPresent(btn), "There should be a '" + button + "' button for: " + description + "."); return btn; } /** * Checks whether button is not present on page * * @param description The task/category associated with button * @param button Button type label * @return Button locator */ protected String buttonMissing(String task, String button) { String btn = String.format(ACTION_BUTTON_FORMATTER, task, button); assertFalse(browser.isElementPresent(btn), "There should NOT be a '" + button + "' button for: " + task + "."); return btn; } /** * Creates new task * * @param category Category of the task * @param description Description of the task */ protected void newTask(String category, String description) { browser.select(NEW_TASK_CATEGORY, String.format("value=%s", category)); browser.type(NEW_TASK_DESCRIPTION, description); browser.click(NEW_TASK_SUBMIT); browser.waitForAJAXUpdate(); } /** * Edits task * * @param task Old description of the task * @param newCategory New category * @param newDescription Old description of the task */ protected void editTask(String task, String newCategory, String newDescription) { String btn = buttonPresent(task, EDIT_BTN_TITLE); browser.click(btn); browser.waitForAJAXUpdate(); browser.select(EDIT_TASK_CATEGORY, String.format("value=%s", newCategory)); browser.type(EDIT_TASK_DESCRIPTION, newDescription); browser.click(EDIT_TASK_SUBMIT); browser.waitForAJAXUpdate(); } /** * Creates new category * * @param category Category description */ protected void newCategory(String category) { browser.type(NEW_CATEGORY_DESCRIPTION, category); browser.click(NEW_CATEGORY_SUBMIT); browser.waitForAJAXUpdate(); } }