package net.thucydides.core.pages;
import net.thucydides.core.annotations.At;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.openqa.selenium.WebDriver;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class WhenMatchingUrlsToPages {
@Mock
WebDriver webdriver;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void by_default_all_urls_will_work_with_a_page() {
PageWithNoUrlDefinitions page = new PageWithNoUrlDefinitions(webdriver);
assertThat(page.compatibleWithUrl("http://www.apache.org"), is(true));
}
@At("http://www.apache.org")
final class PageObjectWithHardcodedUrlDefinition extends PageObject {
public PageObjectWithHardcodedUrlDefinition(WebDriver driver) {
super(driver);
}
}
@Test
public void defining_a_url_will_limit_compatiblity_to_that_url() {
PageObject page = new PageObjectWithHardcodedUrlDefinition(webdriver);
assertThat(page.compatibleWithUrl("http://www.apache.org"), is(true));
}
@Test
public void should_ignore_trailing_slashes_in_incoming_url() {
PageObject page = new PageObjectWithHardcodedUrlDefinition(webdriver);
assertThat(page.compatibleWithUrl("http://www.apache.org/"), is(true));
}
@Test
public void defining_a_url_will_deny_compatiblity_with_a_different_url() {
PageObject page = new PageObjectWithHardcodedUrlDefinition(webdriver);
assertThat(page.compatibleWithUrl("http://projects.apache.org"), is(false));
}
@At("http://.*.apache.org")
final class PageObjectForAnyApacheProject extends PageObject {
public PageObjectForAnyApacheProject(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_urls_with_wildcards() {
PageObject page = new PageObjectForAnyApacheProject(webdriver);
assertThat(page.compatibleWithUrl("http://lucene.apache.org"), is(true));
}
@At("http://maven.apache.org/.*")
final class PageObjectForAnyMavenProjectPage extends PageObject {
public PageObjectForAnyMavenProjectPage(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_urls_with_trailing_wildcards() {
PageObject page = new PageObjectForAnyMavenProjectPage(webdriver);
assertThat(page.compatibleWithUrl("http://maven.apache.org/what-is-maven.html"), is(true));
}
@At("http://.*/whatever/comes/next")
final class PageObjectWithWildcardServerName extends PageObject {
public PageObjectWithWildcardServerName(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_wildcard_server_names() {
PageObject page = new PageObjectWithWildcardServerName(webdriver);
assertThat(page.compatibleWithUrl("http://maven.apache.org/whatever/comes/next"), is(true));
}
@At(urls={"http://maven.apache.org","lucene.apache.org"})
final class MavenOrLucenePage extends PageObject {
public MavenOrLucenePage(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_multiple_urls() {
PageObject page = new PageObjectForAnyApacheProject(webdriver);
assertThat(page.compatibleWithUrl("http://lucene.apache.org"), is(true));
assertThat(page.compatibleWithUrl("http://maven.apache.org"), is(true));
}
@At(urls={"#HOST/"})
final class GenericHomePage extends PageObject {
public GenericHomePage(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_a_generic_home_page_definition() {
PageObject page = new GenericHomePage(webdriver);
assertThat(page.compatibleWithUrl("http://lucene.apache.org/"), is(true));
assertThat(page.compatibleWithUrl("http://maven.apache.org/something"), is(false));
assertThat(page.compatibleWithUrl("http://maven.apache.org/something/"), is(false));
}
@At(urls={"#HOST/somewhere"})
final class GenericInternalPage extends PageObject {
public GenericInternalPage(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_a_server_independent_page_definition() {
PageObject page = new GenericInternalPage(webdriver);
assertThat(page.compatibleWithUrl("http://lucene.apache.org/somewhere"), is(true));
assertThat(page.compatibleWithUrl("http://maven.apache.org/somewhere"), is(true));
assertThat(page.compatibleWithUrl("http://maven.apache.org/somethingelse"), is(false));
}
@At(urls={"#HOST/app/action/login.form"})
final class GenericInternalPageWithWildcard extends PageObject {
public GenericInternalPageWithWildcard(WebDriver driver) {
super(driver);
}
}
@Test
public void should_allow_a_server_independent_page_definition_using_wildcards() {
PageObject page = new GenericInternalPageWithWildcard(webdriver);
assertThat(page.compatibleWithUrl("http://my.app.org/app/action/login.form?some=parameters"), is(true));
}
@Test
public void should_match_simple_urls_with_parameters() {
PageObject page = new PageWithUrlDefinitions(webdriver);
assertThat(page.compatibleWithUrl("https://www.placemyad.com.au/common/microRegistration?a=1"), is(true));
}
@Test
public void should_match_complex_urls_with_parameters() {
PageObject page = new PageWithUrlDefinitions(webdriver);
assertThat(page.compatibleWithUrl("https://www.placemyad.com.au/common/microRegistration?continueAction=print&continueNamespace=%2Femployment"),
is(true));
}
@Test
public void should_know_what_page_we_are_on() {
WebDriver driver = mock(WebDriver.class);
when(driver.getCurrentUrl()).thenReturn("https://www.placemyad.com.au/common/microRegistration");
Pages pages = new Pages(driver);
assertThat(pages.isCurrentPageAt(PageWithUrlDefinitions.class), is(true));
}
@Test
public void should_know_what_page_we_are_not_on() {
WebDriver driver = mock(WebDriver.class);
when(driver.getCurrentUrl()).thenReturn("http://maven.apache.org/somethingelse");
Pages pages = new Pages(driver);
assertThat(pages.isCurrentPageAt(PageWithUrlDefinitions.class), is(false));
}
@Test
public void should_not_throw_exception_if_on_right_page() {
WebDriver driver = mock(WebDriver.class);
when(driver.getCurrentUrl()).thenReturn("https://www.placemyad.com.au/common/microRegistration");
Pages pages = new Pages(driver);
pages.currentPageAt(PageWithUrlDefinitions.class);
}
@Test(expected=WrongPageError.class)
public void should_throw_exception_if_not_on_right_page() {
WebDriver driver = mock(WebDriver.class);
when(driver.getCurrentUrl()).thenReturn("https://www.placemyad.com.au/common/somewhereElse");
Pages pages = new Pages(driver);
pages.currentPageAt(PageWithUrlDefinitions.class);
}
@Test(expected=WrongPageError.class)
public void should_throw_exception_if_fetching_a_page_of_the_wrong_type() {
WebDriver driver = mock(WebDriver.class);
when(driver.getCurrentUrl()).thenReturn("https://www.placemyad.com.au/common/microRegistration");
Pages pages = new Pages(driver);
pages.currentPageAt(ApacheHomePage.class);
}
}