blob: 292b921455a41bea6ea87a9c23a4dfae36b8496e [file] [log] [blame]
package org.apache.maven.shared.web.test;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import junit.framework.TestCase;
import org.codehaus.plexus.util.StringUtils;
import org.openqa.selenium.server.SeleniumServer;
import java.io.File;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Map;
/**
* @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
* @version $Id$
*/
public abstract class AbstractSeleniumTestCase
extends TestCase
{
public static final String CHECKBOX_CHECK = "on";
public static final String CHECKBOX_UNCHECK = "off";
private Selenium sel;
protected String adminUsername = "admin";
protected String adminPassword = "admin1";
protected String adminFullName = getApplicationName() + " Admin";
protected String adminEmail = "admin@localhost.localdomain";
public void setUp()
throws Exception
{
super.setUp();
String browser = System.getProperty( "browser" );
if ( StringUtils.isEmpty( browser ) )
{
browser = "*firefox";
}
sel = new DefaultSelenium( "localhost", SeleniumServer.DEFAULT_PORT, browser, getBaseUrl() );
sel.start();
initialize();
}
public void tearDown()
throws Exception
{
sel.stop();
}
public Selenium getSelenium()
{
return sel;
}
public abstract String getBaseUrl();
/**
* We create an admin user if it doesn't exist
*/
protected void initialize()
{
open( getWebContext() );
if ( getTitle().endsWith( "Create Admin User" ) )
{
assertCreateAdminUserPage();
submitCreateAdminUserPage( adminFullName, adminEmail, adminPassword, adminPassword );
assertLoginPage();
submitLoginPage( adminUsername, adminPassword );
postAdminUserCreation();
logout();
}
}
/**
* where webapp initial configurations can be done
*/
protected void postAdminUserCreation()
{
}
protected abstract String getApplicationName();
/**
* some webapps have
*
* @return the page prefix set by the webapp
*/
protected String getTitlePrefix()
{
return "";
}
protected abstract String getInceptionYear();
protected String getWebContext()
{
return "/";
}
public void open( String url )
{
sel.open( url );
}
public String getTitle()
{
return sel.getTitle();
}
public String getHtmlContent()
{
return getSelenium().getHtmlSource();
}
public void assertTextPresent( String text )
{
assertTrue( "'" + text + "' isn't present.", sel.isTextPresent( text ) );
}
public void assertTextNotPresent( String text )
{
assertFalse( "'" + text + "' is present.", sel.isTextPresent( text ) );
}
public void assertElementPresent( String elementLocator )
{
assertTrue( "'" + elementLocator + "' isn't present.", isElementPresent( elementLocator ) );
}
public void assertElementNotPresent( String elementLocator )
{
assertFalse( "'" + elementLocator + "' is present.", isElementPresent( elementLocator ) );
}
public void assertLinkPresent( String text )
{
assertTrue( "The link '" + text + "' isn't present.", isElementPresent( "link=" + text ) );
}
public void assertLinkNotPresent( String text )
{
assertFalse( "The link '" + text + "' is present.", isElementPresent( "link=" + text ) );
}
public void assertImgWithAlt( String alt )
{
assertElementPresent( "//img[@alt='" + alt + "']" );
}
public void assertImgWithAltAtRowCol( boolean isALink, String alt, int row, int column )
{
String locator = "//tr[" + row + "]/td[" + column + "]/";
locator += isALink ? "a/" : "";
locator += "img[@alt='" + alt + "']";
assertElementPresent( locator );
}
public void assertCellValueFromTable( String expected, String tableElement, int row, int column )
{
assertEquals( expected, getCellValueFromTable( tableElement, row, column ) );
}
public boolean isTextPresent( String text )
{
return sel.isTextPresent( text );
}
public boolean isLinkPresent( String text )
{
return isElementPresent( "link=" + text );
}
public boolean isElementPresent( String locator )
{
return sel.isElementPresent( locator );
}
public void waitPage()
{
waitPage( 180000 );
}
public void waitPage( int nbMillisecond )
{
sel.waitForPageToLoad( String.valueOf( nbMillisecond ) );
}
public void assertPage( String title )
{
assertEquals( getTitlePrefix() + title, getTitle() );
assertHeader();
assertFooter();
}
public abstract void assertHeader();
public void assertFooter()
{
int currentYear = Calendar.getInstance().get( Calendar.YEAR );
assertTrue( getSelenium().getText( "xpath=//div[@id='footer']/div" ).endsWith(
" " + getInceptionYear() + "-" + currentYear + " Apache Software Foundation" ) );
}
public String getFieldValue( String fieldName )
{
return sel.getValue( fieldName );
}
public String getCellValueFromTable( String tableElement, int row, int column )
{
return getSelenium().getTable( tableElement + "." + row + "." + column );
}
public void selectValue( String locator, String value )
{
getSelenium().select( locator, "label=" + value );
}
public void submit()
{
clickLinkWithXPath( "//input[@type='submit']" );
}
public void assertButtonWithValuePresent( String text )
{
assertTrue( "'" + text + "' button isn't present", isButtonWithValuePresent( text ) );
}
public void assertButtonWithValueNotPresent( String text )
{
assertFalse( "'" + text + "' button is present", isButtonWithValuePresent( text ) );
}
public boolean isButtonWithValuePresent( String text )
{
return isElementPresent( "//button[@value='" + text + "']" ) || isElementPresent( "//input[@value='" + text + "']" );
}
public void clickButtonWithValue( String text )
{
clickButtonWithValue( text, true );
}
public void clickButtonWithValue( String text, boolean wait )
{
assertButtonWithValuePresent( text );
if ( isElementPresent( "//button[@value='" + text + "']" ) )
{
clickLinkWithXPath( "//button[@value='" + text + "']", wait );
}
else
{
clickLinkWithXPath( "//input[@value='" + text + "']", wait );
}
}
public void clickSubmitWithLocator( String locator )
{
clickLinkWithLocator( locator );
}
public void clickSubmitWithLocator( String locator, boolean wait )
{
clickLinkWithLocator( locator, wait );
}
public void clickImgWithAlt( String alt )
{
clickLinkWithLocator( "//img[@alt='" + alt + "']" );
}
public void clickLinkWithText( String text )
{
clickLinkWithText( text, true );
}
public void clickLinkWithText( String text, boolean wait )
{
clickLinkWithLocator( "link=" + text, wait );
}
public void clickLinkWithXPath( String xpath )
{
clickLinkWithXPath( xpath, true );
}
public void clickLinkWithXPath( String xpath, boolean wait )
{
clickLinkWithLocator( "xpath=" + xpath, wait );
}
public void clickLinkWithLocator( String locator )
{
clickLinkWithLocator( locator, true );
}
public void clickLinkWithLocator( String locator, boolean wait )
{
assertElementPresent( locator );
sel.click( locator );
if ( wait )
{
waitPage();
}
}
public void setFieldValues( Map fieldMap )
{
Map.Entry entry;
for ( Iterator entries = fieldMap.entrySet().iterator(); entries.hasNext(); )
{
entry = (Map.Entry) entries.next();
sel.type( (String) entry.getKey(), (String) entry.getValue() );
}
}
public void setFieldValue( String fieldName, String value )
{
sel.type( fieldName, value );
}
public void checkField( String locator )
{
sel.check( locator );
}
public void uncheckField( String locator )
{
sel.uncheck( locator );
}
public boolean isChecked( String locator )
{
return sel.isChecked( locator );
}
//////////////////////////////////////
// Login
//////////////////////////////////////
public void goToLoginPage()
{
clickLinkWithText( "Login" );
assertLoginPage();
}
public void login( String username, String password )
{
login( username, password, true, "Login Page" );
}
public void login( String username, String password, boolean valid, String assertReturnPage )
{
if ( isLinkPresent( "Login" ) )
{
goToLoginPage();
submitLoginPage( username, password, false, valid, assertReturnPage );
}
}
public void assertLoginPage()
{
assertPage( "Login Page" );
assertTextPresent( "Login" );
assertTextPresent( "Username" );
assertTextPresent( "Password" );
assertTextPresent( "Remember Me" );
assertFalse( isChecked( "rememberMe" ) );
}
public void submitLoginPage( String username, String password )
{
submitLoginPage( username, password, false, true, "Login Page" );
}
public void submitLoginPage( String username, String password, boolean validUsernamePassword )
{
submitLoginPage( username, password, false, validUsernamePassword, "Login Page" );
}
public void submitLoginPage( String username, String password, boolean rememberMe, boolean validUsernamePassword,
String assertReturnPage )
{
assertLoginPage();
setFieldValue( "username", username );
setFieldValue( "password", password );
if ( rememberMe )
{
checkField( "rememberMe" );
}
clickButtonWithValue( "Login" );
if ( validUsernamePassword )
{
assertTextPresent( "Current User:" );
assertTextPresent( username );
assertLinkPresent( "Edit Details" );
assertLinkPresent( "Logout" );
}
else
{
if ( "Login Page".equals( assertReturnPage ) )
{
assertLoginPage();
}
else
{
assertPage( assertReturnPage );
}
}
}
public boolean isAuthenticated()
{
return !( isLinkPresent( "Login" ) && isLinkPresent( "Register" ) );
}
//////////////////////////////////////
// Logout
//////////////////////////////////////
public void logout()
{
assertTrue( "User wasn't authenticated.", isAuthenticated() );
clickLinkWithText( "Logout" );
assertFalse( "The user is always authenticated after a logout.", isAuthenticated() );
}
//////////////////////////////////////
// My Account
//////////////////////////////////////
public void goToMyAccount()
{
clickLinkWithText( "Edit Details" );
}
public void assertMyAccountDetails( String username, String newFullName, String newEmailAddress )
throws Exception
{
assertPage( "Account Details" );
isTextPresent( "Username" );
assertTextPresent( "Username" );
assertElementPresent( "registerForm_user_username" );
assertCellValueFromTable( username, "//form/table", 0, 1 );
assertTextPresent( "Full Name" );
assertElementPresent( "user.fullName" );
assertEquals( newFullName, getFieldValue( "user.fullName" ) );
assertTextPresent( "Email Address" );
assertElementPresent( "user.email" );
assertEquals( newEmailAddress, getFieldValue( "user.email" ) );
assertTextPresent( "Password" );
assertElementPresent( "user.password" );
assertTextPresent( "Confirm Password" );
assertElementPresent( "user.confirmPassword" );
assertTextPresent( "Last Password Change" );
assertElementPresent( "registerForm_user_timestampLastPasswordChange" );
}
public void editMyUserInfo( String newFullName, String newEmailAddress, String newPassword,
String confirmNewPassword )
{
goToMyAccount();
setFieldValue( "user.fullName", newFullName );
setFieldValue( "user.email", newEmailAddress );
setFieldValue( "user.password", newPassword );
setFieldValue( "user.confirmPassword", confirmNewPassword );
}
//////////////////////////////////////
// Users
//////////////////////////////////////
public void assertUsersListPage()
{
assertPage( "[Admin] User List" );
}
public void assertCreateUserPage()
{
assertPage( "[Admin] User Create" );
assertTextPresent( "Username" );
assertTextPresent( "Full Name" );
assertTextPresent( "Email Address" );
assertTextPresent( "Password" );
assertTextPresent( "Confirm Password" );
}
public void assertUserRolesPage()
{
assertPage( "[Admin] User Edit" );
assertTextPresent( "[Admin] User Roles" );
assertTextPresent( "Assigned Roles" );
assertTextPresent( "Available Roles" );
}
public void assertDeleteUserPage( String username )
{
assertPage( "[Admin] User Delete" );
assertTextPresent( "[Admin] User Delete" );
assertTextPresent( "The following user will be deleted: " + username );
assertButtonWithValuePresent( "Delete User" );
}
//////////////////////////////////////
// Create Admin User
//////////////////////////////////////
public void assertCreateAdminUserPage()
{
assertPage( "Create Admin User" );
assertTextPresent( "Create Admin User" );
assertTextPresent( "Username" );
assertElementPresent( "user.username" );
assertTextPresent( "Full Name" );
assertElementPresent( "user.fullName" );
assertTextPresent( "Email Address" );
assertElementPresent( "user.email" );
assertTextPresent( "Password" );
assertElementPresent( "user.password" );
assertTextPresent( "Confirm Password" );
assertElementPresent( "user.confirmPassword" );
}
public void submitCreateAdminUserPage( String fullName, String email, String password, String confirmPassword )
{
setFieldValue( "user.fullName", fullName );
setFieldValue( "user.email", email );
setFieldValue( "user.password", password );
setFieldValue( "user.confirmPassword", confirmPassword );
submit();
waitPage();
}
public String getBasedir()
{
String basedir = System.getProperty( "basedir" );
if ( basedir == null )
{
basedir = new File( "" ).getAbsolutePath();
}
return basedir;
}
}