1 import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
2 import {getTestBed, TestBed} from "@angular/core/testing";
3 import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
4 import {PnfModelInfoExtended} from "./pnf.model.info.extended";
5 import {DynamicInputsService} from "../../dynamicInputs.service";
6 import {SharedTreeService} from "../../shared.tree.service";
7 import {NgRedux} from "@angular-redux/store";
8 import {AppState} from "../../../../../shared/store/reducers";
9 import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
10 import {DialogService} from "ng2-bootstrap-modal";
11 import {DuplicateService} from "../../../duplicate/duplicate.service";
12 import {IframeService} from "../../../../../shared/utils/iframe.service";
13 import {ComponentInfoService} from "../../../component-info/component-info.service";
14 import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
15 import {HttpClient, HttpHandler} from "@angular/common/http";
16 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
17 import {PnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/pnf/pnf.popup.service";
18 import {DrawingBoardModes} from "../../../drawing-board.modes";
19 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
20 import {PNFModel} from "../../../../../shared/models/pnfModel";
21 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
23 class MockFeatureFlagsService extends FeatureFlagsService {
24 getAllFlags(): { [p: string]: boolean } {
31 return this.getPnfNodeWithAction(ServiceInstanceActions.None);
34 static getPnfNodeWithAction(action: ServiceInstanceActions) {
38 "pnfStoreKey": "PNF_KEY",
41 "modelUniqueId": "modelCustomizationId",
53 describe('Pnf Model Info Extended', () => {
55 let _dynamicInputsService: DynamicInputsService;
56 let _sharedTreeService: SharedTreeService;
57 let _dialogService: DialogService;
58 let _pnfPopupService: PnfPopupService;
59 let _duplicateService: DuplicateService;
60 let _iframeService: IframeService;
61 let _featureFlagsService: FeatureFlagsService;
62 let _store: NgRedux<AppState>;
63 let pnfModelExtended: PnfModelInfoExtended;
66 TestBed.configureTestingModule({
67 imports: [HttpClientTestingModule, NgReduxTestingModule],
73 DefaultDataGeneratorService,
79 {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
82 }).compileComponents();
84 injector = getTestBed();
85 _sharedTreeService = injector.get(SharedTreeService);
86 _store = injector.get(NgRedux);
87 _featureFlagsService = injector.get(FeatureFlagsService);
89 pnfModelExtended = new PnfModelInfoExtended(
97 _dynamicInputsService);
100 test('pnfModelExtended should be defined', () => {
101 expect(pnfModelExtended).toBeDefined();
104 test('getMenuAction: edit should not be visible when mode is null and actions is "None"', () => {
105 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
109 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
110 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
111 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
113 expect(menuActions['edit']).toBeDefined();
114 expect(menuActions['edit'].visible(node)).toBeFalsy();
115 expect(menuActions['edit'].enable(node)).toBeFalsy();
118 test('getMenuAction: edit should be visible when mode is null and action is "Create"', () => {
119 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
123 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
124 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
125 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
127 expect(menuActions['edit']).toBeDefined();
128 expect(menuActions['edit'].visible(node)).toBeTruthy();
129 expect(menuActions['edit'].enable(node)).toBeTruthy();
132 test('getMenuAction: edit should be visible when mode is "RETRY" and action is "Create"', () => {
133 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
135 drawingBoardStatus: DrawingBoardModes.RETRY
139 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
140 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
141 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
143 expect(menuActions['edit']).toBeDefined();
144 expect(menuActions['edit'].visible(node)).toBeFalsy();
145 expect(menuActions['edit'].enable(node)).toBeFalsy();
148 test('getMenuAction: showAuditInfo should be visible when mode is "RETRY"', () => {
149 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
151 drawingBoardStatus: DrawingBoardModes.RETRY
155 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
156 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
157 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
159 expect(menuActions['showAuditInfo']).toBeDefined();
160 expect(menuActions['showAuditInfo'].visible(node)).toBeTruthy();
161 expect(menuActions['showAuditInfo'].enable(node)).toBeTruthy();
164 test('getMenuAction: showAuditInfo should not be visible when mode is not "RETRY" and action is "CREATE"', () => {
165 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
167 drawingBoardStatus: DrawingBoardModes.EDIT
171 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
172 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
173 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
175 expect(menuActions['showAuditInfo']).toBeDefined();
176 expect(menuActions['showAuditInfo'].visible(node)).toBeFalsy();
177 expect(menuActions['showAuditInfo'].enable(node)).toBeFalsy();
180 test('getMenuAction: remove should dispatch 2 actions with proper data', () => {
181 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
182 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
183 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
185 spyOn(_store, 'dispatch');
186 menuActions['remove'].method(node, serviceModelId);
188 expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
189 type: "REMOVE_INSTANCE",
192 expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
193 type: "CHANGE_INSTANCE_COUNTER",
198 test('getMenuAction: remove should not dispatch actions when node has children', () => {
199 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
200 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
201 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
202 node.data.children = [
206 spyOn(_store, 'dispatch');
207 menuActions['remove'].method(node, serviceModelId);
209 expect(_store.dispatch).not.toHaveBeenCalledWith(jasmine.objectContaining({
210 type: "REMOVE_INSTANCE",
213 expect(_store.dispatch).not.toHaveBeenCalledWith(jasmine.objectContaining({
214 type: "CHANGE_INSTANCE_COUNTER",
219 test('getMenuAction: delete should dispatch delete action', () => {
220 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
221 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
222 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
224 spyOn(_store, 'dispatch');
225 menuActions['delete'].method(node, serviceModelId);
227 expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
228 type: "DELETE_PNF_INSTANCE",
233 test('getMenuAction: delete should show modal when node has children', () => {
234 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
235 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
236 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
237 node.data.children = [
241 spyOn(_sharedTreeService, 'shouldShowDeleteInstanceWithChildrenModal');
242 menuActions['delete'].method(node, serviceModelId);
244 expect(_sharedTreeService.shouldShowDeleteInstanceWithChildrenModal).toHaveBeenCalledWith(jasmine.objectContaining({
246 }), jasmine.anything(), jasmine.anything());
249 test('getMenuAction: delete should not be visible when service isMacro', () => {
250 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
252 drawingBoardStatus: DrawingBoardModes.EDIT
256 "d6557200-ecf2-4641-8094-5393ae3aae60": {
263 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
264 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
265 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
267 expect(menuActions['delete']).toBeDefined();
268 expect(menuActions['delete'].visible(node)).toBeFalsy();
269 expect(menuActions['delete'].enable(node)).toBeFalsy();
272 test('getMenuAction: delete should not be visible when service is aLaCarte and Action is Create', () => {
273 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
275 drawingBoardStatus: DrawingBoardModes.EDIT
279 "d6557200-ecf2-4641-8094-5393ae3aae60": {
286 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
287 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
288 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
290 expect(menuActions['delete']).toBeDefined();
291 expect(menuActions['delete'].visible(node)).toBeFalsy();
292 expect(menuActions['delete'].enable(node)).toBeFalsy();
295 test('getMenuAction: delete should be visible when service is aLaCarte and Action is None', () => {
296 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
298 drawingBoardStatus: DrawingBoardModes.EDIT
302 "d6557200-ecf2-4641-8094-5393ae3aae60": {
309 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
310 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
311 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
313 expect(menuActions['delete']).toBeDefined();
314 expect(menuActions['delete'].visible(node)).toBeTruthy();
315 expect(menuActions['delete'].enable(node)).toBeTruthy();
318 test('getMenuAction: undo delete should dispatch undo delete action when no children', () => {
319 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
320 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
321 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
323 spyOn(_store, 'dispatch');
324 menuActions['undoDelete'].method(node, serviceModelId);
326 expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
327 type: "UNDO_DELETE_PNF_INSTANCE",
332 test('getMenuAction: undo delete should iterate over children when they exist', () => {
333 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
334 node.data.children = [
337 node.children = node.data.children;
338 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
339 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
341 spyOn(_store, 'dispatch');
342 menuActions['undoDelete'].method(node, serviceModelId);
344 expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
345 type: "UNDO_DELETE_PNF_INSTANCE",
350 test('getMenuAction: undo delete should not be visible when action is Create or Delete', () => {
351 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
353 drawingBoardStatus: DrawingBoardModes.EDIT
357 "d6557200-ecf2-4641-8094-5393ae3aae60": {}
362 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
363 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
364 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
366 expect(menuActions['undoDelete']).toBeDefined();
367 expect(menuActions['undoDelete'].visible(node)).toBeFalsy();
368 expect(menuActions['undoDelete'].enable(node)).toBeFalsy();
371 test('getMenuAction: undo delete should be visible when action is contains "*_Delete"', () => {
372 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
374 drawingBoardStatus: DrawingBoardModes.EDIT
378 "d6557200-ecf2-4641-8094-5393ae3aae60": {
379 action: ServiceInstanceActions.None
385 let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None_Delete);
386 let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
387 let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
389 expect(menuActions['undoDelete']).toBeDefined();
390 expect(menuActions['undoDelete'].visible(node)).toBeTruthy();
391 expect(menuActions['undoDelete'].enable(node, serviceModelId)).toBeTruthy();
394 test('getModel should return PNF model', () => {
395 expect(pnfModelExtended.getModel({})).toBeInstanceOf(PNFModel);
398 test('getNextLevelObject should return null as there are no childs expected in PNF for now', () => {
399 expect(pnfModelExtended.getNextLevelObject()).toBeNull();
402 test('getNodeCount should return counter of 0 when existingPNFCounterMap doesnt exist', () => {
403 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
407 'd6557200-ecf2-4641-8094-5393ae3aae60': {}
412 let serviceId: string = 'd6557200-ecf2-4641-8094-5393ae3aae60';
413 let node = NodeBuilder.getPnfNode();
414 let result = pnfModelExtended.getNodeCount(<any>node, serviceId);
415 jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
417 expect(result).toEqual(0);
420 test('getNodeCount should return counter of 1 when one node exists and no nodes in delete mode', () => {
421 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
425 'd6557200-ecf2-4641-8094-5393ae3aae60': {
426 'existingPNFCounterMap': {
427 'modelCustomizationId': 1
434 let serviceId: string = 'd6557200-ecf2-4641-8094-5393ae3aae60';
435 let node = NodeBuilder.getPnfNode();
436 let result = pnfModelExtended.getNodeCount(<any>node, serviceId);
437 jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
439 expect(result).toEqual(1);
442 test('getNodeCount should return counter of 2 when three nodes exist and one node is in delete mode', () => {
443 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
447 'd6557200-ecf2-4641-8094-5393ae3aae60': {
448 'existingPNFCounterMap': {
449 'modelCustomizationId': 3
456 jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(1);
457 let serviceId: string = 'd6557200-ecf2-4641-8094-5393ae3aae60';
458 let node = NodeBuilder.getPnfNode();
459 let result = pnfModelExtended.getNodeCount(<any>node, serviceId);
461 expect(result).toEqual(2);
464 test('getTooltip should return "PNF"', () => {
465 expect(pnfModelExtended.getTooltip()).toEqual('PNF');
468 test('getType should return "PNF"', () => {
469 expect(pnfModelExtended.getType()).toEqual('PNF');
472 test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
473 let isEcompGeneratedNaming: boolean = pnfModelExtended.isEcompGeneratedNaming(<any>{
475 ecomp_generated_naming: 'true'
478 expect(isEcompGeneratedNaming).toBeTruthy();
481 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
482 let isEcompGeneratedNaming: boolean = pnfModelExtended.isEcompGeneratedNaming({
485 expect(isEcompGeneratedNaming).toBeFalsy();
488 test('showNodeIcons should return false if reached limit of instances', () => {
489 let serviceId: string = 'servicedId';
490 let node = NodeBuilder.getPnfNode();
491 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
497 modelCustomizationId: "modelCustomizationId",
499 modelCustomizationId: "modelCustomizationId"
511 'existingPNFCounterMap': {
512 'modelCustomizationId': 1
522 let result = pnfModelExtended.showNodeIcons(<any>node, serviceId);
523 expect(result).toEqual(new AvailableNodeIcons(false, true));
526 test('showNodeIcons should return true if limit of instances is not reached', () => {
527 let serviceId: string = 'servicedId';
528 let node = NodeBuilder.getPnfNode();
529 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
531 drawingBoardStatus: DrawingBoardModes.EDIT
537 modelCustomizationId: "modelCustomizationId",
539 modelCustomizationId: "modelCustomizationId"
551 'existingPNFCounterMap': {
552 'modelCustomizationId': 1
562 let result = pnfModelExtended.showNodeIcons(<any>node, serviceId);
563 expect(result).toEqual(new AvailableNodeIcons(true, false));
566 test('hasMissingData returns true instanceName is empty and ecompNameGenerating is off ', () => {
569 platformName: "platformName"
572 let result = pnfModelExtended.hasMissingData(instance, [], false);
574 expect(result).toBeTruthy();
577 test('hasMissingData returns true when at least one required field is empty ', () => {
582 let result = pnfModelExtended.hasMissingData(instance, [], true);
584 expect(result).toBeTruthy();
587 test('hasMissingData returns false when there is no missing data', () => {
589 platformName: "platformName"
592 let result = pnfModelExtended.hasMissingData(instance, [], true);
594 expect(result).toBeFalsy();