import { TestBed } from '@angular/core/testing'; import { SdcUiServices } from 'onap-ui-angular'; import { Observable } from 'rxjs/Rx'; import CollectionNodes = Cy.CollectionNodes; import { Mock } from 'ts-mockery'; import { ComponentInstance } from '../../../../../models'; import { ComponentMetadata } from '../../../../../models/component-metadata'; import { Resource } from '../../../../../models/components/resource'; import { CompositionCiNodeCp } from '../../../../../models/graph/nodes/composition-graph-nodes/composition-ci-node-cp'; import { CompositionCiNodeVl } from '../../../../../models/graph/nodes/composition-graph-nodes/composition-ci-node-vl'; import { EventListenerService } from '../../../../../services'; import CollectionEdges = Cy.CollectionEdges; import { GRAPH_EVENTS } from '../../../../../utils/constants'; import { ServiceServiceNg2 } from '../../../../services/component-services/service.service'; import { TopologyTemplateService } from '../../../../services/component-services/topology-template.service'; import { ComponentGenericResponse } from '../../../../services/responses/component-generic-response'; import { QueueServiceUtils } from '../../../../utils/queue-service-utils'; import { WorkspaceService } from '../../../workspace/workspace.service'; import { CompositionService } from '../../composition.service'; import { CommonGraphUtils } from '../common/common-graph-utils'; import { CompositionGraphGeneralUtils } from './composition-graph-general-utils'; import { CompositionGraphNodesUtils } from './composition-graph-nodes-utils'; describe('composition graph nodes utils', () => { const CP_TO_DELETE_ID = 'cp1'; const VL_TO_DELETE_ID = 'vl'; const CP2_ID = 'cp2'; let loaderServiceMock: Partial; let service: CompositionGraphNodesUtils; let topologyServiceMock: TopologyTemplateService; let queueServiceMock: QueueServiceUtils; let workspaceServiceMock: WorkspaceService; let compositionServiceMock: CompositionService; let eventListenerServiceMock: EventListenerService; const cpInstanceMock: ComponentInstance = Mock.of({ uniqueId: CP_TO_DELETE_ID, isVl: () => false }); const vlInstanceMock: ComponentInstance = Mock.of({ uniqueId: VL_TO_DELETE_ID, isVl: () => true }); const cp2InstanceMock: ComponentInstance = Mock.of({ uniqueId: CP2_ID, isVl: () => false }); const cyMock = Mock.of({ remove: jest.fn(), collection: jest.fn() }); const serviceServiceMock = Mock.of({ getComponentCompositionData : () => Observable.of(Mock.of()) }); // Instances on the graph cp, vl, cp2 const cp = Mock.from({ id: CP_TO_DELETE_ID, componentInstance: cpInstanceMock }); const vl = Mock.from({ id: VL_TO_DELETE_ID, componentInstance: vlInstanceMock }); const cp2 = Mock.from({ id: CP2_ID, componentInstance: cp2InstanceMock }); beforeEach(() => { loaderServiceMock = { activate: jest.fn(), deactivate: jest.fn() }; topologyServiceMock = Mock.of({ deleteComponentInstance : () => Observable.of(cpInstanceMock) }); queueServiceMock = Mock.of({ addBlockingUIAction : ( (f) => f() ) }); workspaceServiceMock = Mock.of({ metadata: Mock.of( { uniqueId: 'topologyTemplateUniqueId' } ) }); compositionServiceMock = Mock.of({ deleteComponentInstance : jest.fn() }); eventListenerServiceMock = Mock.of({ notifyObservers : jest.fn() }); TestBed.configureTestingModule({ imports: [], providers: [ CompositionGraphNodesUtils, {provide: WorkspaceService, useValue: workspaceServiceMock}, {provide: TopologyTemplateService, useValue: topologyServiceMock}, {provide: CompositionService, useValue: compositionServiceMock}, {provide: CompositionGraphGeneralUtils, useValue: {}}, {provide: CommonGraphUtils, useValue: {}}, {provide: EventListenerService, useValue: eventListenerServiceMock}, {provide: QueueServiceUtils, useValue: queueServiceMock}, {provide: ServiceServiceNg2, useValue: serviceServiceMock}, {provide: SdcUiServices.LoaderService, useValue: loaderServiceMock} ] }); service = TestBed.get(CompositionGraphNodesUtils); }); it('When a CP is deleted which is connected to a VL that has another leg to another CP, the VL is deleted as well', () => { // Prepare a VL that is connected to both CP and CP2 const vlToDelete = Mock.of({ data: () => vl, connectedEdges: () => Mock.of({ length: 2, connectedNodes: () => [cp, cp2] as CollectionNodes }) }); // Prepare a CP which is connected to a VL const cpToDelete = Mock.of({ data: () => cp, connectedEdges: () => Mock.of({ length: 1, connectedNodes: () => [vlToDelete] as CollectionNodes }) }); service.deleteNode(cyMock, Mock.of(), cpToDelete); expect(compositionServiceMock.deleteComponentInstance).toHaveBeenCalledWith(CP_TO_DELETE_ID); expect(eventListenerServiceMock.notifyObservers).toHaveBeenCalledWith(GRAPH_EVENTS.ON_DELETE_COMPONENT_INSTANCE, VL_TO_DELETE_ID); expect(eventListenerServiceMock.notifyObservers).toHaveBeenLastCalledWith(GRAPH_EVENTS.ON_DELETE_COMPONENT_INSTANCE_SUCCESS, CP_TO_DELETE_ID); expect(cyMock.remove).toHaveBeenCalled(); }); it('When a CP is deleted which is solely connected to another VL the VL is not deleted', () => { // Prepare a VL that is connected only to 1 CP const vlToDelete = Mock.of({ data: () => vl, connectedEdges: () => Mock.of({ length: 1, connectedNodes: () => [cp] as CollectionNodes }) }); // Prepare a CP which is connected to a VL const cpToDelete = Mock.of({ data: () => cp, connectedEdges: () => Mock.of({ length: 1, connectedNodes: () => [vlToDelete] as CollectionNodes }) }); service.deleteNode(cyMock, Mock.of(), cpToDelete); expect(compositionServiceMock.deleteComponentInstance).toHaveBeenCalledWith(CP_TO_DELETE_ID); expect(eventListenerServiceMock.notifyObservers).toHaveBeenLastCalledWith(GRAPH_EVENTS.ON_DELETE_COMPONENT_INSTANCE_SUCCESS, CP_TO_DELETE_ID); expect(eventListenerServiceMock.notifyObservers).toHaveBeenCalledTimes(1); expect(cyMock.remove).toHaveBeenCalled(); }); });