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 { SdcUiServices} from "onap-ui-angular";
6 import {IModalConfig} from "onap-ui-angular/dist/components/common";
7 import {AppState} from "../../../shared/store/reducers";
8 import {getTestBed, TestBed} from "@angular/core/testing";
10 class MockAppStore<T> {
38 existingVNFCounterMap : {
53 class MockModalService<T> {}
55 describe('Drawing board tree service', () => {
57 let service: DuplicateService;
58 let store : NgRedux<AppState>;
59 beforeAll(done => (async () => {
60 TestBed.configureTestingModule({
64 {provide: NgRedux, useClass: MockAppStore},
65 {provide: SdcUiServices.ModalService, useClass: MockModalService}
68 await TestBed.compileComponents();
70 injector = getTestBed();
71 service = injector.get(DuplicateService);
72 store = injector.get(NgRedux);
74 })().then(done).catch(done.fail));
77 test('setNumberOfDuplicates should set number of duplicates', ()=>{
78 service.setNumberOfDuplicates(10);
79 expect(service.numberOfDuplicates).toEqual(10);
82 test('isEnabled should return false if type is VNF and has missing data', ()=>{
93 spyOn(node.data.menuActions, 'duplicate').and.returnValue(true);
94 spyOn(service, 'hasMissingData').and.returnValue(true);
95 let result : boolean = service.isEnabled(<any>node, null, null);
96 expect(result).toBeFalsy();
99 test('openDuplicateModal', ()=>{
100 spyOn(service, 'getRemainsInstance').and.returnValue(1);
101 let result : IModalConfig = service.openDuplicateModal(
108 expect(result.title).toEqual('Duplicate Node');
111 test('openDuplicateModal should call getRemainsInstance with correct parameters', ()=>{
112 spyOn(service, 'getRemainsInstance');
113 service.openDuplicateModal(
120 expect(service.getRemainsInstance).toHaveBeenCalledWith('currentServiceId', 'currentId', 'currentServiceId', null, null);
123 test('canDuplicate VNF should return true', () => {
124 sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
125 let node : ITreeNode = <any> {data : {type : 'VF'}};
127 let result = service.canDuplicate(node);
128 expect(result).toBeTruthy();
131 test('canDuplicate Network should return true', () => {
132 sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
133 let node : ITreeNode = <any> {data : {type : 'VL'}};
135 let result = service.canDuplicate(node);
136 expect(result).toBeTruthy();
139 test('canDuplicate VFModule should return false', () => {
140 sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
141 let node : ITreeNode = <any> {data : {type : 'VFModule'}};
143 let result = service.canDuplicate(node);
144 expect(result).toBeFalsy();
147 test('Drawing board tree service should be defined', () => {
148 expect(service).toBeDefined();
151 test('DrawingBoardDuplicateService should be defined', () => {
152 expect(service).toBeDefined();
155 test('Duplicate multi vnfs should save multi vnfs in redux', () => {
156 service.existingNames = {
157 "2017488_adiodvpe": "",
161 let newVnfs = service.cloneVnf(<any>{
163 "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
164 "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": {
165 "instanceName": "rrr",
166 "volumeGroupName": "ttt"
170 "originalName": null,
171 "trackById": "pfs1f0len3",
172 "instanceName": "2017488_ADIODvPE"
173 }, "2017-488_ADIOD-vPE 0");
175 expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_001");
176 expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_001");
177 expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_001");
179 newVnfs = service.cloneVnf(<any>{
181 "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
182 "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": {
183 "instanceName": "rrr",
184 "volumeGroupName": "ttt"
188 "originalName": null,
189 "trackById": "pfs1f0len3",
190 "instanceName": "2017488_ADIODvPE"
191 }, "2017-488_ADIOD-vPE 0");
193 expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_002");
194 expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_002");
195 expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_002");
198 test('ensure name is unique - send new name - shouldn\'t change name', () => {
199 service.existingNames = {
200 "2017488_adiodvpe": "",
201 "uniqueinstancename": ""
203 const name = "uniqueInstanceName-1";
204 let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
205 expect(uniqueName).toEqual(name);
208 test('ensure name is unique send existing name should change name', () => {
209 service.existingNames = {
210 "2017488_adiodvpe": "",
211 "uniqueinstancename-1": ""
213 const name = "uniqueInstanceName-1";
214 let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
215 expect(uniqueName).toEqual(name + "_001");
218 test('isAlreadyExist - send new name should return false', () => {
219 service.existingNames = {
220 "2017488_adiodvpe": "",
221 "uniqueinstancename": ""
223 const name = "uniqueinstancename-1";
224 let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
225 expect(isExist).toBeFalsy();
228 test('isAlreadyExist - send existing name should return true', () => {
229 service.existingNames = {
230 "2017488_adiodvpe": "",
231 "uniqueinstancename-1": ""
233 const name = "uniqueinstancename-1";
234 let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
235 expect(isExist).toBeTruthy();
238 test('isAlreadyExist - send existing name case insensitive should return true', () => {
239 service.existingNames = {
240 "2017488_adiodvpe": "",
241 "uniqueinstancename-1": ""
243 const name = "uniqueInstanceName-1";
244 let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
245 expect(isExist).toBeTruthy();
248 test('getNumberAsPaddingString should return 001 if padding is 000 and val is 1 string', () => {
249 let paddingNumber: string = service.getNumberAsPaddingString(1, '0000');
250 expect(paddingNumber).toEqual('0001');
253 test('getNumberAsPaddingString should return 010 if padding is 000 and val is 10 string', () => {
254 let paddingNumber: string = service.getNumberAsPaddingString(10, '0000');
255 expect(paddingNumber).toEqual('0010');
258 test('generateVNFUniqueName should return the next free number', () => {
259 const vnfName: string = "VF_vMee 0";
260 let result: string = service.generateUniqueStoreKey(
261 "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
267 expect(result).toEqual(vnfName + ":0003");
270 test('generateVNFUniqueName on duplicate multi vnfs should return the next free number', () => {
271 spyOn(service, 'openDuplicateModal');
272 service.openDuplicateModal(null, null, null,null, 2, null, null);
274 expect(service.openDuplicateModal).toHaveBeenCalledWith(null, null, null,null, 2, null, null);
278 test('isEnabled should return false if node has missing data', () => {
289 let result : boolean = service.isEnabled(<any>node, null, null);
290 expect(result).toBeFalsy();
293 test('isEnabled should return true if not reach to max', () => {
296 missingData: false, modelName : "vnfModelName" , modelId : "vnfModelId", type : "VF", children: [], modelCustomizationId : "vnfModelId",modelUniqueId: "vnfModelId",
304 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
305 expect(result).toBeTruthy();
308 test('isEnabled should return false if reach to max', () => {
311 missingData: false, modelName : "vnfModelName2" , modelId : "vnfModelId2", type : "VF" ,children: [],
319 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
320 expect(result).toBeFalsy();
323 test('isEnabled should return true if max is null', () => {
326 missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VF", children: [], modelUniqueId: "vnfModelId3",
334 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
335 expect(result).toBeTruthy();
338 test('isEnabled should return false if type is vf module', () => {
341 missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VFModule", children: [],
346 let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
347 expect(result).toBeFalsy();
350 test('getRemainsVNFinstance should return the remains 1 VNF', () => {
351 let result : number = service.getRemainsInstance("vnfModelId", "vnfModelName" , "serviceId" , <any>getStoreState(), <any>{data : {type : 'VF'}});
352 expect(result).toBe(1);
355 test('getRemainsVNFinstance should return the remains 0 VNF', () => {
356 let result : number = service.getRemainsInstance("vnfModelId2", "vnfModelName2" , "serviceId" , <any>getStoreState(),<any>{data : {type : 'VF'}});
357 expect(result).toBe(0);
360 test('isVNFChildrensHasMissingData should return true if vnf missing data = true', () => {
361 let result : boolean = service.hasMissingData(<any>getTreeNode(true,false));
362 expect(result).toBeTruthy();
365 test('isVNFChildrensHasMissingData return should false if vnf missing data = false', () => {
366 let result : boolean = service.hasMissingData(<any>getTreeNode(false,false));
367 expect(result).toBeFalsy();
370 test('isVNFChildrensHasMissingData should return true if vfModule missing data = true', () => {
371 let result : boolean = service.hasMissingData(<any>getTreeNode(false,true));
372 expect(result).toBeTruthy();
375 test('isVNFChildrensHasMissingData should return false if no children and vfModule missing data = false', () => {
376 let node = <any>getTreeNode(false,false);
377 node.data.children = [];
378 let result : boolean = service.hasMissingData(node);
379 expect(result).toBeFalsy();
382 function getExistingVNFs(){
383 return {"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_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_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"}},"VF_vMee 0:0001":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_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_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"},"VF_vMee 0:0002":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_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_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"}}
386 function getStoreState(){
396 ecomp_generated_naming: "false",
402 ecomp_generated_naming: "false",
408 ecomp_generated_naming: "false",
416 existingVNFCounterMap : {
431 function getTreeNode(VNfMissingData : boolean, vfModuleMissingData : boolean){
434 children : vfModuleMissingData ?
442 missingData : VNfMissingData