From 2fe3d879319a34e9802d0bc172fa11fefe771df3 Mon Sep 17 00:00:00 2001 From: imamSidero Date: Fri, 10 Jun 2022 22:08:39 +0530 Subject: Add unit test cases for UI components Unit test cases are added for app.component, utils, entity-filter.pipe from pipes and headers-interceptor from http-interceptor Signed-off-by: imam.hussain Issue-ID: SDC-4066 Change-Id: Iccc66f6b255ea790d6c58061d5129e4804a04457 --- catalog-ui/src/app/ng2/app.component.spec.ts | 49 +++ .../http-interceptor/headers-interceptor.spec.ts | 104 +++++++ .../src/app/ng2/pipes/entity-filter.pipe.spec.ts | 212 +++++++++++++ catalog-ui/src/app/ng2/pipes/entity-filter.pipe.ts | 338 +++++++++++---------- .../app/ng2/utils/ng1-upgraded-provider.spec.ts | 89 ++++++ .../src/app/ng2/utils/queue-service-utils.spec.ts | 60 ++++ 6 files changed, 684 insertions(+), 168 deletions(-) create mode 100644 catalog-ui/src/app/ng2/app.component.spec.ts create mode 100644 catalog-ui/src/app/ng2/http-interceptor/headers-interceptor.spec.ts create mode 100644 catalog-ui/src/app/ng2/pipes/entity-filter.pipe.spec.ts create mode 100644 catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.spec.ts create mode 100644 catalog-ui/src/app/ng2/utils/queue-service-utils.spec.ts (limited to 'catalog-ui/src/app/ng2') diff --git a/catalog-ui/src/app/ng2/app.component.spec.ts b/catalog-ui/src/app/ng2/app.component.spec.ts new file mode 100644 index 0000000000..0d8e3ab1c3 --- /dev/null +++ b/catalog-ui/src/app/ng2/app.component.spec.ts @@ -0,0 +1,49 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ + +import { NO_ERRORS_SCHEMA, ViewContainerRef } from "@angular/core"; +import { async, TestBed } from "@angular/core/testing"; +import { AuthenticationService } from './services/authentication.service'; +import { AppComponent } from './app.component' + +describe('AppComponent', () => { + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [], + schemas: [NO_ERRORS_SCHEMA], + declarations: [ + AppComponent + ], + providers: [ + { provide: AuthenticationService }, + { provide: ViewContainerRef } + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + +}); diff --git a/catalog-ui/src/app/ng2/http-interceptor/headers-interceptor.spec.ts b/catalog-ui/src/app/ng2/http-interceptor/headers-interceptor.spec.ts new file mode 100644 index 0000000000..570ff38174 --- /dev/null +++ b/catalog-ui/src/app/ng2/http-interceptor/headers-interceptor.spec.ts @@ -0,0 +1,104 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ + +import { async, TestBed } from "@angular/core/testing"; +import { ConfigureFn, configureTests } from "../../../jest/test-config.helper"; +import { NO_ERRORS_SCHEMA } from "@angular/core"; +import { HeadersInterceptor } from './headers-interceptor'; +import { SdcConfigToken } from "../config/sdc-config.config"; +import { Injector } from '@angular/core'; +import { of } from 'rxjs'; +import { TranslateService } from '../shared/translator/translate.service'; +import { Cookie2Service } from '../services/cookie.service'; +import { HttpHelperService } from '../services/http-hepler.service'; +import { HttpErrorResponse, HttpEvent, HttpResponse, HttpRequest } from '@angular/common/http'; +import { ModelService } from "../services/model.service"; + +describe('HeadersInterceptor service', () => { + + let headerService: HeadersInterceptor; + let cookieServiceMock: Partial; + let httpServiceMock: Partial; + + beforeEach( + async(() => { + cookieServiceMock = { + getCookieByName: jest.fn(), + getUserIdSuffix: jest.fn().mockImplementation(() => 'urlSuffix'), + getUserId: jest.fn().mockImplementation(() => '009'), + getFirstName: jest.fn().mockImplementation(() => 'First Name'), + getLastName: jest.fn().mockImplementation(() => 'Last Name'), + getEmail: jest.fn().mockImplementation(() => 'names@test.com'), + }; + httpServiceMock = { + getUuidValue: jest.fn().mockImplementation(() => '001'), + replaceUrlParams: jest.fn(), + getHeaderMd5: jest.fn() + }; + + const configure: ConfigureFn = testBed => { + testBed.configureTestingModule({ + declarations: [], + imports: [], + schemas: [NO_ERRORS_SCHEMA], + providers: [HeadersInterceptor, + { provide: SdcConfigToken }, + { provide: Injector }, + { provide: Cookie2Service, useValue: cookieServiceMock }, + { provide: HttpHelperService, useValue: httpServiceMock }, + { provide: TranslateService }, + { provide: ModelService } + ], + }); + }; + configureTests(configure).then(testBed => { + headerService = TestBed.get(HeadersInterceptor); + }); + }) + ); + + it('HeadersInterceptor should be created', () => { + expect(headerService).toBeTruthy(); + }); + + it('should set correct request headers', done => { + const mockHandler = { + handle: jest.fn(() => of( + new HttpResponse({ status: 200 }))) + }; + of(headerService.intercept(new HttpRequest('GET', '/test'), mockHandler)).subscribe(response => { + expect(response).toBeTruthy(); + done(); + }); + }); + + it('should throw 500 error with correct message', done => { + const mockHandler = { + handle: jest.fn(() => of( + new HttpErrorResponse({ status: 500, error: 'This is a error' }))) + }; + of(headerService.intercept(new HttpRequest('GET', '/test'), mockHandler)).subscribe(error => { + expect(error.source.value.name).toBe('HttpErrorResponse'); + expect(error.source.value.status).toBe(500); + done(); + }); + }); +}); diff --git a/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.spec.ts b/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.spec.ts new file mode 100644 index 0000000000..6e0a79bbed --- /dev/null +++ b/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.spec.ts @@ -0,0 +1,212 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ + +import { TestBed } from "@angular/core/testing"; +import { EntityFilterPipe } from './entity-filter.pipe'; +import { IEntityFilterObject } from './entity-filter.pipe'; +import { Component } from "app/models"; +import { ISearchFilter } from './entity-filter.pipe'; + +describe('EntityFilterPipe', () => { + let entityFilterPipe: EntityFilterPipe; + let entityFilterMock: Partial; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + providers: [EntityFilterPipe], + }); + entityFilterPipe = TestBed.get(EntityFilterPipe); + }); + + it('EntityFilterPipe should be created', () => { + expect(entityFilterPipe).toBeTruthy(); + }); + + it('Transform method should filter objects by type matching with selectedComponentTypes', () => { + let componentList: Array = []; + + const mockComponent = { + componentType: 'testtype', + isResource: jest.fn().mockImplementation(() => false) + } as Partial as Component; + componentList.push(mockComponent); + + const mockComponent1 = { + componentType: 'newtesttype', + isResource: jest.fn().mockImplementation(() => false) + } as Partial as Component; + componentList.push(mockComponent1); + + const mockComponent2 = { + componentType: 'newtesttype', + isResource: jest.fn().mockImplementation(() => true), + getComponentSubType: jest.fn().mockImplementation(() => 'subComponent') + } as Partial as Component; + componentList.push(mockComponent2); + + entityFilterMock = { + selectedComponentTypes: ['Testtype', 'Testtype1'], + selectedResourceSubTypes: ['subComponent'] + }; + let response: Array = entityFilterPipe.transform(componentList, entityFilterMock); + expect(response).toHaveLength(2); + expect(response[0]).toEqual(mockComponent); + expect(response[1]).toEqual(mockComponent2); + }); + + it('Transform method should filter objects by categories & subcategories matching with selectedCategoriesModel', () => { + let componentList: Array = []; + const mockComponent = { + componentType: 'newtesttype', + categoryNormalizedName: 'categoryname', + subCategoryNormalizedName: 'subcategoryname', + } as Partial as Component; + componentList.push(mockComponent); + + const mockComponent1 = { + componentType: 'newtesttype', + categoryNormalizedName: 'name', + subCategoryNormalizedName: 'subname', + } as Partial as Component; + componentList.push(mockComponent1); + + const mockComponent2 = { + componentType: 'RESOURCE', + categoryNormalizedName: 'name' + } as Partial as Component; + componentList.push(mockComponent2); + + const mockComponent3 = { + componentType: 'SERVICE', + categoryNormalizedName: 'name' + } as Partial as Component; + componentList.push(mockComponent3); + + entityFilterMock = { + selectedCategoriesModel: ['categoryname.subcategoryname', 'resourceNewCategory.name', 'serviceNewCategory.name'] + }; + let response: Array = entityFilterPipe.transform(componentList, entityFilterMock); + expect(response).toHaveLength(3); + expect(response[0]).toEqual(mockComponent); + expect(response[1]).toEqual(mockComponent2); + expect(response[2]).toEqual(mockComponent3); + }); + + it('Transform method should filter objects by statuses matching with selectedStatuses', () => { + let componentList: Array = []; + const mockComponent = { + lifecycleState: 'lifecyclestatus' + } as Partial as Component; + componentList.push(mockComponent); + + const mockComponent1 = { + lifecycleState: 'lifecycleteststatus' + } as Partial as Component; + componentList.push(mockComponent1); + + const mockComponent2 = { + lifecycleState: 'CERTIFIED', + distributionStatus: 'DISTRIBUTED' + } as Partial as Component; + componentList.push(mockComponent2); + + entityFilterMock = { + selectedStatuses: ['lifecyclestatus', 'DISTRIBUTED'] + }; + let response: Array = entityFilterPipe.transform(componentList, entityFilterMock); + expect(response).toHaveLength(2); + expect(response[0]).toEqual(mockComponent); + expect(response[1]).toEqual(mockComponent2); + }); + + it('Transform method should filter objects by statuses and distributed matching with selected distributed', () => { + let componentList: Array = []; + const mockComponent = { + distributionStatus: 'diststatus' + } as Partial as Component; + componentList.push(mockComponent); + + const mockComponent1 = { + distributionStatus: 'testdiststatus' + } as Partial as Component; + componentList.push(mockComponent1); + + entityFilterMock = { + distributed: ['diststatus', 'localstatus'] + }; + let response: Array = entityFilterPipe.transform(componentList, entityFilterMock); + expect(response).toHaveLength(1); + expect(response[0]).toEqual(mockComponent); + }); + + it('Transform method should filter objects by model matching with selectedModels', () => { + let componentList: Array = []; + const mockComponent = { + model: 'testModel' + } as Partial as Component; + componentList.push(mockComponent); + + const mockComponent1 = { + model: 'testModelNegative' + } as Partial as Component; + componentList.push(mockComponent1); + + const mockComponent2 = { + distributionStatus: 'testdiststatus' + } as Partial as Component; + componentList.push(mockComponent2); + + entityFilterMock = { + selectedModels: ['testModel', 'localTest', 'SDC AID'] + }; + let response: Array = entityFilterPipe.transform(componentList, entityFilterMock); + expect(response).toHaveLength(2); + expect(response[0]).toEqual(mockComponent); + expect(response[1]).toEqual(mockComponent2); + }); + + it('Transform method should filter objects by custom search matching with given keys', () => { + let componentList: Array = []; + const mockComponent = { + distributionStatus: 'distributionStatus', + model: 'testModel' + } as Partial as Component; + componentList.push(mockComponent); + + const mockComponent1 = { + distributionStatus: 'testDiststatus', + model: 'mockModel' + } as Partial as Component; + componentList.push(mockComponent1); + + const searchFilter: ISearchFilter = { + distributionStatus: 'distributionStatus' + } + entityFilterMock = { + search: searchFilter + }; + let response: Array = entityFilterPipe.transform(componentList, entityFilterMock); + expect(response).toHaveLength(1); + expect(response[0]).toEqual(mockComponent); + }); + +}); diff --git a/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.ts b/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.ts index 29b21cb6da..e1b95212e4 100644 --- a/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.ts +++ b/catalog-ui/src/app/ng2/pipes/entity-filter.pipe.ts @@ -1,168 +1,170 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -import {Pipe, PipeTransform} from "@angular/core"; -import {Component, Resource} from "app/models"; -import {ComponentType, DEFAULT_MODEL_NAME} from "app/utils/constants"; - -export interface ISearchFilter { - [key:string]: string; -} - -export interface IEntityFilterObject { - // Types - selectedComponentTypes?:Array; - selectedResourceSubTypes?:Array; - // Categories - selectedCategoriesModel?:Array; - // Statuses - selectedStatuses?:Array; - // Models - selectedModels?:Array; - // distributed - distributed?:Array; - // search - search?:ISearchFilter; - -} - -@Pipe({name: 'entity-filter'}) -export class EntityFilterPipe implements PipeTransform{ - constructor() { - } - - public static transform(components:Array, filter:IEntityFilterObject) { - let filteredComponents:Array = components; - - // filter by type - // -------------------------------------------------------------------------- - if ((filter.selectedComponentTypes && filter.selectedComponentTypes.length > 0) || (filter.selectedResourceSubTypes && filter.selectedResourceSubTypes.length > 0)) { - let filteredTypes = []; - angular.forEach(components, (component:Component):void => { - // Filter by component type - let typeLower:string = component.componentType.toLowerCase(); - let typeFirstCapital:string = typeLower.charAt(0).toUpperCase() + typeLower.slice(1); - if (filter.selectedComponentTypes.indexOf(typeFirstCapital) !== -1) { - filteredTypes.push(component); - } - - // Filter by resource sub type, only in case the resource checkbox was not selected (because in this case we already added all the components in above section). - if (component.isResource() && filter.selectedComponentTypes.indexOf("Resource") === -1 && filter.selectedResourceSubTypes.length > 0) { - //filteredComponents.pop(); // Remove the last inserted component. - let resource:Resource = component; - if (filter.selectedResourceSubTypes.indexOf(resource.getComponentSubType()) !== -1) { - filteredTypes.push(component); - } - } - }); - filteredComponents = filteredTypes; - } - - // filter by categories & subcategories & groupings - // -------------------------------------------------------------------------- - if (filter.selectedCategoriesModel && filter.selectedCategoriesModel.length > 0) { - let filteredCategories = []; - angular.forEach(filteredComponents, (component:Component):void => { - let componentCategory = component.categoryNormalizedName + - ((component.subCategoryNormalizedName) ? '.' + component.subCategoryNormalizedName : ''); - if (component.componentType === ComponentType.RESOURCE) { - componentCategory = 'resourceNewCategory.' + componentCategory; - } else if (component.componentType === ComponentType.SERVICE) { - componentCategory = 'serviceNewCategory.' + componentCategory; - } - if (filter.selectedCategoriesModel.indexOf(componentCategory) !== -1) { - filteredCategories.push(component); - } - }); - filteredComponents = filteredCategories; - } - - // filter by statuses - // -------------------------------------------------------------------------- - if (filter.selectedStatuses && filter.selectedStatuses.length > 0) { - - let filteredStatuses = []; - angular.forEach(filteredComponents, (component:Component):void => { - if (filter.selectedStatuses.indexOf(component.lifecycleState) > -1) { - filteredStatuses.push(component); - } - //if status DISTRIBUTED && CERTIFIED are selected the component will added in CERTIFIED status , not need to add twice - if (filter.selectedStatuses.indexOf('DISTRIBUTED') > -1 && !(filter.selectedStatuses.indexOf('CERTIFIED') > -1)) { - if (component.distributionStatus && component.distributionStatus.indexOf('DISTRIBUTED') > -1 && component.lifecycleState.indexOf('CERTIFIED') > -1) { - filteredStatuses.push(component); - } - } - }); - filteredComponents = filteredStatuses; - } - - // filter by statuses and distributed - // -------------------------------------------------------------------------- - if (filter.distributed != undefined && filter.distributed.length > 0) { - let filterDistributed:Array = filter.distributed; - let filteredDistributed = []; - angular.forEach(filteredComponents, (entity) => { - filterDistributed.forEach((distribute) => { - let distributeItem = distribute.split(','); - distributeItem.forEach((item) => { - if (item !== undefined && entity.distributionStatus === item) { - filteredDistributed.push(entity); - } - }) - }); - }); - filteredComponents = filteredDistributed; - } - - // filter by model - // -------------------------------------------------------------------------- - if (filter.selectedModels && filter.selectedModels.length > 0) { - let filteredModels = []; - let allSelectedModels = [].concat.apply([], filter.selectedModels); - angular.forEach(filteredComponents, (component:Component):void => { - if (component.model && allSelectedModels.indexOf(component.model) > -1) { - filteredModels.push(component); - } else if (!component.model && allSelectedModels.indexOf(DEFAULT_MODEL_NAME) > -1) { - filteredModels.push(component); - } - }); - filteredComponents = filteredModels; - } - - // filter by search - // -------------------------------------------------------------------------- - if (filter.search != undefined) { - Object.keys(filter.search).forEach((searchKey) => { - let searchVal = filter.search[searchKey]; - if (searchVal) { - searchVal = searchVal.toLowerCase(); - filteredComponents = filteredComponents.filter((component:Component) => - component[searchKey].toLowerCase().indexOf(searchVal) !== -1); - } - }); - } - - return filteredComponents; - } - - public transform(components:Array, filter:IEntityFilterObject) { - return EntityFilterPipe.transform(components, filter); - } -} +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +import {Pipe, PipeTransform} from "@angular/core"; +import {Component, Resource} from "app/models"; +import {ComponentType, DEFAULT_MODEL_NAME} from "app/utils/constants"; + +export interface ISearchFilter { + [key:string]: string; +} + +const angular = require('angular'); + +export interface IEntityFilterObject { + // Types + selectedComponentTypes?:Array; + selectedResourceSubTypes?:Array; + // Categories + selectedCategoriesModel?:Array; + // Statuses + selectedStatuses?:Array; + // Models + selectedModels?:Array; + // distributed + distributed?:Array; + // search + search?:ISearchFilter; + +} + +@Pipe({name: 'entity-filter'}) +export class EntityFilterPipe implements PipeTransform{ + constructor() { + } + + public static transform(components:Array, filter:IEntityFilterObject) { + let filteredComponents:Array = components; + + // filter by type + // -------------------------------------------------------------------------- + if ((filter.selectedComponentTypes && filter.selectedComponentTypes.length > 0) || (filter.selectedResourceSubTypes && filter.selectedResourceSubTypes.length > 0)) { + let filteredTypes = []; + angular.forEach(components, (component:Component):void => { + // Filter by component type + let typeLower:string = component.componentType.toLowerCase(); + let typeFirstCapital:string = typeLower.charAt(0).toUpperCase() + typeLower.slice(1); + if (filter.selectedComponentTypes.indexOf(typeFirstCapital) !== -1) { + filteredTypes.push(component); + } + + // Filter by resource sub type, only in case the resource checkbox was not selected (because in this case we already added all the components in above section). + if (component.isResource() && filter.selectedComponentTypes.indexOf("Resource") === -1 && filter.selectedResourceSubTypes.length > 0) { + //filteredComponents.pop(); // Remove the last inserted component. + let resource:Resource = component; + if (filter.selectedResourceSubTypes.indexOf(resource.getComponentSubType()) !== -1) { + filteredTypes.push(component); + } + } + }); + filteredComponents = filteredTypes; + } + + // filter by categories & subcategories & groupings + // -------------------------------------------------------------------------- + if (filter.selectedCategoriesModel && filter.selectedCategoriesModel.length > 0) { + let filteredCategories = []; + angular.forEach(filteredComponents, (component:Component):void => { + let componentCategory = component.categoryNormalizedName + + ((component.subCategoryNormalizedName) ? '.' + component.subCategoryNormalizedName : ''); + if (component.componentType === ComponentType.RESOURCE) { + componentCategory = 'resourceNewCategory.' + componentCategory; + } else if (component.componentType === ComponentType.SERVICE) { + componentCategory = 'serviceNewCategory.' + componentCategory; + } + if (filter.selectedCategoriesModel.indexOf(componentCategory) !== -1) { + filteredCategories.push(component); + } + }); + filteredComponents = filteredCategories; + } + + // filter by statuses + // -------------------------------------------------------------------------- + if (filter.selectedStatuses && filter.selectedStatuses.length > 0) { + + let filteredStatuses = []; + angular.forEach(filteredComponents, (component:Component):void => { + if (filter.selectedStatuses.indexOf(component.lifecycleState) > -1) { + filteredStatuses.push(component); + } + //if status DISTRIBUTED && CERTIFIED are selected the component will added in CERTIFIED status , not need to add twice + if (filter.selectedStatuses.indexOf('DISTRIBUTED') > -1 && !(filter.selectedStatuses.indexOf('CERTIFIED') > -1)) { + if (component.distributionStatus && component.distributionStatus.indexOf('DISTRIBUTED') > -1 && component.lifecycleState.indexOf('CERTIFIED') > -1) { + filteredStatuses.push(component); + } + } + }); + filteredComponents = filteredStatuses; + } + + // filter by statuses and distributed + // -------------------------------------------------------------------------- + if (filter.distributed != undefined && filter.distributed.length > 0) { + let filterDistributed:Array = filter.distributed; + let filteredDistributed = []; + angular.forEach(filteredComponents, (entity) => { + filterDistributed.forEach((distribute) => { + let distributeItem = distribute.split(','); + distributeItem.forEach((item) => { + if (item !== undefined && entity.distributionStatus === item) { + filteredDistributed.push(entity); + } + }) + }); + }); + filteredComponents = filteredDistributed; + } + + // filter by model + // -------------------------------------------------------------------------- + if (filter.selectedModels && filter.selectedModels.length > 0) { + let filteredModels = []; + let allSelectedModels = [].concat.apply([], filter.selectedModels); + angular.forEach(filteredComponents, (component:Component):void => { + if (component.model && allSelectedModels.indexOf(component.model) > -1) { + filteredModels.push(component); + } else if (!component.model && allSelectedModels.indexOf(DEFAULT_MODEL_NAME) > -1) { + filteredModels.push(component); + } + }); + filteredComponents = filteredModels; + } + + // filter by search + // -------------------------------------------------------------------------- + if (filter.search != undefined) { + Object.keys(filter.search).forEach((searchKey) => { + let searchVal = filter.search[searchKey]; + if (searchVal) { + searchVal = searchVal.toLowerCase(); + filteredComponents = filteredComponents.filter((component:Component) => + component[searchKey].toLowerCase().indexOf(searchVal) !== -1); + } + }); + } + + return filteredComponents; + } + + public transform(components:Array, filter:IEntityFilterObject) { + return EntityFilterPipe.transform(components, filter); + } +} diff --git a/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.spec.ts b/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.spec.ts new file mode 100644 index 0000000000..92d5f2526d --- /dev/null +++ b/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.spec.ts @@ -0,0 +1,89 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ + +import { async } from "@angular/core/testing"; + +const Utils = require('./ng1-upgraded-provider'); + +describe('ng1-upgraded-provider', () => { + + let cacheObjMock: Partial; + beforeEach( + async(() => { + const responseData = { + 'Sdc.Services.DataTypesService': 'dataTypesService', + 'Sdc.Services.SharingService': 'sharingService', + 'Sdc.Services.ComponentFactory': 'componentFactory', + 'Sdc.Services.CookieService': 'cookieService', + '$state': 'state', + '$stateParams': 'stateParams', + '$scope': 'scope', + 'EventListenerService': 'eventListenerService', + 'Notification': 'notification', + 'ModalsHandler': 'modalsHandler' + }; + cacheObjMock = { + get: jest.fn().mockImplementation((input: string) => responseData[input]) + }; + }) + ); + + it('should return dataTypesService', () => { + expect(Utils.dataTypesServiceFactory(cacheObjMock)).toEqual('dataTypesService'); + }); + + it('should return sharingService', () => { + expect(Utils.sharingServiceFactory(cacheObjMock)).toEqual('sharingService'); + }); + + it('should return componentFactory', () => { + expect(Utils.componentServiceFactory(cacheObjMock)).toEqual('componentFactory'); + }); + + it('should return cookieService', () => { + expect(Utils.cookieServiceFactory(cacheObjMock)).toEqual('cookieService'); + }); + + it('should return state', () => { + expect(Utils.stateServiceFactory(cacheObjMock)).toEqual('state'); + }); + + it('should return stateParams', () => { + expect(Utils.stateParamsServiceFactory(cacheObjMock)).toEqual('stateParams'); + }); + + it('should return scope', () => { + expect(Utils.scopeServiceFactory(cacheObjMock)).toEqual('scope'); + }); + + it('should return eventListenerService', () => { + expect(Utils.eventListenerServiceServiceFactory(cacheObjMock)).toEqual('eventListenerService'); + }); + + it('should return notification service', () => { + expect(Utils.notificationServiceFactory(cacheObjMock)).toEqual('notification'); + }); + + it('should return modalsHandler', () => { + expect(Utils.ModalsHandlerFactory(cacheObjMock)).toEqual('modalsHandler'); + }); + +}); diff --git a/catalog-ui/src/app/ng2/utils/queue-service-utils.spec.ts b/catalog-ui/src/app/ng2/utils/queue-service-utils.spec.ts new file mode 100644 index 0000000000..fab046044f --- /dev/null +++ b/catalog-ui/src/app/ng2/utils/queue-service-utils.spec.ts @@ -0,0 +1,60 @@ +/* +* ============LICENSE_START======================================================= +* SDC +* ================================================================================ +* Copyright (C) 2022 Nordix Foundation. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* SPDX-License-Identifier: Apache-2.0 +* ============LICENSE_END========================================================= +*/ + +import { TestBed } from '@angular/core/testing'; +import { QueueServiceUtils } from './queue-service-utils' + +describe('QueueServiceUtils', () => { + let service: QueueServiceUtils; + let updateMock; + let updateParamMock; + let updateFunctMock; + + beforeEach(() => { + updateMock = jest.fn(); + updateParamMock = jest.fn(); + updateFunctMock = jest.fn(); + TestBed.configureTestingModule({ + imports: [], + providers: [QueueServiceUtils], + }); + service = TestBed.get(QueueServiceUtils); + }); + + it('QueueServiceUtils should be created', () => { + expect(service).toBeTruthy(); + }); + + it('function should be executed when added to queue using addNonBlockingUIAction', (doneCallback) => { + jest.setTimeout(1000); + service.addNonBlockingUIAction(() => { + doneCallback(); + }); + }); + + it('function should be executed when added to queue using addBlockingUIAction', (doneCallback) => { + jest.setTimeout(1000); + service.addBlockingUIAction(() => { + doneCallback(); + }); + }); + +}); -- cgit 1.2.3-korg