1 import {getTestBed, TestBed} from '@angular/core/testing';
6 InstantiationStatusComponentService,
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";
30 class MockAppStore<T> {
34 describe('Instantiation Status Service', () => {
36 let aaiService: AaiService;
37 let msoService: MsoService;
38 let service: InstantiationStatusComponentService;
39 let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService);
42 beforeAll(done => (async () => {
43 TestBed.configureTestingModule({
45 HttpClientTestingModule,
49 InstantiationStatusComponentService,
53 {provide: NgRedux, useClass: MockAppStore},
54 {provide: FeatureFlagsService, useValue: instance(mockFeatureFlagsService)}
57 await TestBed.compileComponents();
59 injector = getTestBed();
60 aaiService = injector.get(AaiService);
61 msoService = injector.get(MsoService);
62 service = injector.get(InstantiationStatusComponentService);
64 })().then(done).catch(done.fail));
66 test('generateServiceInfoDataMapping should return mapping of arrays', () => {
67 let data : ServiceInfoModel[] = generateServiceInfoData();
68 let result = service.generateServiceInfoDataMapping(data);
70 expect(result['1']).toBeDefined();
71 expect(result['2']).toBeDefined();
72 expect(result['3']).toBeDefined();
74 expect(result['1'].length).toEqual(2);
75 expect(result['2'].length).toEqual(2);
76 expect(result['3'].length).toEqual(1);
79 test('generateServiceInfoDataMapping if array is empty should return empty object', () => {
80 let result = service.generateServiceInfoDataMapping([]);
82 expect(result['1']).not.toBeDefined();
83 expect(result['2']).not.toBeDefined();
84 expect(result['3']).not.toBeDefined();
87 test('convertObjectToArray', () => {
89 jest.spyOn(service, 'convertObjectToArray').mockReturnValue(
93 let data : ServiceInfoModel[] = generateServiceInfoData();
94 service.convertObjectToArray(data).subscribe((result) => {
95 expect(result).toBeDefined();
99 describe('navigations tests:', () => {
102 serviceModelId: '28aeb8f6-5620-4148-8bfb-a5fb406f0309',
103 serviceInstanceId: 'myInstanceId',
104 serviceType: 'myService',
105 subscriberId: 'mySubscriber',
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(
114 serviceModelId: item.serviceModelId,
115 serviceInstanceId: item.serviceInstanceId,
116 serviceType: item.serviceType,
117 subscriberId: item.subscriberId,
122 test('build the View Edit url', () => {
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);
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(
137 serviceModelId: item.serviceModelId,
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.',
157 test(`getStatusTooltip should return status popover: status=${status}`, () => {
158 expect(service.getStatus(status).tooltip).toEqual(tooltip);
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);
171 [true, ServiceAction.INSTANTIATE],
172 [false, ServiceAction.UPDATE],
173 [false, ServiceAction.DELETE],
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);
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);
190 test('getStatusTooltip should return correct icon per job status', () => {
191 let result : ServiceStatus = service.getStatus('pending');
192 expect(result.iconClassName).toEqual(PENDING);
194 result = service.getStatus('IN_PROGRESS');
195 expect(result.iconClassName).toEqual(INPROGRESS);
197 result = service.getStatus('PAUSED');
198 expect(result.iconClassName).toEqual(PAUSE);
200 result = service.getStatus('FAILED');
201 expect(result.iconClassName).toEqual(X_O);
203 result = service.getStatus('COMPLETED');
204 expect(result.iconClassName).toEqual(SUCCESS_CIRCLE);
206 result = service.getStatus('STOPPED');
207 expect(result.iconClassName).toEqual(STOPPED);
209 result = service.getStatus('COMPLETED_WITH_ERRORS');
210 expect(result.iconClassName).toEqual(COMPLETED_WITH_ERRORS);
212 result = service.getStatus('UNEXPECTED_RANDOM_STATUS');
213 expect(result.iconClassName).toEqual(UNKNOWN);
215 result = service.getStatus('COMPLETED_AND_PAUSED');
216 expect(result.iconClassName).toEqual(PAUSE_UPON_COMPLETION);
218 result = service.getStatus('FAILED_AND_PAUSED');
219 expect(result.iconClassName).toEqual(FAILED_AND_PAUSED);
221 result = service.getStatus(undefined);
222 expect(result.iconClassName).toEqual(UNKNOWN);
225 function generateServiceInfoData(){
226 return JSON.parse(JSON.stringify([
228 "created": 1519956533000,
229 "modified": 1521727738000,
235 "jobId": "6748648484",
237 "jobStatus": "FAILED",
239 "owningEntityId": "1234",
240 "owningEntityName": 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,
261 "created": 1519956533000,
262 "modified": 1521727738000,
268 "jobId": "6748648484",
270 "jobStatus": "FAILED",
272 "owningEntityId": "1234",
273 "owningEntityName": 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,
294 "created": 1519956533000,
295 "modified": 1521727738000,
301 "jobId": "6748648484",
303 "jobStatus": "FAILED",
305 "owningEntityId": "1234",
306 "owningEntityName": 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,
327 "created": 1519956533000,
328 "modified": 1521727738000,
334 "jobId": "6748648484",
336 "jobStatus": "FAILED",
338 "owningEntityId": "1234",
339 "owningEntityName": 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,
360 "created": 1519956533000,
361 "modified": 1521727738000,
367 "jobId": "6748648484",
369 "jobStatus": "FAILED",
371 "owningEntityId": "1234",
372 "owningEntityName": 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,