1 import {HttpClientTestingModule} from "@angular/common/http/testing";
2 import {getTestBed, TestBed} from "@angular/core/testing";
3 import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
4 import {VFModuleModelInfo} from "./vfModule.model.info";
5 import {DynamicInputsService} from "../../dynamicInputs.service";
6 import {SharedTreeService} from "../../shared.tree.service";
7 import {VfModulePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
8 import {DialogService} from "ng2-bootstrap-modal";
9 import {NgRedux} from "@angular-redux/store";
10 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
11 import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
12 import {DrawingBoardModes} from "../../../drawing-board.modes";
13 import {IframeService} from "../../../../../shared/utils/iframe.service";
14 import {ComponentInfoService} from "../../../component-info/component-info.service";
15 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
16 import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
17 import {HttpClient, HttpHandler} from "@angular/common/http";
18 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
19 import {VfModuleUpgradePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
20 import {instance, mock, when} from "ts-mockito";
21 import each from "jest-each";
22 import {VfModule} from "../../../../../shared/models/vfModule";
24 class MockAppStore<T> {
28 'drawingBoardStatus': DrawingBoardModes.CREATE
34 describe('VFModule Model Info', () => {
36 let _dynamicInputsService : DynamicInputsService;
37 let _sharedTreeService : SharedTreeService;
38 let vfModuleModel: VFModuleModelInfo;
39 let _dialogService : DialogService;
40 let _vfModulePopupService : VfModulePopupService;
41 let _vfModuleUpgradePopupService : VfModuleUpgradePopupService;
42 let _iframeService : IframeService;
43 let _componentInfoService : ComponentInfoService;
44 let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService);
45 let mockFeatureFlagsServiceInstance: FeatureFlagsService = instance(mockFeatureFlagsService);
48 beforeAll(done => (async () => {
49 TestBed.configureTestingModule({
50 imports: [HttpClientTestingModule, NgReduxTestingModule],
55 VfModuleUpgradePopupService,
58 {provide: NgRedux, useClass: MockAppStore},
63 {provide: FeatureFlagsService, useValue: mockFeatureFlagsServiceInstance},
67 await TestBed.compileComponents();
69 injector = getTestBed();
70 _sharedTreeService = injector.get(SharedTreeService);
71 _componentInfoService = injector.get(ComponentInfoService);
72 vfModuleModel = new VFModuleModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vfModulePopupService, _vfModuleUpgradePopupService,
73 _iframeService, mockFeatureFlagsServiceInstance, MockNgRedux.getInstance(),_componentInfoService);
75 })().then(done).catch(done.fail));
79 test('VFModuleModelInfo should be defined', () => {
80 expect(VFModuleModelInfo).toBeDefined();
83 test('VnfModelInfo should defined extra details', () => {
84 expect(vfModuleModel.name).toEqual('vfModules');
85 expect(vfModuleModel.type).toEqual('Module');
88 test('isEcompGeneratedNaming should return true if vnf has isEcompGeneratedNaming is "true" ', () => {
89 let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
91 ecomp_generated_naming: 'true'
94 expect(isEcompGeneratedNaming).toBeTruthy();
97 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
98 let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
100 ecomp_generated_naming: 'false'
103 expect(isEcompGeneratedNaming).toBeFalsy();
106 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
107 let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
111 expect(isEcompGeneratedNaming).toBeFalsy();
115 test('getTooltip should return "VFModule"', () => {
116 let tooltip: string = vfModuleModel.getTooltip();
117 expect(tooltip).toEqual('VFmodule');
120 test('getType should return "VFModule"', () => {
121 let tooltip: string = vfModuleModel.getType();
122 expect(tooltip).toEqual('VFmodule');
125 test('getNextLevelObject should return null', () => {
126 let nextLevel = vfModuleModel.getNextLevelObject();
127 expect(nextLevel).toBeNull();
130 test('getModel should return Module model', () => {
131 let model = vfModuleModel.getModel({
132 "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
133 "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
134 "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
136 "name": "2017488PasqualeVpe..PASQUALE_vRE_BV..module-1",
138 "modelCustomizationName": "2017488PasqualeVpe..PASQUALE_vRE_BV..module-1",
140 "minCountInstances": 2,
141 "maxCountInstances": 3,
143 "vfModuleLabel": "PASQUALE_vRE_BV",
147 "vnf_config_template_version": {
151 "volumeGroupAllowed": true
153 expect(model).toBeInstanceOf(VfModule);
154 expect(model.uuid).toEqual('25284168-24bb-4698-8cb4-3f509146eca5');
155 expect(model.min).toBe(2);
156 expect(model.max).toBe(3);
157 expect(model.baseModule).toBeFalsy();
158 expect(model.inputs).toEqual(
159 {"vnf_config_template_version": {
162 expect(model.volumeGroupAllowed).toBeTruthy();
165 test('showNodeIcons should return false false if reachLimit of max', ()=>{
166 let serviceId : string = 'servicedId';
179 _sharedTreeService.setSelectedVNF({
182 name : 'VfModuleName'
185 jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([]);
186 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
202 'existingVNFCounterMap' : {
215 let result = vfModuleModel.showNodeIcons(<any>node, serviceId);
216 expect(result).toEqual(new AvailableNodeIcons(false , false));
219 test('showNodeIcons should return true, false if reachLimit of max', ()=>{
223 modelUniqueId : 'vfModuleCustomizationId'
228 modelUniqueId : 'vnfCustomizationId'
232 jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName');
233 jest.spyOn(_sharedTreeService, 'modelUniqueId').mockReturnValue('vnfCustomizationId');
234 jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([{vnfStoreKey: 'vnfName'}]);
235 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
243 modelCustomizationId: 'vnfCustomizationId'
253 modelCustomizationId: 'vfModuleCustomizationId'
256 maxCountInstances : 2
264 'existingVNFCounterMap' : {
281 let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId');
282 expect(result).toEqual(new AvailableNodeIcons(true , false));
286 test('getOptionalVNFs should instance if exist', ()=>{
287 let serviceId : string = 'servicedId';
288 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
303 maxCountInstances : 2
311 'existingVNFCounterMap' : {
316 'originalName' : 'vnfName',
332 name : 'vfModuleName'
341 let result = vfModuleModel.getOptionalVNFs(serviceId , 'vnfName');
342 expect(result.length).toEqual(1);
345 test('getNodeCount should return number of nodes', ()=>{
346 let serviceId : string = 'servicedId';
347 let vfModuleModelUniqueId = 'vfModuleCustomizationId';
348 jest.spyOn(_sharedTreeService, 'modelUniqueId').mockReturnValue(vfModuleModelUniqueId);
349 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
357 modelCustomizationId: 'vnfCustomizationId'
367 modelCustomizationId: vfModuleModelUniqueId
370 maxCountInstances : 2
378 'existingVNFCounterMap' : {
384 'originalName' : 'vnfName',
387 'vnfModuleName_111': {
390 modelCustomizationId : vfModuleModelUniqueId
393 'vnfModuleName_111_1': {
396 modelCustomizationId : vfModuleModelUniqueId
404 'originalName' : 'vnfName',
407 'vnfModuleName_111': {
410 modelCustomizationId : vfModuleModelUniqueId
413 'vnfModuleName_111_1': {
416 modelCustomizationId : vfModuleModelUniqueId
431 modelUniqueId: vfModuleModelUniqueId,
437 modelUniqueId: 'vnfCustomizationId',
442 let result = vfModuleModel.getNodeCount(<any>node , serviceId);
443 expect(result).toEqual(2);
447 test('getNodeCount should return number of nodes : there is selectedVNF', ()=>{
448 let serviceId : string = 'servicedId';
449 let vfModuleModelUniqueId = 'vfModuleCustomizationId';
450 jest.spyOn(_sharedTreeService, 'modelUniqueId').mockReturnValue(vfModuleModelUniqueId);
451 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
466 maxCountInstances : 2
474 'existingVNFCounterMap' : {
480 'originalName' : 'vnfName',
483 'vnfModuleName_111': {
486 modelCustomizationId : vfModuleModelUniqueId
489 'vnfModuleName_111_1': {
492 modelCustomizationId : vfModuleModelUniqueId
500 'originalName' : 'vnfName',
503 'vnfModuleName_111': {
506 modelCustomizationId: vfModuleModelUniqueId
517 jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName_1');
522 modelUniqueId: vfModuleModelUniqueId,
528 modelUniqueId: 'vnfCustomizationId',
533 let result = vfModuleModel.getNodeCount(<any>node , serviceId);
534 expect(result).toEqual(1);
538 test('onClickAdd should open message box if no vnfStoreKey', ()=>{
539 jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue(null);
540 jest.spyOn(vfModuleModel, 'getDefaultVNF').mockReturnValue(null);
541 jest.spyOn(MessageBoxService.openModal, 'next');
542 vfModuleModel.onClickAdd(<any>{}, 'serviceId');
543 expect(MessageBoxService.openModal.next).toHaveBeenCalled();
546 test('getMenuAction: showAuditInfoVfModule', ()=>{
547 jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
551 "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
556 let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
557 let result = vfModuleModel.getMenuAction(<any>node, serviceModelId);
558 spyOn(result['showAuditInfo'], 'method');
559 expect(result['showAuditInfo']).toBeDefined();
560 expect(result['showAuditInfo'].visible(node)).toBeTruthy();
561 expect(result['showAuditInfo'].enable(node)).toBeTruthy();
562 result['showAuditInfo']['method'](node, serviceModelId);
563 expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
566 test('Info for vfModule should be correct', () => {
567 const model = getVFModule();
568 const instance = getVFModuleInstance();
569 let actualVNFInfo = vfModuleModel.getInfo(model,instance);
570 let expectedVNFInfo = [
571 ModelInformationItem.createInstance('Base module', false),
572 ModelInformationItem.createInstance('Min instances', "0"),
573 ModelInformationItem.createInstance("Max instances", 'Unlimited (default)'),
574 ModelInformationItem.createInstance('Initial instances count',"0")
576 expect(actualVNFInfo).toEqual(expectedVNFInfo);
580 ["maxCountInstances 3, currentNodeCount 1, flag on",{maxCountInstances:3}, 1, {FLAG_2002_UNLIMITED_MAX: true}, false],
581 ["maxCountInstances 3, currentNodeCount 3, flag on",{maxCountInstances:3}, 3, {FLAG_2002_UNLIMITED_MAX: true}, true],
582 ["no maxCountInstances, currentNodeCount 0, flag off",{}, 0, {FLAG_2002_UNLIMITED_MAX: false}, false],
583 ["no maxCountInstances, currentNodeCount 1, flag off",{}, 1, {FLAG_2002_UNLIMITED_MAX: false}, true],
584 ["no maxCountInstances, currentNodeCount 1, no flags",{}, 1, null, true],
585 ["no maxCountInstances, currentNodeCount 0, flag on",{}, 0, {FLAG_2002_UNLIMITED_MAX: true}, false],
586 ["no maxCountInstances, currentNodeCount 1, flag on",{}, 1, {FLAG_2002_UNLIMITED_MAX: true}, false],
587 ["no maxCountInstances, currentNodeCount 1000, flag on",{}, 1000, {FLAG_2002_UNLIMITED_MAX: true}, false],
588 ]).test('isVFModuleReachedLimit: %s', (desc, properties, currentNodeCount, flags, expected) => {
590 const node = { data: {
591 name : 'vfModuleName'
594 const serviceHierarchy = {
601 when(mockFeatureFlagsService.getAllFlags()).thenReturn(flags);
603 expect(vfModuleModel.isVFModuleReachedLimit(node, serviceHierarchy, 'servicedId', currentNodeCount)).toEqual(expected);
606 function getVFModule(): Partial<VfModule>{
608 "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
609 "invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b",
610 "customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091",
612 "name":"VfVgeraldine..vflorence_vlc..module-1",
614 "modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1",
620 "volumeGroupAllowed":false
624 function getVFModuleInstance() {
627 "instanceName":"ss820f_0918_db",
628 "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
629 "orchStatus":"deleted",
630 "productFamilyId":null,
631 "lcpCloudRegionId":null,
634 "modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1",
635 "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
636 "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
637 "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
638 "modelType":"vfModule"
643 "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
644 "originalName":"VfVgeraldine..vflorence_vlc..module-1",
646 "lineOfBusiness":null,
648 "trackById":"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1:008",
650 "volumeGroupName":null