1 import {HttpClientTestingModule} from "@angular/common/http/testing";
2 import {getTestBed, TestBed} from "@angular/core/testing";
3 import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
4 import {NetworkModelInfo} from "./network.model.info";
5 import {DynamicInputsService} from "../../dynamicInputs.service";
6 import {SharedTreeService} from "../../shared.tree.service";
7 import {NgRedux} from "@angular-redux/store";
8 import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
9 import {DialogService} from "ng2-bootstrap-modal";
10 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
11 import {DrawingBoardModes} from "../../../drawing-board.modes";
12 import {IframeService} from "../../../../../shared/utils/iframe.service";
13 import {DuplicateService} from "../../../duplicate/duplicate.service";
14 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
15 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
16 import {NetworkModel} from "../../../../../shared/models/networkModel";
18 class MockAppStore<T> {
22 'drawingBoardStatus': DrawingBoardModes.CREATE
38 'existingNetworksCounterMap': {
44 'originalName': 'networkName'
54 class MockFeatureFlagsService extends FeatureFlagsService {
55 getAllFlags(): { [p: string]: boolean } {
61 describe('Network Model Info', () => {
63 let _dynamicInputsService: DynamicInputsService;
64 let _sharedTreeService: SharedTreeService;
65 let networkModel: NetworkModelInfo;
66 let _dialogService: DialogService;
67 let _networkPopupService: NetworkPopupService;
68 let _duplicateService: DuplicateService;
69 let _iframeService: IframeService;
70 let _featureFlagsService: FeatureFlagsService;
72 beforeAll(done => (async () => {
73 TestBed.configureTestingModule({
74 imports: [HttpClientTestingModule, NgReduxTestingModule],
82 {provide: NgRedux, useClass: MockAppStore},
83 {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
86 await TestBed.compileComponents();
88 injector = getTestBed();
89 _sharedTreeService = injector.get(SharedTreeService);
90 _featureFlagsService = injector.get(FeatureFlagsService);
92 networkModel = new NetworkModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _networkPopupService, _duplicateService, null, _iframeService, _featureFlagsService, MockNgRedux.getInstance());
93 })().then(done).catch(done.fail));
95 test('NetworkModelInfo should be defined', () => {
96 expect(NetworkModelInfo).toBeDefined();
99 test('NetworkModelInfo should defined extra details', () => {
100 expect(networkModel.name).toEqual('networks');
101 expect(networkModel.type).toEqual('Network');
104 test('isEcompGeneratedNaming should return true if = isEcompGeneratedNaming is "true" ', () => {
105 let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
107 ecomp_generated_naming: 'true'
110 expect(isEcompGeneratedNaming).toBeTruthy();
113 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
114 let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
116 ecomp_generated_naming: 'false'
119 expect(isEcompGeneratedNaming).toBeFalsy();
122 test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
123 let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
126 expect(isEcompGeneratedNaming).toBeFalsy();
129 test('getTooltip should return "VF"', () => {
130 let tooltip: string = networkModel.getTooltip();
131 expect(tooltip).toEqual('Network');
134 test('getType should return "VF"', () => {
135 let tooltip: string = networkModel.getType();
136 expect(tooltip).toEqual('Network');
139 test('getNextLevelObject should return null', () => {
140 let nextLevel = networkModel.getNextLevelObject();
141 expect(nextLevel).toBeNull();
144 test('updateDynamicInputsDataFromModel should return empty array', () => {
145 let dynamicInputs = networkModel.updateDynamicInputsDataFromModel({});
146 expect(dynamicInputs).toEqual([]);
149 test('getModel should return Network model', () => {
150 expect(networkModel.getModel({})).toBeInstanceOf(NetworkModel);
153 test('showNodeIcons should return false if reachLimit of max', () => {
154 let serviceId: string = 'servicedId';
159 modelCustomizationId: 'modelCustomizationId'
162 jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
163 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
179 'existingNetworksCounterMap': {
180 'modelCustomizationId': 1
190 let result = networkModel.showNodeIcons(<any>node, serviceId);
191 expect(result).toEqual(new AvailableNodeIcons(true, false));
194 test('showNodeIcons should return true if not reachLimit of max', () => {
195 let serviceId: string = 'servicedId';
202 jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
203 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
219 'existingNetworksCounterMap': {
230 let result = networkModel.showNodeIcons(<any>node, serviceId);
231 expect(result).toEqual(new AvailableNodeIcons(true, false));
234 test('getNodeCount should return number of nodes', () => {
235 let serviceId: string = 'servicedId';
236 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
252 'existingNetworksCounterMap': {
253 'modelCustomizationId': 1
258 'originalName': 'networkName'
271 modelCustomizationId: "modelCustomizationId",
272 modelUniqueId: "modelCustomizationId"
275 let result = networkModel.getNodeCount(<any>node, serviceId);
276 expect(result).toEqual(1);
278 node.data.modelCustomizationId = 'networkId_notExist';
279 node.data.modelUniqueId = 'networkId_notExist';
280 result = networkModel.getNodeCount(<any>node, serviceId);
281 expect(result).toEqual(0);
284 test('getMenuAction: showAuditInfoNetwork', () => {
286 jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
288 "drawingBoardStatus": DrawingBoardModes.RETRY
291 jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
294 "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
299 let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
300 let result = networkModel.getMenuAction(<any>node, serviceModelId);
301 spyOn(result['showAuditInfo'], 'method');
302 expect(result['showAuditInfo']).toBeDefined();
303 expect(result['showAuditInfo'].visible(node)).toBeTruthy();
304 expect(result['showAuditInfo'].enable(node)).toBeTruthy();
305 result['showAuditInfo']['method'](node, serviceModelId);
306 expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
309 test('Info for network should be correct', () => {
310 const model = getNetworkModel();
311 const instance = getNetworkInstance();
312 let actualNetworkInfo = networkModel.getInfo(model, instance);
313 let expectedNetworkInfo = [
314 ModelInformationItem.createInstance("Min instances", "0"),
315 ModelInformationItem.createInstance("Max instances", "1"),
316 ModelInformationItem.createInstance('Network role', "network role 1, network role 2"),
317 ModelInformationItem.createInstance("Route target id", null),
318 ModelInformationItem.createInstance("Route target role", null),
320 expect(actualNetworkInfo).toEqual(expectedNetworkInfo);
323 test('When there is no max Max instances text is: Unlimited (default)', () => {
324 let actualVNFInfo = networkModel.getInfo({just:"not empty"},null);
325 const maxInstancesItem = actualVNFInfo.find((item)=> item.label == 'Max instances');
326 expect(maxInstancesItem.values[0]).toEqual('Unlimited (default)');
329 function getNetworkModel() {
331 "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
334 "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
335 "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
336 "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
339 "isEcompGeneratedNaming": false,
341 "modelCustomizationName": "ExtVL 0",
342 "roles": ["network role 1", " network role 2"],
344 "network_role": "network role 1, network role 2",
345 "network_assignments":
346 "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
347 "exVL_naming": "{ecomp_generated_naming=true}",
348 "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
349 "network_homing": "{ecomp_selected_instance_node_target=false}"
355 function getNetworkInstance() {
357 "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
358 "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
359 "modelUniqueId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
361 "id": "NETWORK4_INSTANCE_ID",
363 "orchStatus": "Created",
364 "provStatus": "preprov",
366 "instanceId": "NETWORK4_INSTANCE_ID",
367 "instanceType": "CONTRAIL30_HIMELGUARD",
368 "instanceName": "NETWORK4_INSTANCE_NAME",
369 "name": "NETWORK4_INSTANCE_NAME",
370 "modelName": "ExtVL 0",
372 "isEcompGeneratedNaming": false,
373 "networkStoreKey": "NETWORK4_INSTANCE_ID",
375 "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}},
378 "statusProperties": [{"key": "Prov Status:", "value": "preprov", "testId": "provStatus"}, {
379 "key": "Orch Status:",
381 "testId": "orchStatus"
383 "trackById": "1wvr73xl999",
385 "componentInfoType": "Network",