summaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/ng2/pages/composition/graph/utils/composition-graph-nodes-utils.spec.ts
blob: 9dcc47f7cc33a7455f985212e3f43066f387c1ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highligh
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<SdcUiServices.LoaderService>;
    let service: CompositionGraphNodesUtils;
    let topologyServiceMock: TopologyTemplateService;
    let queueServiceMock: QueueServiceUtils;
    let workspaceServiceMock: WorkspaceService;
    let compositionServiceMock: CompositionService;
    let eventListenerServiceMock: EventListenerService;
    const cpInstanceMock: ComponentInstance = Mock.of<ComponentInstance>({
        uniqueId: CP_TO_DELETE_ID,
        isVl: () => false
    });
    const vlInstanceMock: ComponentInstance = Mock.of<ComponentInstance>({
        uniqueId: VL_TO_DELETE_ID,
        isVl: () => true
    });
    const cp2InstanceMock: ComponentInstance = Mock.of<ComponentInstance>({
        uniqueId: CP2_ID,
        isVl: () => false
    });

    const cyMock = Mock.of<Cy.Instance>({
        remove: jest.fn(),
        collection: jest.fn()
    });

    const serviceServiceMock = Mock.of<ServiceServiceNg2>({
        getComponentCompositionData : () => Observable.of(Mock.of<ComponentGenericResponse>())
    });

    // Instances on the graph cp, vl, cp2
    const cp = Mock.from<CompositionCiNodeCp>({ id: CP_TO_DELETE_ID, componentInstance: cpInstanceMock });
    const vl = Mock.from<CompositionCiNodeVl>({ id: VL_TO_DELETE_ID, componentInstance: vlInstanceMock });
    const cp2 = Mock.from<CompositionCiNodeCp>({ id: CP2_ID, componentInstance: cp2InstanceMock });

    beforeEach(() => {

        loaderServiceMock = {
            activate: jest.fn(),
            deactivate: jest.fn()
        };

        topologyServiceMock = Mock.of<TopologyTemplateService>({
            deleteComponentInstance : () => Observable.of(cpInstanceMock)
        });

        queueServiceMock = Mock.of<QueueServiceUtils>({
            addBlockingUIAction : ( (f) => f() )
        });

        workspaceServiceMock = Mock.of<WorkspaceService>({
            metadata: Mock.of<ComponentMetadata>( { uniqueId: 'topologyTemplateUniqueId' } )
        });

        compositionServiceMock = Mock.of<CompositionService>({
            deleteComponentInstance : jest.fn()
        });

        eventListenerServiceMock = Mock.of<EventListenerService>({
            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<CollectionNodes>({
            data:  () => vl,
            connectedEdges: () => Mock.of<CollectionEdges>({
                length: 2,
                connectedNodes: () => [cp, cp2] as CollectionNodes
            })
        });

        // Prepare a CP which is connected to a VL
        const cpToDelete = Mock.of<CollectionNodes>({
            data:  () => cp,
            connectedEdges: () => Mock.of<CollectionEdges>({
                length: 1,
                connectedNodes: () => [vlToDelete] as CollectionNodes
            })
        });
        service.deleteNode(cyMock, Mock.of<Resource>(), 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<CollectionNodes>({
            data:  () => vl,
            connectedEdges: () => Mock.of<CollectionEdges>({
                length: 1,
                connectedNodes: () => [cp] as CollectionNodes
            })
        });

        // Prepare a CP which is connected to a VL
        const cpToDelete = Mock.of<CollectionNodes>({
            data:  () => cp,
            connectedEdges: () => Mock.of<CollectionEdges>({
                length: 1,
                connectedNodes: () => [vlToDelete] as CollectionNodes
            })
        });
        service.deleteNode(cyMock, Mock.of<Resource>(), 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();
    });
});