Refactor Generic Generators
[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 {SdcUiServices} from "onap-ui-angular";
17 import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
18 import {getTestBed, TestBed} from "@angular/core/testing";
19 import {UpgradeFormControlNames, VfModuleUpgradePopupService} from "./vfModule.upgrade.popuop.service";
20 import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
21 import {AppState} from "../../../../store/reducers";
22 import {instance, mock} from "ts-mockito";
23 import {GeneralActions} from "../../../../storeUtil/utils/general/general.actions";
24 import {VfModuleActions} from "../../../../storeUtil/utils/vfModule/vfModule.actions";
25 import {ServiceActions} from "../../../../storeUtil/utils/service/service.actions";
26 import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
27 import * as _ from "lodash";
28 import {SharedControllersService} from "../../../genericForm/formControlsServices/sharedControlles/shared.controllers.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
72   beforeAll(done => (async () => {
73     TestBed.configureTestingModule({
74       providers: [
75         VfModuleUpgradePopupService,
76         ControlGeneratorUtil,
77         SharedControllersService,
78         VfModuleControlGenerator,
79         DefaultDataGeneratorService,
80         GenericFormService,
81         FormBuilder,
82         IframeService,
83         AaiService,
84         LogService,
85         BasicPopupService,
86         SharedTreeService,
87         {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
88         {provide: NgRedux, useClass: MockReduxStore},
89         {provide: HttpClient, useClass: MockAppStore},
90         {provide: SdcUiServices.ModalService, useClass: MockModalService}
91       ]
92     });
93     await TestBed.compileComponents();
94
95     injector = getTestBed();
96     service = injector.get(VfModuleUpgradePopupService);
97     genericFormService = injector.get(GenericFormService);
98     defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
99     fb = injector.get(FormBuilder);
100     iframeService = injector.get(IframeService);
101     store = injector.get(NgRedux);
102     service.uuidData = {
103       modelName: 'vfModuleName',
104       vFModuleStoreKey: 'vfModuleId'
105     };
106
107   })().then(done).catch(done.fail));
108
109   test('getTitle should return the correct title', () => {
110     expect(service.getTitle()).toBe("Upgrade Module")
111   });
112
113   function findControlByName(controls: FormControlModel[], controlName: string) : FormControlModel {
114     return controls.find((control) => {
115       return control.controlName === controlName;
116     });
117   }
118
119   function getControlByNameAndCheckValue(controlName: string, expectedValue: any, shouldControllerExist: boolean) {
120     const controls = service.getControls('serviceId', 'vnfStoreKey', 'vfModuleId', true);
121     const control = findControlByName(controls, controlName);
122     if(shouldControllerExist){
123       expect(control).toBeDefined();
124       expect(control.value).toEqual(expectedValue);
125     }
126     else{
127       expect(control).toBeUndefined();
128     }
129   }
130
131   test('get controls should return retainAssignments control with true value', ()=> {
132     getControlByNameAndCheckValue(UpgradeFormControlNames.RETAIN_ASSIGNMENTS, true, true);
133   });
134
135   test('get controls should return retainVolumeGroup control with true value', ()=> {
136     getControlByNameAndCheckValue(UpgradeFormControlNames.RETAIN_VOLUME_GROUPS, true, true);
137   });
138
139   test('get controls should NOT return retainVolumeGroup control with true value', ()=> {
140     let stateCopy =_.cloneDeep(store.getState());
141     stateCopy.service.serviceHierarchy['serviceId'].vfModules['vfModuleName'].volumeGroupAllowed = false;
142     jest.spyOn(store, 'getState').mockReturnValue(stateCopy);
143     getControlByNameAndCheckValue(UpgradeFormControlNames.RETAIN_VOLUME_GROUPS, null, false);
144   });
145
146   test('get controls should contain SUPPLEMENTARY_FILE controller', ()=> {
147
148     //when
149     const controls = service.getControls('serviceId', 'vnfStoreKey', 'vfModuleId', true);
150
151     //then
152     const control = findControlByName(controls, SUPPLEMENTARY_FILE);
153     expect(control).toBeDefined();
154     expect(control.selectedFile).toBe("myFileName");
155   });
156
157   test('on submit should call merge action of form value to vfModule', () => {
158
159     //given
160
161     const serviceId = "serviceId5";
162     const vnfStoreKey = 'vnfStoreKey3';
163     const modelName = 'modelA';
164     const dynamicModelName = 'dynamicModel';
165     const that = {
166       uuidData : {
167         vfModule : {
168           data : {
169             modelName,
170             dynamicModelName
171           },
172           parent : {
173             data: {
174               vnfStoreKey
175             }}},
176         serviceId
177       },
178       serviceModel: {
179         uuid : "someUuid"
180       },
181       _iframeService: {
182         removeClassCloseModal : jest.fn()
183       }
184     };
185
186     let mockFrom: FormGroup = mock(FormGroup);
187     let form = instance(mockFrom);
188     form.value = {
189       a: "value",
190       b: "another"
191     };
192     form.controls = {
193       supplementaryFile_hidden_content : {
194         value: '{"c": "c", "d": 1}'
195         },
196       supplementaryFile_hidden : {
197         value: {
198           name: "name"
199         }
200       }
201     };
202
203     let expectedMergePayload = {
204       a: "value",
205       b: "another",
206       supplementaryFileContent: {c: "c", d: 1},
207       supplementaryFileName: "name"
208     };
209
210     spyOn(store, 'dispatch');
211
212     //when
213     service.onSubmit(that, form);
214
215     //then
216     expect(store.dispatch).toBeCalledWith(
217       {type: GeneralActions.MERGE_OBJECT_BY_PATH, path: ['serviceInstance', serviceId, 'vnfs', vnfStoreKey, 'vfModules',modelName, dynamicModelName], payload:expectedMergePayload});
218     expect(store.dispatch).toBeCalledWith(
219       {type: VfModuleActions.UPGRADE_VFMODULE, dynamicModelName: "dynamicModel", modelName: "modelA", serviceId: "serviceId5", vnfStoreKey: "vnfStoreKey3"});
220     expect(store.dispatch).toBeCalledWith({type: ServiceActions.UPGRADE_SERVICE_ACTION, serviceUuid: "serviceId5"});
221
222   });
223
224
225   test( 'get controls should return usePreload with false value', () => {
226     getControlByNameAndCheckValue(SDN_C_PRE_LOAD, false, true);
227   });
228 });