package org.jboss.seam.remoting.examples.model.ftest;
import java.net.URL;
import org.jboss.arquillian.ajocado.framework.AjaxSelenium;
import org.jboss.arquillian.ajocado.locator.JQueryLocator;
import org.jboss.arquillian.ajocado.waiting.Wait;
import org.jboss.arquillian.ajocado.waiting.conditions.ElementPresent;
import org.jboss.arquillian.ajocado.waiting.selenium.SeleniumCondition;
import org.jboss.arquillian.ajocado.waiting.selenium.SeleniumWaiting;
import static org.jboss.arquillian.ajocado.Ajocado.waitForXhr;
import static org.jboss.arquillian.ajocado.locator.LocatorFactory.jq;
import static org.junit.Assert.assertEquals;
public class ModelPage {
private static final JQueryLocator PERSON_LIST = jq("#personList div");
private static final JQueryLocator PERSON_LOAD_ADDRESSES = jq(".loadAddresses");
private static final JQueryLocator PERSON_CREATE_ADDRESS = jq(".createAddress");
private static final JQueryLocator PERSON_APPLY_CHANGES = jq(".applyChanges");
private static final JQueryLocator PERSON_BY_NAME = jq("#personList div a:contains('{0}')");
private static final JQueryLocator PERSON_CREATE_NEW = jq(".createPerson");
private static final JQueryLocator ADDRESS_BY_ID = jq(".addressContainer:eq({0})");
private static final JQueryLocator ADDRESSES = jq(".addressContainer");
private static final JQueryLocator PERSON_FIRSTNAME = jq("#firstName");
private static final JQueryLocator PERSON_SURNAME = jq("#lastName");
private static final JQueryLocator PERSON_BIRTHDATE = jq("#dob");
private static final int WAIT_INTERVAL = 500;
private static final int WAIT_TIMEOUT = 10000;
private AjaxSelenium selenium;
private ElementPresent elementPresent = ElementPresent.getInstance();
private SeleniumWaiting wait = Wait.waitSelenium.interval(WAIT_INTERVAL).timeout(WAIT_TIMEOUT);
private URL contextPath;
public ModelPage(AjaxSelenium selenium, URL contextPath) {
this.selenium = selenium;
this.contextPath = contextPath;
selenium.open(this.contextPath);
wait.until(elementPresent.locator(PERSON_LIST));
}
public ModelPage selectPerson(String name) {
waitForXhr(selenium).click(PERSON_BY_NAME.format(name));
return this;
}
public ModelPage createPerson() {
waitForXhr(selenium).click(PERSON_CREATE_NEW);
return this;
}
public String getFirstName() {
return selenium.getValue(PERSON_FIRSTNAME);
}
public void setFirstName(String value) {
selenium.type(PERSON_FIRSTNAME, value);
}
public String getSurname() {
return selenium.getValue(PERSON_SURNAME);
}
public void setSurname(String value) {
selenium.type(PERSON_SURNAME, value);
}
public String getBirthdate() {
return selenium.getValue(PERSON_BIRTHDATE);
}
public void setBirthdate(String value) {
selenium.type(PERSON_BIRTHDATE, value);
}
public boolean areAddressesLoaded()
{
return !selenium.isElementPresent(PERSON_LOAD_ADDRESSES);
}
public ModelPage loadAddresses() {
if (!areAddressesLoaded())
{
waitForXhr(selenium).click(PERSON_LOAD_ADDRESSES);
}
return this;
}
public ModelPage createAddress() {
selenium.click(PERSON_CREATE_ADDRESS);// TODO this may cause race
// conditions
return this;
}
public ModelPage applyChanges() {
waitForXhr(selenium).click(PERSON_APPLY_CHANGES);
Wait.waitSelenium.timeout(30000).interval(500).until(new SeleniumCondition() {
@Override
public boolean isTrue() {
return selenium.isAlertPresent();
}
});
assertEquals(selenium.getAlert(), "Changes applied");
return this;
}
public AjaxSelenium getSelenium() {
return selenium;
}
public int getAddressCount() {
return selenium.getCount(ADDRESSES);
}
public Address getAddress(int id) {
return new Address(ADDRESS_BY_ID.format(id));
}
public class Address {
private final JQueryLocator locator;
private final String ADDRESS_STREET_NUMBER = ".streetNo";
private final String ADDRESS_STREET_NAME = ".streetName";
private final String ADDRESS_SUBURB = ".suburb";
private final String ADDRESS_POSTCODE = ".postCode";
private final String ADDRESS_COUNTRY = ".country";
public Address(JQueryLocator locator) {
this.locator = locator;
}
public String getStreetNumber() {
return selenium.getValue(locator.getDescendant(jq(ADDRESS_STREET_NUMBER)));
}
public void setStreetNumber(String value) {
selenium.type(locator.getDescendant(jq(ADDRESS_STREET_NUMBER)), value);
}
public String getStreetName() {
return selenium.getValue(locator.getDescendant(jq(ADDRESS_STREET_NAME)));
}
public void setStreetName(String value) {
selenium.type(locator.getDescendant(jq(ADDRESS_STREET_NAME)), value);
}
public String getSuburb() {
return selenium.getValue(locator.getDescendant(jq(".suburb")));
}
public void setSuburb(String value) {
selenium.type(locator.getDescendant(jq(ADDRESS_SUBURB)), value);
}
public String getPostcode() {
return selenium.getValue(locator.getDescendant(jq(ADDRESS_POSTCODE)));
}
public void setPostcode(String value) {
selenium.type(locator.getDescendant(jq(ADDRESS_POSTCODE)), value);
}
public String getCountry() {
return selenium.getValue(locator.getDescendant(jq(".country")));
}
public void setCountry(String value) {
selenium.type(locator.getDescendant(jq(ADDRESS_COUNTRY)), value);
}
public void delete() {
selenium.click(locator.getDescendant(jq(".deleteAddress")));
}
}
}