package org.jboss.seam.examples.booking.ftest;
import static org.jboss.arquillian.ajocado.Ajocado.waitForHttp;
import static org.jboss.arquillian.ajocado.locator.LocatorFactory.*;
import static org.junit.Assert.assertTrue;
import java.net.URL;
import java.text.MessageFormat;
import java.util.Date;
import org.jboss.arquillian.ajocado.framework.AjaxSelenium;
import org.jboss.arquillian.ajocado.locator.JQueryLocator;
import org.jboss.arquillian.ajocado.locator.XPathLocator;
import org.jboss.arquillian.drone.api.annotation.Drone;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class RegistrationTest extends AbstractBookingTest {
public static final XPathLocator LOGIN_REGISTER = xp("//a[contains(@name,'login:register')]");
public static final JQueryLocator LOGIN_MESSAGES = jq("[id='login:messages']");
public static final JQueryLocator REGISTER_USERNAME = jq("[id='username:input']");
public static final JQueryLocator REGISTER_USERNAME_MESSAGE = jq("[id='username:message1']");
public static final JQueryLocator REGISTER_NAME = jq("[id='name:input']");
public static final JQueryLocator REGISTER_EMAIL = jq("[id='email:input']");
public static final JQueryLocator REGISTER_EMAIL_MESSAGES = jq("[id='email:message1']");
public static final JQueryLocator REGISTER_PASSWORD = jq("[id='password:input']");
public static final JQueryLocator REGISTER_PASSWORD_VERIFY = jq("[id='confirmPassword:input']");
public static final JQueryLocator REGISTER_PASSWORD_VERIFY_MESSAGE = jq("[id='confirmPassword:message1']");
public static final JQueryLocator REGISTER_SUBMIT = jq("[id='register']");
public static final JQueryLocator REGISTER_CANCEL = jq("[id='cancel']");
public static final JQueryLocator REGISTER_MESSAGES = jq("[id='messages']");
public static final String MESSAGE_SUCCESS = "You have been successfully registered as the user {0}! You may now login.";
public static final String MESSAGE_INCORRECT_PASSWORD = "Passwords do not match. Please re-type the new password.";
public static final String MESSAGE_USERNAME_SIZE = "size must be between 3 and 15";
public static final String MESSAGE_PASSWORD_SIZE = "size must be between 5 and 15";
public static final String MESSAGE_EMAIL_INCORRECT = "not a well-formed email address";
public static final String MESSAGE_USERNAME_DUPLICATE = "The username ''{0}'' is already taken. Please choose another username.";
private static String usernameSuffix;
@Drone
AjaxSelenium selenium;
@ArquillianResource
URL contextPath;
@BeforeClass
public static void generateUsernameSuffix() {
Date date = new Date();
// suffix is needed to allow tests to be run repeatedly
usernameSuffix = Long.toString(date.getTime() % 10000000);
}
@Override
@Before
public void setUp() {
selenium.open(contextPath);
selenium.waitForPageToLoad();
if (isLoggedIn()) {
logout();
}
selenium.click(MENU_HOME);
selenium.waitForPageToLoad();
selenium.click(LOGIN_REGISTER);
selenium.waitForPageToLoad();
}
@Test
public void testRegistration() {
String username = "jdoe" + usernameSuffix;
String password = "password";
populateRegistrationFields(username, "John Doe", "joed@example.com", password, password);
selenium.click(REGISTER_SUBMIT);
selenium.waitForPageToLoad();
String expectedMessage = MessageFormat.format(MESSAGE_SUCCESS, username);
assertTrue(selenium.getText(LOGIN_MESSAGES).contains(expectedMessage));
login(username, password);
assertTrue(isLoggedIn());
logout();
}
@Test
public void testPasswordValidation() {
populateRegistrationFields("tester", "tester", "tester@tester.te", "password", "password1");
selenium.click(REGISTER_SUBMIT);
selenium.waitForPageToLoad();
assertTrue(selenium.getText(REGISTER_MESSAGES).contains(MESSAGE_INCORRECT_PASSWORD));
}
@Test
public void testEmailValidation() {
populateRegistrationFields("tester", "tester", "abcdefgh", "password", "password");
selenium.click(REGISTER_SUBMIT);
selenium.waitForPageToLoad();
assertTrue(selenium.getText(REGISTER_EMAIL_MESSAGES).contains(MESSAGE_EMAIL_INCORRECT));
}
@Test
public void testUsernameValidation() {
selenium.type(REGISTER_USERNAME, "A");
selenium.click(REGISTER_SUBMIT);
selenium.waitForPageToLoad();
assertTrue(selenium.getText(REGISTER_USERNAME_MESSAGE).contains(MESSAGE_USERNAME_SIZE));
selenium.click(REGISTER_CANCEL);
selenium.waitForPageToLoad();
selenium.click(LOGIN_REGISTER);
selenium.waitForPageToLoad();
selenium.type(REGISTER_USERNAME, "abcdefghijklmnop");
selenium.click(REGISTER_SUBMIT);
selenium.waitForPageToLoad();
assertTrue(selenium.getText(REGISTER_USERNAME_MESSAGE).contains(MESSAGE_USERNAME_SIZE));
// test duplicate username
populateRegistrationFields("shane", "shane", "shane@example.com", "password", "password");
waitForHttp(selenium).click(REGISTER_SUBMIT);
assertTrue(selenium.getText(REGISTER_USERNAME_MESSAGE).contains(MessageFormat.format(MESSAGE_USERNAME_DUPLICATE, "shane")));
}
protected void populateRegistrationFields(String username, String name, String email, String password, String verify) {
selenium.type(REGISTER_USERNAME, username);
selenium.type(REGISTER_NAME, name);
selenium.type(REGISTER_EMAIL, email);
selenium.type(REGISTER_PASSWORD, password);
selenium.type(REGISTER_PASSWORD_VERIFY, verify);
}
}