Pause Upon VF Module Failure
[vid.git] / vid-webpack-master / src / app / instantiationStatus / instantiationStatus.component.service.spec.ts
1 import {getTestBed, TestBed} from '@angular/core/testing';
2 import {
3   COMPLETED_WITH_ERRORS,
4   FAILED_AND_PAUSED,
5   INPROGRESS,
6   InstantiationStatusComponentService,
7   PAUSE,
8   PAUSE_UPON_COMPLETION,
9   PENDING,
10   ServiceStatus,
11   STOPPED,
12   SUCCESS_CIRCLE,
13   UNKNOWN,
14   X_O
15 } from './instantiationStatus.component.service';
16 import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model';
17 import {AaiService} from "../shared/services/aaiService/aai.service";
18 import {MsoService} from "../shared/services/msoService/mso.service";
19 import {NgRedux} from "@angular-redux/store";
20 import {HttpClientTestingModule} from "@angular/common/http/testing";
21 import {FeatureFlagsService, Features} from "../shared/services/featureFlag/feature-flags.service";
22 import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
23 import {RouterTestingModule} from "@angular/router/testing";
24 import {of} from "rxjs";
25 import {UrlTree} from "@angular/router";
26 import each from "jest-each";
27 import {ServiceAction} from "../shared/models/serviceInstanceActions";
28 import {instance, mock, when} from "ts-mockito";
29
30 class MockAppStore<T> {
31   dispatch() {}
32 }
33
34 describe('Instantiation Status Service', () => {
35   let injector;
36   let aaiService: AaiService;
37   let msoService: MsoService;
38   let service: InstantiationStatusComponentService;
39   let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService);
40
41
42   beforeAll(done => (async () => {
43     TestBed.configureTestingModule({
44       imports: [
45         HttpClientTestingModule,
46         RouterTestingModule,
47       ],
48       providers: [
49         InstantiationStatusComponentService,
50         AaiService,
51         MsoService,
52         FeatureFlagsService,
53         {provide: NgRedux, useClass: MockAppStore},
54         {provide: FeatureFlagsService, useValue: instance(mockFeatureFlagsService)}
55       ]
56     });
57     await TestBed.compileComponents();
58
59     injector = getTestBed();
60     aaiService = injector.get(AaiService);
61     msoService = injector.get(MsoService);
62     service = injector.get(InstantiationStatusComponentService);
63
64   })().then(done).catch(done.fail));
65
66   test('generateServiceInfoDataMapping should return mapping of arrays', () => {
67     let data : ServiceInfoModel[] = generateServiceInfoData();
68     let result = service.generateServiceInfoDataMapping(data);
69
70     expect(result['1']).toBeDefined();
71     expect(result['2']).toBeDefined();
72     expect(result['3']).toBeDefined();
73
74     expect(result['1'].length).toEqual(2);
75     expect(result['2'].length).toEqual(2);
76     expect(result['3'].length).toEqual(1);
77   });
78
79   test('generateServiceInfoDataMapping if array is empty  should return empty object', () => {
80     let result = service.generateServiceInfoDataMapping([]);
81
82     expect(result['1']).not.toBeDefined();
83     expect(result['2']).not.toBeDefined();
84     expect(result['3']).not.toBeDefined();
85   });
86
87   test('convertObjectToArray', () => {
88
89     jest.spyOn(service, 'convertObjectToArray').mockReturnValue(
90       of([])
91     );
92
93     let data : ServiceInfoModel[] = generateServiceInfoData();
94     service.convertObjectToArray(data).subscribe((result) => {
95       expect(result).toBeDefined();
96     });
97   });
98
99   describe('navigations tests:', () => {
100
101     const item = {
102       serviceModelId: '28aeb8f6-5620-4148-8bfb-a5fb406f0309',
103       serviceInstanceId: 'myInstanceId',
104       serviceType: 'myService',
105       subscriberId: 'mySubscriber',
106       jobId: 'aJobId'
107     };
108
109     test('click on "Open" button should open new view edit', () => {
110       let params: UrlTree = service.getNewViewEditUrlTree(<any>item, DrawingBoardModes.VIEW);
111       expect(params.toString().startsWith('/servicePlanning/VIEW')).toBeTruthy();
112       expect(params.queryParams).toEqual(
113         {
114           serviceModelId: item.serviceModelId,
115           serviceInstanceId: item.serviceInstanceId,
116           serviceType: item.serviceType,
117           subscriberId: item.subscriberId,
118           jobId: item.jobId
119         });
120     });
121
122     test('build the View Edit url', () => {
123
124       let serviceModelUrl: string = '/servicePlanning/EDIT?serviceModelId=28aeb8f6-5620-4148-8bfb-a5fb406f0309' +
125         '&serviceInstanceId=myInstanceId&serviceType=myService&subscriberId=mySubscriber&jobId=aJobId';
126       let prefix: string = '../../serviceModels.htm#';
127       let tree: UrlTree = service.getNewViewEditUrlTree(<any>item, DrawingBoardModes.EDIT);
128       let result = service.getViewEditUrl(tree);
129       expect(result).toEqual(prefix + serviceModelUrl);
130     });
131
132     test('recreate url shall contains mode RECREATE and only jobId and serviceModelId', () =>{
133       let params: UrlTree = service.getNewViewEditUrlTree(<any>item, DrawingBoardModes.RECREATE);
134       expect(params.toString().startsWith('/servicePlanning/RECREATE')).toBeTruthy();
135       expect(params.queryParams).toEqual(
136         {
137           serviceModelId: item.serviceModelId,
138           jobId: item.jobId
139         });
140     });
141   });
142
143   for (let [status, tooltip] of Object.entries({
144     'pending': 'Pending: The action required will be sent as soon as possible.',
145     'IN_PROGRESS': 'In-progress: the service is in process of the action required.',
146     'PAUSED': 'Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.',
147     'FAILED': 'Failed: All planned actions have failed.',
148     'COMPLETED': 'Completed successfully: Service is successfully instantiated, updated or deleted.',
149     'STOPPED': 'Stopped: Due to previous failure, will not be instantiated.',
150     'StOpPeD': 'Stopped: Due to previous failure, will not be instantiated.',
151     'COMPLETED_WITH_ERRORS': 'Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.',
152     'UNEXPECTED_RANDOM_STATUS': 'Unexpected status: "UNEXPECTED_RANDOM_STATUS"',
153     'COMPLETED_AND_PAUSED': 'Pause upon completion. you may resume the instantiation.\n Open the service to check it out.',
154     'FAILED_AND_PAUSED': 'Failed and Paused: you may re-deploy the instantiation.\n Open the service to check it out.',
155   })) {
156
157     test(`getStatusTooltip should return status popover: status=${status}`, () => {
158       expect(service.getStatus(status).tooltip).toEqual(tooltip);
159     });
160
161   }
162
163   test(`service.getStatus should handle undefined status`, () => {
164     const statusResult = service.getStatus(undefined);
165     expect(statusResult.tooltip).toEqual('Unexpected status: "undefined"');
166     expect(statusResult.iconClassName).toEqual(UNKNOWN);
167   });
168
169
170   each([
171       [true, ServiceAction.INSTANTIATE],
172       [false, ServiceAction.UPDATE],
173       [false, ServiceAction.DELETE],
174   ]).
175   test('isRecreateEnabled: should be %s if action is %s', (expected:boolean, action:ServiceAction) => {
176     let serviceInfoModel = new ServiceInfoModel();
177     serviceInfoModel.action = action;
178     expect(service.isRecreateEnabled(serviceInfoModel)).toBe(expected);
179   });
180
181   each([
182     [true, true],
183     [false, false],
184   ]).
185   test('isRecreateVisible: should be %s if flag is %s', (expected:boolean, flag:boolean) => {
186     when(mockFeatureFlagsService.getFlagState(Features.FLAG_2004_CREATE_ANOTHER_INSTANCE_FROM_TEMPLATE)).thenReturn(flag);
187     expect(service.isRecreateVisible()).toEqual(expected);
188   });
189
190   test('getStatusTooltip should return correct icon per job status', () => {
191     let result : ServiceStatus  = service.getStatus('pending');
192     expect(result.iconClassName).toEqual(PENDING);
193
194     result = service.getStatus('IN_PROGRESS');
195     expect(result.iconClassName).toEqual(INPROGRESS);
196
197     result = service.getStatus('PAUSED');
198     expect(result.iconClassName).toEqual(PAUSE);
199
200     result = service.getStatus('FAILED');
201     expect(result.iconClassName).toEqual(X_O);
202
203     result = service.getStatus('COMPLETED');
204     expect(result.iconClassName).toEqual(SUCCESS_CIRCLE);
205
206     result = service.getStatus('STOPPED');
207     expect(result.iconClassName).toEqual(STOPPED);
208
209     result = service.getStatus('COMPLETED_WITH_ERRORS');
210     expect(result.iconClassName).toEqual(COMPLETED_WITH_ERRORS);
211
212     result = service.getStatus('UNEXPECTED_RANDOM_STATUS');
213     expect(result.iconClassName).toEqual(UNKNOWN);
214
215     result = service.getStatus('COMPLETED_AND_PAUSED');
216     expect(result.iconClassName).toEqual(PAUSE_UPON_COMPLETION);
217
218     result = service.getStatus('FAILED_AND_PAUSED');
219     expect(result.iconClassName).toEqual(FAILED_AND_PAUSED);
220
221     result = service.getStatus(undefined);
222     expect(result.iconClassName).toEqual(UNKNOWN);
223   });
224
225   function generateServiceInfoData(){
226     return JSON.parse(JSON.stringify([
227       {
228         "created": 1519956533000,
229         "modified": 1521727738000,
230         "createdId": null,
231         "modifiedId": null,
232         "rowNum": null,
233         "auditUserId": null,
234         "auditTrail": null,
235         "jobId": "6748648484",
236         "userId": "2222",
237         "jobStatus": "FAILED",
238         "pause": false,
239         "owningEntityId": "1234",
240         "owningEntityName": null,
241         "project": null,
242         "aicZoneId": null,
243         "aicZoneName": null,
244         "tenantId": null,
245         "tenantName": null,
246         "regionId": null,
247         "regionName": null,
248         "serviceType": null,
249         "subscriberName": null,
250         "serviceInstanceId": "1",
251         "serviceInstanceName": null,
252         "serviceModelId": null,
253         "serviceModelName": null,
254         "serviceModelVersion": null,
255         "createdBulkDate": 1519956533000,
256         "statusModifiedDate": 1520042933000,
257         "templateId": "1",
258         "hidden": false
259       },
260       {
261         "created": 1519956533000,
262         "modified": 1521727738000,
263         "createdId": null,
264         "modifiedId": null,
265         "rowNum": null,
266         "auditUserId": null,
267         "auditTrail": null,
268         "jobId": "6748648484",
269         "userId": "2222",
270         "jobStatus": "FAILED",
271         "pause": false,
272         "owningEntityId": "1234",
273         "owningEntityName": null,
274         "project": null,
275         "aicZoneId": null,
276         "aicZoneName": null,
277         "tenantId": null,
278         "tenantName": null,
279         "regionId": null,
280         "regionName": null,
281         "serviceType": null,
282         "subscriberName": null,
283         "serviceInstanceId": "1",
284         "serviceInstanceName": null,
285         "serviceModelId": null,
286         "serviceModelName": null,
287         "serviceModelVersion": null,
288         "createdBulkDate": 1519956533000,
289         "statusModifiedDate": 1520042933000,
290         "templateId": "1",
291         "hidden": false
292       },
293       {
294         "created": 1519956533000,
295         "modified": 1521727738000,
296         "createdId": null,
297         "modifiedId": null,
298         "rowNum": null,
299         "auditUserId": null,
300         "auditTrail": null,
301         "jobId": "6748648484",
302         "userId": "2222",
303         "jobStatus": "FAILED",
304         "pause": false,
305         "owningEntityId": "1234",
306         "owningEntityName": null,
307         "project": null,
308         "aicZoneId": null,
309         "aicZoneName": null,
310         "tenantId": null,
311         "tenantName": null,
312         "regionId": null,
313         "regionName": null,
314         "serviceType": null,
315         "subscriberName": null,
316         "serviceInstanceId": "2",
317         "serviceInstanceName": null,
318         "serviceModelId": null,
319         "serviceModelName": null,
320         "serviceModelVersion": null,
321         "createdBulkDate": 1519956533000,
322         "statusModifiedDate": 1520042933000,
323         "templateId": "2",
324         "hidden": false
325       },
326       {
327         "created": 1519956533000,
328         "modified": 1521727738000,
329         "createdId": null,
330         "modifiedId": null,
331         "rowNum": null,
332         "auditUserId": null,
333         "auditTrail": null,
334         "jobId": "6748648484",
335         "userId": "2222",
336         "jobStatus": "FAILED",
337         "pause": false,
338         "owningEntityId": "1234",
339         "owningEntityName": null,
340         "project": null,
341         "aicZoneId": null,
342         "aicZoneName": null,
343         "tenantId": null,
344         "tenantName": null,
345         "regionId": null,
346         "regionName": null,
347         "serviceType": null,
348         "subscriberName": null,
349         "serviceInstanceId": "2",
350         "serviceInstanceName": null,
351         "serviceModelId": null,
352         "serviceModelName": null,
353         "serviceModelVersion": null,
354         "createdBulkDate": 1519956533000,
355         "statusModifiedDate": 1520042933000,
356         "templateId": "2",
357         "hidden": false
358       },
359       {
360         "created": 1519956533000,
361         "modified": 1521727738000,
362         "createdId": null,
363         "modifiedId": null,
364         "rowNum": null,
365         "auditUserId": null,
366         "auditTrail": null,
367         "jobId": "6748648484",
368         "userId": "2222",
369         "jobStatus": "FAILED",
370         "pause": false,
371         "owningEntityId": "1234",
372         "owningEntityName": null,
373         "project": null,
374         "aicZoneId": null,
375         "aicZoneName": null,
376         "tenantId": null,
377         "tenantName": null,
378         "regionId": null,
379         "regionName": null,
380         "serviceType": null,
381         "subscriberName": null,
382         "serviceInstanceId": "3",
383         "serviceInstanceName": null,
384         "serviceModelId": null,
385         "serviceModelName": null,
386         "serviceModelVersion": null,
387         "createdBulkDate": 1519956533000,
388         "statusModifiedDate": 1520042933000,
389         "templateId": "3",
390         "hidden": false
391       }
392     ]));
393   }
394
395 });