set default values in VFM Upgrade popup
[vid.git] / vid-webpack-master / src / app / shared / components / genericFormPopup / genericFormServices / vfModuleUpgrade / vfModule.upgrade.popup.service.spec.ts
1 import {LogService} from "../../../../utils/log/log.service";
2 import {NgRedux} from "@angular-redux/store";
3 import {
4   ControlGeneratorUtil,
5   SDN_C_PRE_LOAD,
6   SUPPLEMENTARY_FILE
7 } from "../../../genericForm/formControlsServices/control.generator.util.service";
8 import {AaiService} from "../../../../services/aaiService/aai.service";
9 import {HttpClient} from "@angular/common/http";
10 import {GenericFormService} from "../../../genericForm/generic-form.service";
11 import {FormBuilder, FormGroup} from "@angular/forms";
12 import {IframeService} from "../../../../utils/iframe.service";
13 import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
14 import {BasicPopupService} from "../basic.popup.service";
15 import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
16 import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
17 import {getTestBed, TestBed} from "@angular/core/testing";
18 import {UpgradeFormControlNames, VfModuleUpgradePopupService} from "./vfModule.upgrade.popuop.service";
19 import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
20 import {AppState} from "../../../../store/reducers";
21 import {instance, mock} from "ts-mockito";
22 import {GeneralActions} from "../../../../storeUtil/utils/general/general.actions";
23 import {VfModuleActions} from "../../../../storeUtil/utils/vfModule/vfModule.actions";
24 import {ServiceActions} from "../../../../storeUtil/utils/service/service.actions";
25 import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
26 import * as _ from "lodash";
27 import {SharedControllersService} from "../../../genericForm/formControlsServices/sharedControlles/shared.controllers.service";
28 import {ModalService} from "../../../customModal/services/modal.service";
29
30 class MockModalService<T> {}
31
32 class MockAppStore<T> {}
33
34 class MockReduxStore<T> {
35   getState() {
36     return {
37       service: {
38         serviceHierarchy: {
39           serviceId: {
40             vfModules: {
41               vfModuleName: {
42                 volumeGroupAllowed: true
43               }
44             }
45           }
46         },
47         serviceInstance : {
48           serviceId : {
49             vnfs : {
50               vnfStoreKey : {
51                 vfModules: {
52                   vfModuleName: {
53                     vfModuleId : {
54                       supplementaryFileName: "myFileName"
55                     }}}}}}}}
56     };
57   }
58   dispatch() {}
59 }
60
61 class MockFeatureFlagsService {}
62
63 describe('VFModule popup service', () => {
64   let injector;
65   let service: VfModuleUpgradePopupService;
66   let genericFormService: GenericFormService;
67   let defaultDataGeneratorService: DefaultDataGeneratorService;
68   let fb: FormBuilder;
69   let iframeService: IframeService;
70   let store : NgRedux<AppState>;
71   let _sharedTreeService : SharedTreeService;
72
73   beforeAll(done => (async () => {
74     TestBed.configureTestingModule({
75       providers: [
76         VfModuleUpgradePopupService,
77         ControlGeneratorUtil,
78         SharedControllersService,
79         VfModuleControlGenerator,
80         DefaultDataGeneratorService,
81         GenericFormService,
82         FormBuilder,
83         IframeService,
84         AaiService,
85         LogService,
86         BasicPopupService,
87         SharedTreeService,
88         {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
89         {provide: NgRedux, useClass: MockReduxStore},
90         {provide: HttpClient, useClass: MockAppStore},
91         {provide: ModalService, useClass: MockModalService}
92       ]
93     });
94     await TestBed.compileComponents();
95
96     injector = getTestBed();
97     service = injector.get(VfModuleUpgradePopupService);
98     genericFormService = injector.get(GenericFormService);
99     defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
100     fb = injector.get(FormBuilder);
101     iframeService = injector.get(IframeService);
102     _sharedTreeService = injector.get(SharedTreeService);
103     store = injector.get(NgRedux);
104     service.uuidData = {
105       vfModule: {
106         data: {}
107       },
108       modelName: 'vfModuleName',
109       vFModuleStoreKey: 'vfModuleId'
110     };
111
112   })().then(done).catch(done.fail));
113
114   test('getTitle should return the correct title', () => {
115     expect(service.getTitle()).toBe("Upgrade Module")
116   });
117
118   function findControlByName(controls: FormControlModel[], controlName: string) : FormControlModel {
119     return controls.find((control) => {
120       return control.controlName === controlName;
121     });
122   }
123
124   function getControlByNameAndCheckValue(controlName: string, expectedValue: any, shouldControllerExist: boolean) {
125     const controls = service.getControls('serviceId', 'vnfStoreKey', 'vfModuleId', true);
126     const control = findControlByName(controls, controlName);
127     if(shouldControllerExist){
128       expect(control).toBeDefined();
129       expect(control.value).toEqual(expectedValue);
130     }
131     else{
132       expect(control).toBeUndefined();
133     }
134   }
135
136   test('get controls should return retainAssignments control with false', ()=> {
137     getControlByNameAndCheckValue(UpgradeFormControlNames.RETAIN_ASSIGNMENTS, false, true);
138   });
139
140   test('get controls should return retainVolumeGroup control with false', ()=> {
141     getControlByNameAndCheckValue(UpgradeFormControlNames.RETAIN_VOLUME_GROUPS, false, true);
142   });
143
144   [true, false].forEach(notExistsOnModel => {
145     test(`retainVolumeGroup control is shown when vfModule not from model (notExistsOnModel=${notExistsOnModel})`, () => {
146       let stateCopy = _.cloneDeep(store.getState());
147       stateCopy.service.serviceHierarchy['serviceId'].vfModules['vfModuleName'].volumeGroupAllowed = false;
148       jest.spyOn(store, 'getState').mockReturnValue(stateCopy);
149
150       jest.spyOn(_sharedTreeService, 'isVfModuleCustomizationIdNotExistsOnModel').mockReturnValue(notExistsOnModel);
151
152       getControlByNameAndCheckValue(UpgradeFormControlNames.RETAIN_VOLUME_GROUPS, false, notExistsOnModel);
153     });
154   });
155
156   test('get controls should contain SUPPLEMENTARY_FILE controller', ()=> {
157
158     //when
159     const controls = service.getControls('serviceId', 'vnfStoreKey', 'vfModuleId', true);
160
161     //then
162     const control = findControlByName(controls, SUPPLEMENTARY_FILE);
163     expect(control).toBeDefined();
164     expect(control.selectedFile).toBe("myFileName");
165   });
166
167   test('on submit should call merge action of form value to vfModule', () => {
168
169     //given
170
171     const serviceId = "serviceId5";
172     const vnfStoreKey = 'vnfStoreKey3';
173     const modelName = 'modelA';
174     const dynamicModelName = 'dynamicModel';
175     const that = {
176       uuidData : {
177         vfModule : {
178           data : {
179             modelName,
180             dynamicModelName
181           },
182           parent : {
183             data: {
184               vnfStoreKey
185             }}},
186         serviceId
187       },
188       serviceModel: {
189         uuid : "someUuid"
190       },
191       _iframeService: {
192         removeClassCloseModal : jest.fn()
193       }
194     };
195
196     let mockFrom: FormGroup = mock(FormGroup);
197     let form = instance(mockFrom);
198     form.value = {
199       a: "value",
200       b: "another"
201     };
202     form.controls = {
203       supplementaryFile_hidden_content : {
204         value: '[{"name": "c", "value": "c"}, {"name": "d", "value": "1"}]'
205         },
206       supplementaryFile_hidden : {
207         value: {
208           name: "name"
209         }
210       }
211     };
212
213     let expectedMergePayload = {
214       a: "value",
215       b: "another",
216       supplementaryFileContent: [{"name": "c", "value": "c"}, {"name": "d", "value": "1"}],
217       supplementaryFileName: "name"
218     };
219
220     spyOn(store, 'dispatch');
221
222     //when
223     service.onSubmit(that, form);
224
225     //then
226     expect(store.dispatch).toBeCalledWith(
227       {type: GeneralActions.MERGE_OBJECT_BY_PATH, path: ['serviceInstance', serviceId, 'vnfs', vnfStoreKey, 'vfModules',modelName, dynamicModelName], payload:expectedMergePayload});
228     expect(store.dispatch).toBeCalledWith(
229       {type: VfModuleActions.UPGRADE_VFMODULE, dynamicModelName: "dynamicModel", modelName: "modelA", serviceId: "serviceId5", vnfStoreKey: "vnfStoreKey3"});
230     expect(store.dispatch).toBeCalledWith({type: ServiceActions.UPGRADE_SERVICE_ACTION, serviceUuid: "serviceId5"});
231
232   });
233
234
235   test( 'get controls should return usePreload with true value', () => {
236     getControlByNameAndCheckValue(SDN_C_PRE_LOAD, true, true);
237   });
238 });