cloudfoundry/stratos

View on GitHub
src/test-e2e/po/page.po.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { browser, by, element, promise, protractor } from 'protractor';

import { E2EHelpers } from '../helpers/e2e-helpers';
import { BreadcrumbsComponent } from './breadcrumbs.po';
import { LoadingIndicatorComponent } from './loading-indicator.po';
import { PageHeaderSubPo } from './page-header-sub.po';
import { PageHeader } from './page-header.po';
import { PageTabsPo } from './page-tabs.po';
import { SideNavigation } from './side-nav.po';


const until = protractor.ExpectedConditions;

/**
 * Base Page Object can be inherited by appropriate pages
 */
export abstract class Page {

  // Side navigation
  public sideNav = new SideNavigation();

  // Top header bar (if present)
  public header = new PageHeader();

  // Subheader (if present)
  public subHeader = new PageHeaderSubPo();

  // Tabs (if present)
  public tabs = new PageTabsPo();

  // Breadcrumbs (if present)
  public breadcrumbs = new BreadcrumbsComponent();

  // Loading page indicator (if present)
  public loadingIndicator = new LoadingIndicatorComponent();

  // Helpers
  public helpers = new E2EHelpers();

  constructor(public navLink?: string) { }

  navigateTo(): promise.Promise<any> {
    return browser.get(this.navLink);
  }

  isActivePage(ignoreQuery = false): promise.Promise<boolean> {
    return browser.getCurrentUrl().then(url => {
      const browserUrl = ignoreQuery ? this.stripQuery(url) : url;
      const expectedUrl = ignoreQuery ? this.stripQuery(this.getUrl()) : this.getUrl();
      return browserUrl === expectedUrl;
    });
  }

  isChildPage(childPath: string): promise.Promise<boolean> {
    if (!childPath.startsWith('/')) {
      childPath = '/' + childPath;
    }
    return browser.getCurrentUrl().then(url => {
      return url === browser.baseUrl + this.navLink + childPath;
    });
  }

  waitForPage(timeout = 20000, ignoreQuery = false) {
    expect(this.navLink.startsWith('/')).toBeTruthy('navLink should start with a /');
    if (ignoreQuery) {
      return browser.wait(() => {
        return this.isActivePage(true);
      });
    } else {
      return browser.wait(until.urlIs(this.getUrl()), timeout, `Failed to wait for page with navlink '${this.navLink}'`);
    }
  }

  waitForPageDataLoaded(timeout = 20000) {
    this.waitForPage();
    return browser.wait(until.stalenessOf(element(by.tagName('app-loading-page'))), timeout);
  }

  waitForPageOrChildPage() {
    expect(this.navLink.startsWith('/')).toBeTruthy();
    browser.wait(until.urlContains(this.getUrl()), 20000);
  }

  waitForChildPage(childPath: string) {
    expect(this.navLink.startsWith('/')).toBeTruthy();
    browser.wait(until.urlContains(browser.baseUrl + this.navLink + childPath), 20000);
  }
  private getUrl = () => browser.baseUrl + this.navLink;

  private stripQuery(url: string): string {
    const queryStarts = url.indexOf('?');
    return queryStarts >= 0 ? url.substring(0, queryStarts) : url;
  }
}