cloudfoundry/stratos

View on GitHub
src/test-e2e/cloud-foundry/space-level/space-routes-e2e.spec.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import { browser, promise } from 'protractor';

import { ISpace } from '../../../frontend/packages/cloud-foundry/src/cf-api.types';
import { APIResource } from '../../../frontend/packages/store/src/types/api.types';
import { e2e } from '../../e2e';
import { E2EConfigCloudFoundry } from '../../e2e.types';
import { CFHelpers } from '../../helpers/cf-e2e-helpers';
import { ConsoleUserType, E2EHelpers } from '../../helpers/e2e-helpers';
import { ListComponent } from '../../po/list.po';
import { CfSpaceLevelPage } from './cf-space-level-page.po';

const customRouteLabel = E2EHelpers.e2eItemPrefix + (process.env.CUSTOM_APP_LABEL || process.env.USER) + '-space-route-test';

describe('Space Routes List -', () => {
  let cfHelper: CFHelpers;
  let defaultCf: E2EConfigCloudFoundry;
  let endpointGuid: string;
  let defaultOrgGuid: string;
  let createdSpaceGuid: string;
  const routesList = new ListComponent();

  const timeAllowed = 50000;

  const pageSizeSelectName = 'mat-select-4';

  function createRouteHosts(count: number): string[] {
    const routeHosts = [];
    for (let i = 0; i < count; i++) {
      routeHosts.push(CFHelpers.cleanRouteHost(E2EHelpers.createCustomName(customRouteLabel + i)));
    }
    return routeHosts;
  }

  function chainCreateRoute(spaceGuid: string, domainGuid: string, routeHosts: string[]): promise.Promise<any> {
    return routeHosts.reduce((promiseChain, host) => {
      return promiseChain.then(() => {
        // Ensure there's a gap so that the 'created_at' is different
        browser.sleep(1100);
        return cfHelper.addRoute(endpointGuid, spaceGuid, domainGuid, host);
      });
    }, promise.fullyResolved(''));
  }

  function concurrentCreateRoute(spaceGuid: string, domainGuid: string, routeHosts: string[]): promise.Promise<any> {
    return promise.all(routeHosts.map(host => cfHelper.addRoute(endpointGuid, spaceGuid, domainGuid, host)));
  }

  function setup(spaceName: string, routeHosts: string[], orderImportant: boolean) {
    defaultCf = e2e.secrets.getDefaultCFEndpoint();
    endpointGuid = e2e.helper.getEndpointGuid(e2e.info, defaultCf.name);
    const defaultOrgGuidP = CFHelpers.cachedDefaultOrgGuid ?
      promise.fullyResolved<string>(CFHelpers.cachedDefaultOrgGuid) : cfHelper.fetchDefaultOrgGuid();
    browser.wait(
      defaultOrgGuidP
        .then(orgGuid => {
          defaultOrgGuid = orgGuid;
          return cfHelper.addSpaceIfMissingForEndpointUsers(
            endpointGuid,
            orgGuid,
            spaceName,
            defaultCf,
            true);
        })
        .catch(error => { throw new Error(`Failed to create space: ${error.toString()}`); })
        .then((space: APIResource<ISpace>) => {
          createdSpaceGuid = space.metadata.guid;
          if (!routeHosts || !routeHosts.length) {
            return promise.fullyResolved(space);
          }

          return cfHelper
            .fetchDomains(endpointGuid)
            .catch(error => { throw new Error(`Failed to fetch domains: ${error.toString()}`); })
            .then(domains => {
              if (!domains || !domains.length) {
                throw Error('At least one domain is required to create test routes');
              }
              const domainGuid = domains[0].metadata.guid;
              // Chain the creation of the routes to ensure there's a nice sequential 'created_at' value to be used for sort tests
              const promises = orderImportant ?
                chainCreateRoute(createdSpaceGuid, domainGuid, routeHosts) :
                concurrentCreateRoute(createdSpaceGuid, domainGuid, routeHosts);

              return promises.then(() => space);
            });
        })
        .then(navToSpaceRoutes)

    );
  }

  function navToSpaceRoutes() {
    const spacePage = CfSpaceLevelPage.forEndpoint(endpointGuid, defaultOrgGuid, createdSpaceGuid);
    spacePage.navigateTo();
    spacePage.waitForPageOrChildPage();
    spacePage.loadingIndicator.waitUntilNotShown();
    spacePage.goToRoutesTab();
    expect(routesList.isCardsView()).toBeFalsy();
  }

  function tearDown(spaceName: string) {
    expect(spaceName).not.toBeNull();
    browser.wait(cfHelper.deleteSpaceIfExisting(endpointGuid, defaultOrgGuid, spaceName));
  }

  beforeAll(() => {
    const e2eSetup = e2e.setup(ConsoleUserType.admin)
      .clearAllEndpoints()
      .registerDefaultCloudFoundry()
      .connectAllEndpoints(ConsoleUserType.admin)
      .loginAs(ConsoleUserType.admin)
      .getInfo();
    cfHelper = new CFHelpers(e2eSetup);
  });

  describe('No Pages -', () => {
    const spaceName = E2EHelpers.createCustomName(customRouteLabel) + '-no-pages';
    beforeAll(() => {
      setup(spaceName, [], false);
    });

    it('Should show no entities message', () => {
      expect(routesList.isDisplayed()).toBeTruthy();
      routesList.empty.getDefault().waitUntilShown();
      expect(routesList.empty.getDefault().getComponent().getText()).toBe('There are no routes');
      expect(routesList.table.getRowCount()).toBe(0);
    });

    afterAll(() => tearDown(spaceName));
  });

  describe('Single Page -', () => {
    const spaceName = E2EHelpers.createCustomName(customRouteLabel) + '-1-page';

    let routeHosts;

    function testSortBy() {

      let expectedOrder: string[];
      routesList.table.getTableData().then(rows => {
        const originalOrder = rows.map(row => row.route);
        expectedOrder = new Array(originalOrder.length);
        for (let i = 0; i < originalOrder.length; i++) {
          expectedOrder[originalOrder.length - i - 1] = originalOrder[i];
        }
      });

      routesList.table.toggleSort('Creation Date');

      routesList.table.getTableData().then(rows => {
        const newOrder = rows.map(row => row.route);
        expect(expectedOrder).toEqual(newOrder);
      });
    }

    beforeAll(() => {
      routeHosts = createRouteHosts(3);
      setup(spaceName, routeHosts, true);
      expect(routesList.getTotalResults()).toBeLessThanOrEqual(5);
      expect(routesList.pagination.isDisplayed()).toBeFalsy();
    }, timeAllowed);

    afterAll(() => tearDown(spaceName), timeAllowed);

    it('sort by creation', () => {
      testSortBy();
    });

    it('single page pagination settings', () => {
      expect(routesList.pagination.isDisplayed()).toBeFalsy();
    });

  });

  describe('Multi Page -', () => {
    const spaceName = E2EHelpers.createCustomName(customRouteLabel) + '-multi-page';

    let routeHosts;
    const initialPageSize = 9;

    beforeAll(() => {
      routeHosts = createRouteHosts(10);
      setup(spaceName, routeHosts, true);
      expect(routesList.getTotalResults()).toBeGreaterThanOrEqual(routeHosts.length);
    }, timeAllowed);

    afterAll(() => tearDown(spaceName), timeAllowed);

    function testStartingPosition() {
      // General expects for all tests in this section
      expect(routesList.getTotalResults()).toBeLessThan(80);
      expect(routesList.pagination.isPresent()).toBeTruthy();

      expect(routesList.table.getRowCount()).toBe(initialPageSize);
      expect(routesList.pagination.getPageSize(pageSizeSelectName)).toEqual(initialPageSize.toString());
      expect(routesList.pagination.getTotalResults()).toBeGreaterThan(initialPageSize);
      expect(routesList.pagination.getTotalResults()).toBeLessThanOrEqual(11);

      expect(routesList.pagination.getNavFirstPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavPreviousPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavNextPage().getComponent().isEnabled()).toBeTruthy();
      expect(routesList.pagination.getNavLastPage().getComponent().isEnabled()).toBeTruthy();
    }

    beforeEach(testStartingPosition, timeAllowed);

    afterEach(testStartingPosition, timeAllowed);

    it('Initial Pagination Values', () => { });

    it('Next and Previous Page', () => {
      routesList.pagination.getNavNextPage().getComponent().click();
      // routesList.waitForLoadingIndicator();
      // routesList.waitForNoLoadingIndicator();

      expect(routesList.pagination.getNavFirstPage().getComponent().isEnabled()).toBeTruthy();
      expect(routesList.pagination.getNavPreviousPage().getComponent().isEnabled()).toBeTruthy();
      expect(routesList.pagination.getNavNextPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavLastPage().getComponent().isEnabled()).toBeFalsy();

      routesList.pagination.getNavPreviousPage().getComponent().click();
    });

    it('Last and First Page', () => {
      routesList.pagination.getNavLastPage().getComponent().click();

      expect(routesList.pagination.getNavFirstPage().getComponent().isEnabled()).toBeTruthy();
      expect(routesList.pagination.getNavPreviousPage().getComponent().isEnabled()).toBeTruthy();
      expect(routesList.pagination.getNavNextPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavLastPage().getComponent().isEnabled()).toBeFalsy();

      routesList.pagination.getNavFirstPage().getComponent().click();
    });

    it('Change Page Size', () => {

      routesList.pagination.setPageSize('80', pageSizeSelectName);
      expect(routesList.table.getRowCount()).toBeGreaterThan(initialPageSize);

      expect(routesList.pagination.getNavFirstPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavPreviousPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavNextPage().getComponent().isEnabled()).toBeFalsy();
      expect(routesList.pagination.getNavLastPage().getComponent().isEnabled()).toBeFalsy();

      routesList.pagination.setPageSize(initialPageSize.toString(), pageSizeSelectName);
      expect(routesList.table.getRowCount()).toBe(initialPageSize);

    });

    xit('Refresh animation', () => {
      // Refresh icon animation stops before we can check it's started. Need to simulate slower http requests
      // browser.driver.setNetworkConnection(4); // Fails with `network connection must be enabled`
      browser.waitForAngularEnabled(false);
      routesList.header.getRefreshListButton().click();
      routesList.header.waitForRefreshing();
      routesList.header.waitForNotRefreshing();
      browser.waitForAngularEnabled(true);
    });

  });
});