@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(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();
  }
  @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");
  }
  @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");
  }
  @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");
  }
  @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 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");
  }
  @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_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_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");
  }
  @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 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 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 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_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_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/");
  }
  @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");
  }