1 import {getTestBed, TestBed} from '@angular/core/testing';
2 import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
3 import {NgRedux} from '@angular-redux/store';
4 import {FormControlNames} from "../service.control.generator";
5 import {BasicControlGenerator} from "../basic.control.generator";
6 import {AaiService} from "../../../../services/aaiService/aai.service";
7 import {GenericFormService} from "../../generic-form.service";
8 import {FormBuilder} from "@angular/forms";
13 } from "../../../../models/formControlModels/formControl.model";
14 import {LogService} from "../../../../utils/log/log.service";
15 import {VnfGroupControlGenerator} from "./vnfGroup.control.generator";
16 import {Observable} from "rxjs";
17 import {SelectOption} from "../../../../models/selectOption";
18 import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
20 class MockAppStore<T> {
25 "type": "UPDATE_DRAWING_BOARD_STATUS",
26 "drawingBoardStatus": "CREATE",
28 "CREATE_INSTANCE_TEST": false,
29 "EMPTY_DRAWING_BOARD_TEST": false,
30 "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
31 "FLAG_ASYNC_INSTANTIATION": true,
32 "FLAG_ASYNC_JOBS": true,
33 "FLAG_ADD_MSO_TESTAPI_FIELD": true,
34 "FLAG_UNASSIGN_SERVICE": false,
35 "FLAG_SERVICE_MODEL_CACHE": false,
36 "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
37 "FLAG_SHOW_ASSIGNMENTS": true,
38 "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
39 "FLAG_DUPLICATE_VNF": true,
40 "FLAG_DEFAULT_VNF": true,
41 "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
42 "FLAG_A_LA_CARTE_AUDIT_INFO": true,
43 "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
44 "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
45 "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
46 "FLAG_1902_NEW_VIEW_EDIT": true
51 "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": {
54 "instantiationUI": "serviceWithVnfGrouping",
55 "modelCategory": "other",
56 "viewEditUI": "serviceWithVnfGrouping"
58 "uuid": "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc",
59 "invariantUuid": "7ee41ce4-4827-44b0-a48e-2707a59905d2",
60 "name": "Grouping Service for Test",
62 "toscaModelURL": null,
63 "category": "Network L4+",
64 "serviceType": "INFRASTRUCTURE",
65 "serviceRole": "GROUPING",
67 "serviceEcompNaming": "false",
68 "instantiationType": "A-La-Carte",
73 "collectionResource": {},
75 "fabricConfigurations": {},
77 "vdbe_svc_vprs_proxy 0": {
78 "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
79 "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
80 "description": "A Proxy for Service vDBE_Svc_vPRS",
81 "name": "vDBE_Svc_vPRS Service Proxy",
83 "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
87 "type": "Service Proxy",
88 "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
89 "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
90 "sourceModelName": "vDBE_Svc_vPRS"
92 "tsbc0001vm001_svc_proxy 0": {
93 "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
94 "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
95 "description": "A Proxy for Service tsbc0001vm001_Svc",
96 "name": "tsbc0001vm001_Svc Service Proxy",
98 "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
102 "type": "Service Proxy",
103 "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
104 "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
105 "sourceModelName": "tsbc0001vm001_Svc"
112 "groupingservicefortest..ResourceInstanceGroup..0": {
114 "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
115 "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48",
117 "name": "groupingservicefortest..ResourceInstanceGroup..0",
118 "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
120 "ecomp_generated_naming": "false",
121 "contained_resource_type": "VF",
122 "role": "SERVICE-ACCESS",
124 "description": "DDD0",
128 "vdbe_svc_vprs_proxy 0": {
129 "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
130 "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
131 "description": "A Proxy for Service vDBE_Svc_vPRS",
132 "name": "vDBE_Svc_vPRS Service Proxy",
134 "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
138 "type": "Service Proxy",
139 "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
140 "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
141 "sourceModelName": "vDBE_Svc_vPRS"
145 "groupingservicefortest..ResourceInstanceGroup..1": {
147 "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a",
148 "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56",
150 "name": "groupingservicefortest..ResourceInstanceGroup..1",
151 "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1",
153 "ecomp_generated_naming": "true",
154 "contained_resource_type": "VF",
155 "role": "SERVICE-ACCESS",
156 "function": "SIGNALING",
157 "description": "DDD1",
161 "tsbc0001vm001_svc_proxy 0": {
162 "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
163 "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
164 "description": "A Proxy for Service tsbc0001vm001_Svc",
165 "name": "tsbc0001vm001_Svc Service Proxy",
167 "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
171 "type": "Service Proxy",
172 "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
173 "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
174 "sourceModelName": "tsbc0001vm001_Svc"
182 "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": {
183 "existingVNFCounterMap": {},
184 "existingVnfGroupCounterMap": {
185 "daeb6568-cef8-417f-9075-ed259ce59f48": 1,
186 "c2b300e6-45de-4e5e-abda-3032bee2de56": 0
188 "existingNetworksCounterMap": {},
191 "groupingservicefortest..ResourceInstanceGroup..0": {
193 "rollbackOnFailure": "true",
194 "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
195 "isMissingData": false,
196 "trackById": "johjmxpmrlk",
197 "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
198 "instanceName": "groupingservicefortestResourceInstanceGroup0",
203 "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
204 "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
205 "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
207 "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
208 "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
210 "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
213 "isEcompGeneratedNaming": false,
222 class MockFeatureFlagsService {}
224 describe('VNF Group Control Generator', () => {
226 let service: VnfGroupControlGenerator;
227 let httpMock: HttpTestingController;
229 beforeAll(done => (async () => {
230 TestBed.configureTestingModule({
231 imports: [HttpClientTestingModule],
232 providers: [VnfGroupControlGenerator,
234 BasicControlGenerator,
238 {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
239 {provide: NgRedux, useClass: MockAppStore}]
241 await TestBed.compileComponents();
243 injector = getTestBed();
244 service = injector.get(VnfGroupControlGenerator);
245 httpMock = injector.get(HttpTestingController);
247 })().then(done).catch(done.fail));
251 test('getMacroFormControls check for mandatory controls', () => {
252 const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
253 const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
254 const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0";
255 const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
257 const mandatoryControls : string[] = [
258 FormControlNames.INSTANCE_NAME
261 for(let i = 0 ; i < mandatoryControls.length ; i++){
262 let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
263 expect(requiredExist).toBeDefined();
267 test('getMacroFormControls should return the correct order of controls', () => {
268 const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
269 const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
270 const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0";
271 const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
273 const controlsOrderNames = [
274 FormControlNames.INSTANCE_NAME,
275 'rollbackOnFailure'];
277 expect(controls.length).toEqual(1);
278 for(let i = 0 ; i < controls.length ; i++){
279 expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
283 test('getMacroFormControls check for mandatory controls when ecomp naming = true', () => {
284 const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
285 const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..1";
286 const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..1";
287 const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
289 let isOptional = controls.find(ctrl => ctrl.controlName === 'instanceName').validations.find(item => item.validatorName !== 'required');
290 expect(isOptional).toBeTruthy();
293 test('getAlacartFormControls should return the correct order of controls', () => {
294 const controls:FormControlModel[] = getALaCarteFormControls();
296 const controlsOrderNames = [
297 FormControlNames.INSTANCE_NAME,
298 'rollbackOnFailure'];
299 expect(controls.length).toEqual(2);
300 for(let i = 0 ; i < controls.length ; i++) {
301 expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
306 test('getAlacartFormControls check for mandatory controls', () => {
307 const controls:FormControlModel[] = getALaCarteFormControls();
309 const mandatoryControls : string[] = [
310 FormControlNames.INSTANCE_NAME,
313 for(let i = 0 ; i < mandatoryControls.length ; i++){
314 let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
315 expect(requiredExist).toBeDefined();
319 test('getAlacartFormControls with ecomp_naming true check for mandatory controls', () => {
320 const controls:FormControlModel[] = getALaCarteFormControls();
322 const mandatoryControls : string[] = [
325 for(let i = 0 ; i < mandatoryControls.length ; i++){
326 let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
327 expect(requiredExist).toBeDefined();
331 test('default instanceName', () => {
332 const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
333 const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
334 let result:FormControlModel = service.getInstanceName(null, serviceId, vnfGroupName, false);
335 expect(result.value).toEqual("groupingservicefortest..ResourceInstanceGroup..0");
338 test('rollbackOnFailure', () => {
339 let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions();
340 result.subscribe((val)=>{
341 expect(val).toEqual([
342 new SelectOption({id: 'true', name: 'Rollback'}),
343 new SelectOption({id: 'false', name: 'Don\'t Rollback'})
348 test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
349 const controls:FormControlModel[] = getALaCarteFormControls();
351 const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
352 const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
353 expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
356 function getALaCarteFormControls():FormControlModel[] {
357 const serviceId: string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
358 const vnfGroupName: string = "groupingservicefortest..ResourceInstanceGroup..0";
359 const vnfGroupStoreKey: string = "groupingservicefortest..ResourceInstanceGroup..0";
360 const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);