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";
23 import {VfModuleTreeNode} from "../../../../../shared/models/vfModuleTreeNode";
25 class MockAppStore<T> {
29 'drawingBoardStatus': DrawingBoardModes.CREATE
35 describe('VFModule Model Info', () => {
37 let _dynamicInputsService : DynamicInputsService;
38 let _sharedTreeService : SharedTreeService;
39 let vfModuleModel: VFModuleModelInfo;
40 let _dialogService : DialogService;
41 let _vfModulePopupService : VfModulePopupService;
42 let _vfModuleUpgradePopupService : VfModuleUpgradePopupService;
43 let _iframeService : IframeService;
44 let _componentInfoService : ComponentInfoService;
45 let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService);
46 let mockFeatureFlagsServiceInstance: FeatureFlagsService = instance(mockFeatureFlagsService);
49 beforeAll(done => (async () => {
50 TestBed.configureTestingModule({
51 imports: [HttpClientTestingModule, NgReduxTestingModule],
56 VfModuleUpgradePopupService,
59 {provide: NgRedux, useClass: MockAppStore},
64 {provide: FeatureFlagsService, useValue: mockFeatureFlagsServiceInstance},
68 await TestBed.compileComponents();
70 injector = getTestBed();
71 _sharedTreeService = injector.get(SharedTreeService);
72 _componentInfoService = injector.get(ComponentInfoService);
73 vfModuleModel = new VFModuleModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vfModulePopupService, _vfModuleUpgradePopupService,
74 _iframeService, mockFeatureFlagsServiceInstance, MockNgRedux.getInstance(),_componentInfoService);
76 })().then(done).catch(done.fail));
80 test('VFModuleModelInfo should be defined', () => {
81 expect(VFModuleModelInfo).toBeDefined();
84 test('VnfModelInfo should defined extra details', () => {
85 expect(vfModuleModel.name).toEqual('vfModules');
86 expect(vfModuleModel.type).toEqual('Module');
89 test('isEcompGeneratedNaming should return true if vnf has isEcompGeneratedNaming is "true" ', () => {
90 let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
92 ecomp_generated_naming: 'true'
95 expect(isEcompGeneratedNaming).toBeTruthy();
98 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
99 let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
101 ecomp_generated_naming: 'false'
104 expect(isEcompGeneratedNaming).toBeFalsy();
107 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
108 let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
112 expect(isEcompGeneratedNaming).toBeFalsy();
116 test('getTooltip should return "VFModule"', () => {
117 let tooltip: string = vfModuleModel.getTooltip();
118 expect(tooltip).toEqual('VFmodule');
121 test('getType should return "VFModule"', () => {
122 let tooltip: string = vfModuleModel.getType();
123 expect(tooltip).toEqual('VFmodule');
126 test('getNextLevelObject should return null', () => {
127 let nextLevel = vfModuleModel.getNextLevelObject();
128 expect(nextLevel).toBeNull();
132 ['afterCompletion', 'afterCompletion'],
133 ['undefined', undefined]
135 test('createNode should return pauseInstantiation status %s', (description, pauseInstantiationStatus) => {
136 const modelName: string = "vfModuleModelName";
137 const vfModuleInstance = {
138 "vfModuleInstanceName": {
139 "pauseInstantiation": pauseInstantiationStatus,
142 const currentModel = {};
143 const parentModel = {};
144 const serviceModelId = "serviceModelId";
146 let actual: VfModuleTreeNode = vfModuleModel.createNode(<any>vfModuleInstance, <any>currentModel, <any>parentModel, modelName, 0, serviceModelId);
147 let expected: string = pauseInstantiationStatus;
148 expect(actual.pauseInstantiation).toEqual(expected);
151 test('getModel should return Module model', () => {
152 let model = vfModuleModel.getModel({
153 "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
154 "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
155 "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
157 "name": "2017488PasqualeVpe..PASQUALE_vRE_BV..module-1",
159 "modelCustomizationName": "2017488PasqualeVpe..PASQUALE_vRE_BV..module-1",
161 "minCountInstances": 2,
162 "maxCountInstances": 3,
164 "vfModuleLabel": "PASQUALE_vRE_BV",
168 "vnf_config_template_version": {
172 "volumeGroupAllowed": true
174 expect(model).toBeInstanceOf(VfModule);
175 expect(model.uuid).toEqual('25284168-24bb-4698-8cb4-3f509146eca5');
176 expect(model.min).toBe(2);
177 expect(model.max).toBe(3);
178 expect(model.baseModule).toBeFalsy();
179 expect(model.inputs).toEqual(
180 {"vnf_config_template_version": {
183 expect(model.volumeGroupAllowed).toBeTruthy();
186 test('showNodeIcons should return false false if reachLimit of max', ()=>{
187 let serviceId : string = 'servicedId';
200 _sharedTreeService.setSelectedVNF({
203 name : 'VfModuleName'
206 jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([]);
207 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
223 'existingVNFCounterMap' : {
236 let result = vfModuleModel.showNodeIcons(<any>node, serviceId);
237 expect(result).toEqual(new AvailableNodeIcons(false , false));
240 test('showNodeIcons should return true, false if reachLimit of max', ()=>{
244 modelUniqueId : 'vfModuleCustomizationId'
249 modelUniqueId : 'vnfCustomizationId'
253 jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName');
254 jest.spyOn(_sharedTreeService, 'modelUniqueId').mockReturnValue('vnfCustomizationId');
255 jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([{vnfStoreKey: 'vnfName'}]);
256 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
264 modelCustomizationId: 'vnfCustomizationId'
274 modelCustomizationId: 'vfModuleCustomizationId'
277 maxCountInstances : 2
285 'existingVNFCounterMap' : {
302 let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId');
303 expect(result).toEqual(new AvailableNodeIcons(true , false));
307 test('getOptionalVNFs should instance if exist', ()=>{
308 let serviceId : string = 'servicedId';
309 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
324 maxCountInstances : 2
332 'existingVNFCounterMap' : {
337 'originalName' : 'vnfName',
353 name : 'vfModuleName'
362 let result = vfModuleModel.getOptionalVNFs(serviceId , 'vnfName');
363 expect(result.length).toEqual(1);
366 test('getNodeCount should return number of nodes', ()=>{
367 let serviceId : string = 'servicedId';
368 let vfModuleModelUniqueId = 'vfModuleCustomizationId';
369 jest.spyOn(_sharedTreeService, 'modelUniqueId').mockReturnValue(vfModuleModelUniqueId);
370 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
378 modelCustomizationId: 'vnfCustomizationId'
388 modelCustomizationId: vfModuleModelUniqueId
391 maxCountInstances : 2
399 'existingVNFCounterMap' : {
405 'originalName' : 'vnfName',
408 'vnfModuleName_111': {
411 modelCustomizationId : vfModuleModelUniqueId
414 'vnfModuleName_111_1': {
417 modelCustomizationId : vfModuleModelUniqueId
425 'originalName' : 'vnfName',
428 'vnfModuleName_111': {
431 modelCustomizationId : vfModuleModelUniqueId
434 'vnfModuleName_111_1': {
437 modelCustomizationId : vfModuleModelUniqueId
452 modelUniqueId: vfModuleModelUniqueId,
458 modelUniqueId: 'vnfCustomizationId',
463 let result = vfModuleModel.getNodeCount(<any>node , serviceId);
464 expect(result).toEqual(2);
468 test('getNodeCount should return number of nodes : there is selectedVNF', ()=>{
469 let serviceId : string = 'servicedId';
470 let vfModuleModelUniqueId = 'vfModuleCustomizationId';
471 jest.spyOn(_sharedTreeService, 'modelUniqueId').mockReturnValue(vfModuleModelUniqueId);
472 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
487 maxCountInstances : 2
495 'existingVNFCounterMap' : {
501 'originalName' : 'vnfName',
504 'vnfModuleName_111': {
507 modelCustomizationId : vfModuleModelUniqueId
510 'vnfModuleName_111_1': {
513 modelCustomizationId : vfModuleModelUniqueId
521 'originalName' : 'vnfName',
524 'vnfModuleName_111': {
527 modelCustomizationId: vfModuleModelUniqueId
538 jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName_1');
543 modelUniqueId: vfModuleModelUniqueId,
549 modelUniqueId: 'vnfCustomizationId',
554 let result = vfModuleModel.getNodeCount(<any>node , serviceId);
555 expect(result).toEqual(1);
559 test('onClickAdd should open message box if no vnfStoreKey', ()=>{
560 jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue(null);
561 jest.spyOn(vfModuleModel, 'getDefaultVNF').mockReturnValue(null);
562 jest.spyOn(MessageBoxService.openModal, 'next');
563 vfModuleModel.onClickAdd(<any>{}, 'serviceId');
564 expect(MessageBoxService.openModal.next).toHaveBeenCalled();
567 test('getMenuAction: showAuditInfoVfModule', ()=>{
568 jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
572 "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
577 let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
578 let result = vfModuleModel.getMenuAction(<any>node, serviceModelId);
579 spyOn(result['showAuditInfo'], 'method');
580 expect(result['showAuditInfo']).toBeDefined();
581 expect(result['showAuditInfo'].visible(node)).toBeTruthy();
582 expect(result['showAuditInfo'].enable(node)).toBeTruthy();
583 result['showAuditInfo']['method'](node, serviceModelId);
584 expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
587 test('Info for vfModule should be correct', () => {
588 const model = getVFModule();
589 const instance = getVFModuleInstance();
590 let actualVNFInfo = vfModuleModel.getInfo(model,instance);
591 let expectedVNFInfo = [
592 ModelInformationItem.createInstance('Base module', false),
593 ModelInformationItem.createInstance('Min instances', "0"),
594 ModelInformationItem.createInstance("Max instances", 'Unlimited (default)'),
595 ModelInformationItem.createInstance('Initial instances count',"0")
597 expect(actualVNFInfo).toEqual(expectedVNFInfo);
601 ["maxCountInstances 3, currentNodeCount 1, flag on",{maxCountInstances:3}, 1, {FLAG_2002_UNLIMITED_MAX: true}, false],
602 ["maxCountInstances 3, currentNodeCount 3, flag on",{maxCountInstances:3}, 3, {FLAG_2002_UNLIMITED_MAX: true}, true],
603 ["no maxCountInstances, currentNodeCount 0, flag off",{}, 0, {FLAG_2002_UNLIMITED_MAX: false}, false],
604 ["no maxCountInstances, currentNodeCount 1, flag off",{}, 1, {FLAG_2002_UNLIMITED_MAX: false}, true],
605 ["no maxCountInstances, currentNodeCount 1, no flags",{}, 1, null, true],
606 ["no maxCountInstances, currentNodeCount 0, flag on",{}, 0, {FLAG_2002_UNLIMITED_MAX: true}, false],
607 ["no maxCountInstances, currentNodeCount 1, flag on",{}, 1, {FLAG_2002_UNLIMITED_MAX: true}, false],
608 ["no maxCountInstances, currentNodeCount 1000, flag on",{}, 1000, {FLAG_2002_UNLIMITED_MAX: true}, false],
609 ]).test('isVFModuleReachedLimit: %s', (desc, properties, currentNodeCount, flags, expected) => {
611 const node = { data: {
612 name : 'vfModuleName'
615 const serviceHierarchy = {
622 when(mockFeatureFlagsService.getAllFlags()).thenReturn(flags);
624 expect(vfModuleModel.isVFModuleReachedLimit(node, serviceHierarchy, 'servicedId', currentNodeCount)).toEqual(expected);
627 function getVFModule(): Partial<VfModule>{
629 "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
630 "invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b",
631 "customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091",
633 "name":"VfVgeraldine..vflorence_vlc..module-1",
635 "modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1",
641 "volumeGroupAllowed":false
645 function getVFModuleInstance() {
648 "instanceName":"ss820f_0918_db",
649 "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
650 "orchStatus":"deleted",
651 "productFamilyId":null,
652 "lcpCloudRegionId":null,
655 "modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1",
656 "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
657 "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
658 "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
659 "modelType":"vfModule"
664 "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
665 "originalName":"VfVgeraldine..vflorence_vlc..module-1",
667 "lineOfBusiness":null,
669 "trackById":"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1:008",
671 "volumeGroupName":null