cloudfoundry/stratos

View on GitHub
src/frontend/packages/store/testing/src/store-test-helper.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { ModuleWithProviders } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { Store, StoreModule, StoreRootModule } from '@ngrx/store';
import {
  appReducers,
  AppState,
  BaseEntityValues,
  endpointEntityType,
  EndpointModel,
  entityCatalog,
  EntityCatalogEntityConfig,
  getDefaultPaginationEntityState,
  getDefaultRequestState,
  getDefaultRolesRequestState,
  NormalizedResponse,
  rootUpdatingKey,
  SessionData,
  SessionDataEndpoint,
  stratosEntityFactory,
  WrapperRequestActionSuccess,
} from '@stratosui/store';

export const testSCFEndpointGuid = '01ccda9d-8f40-4dd0-bc39-08eea68e364f';
const testSCFSessionEndpoint: SessionDataEndpoint = {
  guid: testSCFEndpointGuid,
  name: 'SCF-2.2.0-beta',
  version: '',
  user: {
    scopes: [],
    guid: 'a6254a42-a218-4f41-b77e-35a8d53d9dd1',
    name: 'admin',
    admin: true
  },
  type: ''
};

export const testSCFEndpoint: EndpointModel = {
  guid: testSCFEndpointGuid,
  name: 'SCF-2.2.0-beta',
  user: {
    scopes: [],
    guid: 'a6254a42-a218-4f41-b77e-35a8d53d9dd1',
    name: 'admin',
    admin: true
  },
  cnsi_type: 'cf',
  system_shared_token: false,
  sso_allowed: false,
  metricsAvailable: false,
  creator: {
    name: 'admin',
    admin: true,
    system: false
  }
};

export const testSessionData: SessionData = {
  version: {
    proxy_version: '0.9.5-a77102d6',
    database_version: 20170818162837
  },
  user: {
    guid: '530170c7-5042-40ed-8654-c4a79e4d1302',
    name: 'admin',
    admin: true,
    scopes: []
  },
  endpoints: {
    cf: {
      [testSCFEndpointGuid]: testSCFSessionEndpoint,
      '521a9d96-2d6c-4d94-a555-807437ab106d': {
        guid: '521a9d96-2d6c-4d94-a555-807437ab106d',
        name: 'SCF',
        version: '',
        user: {
          scopes: [],
          guid: 'ded8a59b-b21d-4da6-a07a-0d865a9b16e2',
          name: 'admin',
          admin: true
        },
        type: ''
      },
      '663a363e-1faf-4359-ac96-b8c24ec1a4ab': {
        guid: '663a363e-1faf-4359-ac96-b8c24ec1a4ab',
        name: 'TEST',
        version: '',
        user: {
          scopes: [],
          guid: 'b2a8ed5c-5c63-4b5b-bdf8-04ea66a9db00',
          name: 'admin',
          admin: true
        },
        type: ''
      },
      'b24923d0-f1ad-4534-bb02-f609a1667bb1': {
        guid: 'b24923d0-f1ad-4534-bb02-f609a1667bb1',
        name: 'SAP',
        version: '',
        user: {
          scopes: [],
          guid: '7965e2cc-ef57-4373-bb0d-b45025355883',
          name: 'macdougall.neil@gmail.com',
          admin: false
        },
        type: ''
      },
      'e2f91bca-38e8-435a-9f72-7a8f8de0ee17': {
        guid: 'e2f91bca-38e8-435a-9f72-7a8f8de0ee17',
        name: 'SCF 2.1.0-beta',
        version: '',
        user: {
          scopes: [],
          guid: 'a1e15ade-2f3d-4354-8935-0553973afb2c',
          name: 'admin',
          admin: true
        },
        type: ''
      }
    }
  },
  valid: true,
  uaaError: false,
  upgradeInProgress: false,
  sessionExpiresOn: 1000,
  plugins: {
    demo: false
  },
  config: {
    enableTechPreview: false
  }
};

function getDefaultInitialTestStratosStoreState() {
  return {
    recentlyVisited: {},
    userFavoritesGroups: {
      busy: false,
      error: false,
      message: '',
      groups: {}
    },
    auth: {
      loggedIn: true,
      loggingIn: false,
      user: null,
      error: false,
      errorResponse: '',
      sessionData: testSessionData,
      verifying: false
    },
    uaaSetup: {
      payload: null,
      setup: false,
      error: false,
      message: '',
      settingUp: false
    },
    endpoints: {
      loading: false,
      error: false,
      message: ''
    },
    dashboard: {
      sidenavOpen: true,
      timeoutSession: true,
      sideHelpOpen: false,
      sideHelpDocument: '',
      isMobile: false,
      isMobileNavOpen: false,
      sideNavPinned: false,
      pollingEnabled: true,
      themeKey: null,
      headerEventMinimized: true,
      gravatarEnabled: false,
      homeLayout: 0,
      homeShowAllEndpoints: true,
    },
    lists: {},
    routing: {
      previousState: {
        id: 4,
        url: '/marketplace',
        urlAfterRedirects: '/marketplace',
        state: {
          url: '/marketplace',
          params: {},
          queryParams: {}
        }
      },
      currentState: {
        id: 5,
        url: '/applications',
        urlAfterRedirects: '/applications',
        state: {
          url: '/applications',
          params: {},
          queryParams: {}
        }
      }
    },
    internalEvents: {
      types: {
        global: {},
        endpoint: {}
      }
    },
    currentUserRoles: {
      internal: {
        isAdmin: false,
        scopes: []
      },
      endpoints: {},
      state: getDefaultRolesRequestState()
    }
  };
}

