1 import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
2 import {getTestBed, TestBed} from "@angular/core/testing";
3 import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
4 import {VnfModelInfo} from "./vnf.model.info";
5 import {DynamicInputsService} from "../../dynamicInputs.service";
6 import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
7 import {VNFModel} from "../../../../../shared/models/vnfModel";
8 import {SharedTreeService} from "../../shared.tree.service";
9 import {NgRedux} from "@angular-redux/store";
10 import {AppState} from "../../../../../shared/store/reducers";
11 import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
12 import {DialogService} from "ng2-bootstrap-modal";
13 import {VfModulePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
14 import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
15 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
16 import {DuplicateService} from "../../../duplicate/duplicate.service";
17 import {IframeService} from "../../../../../shared/utils/iframe.service";
18 import {ServiceInfoService} from "../../../../../shared/server/serviceInfo/serviceInfo.service";
19 import {AuditInfoModalComponent} from "../../../../../shared/components/auditInfoModal/auditInfoModal.component";
20 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
21 import {ComponentInfoService} from "../../../component-info/component-info.service";
22 import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
23 import {HttpClient, HttpHandler} from "@angular/common/http";
24 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
25 import {VfModuleUpgradePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
27 class MockFeatureFlagsService extends FeatureFlagsService{
28 getAllFlags(): { [p: string]: boolean } {
33 describe('Vnf Model Info', () => {
35 let httpMock: HttpTestingController;
36 let _dynamicInputsService : DynamicInputsService;
37 let _sharedTreeService : SharedTreeService;
38 let _serviceInfoService: ServiceInfoService;
39 let _defaultDataGeneratorService : DefaultDataGeneratorService;
40 let _dialogService : DialogService;
41 let _vfModulePopupService : VfModulePopupService;
42 let _vfModuleUpgradePopupService : VfModuleUpgradePopupService;
43 let _vnfPopupService : VnfPopupService;
44 let _duplicateService : DuplicateService;
45 let _iframeService : IframeService;
46 let _componentInfoService : ComponentInfoService;
47 let _featureFlagsService : FeatureFlagsService;
49 let _store : NgRedux<AppState>;
50 let vnfModel: VnfModelInfo;
52 TestBed.configureTestingModule({
53 imports: [HttpClientTestingModule, NgReduxTestingModule],
59 VfModuleUpgradePopupService,
61 DefaultDataGeneratorService,
67 {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
70 }).compileComponents();
72 injector = getTestBed();
73 _sharedTreeService = injector.get(SharedTreeService);
74 _store = injector.get(NgRedux);
75 _featureFlagsService = injector.get(FeatureFlagsService);
77 vnfModel = new VnfModelInfo(
78 _dynamicInputsService,
80 _defaultDataGeneratorService,
83 _vfModulePopupService,
84 _vfModuleUpgradePopupService,
88 _componentInfoService,
95 test('VnfModelInfo should be defined', () => {
96 expect(VnfModelInfo).toBeDefined();
99 test('VnfModelInfo should defined extra details', () => {
100 expect(vnfModel.name).toEqual('vnfs');
101 expect(vnfModel.type).toEqual('VNF');
102 expect(vnfModel.childNames).toEqual(['vfModules']);
105 test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
106 let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming(<any>{
108 ecomp_generated_naming: 'true'
111 expect(isEcompGeneratedNaming).toBeTruthy();
114 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
115 let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
117 ecomp_generated_naming: 'false'
120 expect(isEcompGeneratedNaming).toBeFalsy();
123 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
124 let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
128 expect(isEcompGeneratedNaming).toBeFalsy();
132 test('getTooltip should return "VF"', () => {
133 let tooltip: string = vnfModel.getTooltip();
134 expect(tooltip).toEqual('VF');
137 test('getType should return "VF"', () => {
138 let tooltip: string = vnfModel.getType();
139 expect(tooltip).toEqual('VF');
142 test('getNextLevelObject should vfModule level object', () => {
143 let nextLevel: VFModuleModelInfo = vnfModel.getNextLevelObject();
144 expect(nextLevel.type).toEqual('Module');
147 test('getModel should return VNF model', () => {
148 expect(vnfModel.getModel({})).toBeInstanceOf(VNFModel);
151 test('showNodeIcons should return false if reachLimit of max', ()=>{
152 let serviceId : string = 'servicedId';
157 modelCustomizationId : "modelCustomizationId",
158 modelUniqueId: "modelCustomizationId"
161 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
167 modelCustomizationId : "modelCustomizationId",
169 modelCustomizationId : "modelCustomizationId"
181 'existingVNFCounterMap' : {
182 'modelCustomizationId' : 1
194 let result = vnfModel.showNodeIcons(<any>node, serviceId);
195 expect(result).toEqual(new AvailableNodeIcons(false , true));
198 test('showNodeIcons should return true if not reachLimit of max', ()=>{
199 let serviceId : string = 'servicedId';
206 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
208 drawingBoardStatus: "EDIT"
224 'existingVNFCounterMap' : {
237 let result = vnfModel.showNodeIcons(<any>node, serviceId);
238 expect(result).toEqual(new AvailableNodeIcons(true , false));
241 test('getNodeCount should return number of nodes', ()=>{
242 let serviceId : string = 'servicedId';
243 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
259 'existingVNFCounterMap' : {
260 'modelCustomizationId' : 1
264 'originalName' : 'vnfName'
276 modelCustomizationId : "modelCustomizationId",
277 modelUniqueId: "modelCustomizationId"
280 let result = vnfModel.getNodeCount(<any>node , serviceId);
281 expect(result).toEqual(1);
283 node.data.modelCustomizationId = 'vnfId_notExist';
284 node.data.modelUniqueId = 'vnfId_notExist';
285 result = vnfModel.getNodeCount(<any>node , serviceId);
286 expect(result).toEqual(0);
288 result = vnfModel.getNodeCount(<any>node , serviceId + '_notExist');
289 expect(result).toEqual(0);
292 test('getMenuAction: edit', ()=>{
293 let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vGeraldine 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vGeraldine 0:004","vnfStoreKey":"VF_vGeraldine 0:004","typeName":"VNF"};
294 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
295 let result = vnfModel.getMenuAction(<any>node, serviceModelId);
296 spyOn(result['edit'], 'method');
297 expect(result['edit']).toBeDefined();
298 expect(result['edit'].visible).toBeTruthy();
299 expect(result['edit'].enable).toBeTruthy();
300 result['edit']['method'](node, serviceModelId);
301 expect(result['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
304 test('member should defined edit method', () => {
307 "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
311 "name": "jlfBwIks283yKlCD8",
312 "modelName": "VF_vGeraldine 0",
314 "userProvidedNaming": false,
315 "networkStoreKey": "VF_vGeraldine 0:004",
316 "vnfStoreKey": "VF_vGeraldine 0:004",
322 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
324 let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
325 spyOn(menuActions['edit'], 'method');
326 expect(menuActions['edit']).toBeDefined();
327 expect(menuActions['edit'].visible(node)).toBeFalsy();
328 menuActions['edit']['method'](node, serviceModelId);
329 expect(menuActions['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
332 test('getMenuAction: duplicate', ()=>{
333 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
336 "type": "UPDATE_DRAWING_BOARD_STATUS",
337 "drawingBoardStatus": "CREATE"
342 "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
346 "name": "jlfBwIks283yKlCD8",
347 "modelName": "VF_vGeraldine 0",
349 "isEcompGeneratedNaming":true,
350 "networkStoreKey": "VF_vGeraldine 0:004",
351 "vnfStoreKey": "VF_vGeraldine 0:004",
357 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
358 let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
359 spyOn(menuActions['duplicate'], 'method');
360 expect(menuActions['duplicate']).toBeDefined();
361 expect(menuActions['duplicate'].visible(node)).toBeFalsy();
362 menuActions['duplicate']['method'](node, serviceModelId);
363 expect(menuActions['duplicate']['method']).toHaveBeenCalledWith(node, serviceModelId);
366 test('getMenuAction: remove', ()=>{
369 "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
373 "name": "jlfBwIks283yKlCD8",
374 "modelName": "VF_vGeraldine 0",
376 "isEcompGeneratedNaming":true,
377 "networkStoreKey": "VF_vGeraldine 0:004",
378 "vnfStoreKey": "VF_vGeraldine 0:004",
384 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
386 let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
387 spyOn(menuActions['remove'], 'method');
388 expect(menuActions['remove']).toBeDefined();
389 expect(menuActions['remove'].visible(node)).toBeFalsy();
390 menuActions['remove']['method'](node, serviceModelId);
391 expect(menuActions['remove']['method']).toHaveBeenCalledWith(node, serviceModelId);
394 test('getMenuAction: delete', ()=>{
395 let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vGeraldine 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vGeraldine 0:004","vnfStoreKey":"VF_vGeraldine 0:004","typeName":"VNF"};
396 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
397 let result = vnfModel.getMenuAction(<any>node, serviceModelId);
398 spyOn(result['delete'], 'method');
399 expect(result['delete']).toBeDefined();
400 expect(result['delete'].visible).toBeTruthy();
401 expect(result['delete'].enable).toBeTruthy();
402 result['delete']['method'](node, serviceModelId);
403 expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId);
407 test('getMenuAction: undoDelete', ()=>{
408 let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vGeraldine 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vGeraldine 0:004","vnfStoreKey":"VF_vGeraldine 0:004","typeName":"VNF"};
409 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
410 let result = vnfModel.getMenuAction(<any>node, serviceModelId);
411 spyOn(result['undoDelete'], 'method');
412 expect(result['undoDelete']).toBeDefined();
413 expect(result['undoDelete'].visible).toBeDefined();
414 expect(result['undoDelete'].enable).toBeDefined();
415 result['undoDelete']['method'](node, serviceModelId);
416 expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId);
419 test('getMenuAction: showAuditInfo', ()=>{
420 jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
422 jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
425 "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
428 "vnfStoreKey": "MSOTEST103a",
435 let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
436 let result = vnfModel.getMenuAction(<any>node, serviceModelId);
437 spyOn(result['showAuditInfo'], 'method');
438 expect(result['showAuditInfo']).toBeDefined();
439 expect(result['showAuditInfo'].visible(node)).toBeTruthy();
440 expect(result['showAuditInfo'].enable(node)).toBeTruthy();
441 result['showAuditInfo']['method'](node, serviceModelId);
445 test('Info for vnf should be correct', () => {
446 const model = getVNFModel();
447 const instance = getVNFInstance();
448 let actualVNFInfo = vnfModel.getInfo(model,instance);
449 let expectedVNFInfo = [
450 ModelInformationItem.createInstance('Min instances', "0"),
451 ModelInformationItem.createInstance('Max instances',"1"),
452 ModelInformationItem.createInstance('NF type',undefined),
453 ModelInformationItem.createInstance('NF role',undefined)
455 expect(actualVNFInfo).toEqual(expectedVNFInfo);
458 test('Info for vnf in left side - model only - should be correct', () => {
459 const model = getVNFModel();
460 let actualVNFInfo = vnfModel.getInfo(model,null);
461 let expectedVNFInfo = [
462 ModelInformationItem.createInstance('Min instances', "0"),
463 ModelInformationItem.createInstance('Max instances',"1")
465 expect(actualVNFInfo).toEqual(expectedVNFInfo);
468 test('When there is no max Max instances text is: Unlimited (default)', () => {
469 let actualVNFInfo = vnfModel.getInfo({just:"not empty"},null);
470 const maxInstancesItem = actualVNFInfo.find((item)=> item.label == 'Max instances');
471 expect(maxInstancesItem.values[0]).toEqual('Unlimited (default)');
474 function getVNFModel(){
476 "name":"VF_vGeraldine",
478 "description":"VSP_vGeraldine",
479 "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
480 "invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e",
483 "customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9",
484 "isEcompGeneratedNaming":true,
486 "modelCustomizationName":"VF_vGeraldine 0",
487 "vfcInstanceGroups":{},
489 "gpb2_Internal2_mac":"00:11:22:EF:AC:DF",
490 "sctp-a-ipv6-egress_rule_application":"any",
491 "sctp-b-ipv6-egress_src_start_port":"0",
492 "Internal2_allow_transit":"true",
493 "sctp-b-IPv6_ethertype":"IPv6",
494 "ncb2_Internal1_mac":"00:11:22:EF:AC:DF",
495 "sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass",
496 "sctp-a-egress_rule_application":"any",
497 "sctp-b-ipv6-ingress-src_start_port":"0.0",
498 "ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local",
499 "fsb_volume_size_0":"320.0",
500 "sctp-a-ipv6-ingress-dst_start_port":"0",
501 "sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any",
502 "domain_name":"default-domain",
503 "sctp-a-egress_src_addresses":"local",
504 "sctp-b-egress-src_start_port":"0.0",
505 "sctp-a-ingress_rule_protocol":"icmp",
506 "sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group",
507 "sctp-b-ipv6-ingress-dst_end_port":"65535",
508 "sctp-a-ingress_ethertype":"IPv4",
509 "sctp-a-egress-src_start_port":"0.0",
510 "sctp-b-dst_subnet_prefix_v6":"::",
511 "nf_naming":"{ecomp_generated_naming=true}",
512 "sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0"
518 function getVNFInstance(){
521 "instanceName":"4O61SmpFAdCm1oVEs",
522 "instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250",
524 "productFamilyId":null,
525 "lcpCloudRegionId":null,
528 "modelCustomizationName":"VF_vGeraldine 0",
529 "modelInvariantId":"vnf-instance-model-invariant-id",
530 "modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60",
533 "instanceType":"7538ifdSoTccmbEkr",
536 "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
537 "originalName":"VF_vGeraldine 0",
539 "lineOfBusiness":null,
541 "trackById":"VF_vGeraldine 0:004",
543 "vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1":{
544 "vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1:008":{
546 "instanceName":"ss820f_0918_db",
547 "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
548 "orchStatus":"deleted",
549 "productFamilyId":null,
550 "lcpCloudRegionId":null,
553 "modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1",
554 "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
555 "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
556 "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
557 "modelType":"vfModule"
562 "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
563 "originalName":"VfVgeraldine..vflorence_vlc..module-1",
565 "lineOfBusiness":null,
567 "trackById":"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1:008",
569 "volumeGroupName":null
572 "dc229cd8-c132-4455-8517-5c1787c18b14":{
573 "dc229cd8-c132-4455-8517-5c1787c18b14:009":{
575 "instanceName":"ss820f_0918_base",
576 "instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
577 "orchStatus":"Assigned",
578 "productFamilyId":null,
579 "lcpCloudRegionId":null,
582 "modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a",
583 "modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de",
584 "modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14",
585 "modelType":"vfModule"
590 "uuid":"dc229cd8-c132-4455-8517-5c1787c18b14",
593 "lineOfBusiness":null,
595 "trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009",
597 "volumeGroupName":null