package net.thucydides.core.pages; import net.thucydides.core.annotations.*; import net.thucydides.core.util.MockEnvironmentVariables; import net.thucydides.core.webdriver.Configuration; import net.thucydides.core.webdriver.SystemPropertiesConfiguration; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.openqa.selenium.WebDriver; import java.net.URL; import static net.thucydides.core.pages.PageObject.withParameters; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class WhenDefiningPageUrls { @Mock WebDriver webdriver; MockEnvironmentVariables environmentVariables; Configuration configuration; @Before public void initMocks() { MockitoAnnotations.initMocks(this); environmentVariables = new MockEnvironmentVariables(); configuration = new SystemPropertiesConfiguration(environmentVariables); } @DefaultUrl("http://www.apache.org") final class PageObjectWithFullUrlDefinition extends PageObject { public PageObjectWithFullUrlDefinition(WebDriver driver) { super(driver); } } @DefaultUrl("http://test.myapp.org/somepage") final class PageObjectWithFullUrlAndPageDefinition extends PageObject { public PageObjectWithFullUrlAndPageDefinition(WebDriver driver) { super(driver); } } @DefaultUrl("http://test.myapp.org:9000/somepage") final class PageObjectWithFullUrlAndPageAndPortDefinition extends PageObject { public PageObjectWithFullUrlAndPageAndPortDefinition(WebDriver driver) { super(driver); } } @DefaultUrl("http://test.myapp.org/somepage/") final class PageObjectWithAURrlWithATrainingSlash extends PageObject { public PageObjectWithAURrlWithATrainingSlash(WebDriver driver) { super(driver); } } @Test public void the_url_annotation_should_determine_where_the_page_will_open_to() { PageObject page = new PageObjectWithFullUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.open(); verify(webdriver).get("http://www.apache.org"); } @DefaultUrl("http://some.user.application.com/#Showcase") final class PageObjectWithHashNotation extends PageObject { public PageObjectWithHashNotation(WebDriver driver) { super(driver); } } @Test public void the_url_notation_should_work_with_hashes() { PageObject page = new PageObjectWithHashNotation(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://my.application.com"); page.open(); verify(webdriver).get("http://my.application.com/#Showcase"); } @Test public void the_url_should_use_the_annotation_url_if_the_base_url_is_empty() { PageObject page = new PageObjectWithHashNotation(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url",""); page.open(); verify(webdriver).get("http://some.user.application.com/#Showcase"); } @Test public void the_url_should_use_the_annotation_url_if_the_base_url_is_not_defined() { PageObject page = new PageObjectWithHashNotation(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); System.clearProperty("webdriver.base.url"); page.open(); verify(webdriver).get("http://some.user.application.com/#Showcase"); } final class PageObjectWithNoUrlDefinition extends PageObject { public PageObjectWithNoUrlDefinition(WebDriver driver) { super(driver); } } @Test public void the_webdriver_base_url_system_property_should_not_override_pages() { PageObject page = new PageObjectWithFullUrlAndPageDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://staging.myapp.org"); page.open(); verify(webdriver).get("http://staging.myapp.org/somepage"); } @Test public void the_webdriver_base_url_should_conserve_trailing_slashes() { PageObject page = new PageObjectWithAURrlWithATrainingSlash(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.open(); verify(webdriver).get("http://test.myapp.org/somepage/"); } @Test public void the_webdriver_base_url_system_property_should_include_full_path() { PageObject page = new PageObjectWithFullUrlAndPageDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://staging.myapp.org/myapp-staging"); page.open(); verify(webdriver).get("http://staging.myapp.org/myapp-staging/somepage"); } @Test public void the_webdriver_base_url_system_property_should_override_protocol() { PageObject page = new PageObjectWithFullUrlAndPageDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","https://staging.myapp.org"); page.open(); verify(webdriver).get("https://staging.myapp.org/somepage"); } @Test public void the_webdriver_base_url_system_property_should_override_ports() { PageObject page = new PageObjectWithFullUrlAndPageAndPortDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","https://staging.myapp.org:8888"); page.open(); verify(webdriver).get("https://staging.myapp.org:8888/somepage"); } @Test public void the_base_url_is_overrided_by_the_webdriver_base_url_system_property() { PageObject page = new PageObjectWithFullUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://www.wikipedia.org"); page.open(); verify(webdriver).get("http://www.wikipedia.org"); } @Test public void the_base_url_is_overrided_by_the_webdriver_base_url_system_property_even_with_trailing_slashes() { PageObject page = new PageObjectWithFullUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://www.wikipedia.org/"); page.open(); verify(webdriver).get("http://www.wikipedia.org/"); } @Test public void the_base_url_is_overrided_by_the_webdriver_base_url_system_property_even_with_trailing_slashes_and_should_include_full_path() { PageObject page = new PageObjectWithFullUrlAndPageDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://www.wikipedia.org/test/"); page.open(); verify(webdriver).get("http://www.wikipedia.org/test/somepage"); } @Test public void the_base_url_should_be_used_if_no_url_annotation_is_present() { PageObject page = new PageObjectWithNoUrlDefinition(webdriver); configuration.setDefaultBaseUrl("http://www.google.com"); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.open(); verify(webdriver).get("http://www.google.com"); } @DefaultUrl("http://jira.mycompany.org/issues/{1}") final class PageObjectWithParameterizedUrlDefinition extends PageObject { public PageObjectWithParameterizedUrlDefinition(WebDriver driver) { super(driver); } } @Test public void the_url_annotation_should_let_you_define_a_parameterized_url() { PageObject page = new PageObjectWithParameterizedUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.open(withParameters("ISSUE-1")); verify(webdriver).get("http://jira.mycompany.org/issues/ISSUE-1"); } @Test public void the_pages_object_provides_access_to_the_webdriver_instance() { PageObject page = new PageObjectWithParameterizedUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.getDriver().get("http://www.google.com"); verify(webdriver).get("http://www.google.com"); } @DefaultUrl("http://jira.mycompany.org") @NamedUrls( { @NamedUrl(name = "open.issue", url = "http://jira.mycompany.org/issues/{1}") } ) final class PageObjectWithNamedParameterizedUrlDefinition extends PageObject { public PageObjectWithNamedParameterizedUrlDefinition(WebDriver driver) { super(driver); } } @Test public void the_url_annotation_should_let_you_define_a_named_parameterized_url() { PageObject page = new PageObjectWithNamedParameterizedUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.open("open.issue", withParameters("ISSUE-1")); verify(webdriver).get("http://jira.mycompany.org/issues/ISSUE-1"); } @DefaultUrl("/clients") final class PageObjectWithRelativeUrlDefinition extends PageObject { public PageObjectWithRelativeUrlDefinition(WebDriver driver) { super(driver); } } @Test public void the_url_annotation_can_be_relative_to_the_base_url() { PageObject page = new PageObjectWithRelativeUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.open(); verify(webdriver).get("http://myapp.mycompany.com/clients"); } @DefaultUrl("/clients/") final class PageObjectWithRelativeUrlDefinitionAndATrailingSlash extends PageObject { public PageObjectWithRelativeUrlDefinitionAndATrailingSlash(WebDriver driver) { super(driver); } } @Test public void the_url_annotation_can_be_relative_to_the_base_url_with_a_trailing_slash() { PageObject page = new PageObjectWithRelativeUrlDefinitionAndATrailingSlash(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.open(); verify(webdriver).get("http://myapp.mycompany.com/clients/"); } @DefaultUrl("http://jira.mycompany.org") @NamedUrls( { @NamedUrl(name = "open.issue", url = "/issues/{1}") } ) final class PageObjectWithDefaultUrlAndNamedParameterizedRelativeUrlDefinition extends PageObject { public PageObjectWithDefaultUrlAndNamedParameterizedRelativeUrlDefinition(WebDriver driver) { super(driver); } } @Test public void the_webdriver_base_url_system_property_should_not_override_pages_with_parameters() { PageObject page = new PageObjectWithDefaultUrlAndNamedParameterizedRelativeUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://staging.mycompany.org"); page.open("open.issue", withParameters("ISSUE-1")); verify(webdriver).get("http://staging.mycompany.org/issues/ISSUE-1"); } @Test public void the_url_annotation_should_let_you_define_a_named_parameterized_url_relative_to_the_default_url() { PageObject page = new PageObjectWithDefaultUrlAndNamedParameterizedRelativeUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl(null); page.open("open.issue", withParameters("ISSUE-1")); verify(webdriver).get("http://jira.mycompany.org/issues/ISSUE-1"); } @NamedUrls( { @NamedUrl(name = "open.issue", url = "/issues/{1}") } ) final class PageObjectWithNamedParameterizedRelativeUrlDefinition extends PageObject { public PageObjectWithNamedParameterizedRelativeUrlDefinition(WebDriver driver) { super(driver); } } @Test public void the_url_annotation_should_let_you_define_a_relative_named_parameterized_url() { PageObject page = new PageObjectWithNamedParameterizedRelativeUrlDefinition(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.open("open.issue", withParameters("ISSUE-1")); verify(webdriver).get("http://myapp.mycompany.com/issues/ISSUE-1"); } @NamedUrls( { @NamedUrl(name = "open.issue", url = "/issues/{1}"), @NamedUrl(name = "close.issue", url = "/issues/close/{1}") } ) final class PageObjectWithMultipleNamedUrlDefinitions extends PageObject { public PageObjectWithMultipleNamedUrlDefinitions(WebDriver driver) { super(driver); } } @Test public void when_the_default_url_is_defined_as_a_classpath_url_it_uses_an_absolute_path_from_the_classpath() { PageWithDefaultUrlOnTheClasspath page = new PageWithDefaultUrlOnTheClasspath(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); URL staticSiteUrl = Thread.currentThread().getContextClassLoader().getResource("static-site/index.html"); page.open(); verify(webdriver).get(staticSiteUrl.toString()); } @Test(expected = IllegalStateException.class) public void if_a_classpath_url_is_not_found_an_exception_is_thrown() { PageWithInvalidDefaultUrlOnTheClasspath page = new PageWithInvalidDefaultUrlOnTheClasspath(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); page.open(); } @Test public void the_url_annotation_should_let_you_define_several_named_parameterized_urls() { PageObject page = new PageObjectWithMultipleNamedUrlDefinitions(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.open("close.issue", withParameters("ISSUE-1")); verify(webdriver).get("http://myapp.mycompany.com/issues/close/ISSUE-1"); } @Test(expected = IllegalArgumentException.class) public void the_url_annotation_should_throw_an_exception_if_no_named_url_is_found() { PageObject page = new PageObjectWithMultipleNamedUrlDefinitions(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.open("no.such.template", withParameters("ISSUE-1")); } @Test public void when_we_get_a_target_url_a_normal_url_is_left_unprocessed() { String url = PageUrls.getUrlFrom("http://www.google.com"); assertThat(url, is("http://www.google.com")); } @Test public void when_we_get_a_target_url_a_normal_https_url_is_left_unprocessed() { String url = PageUrls.getUrlFrom("https://www.google.com"); assertThat(url, is("https://www.google.com")); } @Test public void when_we_get_a_target_url_a_classpath_url_is_converted_to_a_file_url() { String staticSiteUrl = Thread.currentThread().getContextClassLoader() .getResource("static-site/index.html").toString(); String url = PageUrls.getUrlFrom("classpath:static-site/index.html"); assertThat(url, is(staticSiteUrl)); } @DefaultUrl("http://localhost:8080/somepage") final class PageObjectWithOnOpenPageMethod extends PageObject { public boolean pageFullyLoaded; public PageObjectWithOnOpenPageMethod(WebDriver driver) { super(driver); } @WhenPageOpens public void waitTilPageIsFullyLoaded() { pageFullyLoaded = true; } } @DefaultUrl("http://localhost:8080/myapp/somepage") final class PageObjectWithLongDefaultUrl extends PageObject { public boolean pageFullyLoaded; public PageObjectWithLongDefaultUrl(WebDriver driver) { super(driver); } } @Test public void should_override_base_urls() { PageObject page = new PageObjectWithLongDefaultUrl(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://prod.server"); page.open(); verify(webdriver).get("http://prod.server/myapp/somepage"); } @Test public void overriding_base_urls_should_allow_for_trailing_slashes() { PageObject page = new PageObjectWithLongDefaultUrl(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://prod.server/"); page.open(); verify(webdriver).get("http://prod.server/myapp/somepage"); } @Test public void should_not_override_base_url_if_empty() { PageObject page = new PageObjectWithLongDefaultUrl(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.clearProperty("webdriver.base.url"); page.open(); verify(webdriver).get("http://localhost:8080/myapp/somepage"); } @Test public void should_not_override_base_url_if_empty_string() { PageObject page = new PageObjectWithLongDefaultUrl(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url",""); page.open(); verify(webdriver).get("http://localhost:8080/myapp/somepage"); } @Test public void annotated_OnOpenPage_methods_should_be_called_when_the_page_is_opened() { PageObjectWithOnOpenPageMethod page = new PageObjectWithOnOpenPageMethod(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://staging.myapp.org"); page.open(); verify(webdriver).get("http://staging.myapp.org/somepage"); assertThat(page.pageFullyLoaded, is(true)); } @DefaultUrl("http://localhost:8080/somepage") final class PageObjectWithOnOpenPageMethodWithParameters extends PageObject { public boolean pageFullyLoaded; public PageObjectWithOnOpenPageMethodWithParameters(WebDriver driver) { super(driver); } @WhenPageOpens public void waitTilPageIsFullyLoaded(int value) { pageFullyLoaded = true; } } @Test(expected = UnableToInvokeWhenPageOpensMethods.class) public void annotated_OnOpenPage_methods_cannot_have_parameters() { PageObject page = new PageObjectWithOnOpenPageMethodWithParameters(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://staging.myapp.org"); page.open(); } @DefaultUrl("http://localhost:8080/somepage") final class PageObjectWithFailingOnOpenPageMethod extends PageObject { public PageObjectWithFailingOnOpenPageMethod(WebDriver driver) { super(driver); } @WhenPageOpens public void checkPageOpens() { throw new AssertionError("could not open page properly"); } } @Test(expected = AssertionError.class) public void annotated_OnOpenPage_methods_should_report_assertion_errors() { PageObject page = new PageObjectWithFailingOnOpenPageMethod(webdriver); page.open(); } @DefaultUrl("http://localhost:8080/somepage") final class PageObjectWithPrivateOnOpenPageMethod extends PageObject { public boolean pageFullyLoaded; public PageObjectWithPrivateOnOpenPageMethod(WebDriver driver) { super(driver); } @WhenPageOpens private void waitTilPageIsFullyLoaded() { pageFullyLoaded = true; } } @Test public void annotated_OnOpenPage_methods_can_be_private() { PageObjectWithPrivateOnOpenPageMethod page = new PageObjectWithPrivateOnOpenPageMethod(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); environmentVariables.setProperty("webdriver.base.url","http://staging.myapp.org"); page.open(); verify(webdriver).get("http://staging.myapp.org/somepage"); assertThat(page.pageFullyLoaded, is(true)); } @DefaultUrl("/clients") @At(".*/clients") final class PageObjectWithRelativeUrlAndPattern extends PageObject { public PageObjectWithRelativeUrlAndPattern(WebDriver driver) { super(driver); } } @Test(expected = WrongPageError.class) public void open_should_fail_on_mismatched_url() { when(webdriver.getCurrentUrl()).thenReturn("http://sso.mycompany.com/login"); PageObject page = new PageObjectWithRelativeUrlAndPattern(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.open(); } @Test public void open_unchecked_should_not_fail_on_mismatched_url() { when(webdriver.getCurrentUrl()).thenReturn("http://sso.mycompany.com/login"); PageObject page = new PageObjectWithRelativeUrlAndPattern(webdriver); PageUrls pageUrls = new PageUrls(page, configuration); page.setPageUrls(pageUrls); configuration.setDefaultBaseUrl("http://myapp.mycompany.com"); page.openUnchecked(); verify(webdriver).get("http://myapp.mycompany.com/clients"); } }