function getDefaultInitialTestStoreState(): AppState<BaseEntityValues> {
  return {
    ...getDefaultInitialTestStratosStoreState(),
    pagination: {
      system: {},
      stratosEndpoint: {
        'endpoint-list': {
          pageCount: 1,
          currentPage: 1,
          totalResults: 0,
          params: {
            key: 'a'
          },
          pageRequests: {
          },
          ids: {},
          clientPagination: {
            pageSize: 5,
            currentPage: 1,
            totalResults: 50,
            filter: {
              string: '',
              items: {}
            },
          },
          maxedState: {},
          isListPagination: true
        }
      },
      metrics: {},
      stratosUserProfile: {},
      stratosUserFavorites: {},
    },
    request: {
      stratosUserProfile: {},
      metrics: {},
      stratosUserFavorites: {},
      stratosEndpoint: {
        '57ab08d8-86cc-473a-8818-25d5e8d0ea23': {
          fetching: false,
          updating: {
            [rootUpdatingKey]: {
              busy: false,
              error: false,
              message: ''
            }
          },
          deleting: {
            busy: false,
            error: false,
            message: '',
            deleted: false
          },
          creating: false,
          error: false,
          response: null,
          message: ''
        }
      },
      system: {},
    },
    requestData: {
      stratosUserFavorites: {},
      stratosEndpoint: {
        [testSCFEndpointGuid]: {
          guid: testSCFEndpointGuid,
          name: 'SCF',
          cnsi_type: 'cf',
          api_endpoint: {
            Scheme: 'https',
            Opaque: '',
            User: null,
            Host: 'api.127.0.0.1.xip.io:8443',
            Path: '',
            RawPath: '',
            ForceQuery: false,
            RawQuery: '',
            Fragment: ''
          },
          authorization_endpoint: 'https://cf.uaa.127.0.0.1.xip.io:2793',
          token_endpoint: 'https://cf.uaa.127.0.0.1.xip.io:2793',
          doppler_logging_endpoint: 'wss://doppler.127.0.0.1.xip.io:4443',
          skip_ssl_validation: true,
          sso_allowed: true,
          user: {
            guid: 'bcf78136-6225-4515-bf8e-a32243deea0c',
            name: 'admin',
            admin: true
          },
          creator: {
            name: 'admin',
            admin: true,
            system: false
          },
          connectionStatus: 'connected',
          system_shared_token: false,
          metricsAvailable: false
        },
      },
      metrics: {},
      system: {},
      stratosUserProfile: {
        id: 'test-user',
        name: {
          familyName: 'User',
          givenName: 'Test',
        },
        userName: 'tesy-user-name',
        meta: {
          version: 1,
          created: '',
          lastModified: '',
        },
        verified: true,
        active: true,
        emails: [
          {
            primary: true,
            value: 'test@test.com',
          }
        ],
        passwordLastModified: '',
        schemas: '',
        zoneId: '',
        origin: ''
      },
    },
  };
}

export function createBasicStoreModule(
  initialState: Partial<AppState<BaseEntityValues>> = getDefaultInitialTestStoreState()
): ModuleWithProviders<StoreRootModule> {
  return StoreModule.forRoot(
    appReducers,
    {
      initialState, runtimeChecks: { strictStateImmutability: false, strictActionImmutability: false }
    }
  );
}

export function createEmptyStoreModule(): ModuleWithProviders<StoreRootModule> {
  return StoreModule.forRoot(
    appReducers, { runtimeChecks: { strictStateImmutability: false, strictActionImmutability: false } }
  );
}

function getStoreSectionForIds(entities: Array<TestStoreEntity | string>, dataOverride?: any) {
  return entities.reduce((sections, entity) => {
    if (typeof entity === 'string') {
      return {
        [entity]: dataOverride || {}
      };
    }
    sections[entity.guid] = dataOverride || entity.data || {};
    return sections;
  }, {});
}

export interface TestStoreEntity {
  guid: string;
  data?: any;
}

/**
 * Should not be used by StoreModule.forRoot's initialState (lack of specific reducers in same object cause parts of state to be ignored)
 */
export function createEntityStoreState(entityMap: Map<EntityCatalogEntityConfig, Array<TestStoreEntity | string>>) {
  return Array.from(entityMap.keys()).reduce((state, entityConfig) => {
    const entities = entityMap.get(entityConfig);
    const entityKey = entityCatalog.getEntityKey(entityConfig);
    return {
      request: {
        ...state.request,
        [entityKey]: getStoreSectionForIds(entities, getDefaultRequestState())
      },
      requestData: {
        ...state.requestData,
        [entityKey]: getStoreSectionForIds(entities)
      },
      pagination: {
        ...state.pagination,
        [entityKey]: getStoreSectionForIds(entities, getDefaultPaginationEntityState())
      }
    };
  }, getDefaultInitialTestStoreState());
}

export function createEntityStore(
  entityMap: Map<EntityCatalogEntityConfig, Array<TestStoreEntity | string>>
): ModuleWithProviders<StoreRootModule> {
  const initialState = createEntityStoreState(entityMap);
  return createBasicStoreModule(initialState);
}

export function populateStoreWithTestEndpoint(): EndpointModel {
  const stratosEndpointEntityConfig: EntityCatalogEntityConfig = stratosEntityFactory(endpointEntityType);
  const stratosEndpointEntityKey = entityCatalog.getEntityKey(stratosEndpointEntityConfig);
  const mappedData = {
    entities: {
      [stratosEndpointEntityKey]: {
        [testSCFEndpoint.guid]: testSCFEndpoint
      }
    },
    result: [testSCFEndpoint.guid]
  } as NormalizedResponse;
  const store = TestBed.get(Store);
  store.dispatch(new WrapperRequestActionSuccess(mappedData, {
    type: 'POPULATE_TEST_DATA',
    ...stratosEndpointEntityConfig
  }, 'fetch'));

  return testSCFEndpoint;
}