1 import {DuplicateService} from './duplicate.service';
2 import {LogService} from '../../../shared/utils/log/log.service';
3 import {NgRedux} from '@angular-redux/store';
4 import {ITreeNode} from "angular-tree-component/dist/defs/api";
5 import {AppState} from "../../../shared/store/reducers";
6 import {getTestBed, TestBed} from "@angular/core/testing";
7 import {FeatureFlagsService} from "../../../shared/services/featureFlag/feature-flags.service";
8 import {SharedTreeService} from "../objectsToTree/shared.tree.service";
9 import {IModalConfig} from "../../../shared/components/customModal/models/modal.model";
10 import {ModalService} from "../../../shared/components/customModal/services/modal.service";
12 class MockAppStore<T> {
40 existingVNFCounterMap : {
55 class MockModalService<T> {}
57 class MockFeatureFlagsService extends FeatureFlagsService{
58 getAllFlags(): { [p: string]: boolean } {
63 describe('Drawing board tree service', () => {
65 let service: DuplicateService;
66 let store : NgRedux<AppState>;
67 let featureFlagsService : FeatureFlagsService;
68 beforeAll(done => (async () => {
69 TestBed.configureTestingModule({
74 {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
75 {provide: NgRedux, useClass: MockAppStore},
76 {provide: ModalService, useClass: MockModalService}
79 await TestBed.compileComponents();
81 injector = getTestBed();
82 service = injector.get(DuplicateService);
83 store = injector.get(NgRedux);
84 featureFlagsService = injector.get(FeatureFlagsService);
86 })().then(done).catch(done.fail));
89 test('setNumberOfDuplicates should set number of duplicates', ()=>{
90 service.setNumberOfDuplicates(10);
91 expect(service.numberOfDuplicates).toEqual(10);
94 test('isEnabled should return false if type is VNF and has missing data', ()=>{
105 spyOn(node.data.menuActions, 'duplicate').and.returnValue(true);
106 spyOn(service, 'hasMissingData').and.returnValue(true);
107 let result : boolean = service.isEnabled(<any>node, null, null);
108 expect(result).toBeFalsy();
111 test('openDuplicateModal', ()=>{
112 spyOn(service, 'getRemainsInstance').and.returnValue(1);
113 let result : IModalConfig = service.openDuplicateModal(
120 expect(result.title).toEqual('Duplicate Node');
123 test('openDuplicateModal should call getRemainsInstance with correct parameters', ()=>{
124 spyOn(service, 'getRemainsInstance');
125 service.openDuplicateModal(
132 expect(service.getRemainsInstance).toHaveBeenCalledWith('currentServiceId', 'currentId', 'currentServiceId', null, null);
135 test('canDuplicate VNF should return true', () => {
136 let node : ITreeNode = <any> {data : {type : 'VF'}};
138 let result = service.canDuplicate(node);
139 expect(result).toBeTruthy();
142 test('canDuplicate Network should return true', () => {
143 let node : ITreeNode = <any> {data : {type : 'VL'}};
145 let result = service.canDuplicate(node);
146 expect(result).toBeTruthy();
149 test('canDuplicate VFModule should return false', () => {
150 let node : ITreeNode = <any> {data : {type : 'VFModule'}};
152 let result = service.canDuplicate(node);
153 expect(result).toBeFalsy();
156 test('Drawing board tree service should be defined', () => {
157 expect(service).toBeDefined();
160 test('DrawingBoardDuplicateService should be defined', () => {
161 expect(service).toBeDefined();
164 test('Duplicate multi vnfs should save multi vnfs in redux', () => {
165 service.existingNames = {
166 "2017488_pasqualevpe": "",
170 let newVnfs = service.cloneVnf(<any>{
172 "2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2": {
173 "2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2mtlfi": {
174 "instanceName": "rrr",
175 "volumeGroupName": "ttt"
179 "originalName": null,
180 "trackById": "pfs1f0len3",
181 "instanceName": "2017488_PASQUALEvPE"
182 }, "2017-488_PASQUALE-vPE 0");
184 expect(newVnfs.instanceName).toBe("2017488_PASQUALEvPE_001");
185 expect(newVnfs.vfModules['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2']['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_001");
186 expect(newVnfs.vfModules['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2']['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_001");
188 newVnfs = service.cloneVnf(<any>{
190 "2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2": {
191 "2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2mtlfi": {
192 "instanceName": "rrr",
193 "volumeGroupName": "ttt"
197 "originalName": null,
198 "trackById": "pfs1f0len3",
199 "instanceName": "2017488_PASQUALEvPE"
200 }, "2017-488_PASQUALE-vPE 0");
202 expect(newVnfs.instanceName).toBe("2017488_PASQUALEvPE_002");
203 expect(newVnfs.vfModules['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2']['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_002");
204 expect(newVnfs.vfModules['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2']['2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_002");
207 test('ensure name is unique - send new name - shouldn\'t change name', () => {
208 service.existingNames = {
209 "2017488_pasqualevpe": "",
210 "uniqueinstancename": ""
212 const name = "uniqueInstanceName-1";
213 let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
214 expect(uniqueName).toEqual(name);
217 test('ensure name is unique send existing name should change name', () => {
218 service.existingNames = {
219 "2017488_pasqualevpe": "",
220 "uniqueinstancename-1": ""
222 const name = "uniqueInstanceName-1";
223 let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
224 expect(uniqueName).toEqual(name + "_001");
227 test('isAlreadyExist - send new name should return false', () => {
228 service.existingNames = {
229 "2017488_pasqualevpe": "",
230 "uniqueinstancename": ""
232 const name = "uniqueinstancename-1";
233 let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
234 expect(isExist).toBeFalsy();
237 test('isAlreadyExist - send existing name should return true', () => {
238 service.existingNames = {
239 "2017488_pasqualevpe": "",
240 "uniqueinstancename-1": ""
242 const name = "uniqueinstancename-1";
243 let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
244 expect(isExist).toBeTruthy();
247 test('isAlreadyExist - send existing name case insensitive should return true', () => {
248 service.existingNames = {
249 "2017488_pasqualevpe": "",
250 "uniqueinstancename-1": ""
252 const name = "uniqueInstanceName-1";
253 let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
254 expect(isExist).toBeTruthy();
257 test('getNumberAsPaddingString should return 001 if padding is 000 and val is 1 string', () => {
258 let paddingNumber: string = service.getNumberAsPaddingString(1, '0000');
259 expect(paddingNumber).toEqual('0001');
262 test('getNumberAsPaddingString should return 010 if padding is 000 and val is 10 string', () => {
263 let paddingNumber: string = service.getNumberAsPaddingString(10, '0000');
264 expect(paddingNumber).toEqual('0010');
267 test('generateVNFUniqueName should return the next free number', () => {
268 const vnfName: string = "VF_vGeraldine 0";
269 let result: string = service.generateUniqueStoreKey(
270 "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
276 expect(result).toEqual(vnfName + ":0003");
279 test('generateVNFUniqueName on duplicate multi vnfs should return the next free number', () => {
280 spyOn(service, 'openDuplicateModal');
281 service.openDuplicateModal(null, null, null,null, 2, null, null);
283 expect(service.openDuplicateModal).toHaveBeenCalledWith(null, null, null,null, 2, null, null);
287 test('isEnabled should return false if node has missing data', () => {
298 let result : boolean = service.isEnabled(<any>node, null, null);
299 expect(result).toBeFalsy();
302 test('isEnabled should return true if not reach to max', () => {
305 missingData: false, modelName : "vnfModelName" , modelId : "vnfModelId", type : "VF", children: [], modelCustomizationId : "vnfModelId",modelUniqueId: "vnfModelId",
313 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
314 expect(result).toBeTruthy();
317 test('isEnabled should return false if reach to max', () => {
320 missingData: false, modelName : "vnfModelName2" , modelId : "vnfModelId2", type : "VF" ,children: [],
328 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
329 expect(result).toBeFalsy();
332 test('isEnabled should return true if max is null', () => {
335 missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VF", children: [], modelUniqueId: "vnfModelId3",
343 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
344 expect(result).toBeTruthy();
347 test('isEnabled should return false if type is vf module', () => {
350 missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VFModule", children: [],
355 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
356 expect(result).toBeFalsy();
359 test('getRemainsVNFinstance should return the remains 1 VNF', () => {
360 let result : number = service.getRemainsInstance("vnfModelId", "vnfModelName" , "serviceId" , <any>getStoreState(), <any>{data : {type : 'VF'}});
361 expect(result).toBe(1);
364 test('getRemainsVNFinstance should return the remains 0 VNF', () => {
365 let result : number = service.getRemainsInstance("vnfModelId2", "vnfModelName2" , "serviceId" , <any>getStoreState(),<any>{data : {type : 'VF'}});
366 expect(result).toBe(0);
369 test('isVNFChildrensHasMissingData should return true if vnf missing data = true', () => {
370 let result : boolean = service.hasMissingData(<any>getTreeNode(true,false));
371 expect(result).toBeTruthy();
374 test('isVNFChildrensHasMissingData return should false if vnf missing data = false', () => {
375 let result : boolean = service.hasMissingData(<any>getTreeNode(false,false));
376 expect(result).toBeFalsy();
379 test('isVNFChildrensHasMissingData should return true if vfModule missing data = true', () => {
380 let result : boolean = service.hasMissingData(<any>getTreeNode(false,true));
381 expect(result).toBeTruthy();
384 test('isVNFChildrensHasMissingData should return false if no children and vfModule missing data = false', () => {
385 let node = <any>getTreeNode(false,false);
386 node.data.children = [];
387 let result : boolean = service.hasMissingData(node);
388 expect(result).toBeFalsy();
391 function getExistingVNFs(){
392 return {"VF_vGeraldine 0":{"rollbackOnFailure":"true","vfModules":{"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1":{"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVgeraldine..vflorence_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vGeraldine","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vGeraldine 0"}},"VF_vGeraldine 0:0001":{"rollbackOnFailure":"true","vfModules":{"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1":{"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVgeraldine..vflorence_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vGeraldine","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vGeraldine 0"},"originalName":"VF_vGeraldine 0"},"VF_vGeraldine 0:0002":{"rollbackOnFailure":"true","vfModules":{"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1":{"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVgeraldine..vflorence_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vGeraldine","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vGeraldine 0"},"originalName":"VF_vGeraldine 0"}}
395 function getStoreState(){
405 ecomp_generated_naming: "false",
411 ecomp_generated_naming: "false",
417 ecomp_generated_naming: "false",
425 existingVNFCounterMap : {
445 function getTreeNode(VNfMissingData : boolean, vfModuleMissingData : boolean){
448 children : vfModuleMissingData ?
456 missingData : VNfMissingData