package net.thucydides.core.pages; import net.thucydides.core.util.MockEnvironmentVariables; import net.thucydides.core.webdriver.Configuration; import net.thucydides.core.webdriver.SystemPropertiesConfiguration; import net.thucydides.core.webdriver.WebDriverFacade; import net.thucydides.core.webdriver.WebdriverProxyFactory; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.openqa.selenium.WebDriver; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.mockito.Mockito.*; public class WhenKeepingTrackOfVisitedPages { @Mock WebDriver driver; @Mock WebDriverFacade driverProxy; @Mock WebdriverProxyFactory proxyFactory; MockEnvironmentVariables environmentVariables; Configuration configuration; @Before public void initMocksAndClearSystemwideDefaultUrl() { MockitoAnnotations.initMocks(this); environmentVariables = new MockEnvironmentVariables(); configuration = new SystemPropertiesConfiguration(environmentVariables); } static class SimplePage extends PageObject { public SimplePage(final WebDriver driver) { super(driver); } } @Captor ArgumentCaptor<String> driverUrl; @Test public void the_default_starting_point_url_can_refer_to_a_file_on_the_classpath() { final String baseUrl = "classpath:static-site/index.html"; final Pages pages = new Pages(driver, configuration); pages.setDefaultBaseUrl(baseUrl); pages.get(SimplePage.class).open(); verify(driver).get(driverUrl.capture()); assertThat(driverUrl.getValue(), containsString("static-site/index.html")); } @Test public void the_default_starting_point_url_can_be_overriden_by_a_system_property() { final String systemDefinedBaseUrl = "http://www.google.com.au"; environmentVariables.setProperty("webdriver.base.url", systemDefinedBaseUrl); Configuration Configuration = new SystemPropertiesConfiguration(environmentVariables); final Pages pages = new Pages(driver, Configuration); pages.get(SimplePage.class).open(); verify(driver).get(driverUrl.capture()); assertThat(driverUrl.getValue(), containsString(systemDefinedBaseUrl)); } @Test public void the_pages_object_knows_when_we_are_on_the_right_page() { when(driver.getCurrentUrl()).thenReturn("http://www.apache.org"); final Pages pages = new Pages(driver, configuration); assertThat(pages.isCurrentPageAt(ApacheHomePage.class), is(true)); } @Test public void the_pages_object_knows_when_we_are_not_on_the_right_page() { when(driver.getCurrentUrl()).thenReturn("http://www.google.org"); final Pages pages = new Pages(driver, configuration); assertThat(pages.isCurrentPageAt(ApacheHomePage.class), is(false)); } @Test public void the_get_method_is_shorthand_for_currentPageAt() { when(driver.getCurrentUrl()).thenReturn("http://www.apache.org"); final Pages pages = new Pages(driver, configuration); assertThat(pages.get(ApacheHomePage.class).getClass().getName(), is(ApacheHomePage.class.getName())); } @Test public void the_getAt_method_is_Groovy_shorthand_for_currentPageAt() { when(driver.getCurrentUrl()).thenReturn("http://www.apache.org"); final Pages pages = new Pages(driver, configuration); assertThat(pages.getAt(ApacheHomePage.class).getClass().getName(), is(ApacheHomePage.class.getName())); } @Test public void should_be_able_to_retrieve_the_current_page_as_an_instance_of_AnyPage() { when(driver.getCurrentUrl()).thenReturn("http://www.apache.org"); final Pages pages = new Pages(driver, configuration); AnyPage currentPage = pages.getAt(AnyPage.class); assertThat(currentPage, is(not(nullValue()))); } @Test(expected = WrongPageError.class) public void the_pages_object_throws_a_wrong_page_error_when_we_expect_the_wrong_page() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); final Pages pages = new Pages(driver, configuration); pages.currentPageAt(ApacheHomePage.class); } public final class InvalidHomePage extends PageObject { public InvalidHomePage() { super(null); } } @Test(expected = WrongPageError.class) public void the_pages_object_throws_a_wrong_page_error_when_the_page_object_is_invalid() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); final Pages pages = new Pages(driver, configuration); pages.currentPageAt(InvalidHomePage.class); } public final class ExplodingHomePage extends PageObject { public ExplodingHomePage(final WebDriver driver) throws InstantiationException { super(null); throw new InstantiationException(); } } @Test(expected = WrongPageError.class) public void the_pages_object_throws_a_wrong_page_error_when_the_page_object_cant_be_instantiated() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); final Pages pages = new Pages(driver, configuration); pages.currentPageAt(ExplodingHomePage.class); } public class PageObjectWithNoDriverConstructor extends PageObject { public PageObjectWithNoDriverConstructor() { super(null); } } @Test(expected = WrongPageError.class) public void the_pages_object_throws_a_wrong_page_error_when_the_page_object_doesnt_have_a_webdriver_constructor() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); final Pages pages = new Pages(driver, configuration); pages.currentPageAt(PageObjectWithNoDriverConstructor.class); } static final class GooglePage extends PageObject { public GooglePage(final WebDriver driver) { super(driver); } } static final class SomeOtherPage extends PageObject { public SomeOtherPage(final WebDriver driver) { super(driver); } } @Test public void should_requery_driver_for_each_page_request() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); Pages pages = new Pages(driver, configuration); pages.setDefaultBaseUrl("http://www.google.com"); GooglePage page1 = pages.get(GooglePage.class); GooglePage page2 = pages.get(GooglePage.class); assertThat(page2, is(not(page1))); } @Test public void should_use_the_same_page_object_if_we_indicate_that_are_on_the_same_unchanged_page() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); Pages pages = new Pages(driver, configuration); pages.setDefaultBaseUrl("http://www.google.com"); GooglePage page1 = pages.get(GooglePage.class); pages.onSamePage(); GooglePage page2 = pages.get(GooglePage.class); assertThat(page2, is(page1)); } @Test public void should_use_a_new_page_object_if_we_indicate_that_are_on_the_same_unchanged_page_but_we_are_not() { when(driver.getCurrentUrl()).thenReturn("http://www.google.com"); Pages pages = new Pages(driver, configuration); pages.setDefaultBaseUrl("http://www.google.com"); GooglePage page1 = pages.get(GooglePage.class); pages.get(SomeOtherPage.class); pages.onSamePage(); GooglePage page2 = pages.get(GooglePage.class); assertThat(page2, is(not(page1))); } @Test public void should_not_open_initial_page_when_driver_opens_if_using_a_proxied_driver() { Pages pages = new Pages(driverProxy); pages.setDefaultBaseUrl("http://www.google.com"); verify(driver, never()).get("http://www.google.com"); } }