cloudfoundry/stratos

View on GitHub
src/frontend/packages/cloud-foundry/src/shared/services/application-state.service.spec.ts

Summary

Maintainability
F
3 days
Test Coverage
import { TestBed } from '@angular/core/testing';

import { ApplicationStateService } from './application-state.service';


describe('ApplicationStateService', () => {

  const $translate = { instant: (label) => label };
  let cfAppStateService;

  beforeEach(async () => {
    TestBed.configureTestingModule({
      providers: [ApplicationStateService]
    }).compileComponents();
  });

  beforeEach(() => {
    cfAppStateService = TestBed.get(ApplicationStateService);
  });

  it('should be created', () => {
    expect(cfAppStateService).toBeTruthy();
  });

  describe('check friendly names and indicators', () => {

    function makeTestData(appState, packageState, instanceStates?) {
      const summary = {
        state: appState,
        package_state: packageState,
        package_updated_at: undefined,
        running_instances: 0,
        instances: instanceStates ? instanceStates.length : undefined
      };
      let instances = [];
      let running = 0;
      if (instanceStates) {
        instanceStates.forEach(s => {
          instances.push({ state: s });
          if (s === 'RUNNING') { running++; }
        });
      } else {
        instances = undefined;
      }
      summary.running_instances = running;
      return {
        summary,
        instances
      };
    }

    it('Busted push', () => {
      const testData = makeTestData('ANY', 'FAILED', ['RUNNING']);
      const res = cfAppStateService.get(testData.summary, testData.instances);

      expect(res.indicator).toBe('error');
      expect($translate.instant(res.label)).toBe('Staging Failed');
      expect(Object.keys(res.actions).length).toBe(2);
      expect(res.actions.delete).toBe(true);
    });

    it('Updating app', () => {
      const testData = makeTestData('STOPPED', 'PENDING', ['RUNNING', 'CRASHED']);
      testData.summary.package_updated_at = 'some date';
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Offline while Updating');
      expect(Object.keys(res.actions).length).toBe(2);
      expect(res.actions.delete).toBe(true);
      expect(res.actions.start).toBe(true);
    });

    it('Incomplete app', () => {
      const testData = makeTestData('STOPPED', 'PENDING', ['RUNNING', 'CRASHED']);
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('incomplete');
      expect($translate.instant(res.label)).toBe('Incomplete');
      expect(Object.keys(res.actions).length).toBe(3);
      expect(res.actions.delete).toBe(true);
      expect(res.actions.cli).toBe(true);
    });

    it('User stopped app', () => {
      const testData = makeTestData('STOPPED', 'STAGED', ['RUNNING', 'CRASHED']);
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Offline');
      expect(Object.keys(res.actions).length).toBe(4);
      expect(res.actions.start).toBe(true);
      expect(res.actions.delete).toBe(true);
    });

    it('Incomplete', () => {
      const testData = makeTestData('STOPPED', undefined, ['RUNNING', 'CRASHED']);
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('incomplete');
      expect($translate.instant(res.label)).toBe('Incomplete');
      expect(Object.keys(res.actions).length).toBe(3);
      expect(res.actions.delete).toBe(true);
      expect(res.actions.cli).toBe(true);
    });

    it('During push', () => {
      const testData = makeTestData('STARTED', 'PENDING', ['RUNNING', 'CRASHED']);
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('busy');
      expect($translate.instant(res.label)).toBe('Staging App');
      expect(Object.keys(res.actions).length).toBe(1);
      expect(res.actions.delete).toBe(true);
    });

    it('After successful push', () => {
      const testData = makeTestData('STARTED', 'STAGED', ['STARTING']);
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('busy');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Starting App');
      expect(Object.keys(res.actions).length).toBe(3);
      expect(res.actions.stop).toBe(true);
      expect(res.actions.restart).toBe(true);
    });

    it('Starting', () => {
      const testData = makeTestData('STARTED', 'STAGED', ['STARTING', 'RUNNING']);
      const res = cfAppStateService.get(testData.summary, testData.instances);

      expect(res.indicator).toBe('ok');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Scaling App');
      expect(Object.keys(res.actions).length).toBe(4);
      expect(res.actions.stop).toBe(true);
      expect(res.actions.restart).toBe(true);
    });

    it('Running!', () => {
      let testData = makeTestData('STARTED', 'STAGED', ['RUNNING']);
      let res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('ok');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Online');

      testData = makeTestData('STARTED', 'STAGED', ['RUNNING', 'RUNNING']);
      res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('ok');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Online');
      expect(Object.keys(res.actions).length).toBe(5);
      expect(res.actions.restart).toBe(true);
      expect(res.actions.stop).toBe(true);
      expect(res.actions.launch).toBe(true);
    });

    it('Borked, usually due to app code', () => {
      let testData = makeTestData('STARTED', 'STAGED', ['CRASHED']);
      let res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('error');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashed');

      testData = makeTestData('STARTED', 'STAGED', ['CRASHED', 'CRASHED']);
      res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('error');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashed');
      expect(Object.keys(res.actions).length).toBe(4);
      expect(res.actions.restart).toBe(true);
      expect(res.actions.stop).toBe(true);
    });

    it('Borked, usually due to starting timeouts', () => {
      let testData = makeTestData('STARTED', 'STAGED', ['TIMEOUT']);
      let res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Starting App');

      testData = makeTestData('STARTED', 'STAGED', ['TIMEOUT', 'TIMEOUT']);
      res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Starting App');
      expect(Object.keys(res.actions).length).toBe(3);
      expect(res.actions.restart).toBe(true);
      expect(res.actions.stop).toBe(true);
    });

    it('Borked, usually due to starting timeouts (1)', () => {
      let testData = makeTestData('STARTED', 'STAGED', ['TIMEOUT', 'CRASHED']);
      let res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('error');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashed');

      testData = makeTestData('STARTED', 'STAGED', ['TIMEOUT', 'TIMEOUT', 'CRASHED', 'CRASHED']);
      res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('error');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashed');
      expect(Object.keys(res.actions).length).toBe(4);
      expect(res.actions.restart).toBe(true);
      expect(res.actions.stop).toBe(true);
    });

    it('Borked, usually due to platform issues', () => {
      let testData = makeTestData('STARTED', 'STAGED', ['RUNNING', 'CRASHED']);
      let res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashing');

      testData = makeTestData('STARTED', 'STAGED', ['RUNNING', 'RUNNING', 'CRASHED', 'CRASHED']);
      res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashing');
      expect(Object.keys(res.actions).length).toBe(5);
      expect(res.actions.restart).toBe(true);
      expect(res.actions.stop).toBe(true);
      expect(res.actions.launch).toBe(true);
    });

    it('Borked, usually due to platform issues (2)', () => {
      let testData = makeTestData('STARTED', 'STAGED', ['RUNNING', 'UNKNOWN']);
      let res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Partially Online');

      testData = makeTestData('STARTED', 'STAGED', ['RUNNING', 'RUNNING', 'UNKNOWN', 'UNKNOWN']);
      res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Partially Online');
      expect(Object.keys(res.actions).length).toBe(5);
      expect(res.actions.restart).toBe(true);
      expect(res.actions.stop).toBe(true);
      expect(res.actions.launch).toBe(true);
    });

    it('Borked, one crashed, one running, one stating', () => {
      const testData = makeTestData('STARTED', 'STAGED', ['RUNNING', 'CRASHED', 'STARTING']);
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('warning');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect($translate.instant(res.subLabel)).toBe('Crashing');
    });

    it('Started, but no stats available', () => {
      const testData = makeTestData('STARTED', 'STAGED');
      const res = cfAppStateService.get(testData.summary, undefined);
      expect(res.indicator).toBe('tentative');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect(res.subLabel).not.toBeDefined();
    });

    it('Started, but have instance counf set to 0', () => {
      const testData = makeTestData('STARTED', 'STAGED');
      const res = cfAppStateService.get(testData.summary, testData.instances);
      expect(res.indicator).toBe('tentative');
      expect($translate.instant(res.label)).toBe('Deployed');
      expect(res.subLabel).not.toBeDefined();
    });
  });
});