2 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing
14 * permissions and limitations under the License.
16 import deepFreeze from 'deep-freeze';
17 import mockRest from 'test-utils/MockRest.js';
18 import {cloneAndSet, buildFromExistingObject} from 'test-utils/Util.js';
19 import {storeCreator} from 'sdc-app/AppStore.js';
21 import SoftwareProductCreationActionHelper from 'sdc-app/onboarding/softwareProduct/creation/SoftwareProductCreationActionHelper.js';
22 import SoftwareProductActionHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductActionHelper.js';
23 import SoftwareProductCategoriesHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductCategoriesHelper.js';
24 import {forms} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
25 import ValidationHelper from 'sdc-app/common/helpers/ValidationHelper.js';
27 import {VSPEditorFactory, VSPEditorPostFactory, VSPEditorFactoryWithLicensingData, VSPEditorPostFactoryWithLicensingData} from 'test-utils/factories/softwareProduct/SoftwareProductEditorFactories.js';
28 import {CategoryFactory} from 'test-utils/factories/softwareProduct/VSPCategoriesFactory.js';
29 import {heatSetupManifest} from 'test-utils/factories/softwareProduct/SoftwareProductAttachmentsFactories.js';
31 import { FeatureGroupStoreFactory as FeatureGroup} from 'test-utils/factories/licenseModel/FeatureGroupFactories.js';
32 import {LicenseAgreementStoreFactory as LicenseAgreement} from 'test-utils/factories/licenseModel/LicenseAgreementFactories.js';
33 import VersionControllerUtilsFactory from 'test-utils/factories/softwareProduct/VersionControllerUtilsFactory.js';
36 describe('Software Product Module Tests', function () {
37 it('Get Software Products List', () => {
38 const store = storeCreator();
39 deepFreeze(store.getState());
40 const softwareProductList = VSPEditorFactory.buildList(2);
41 deepFreeze(softwareProductList);
42 deepFreeze(store.getState());
43 const expectedStore = cloneAndSet(store.getState(), 'softwareProductList', softwareProductList);
45 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
46 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
47 expect(data).toEqual(undefined);
48 expect(options).toEqual(undefined);
49 return {results: softwareProductList};
52 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
53 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/?versionFilter=Final');
54 expect(data).toEqual(undefined);
55 expect(options).toEqual(undefined);
59 return SoftwareProductActionHelper.fetchSoftwareProductList(store.dispatch).then(() => {
60 return SoftwareProductActionHelper.fetchFinalizedSoftwareProductList(store.dispatch);
62 expect(store.getState()).toEqual(expectedStore);
66 it('Add Software Product', () => {
67 const store = storeCreator();
68 deepFreeze(store.getState());
70 const softwareProductPostRequest = VSPEditorPostFactory.build();
71 deepFreeze(softwareProductPostRequest);
72 const idFromResponse = '1';
73 const expectedVSP = VSPEditorPostFactory.build({id: idFromResponse, vendorId: softwareProductPostRequest.vendorId});
74 deepFreeze(expectedVSP);
76 mockRest.addHandler('post', ({options, data, baseUrl}) => {
77 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
78 expect(data).toEqual(softwareProductPostRequest);
79 expect(options).toEqual(undefined);
85 return SoftwareProductCreationActionHelper.createSoftwareProduct(store.dispatch, {
86 softwareProduct: softwareProductPostRequest
87 }).then((response) => {
88 expect(response.vspId).toEqual(idFromResponse);
92 it('Fetch Software Product with manifest', () => {
93 const store = storeCreator();
94 deepFreeze(store.getState());
96 const softwareProductPostRequest = VSPEditorPostFactory.build();
97 deepFreeze(softwareProductPostRequest);
99 const expectedGenericInfo = {
103 validations: [{type: 'validateName', data: true}, {type: 'maxLength', data: 25}, {
111 validations: [{type: 'required', data: true}]
114 const expectedFormName = forms.VENDOR_SOFTWARE_PRODUCT_DETAILS;
116 const idFromResponse = '1';
117 const version = { id: '0.1', label: '0.1'};
118 const expectedVSP = VSPEditorPostFactory.build({id: idFromResponse, vendorId: softwareProductPostRequest.vendorId});
119 deepFreeze(expectedVSP);
120 let expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductEditor.data', expectedVSP);
121 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.genericFieldInfo', expectedGenericInfo);
122 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.formName', expectedFormName);
123 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductQuestionnaire', {qdata: {}, dataMap: {}, qgenericFieldInfo: {}});
125 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductAttachments.heatValidation', {
126 'attachmentsTree': {},
128 'selectedNode': 'All'
130 let manifest = heatSetupManifest.build();
131 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductAttachments.heatSetup', manifest);
133 mockRest.addHandler('post', ({options, data, baseUrl}) => {
134 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
135 expect(data).toEqual(softwareProductPostRequest);
136 expect(options).toEqual(undefined);
138 vspId: idFromResponse,
143 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
144 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}`);
145 expect(data).toEqual(undefined);
146 expect(options).toEqual(undefined);
150 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
151 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}/questionnaire`);
152 expect(data).toEqual(undefined);
153 expect(options).toEqual(undefined);
154 return {data: JSON.stringify({}), schema: JSON.stringify({})};
157 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
158 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}/orchestration-template-candidate/manifest`);
159 expect(data).toEqual(undefined);
160 expect(options).toEqual(undefined);
164 return SoftwareProductCreationActionHelper.createSoftwareProduct(store.dispatch, {
165 softwareProduct: softwareProductPostRequest
167 return SoftwareProductActionHelper.fetchSoftwareProduct(store.dispatch, {softwareProductId: idFromResponse, version});
169 return SoftwareProductActionHelper.loadSoftwareProductHeatCandidate(store.dispatch, {softwareProductId: idFromResponse, version});
171 expect(store.getState()).toEqual(expectedStore);
172 let newName = 'newName';
173 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.formReady', null);
174 ValidationHelper.dataChanged(store.dispatch, {deltaData: {'name': newName}, formName: forms.VENDOR_SOFTWARE_PRODUCT_DETAILS});
175 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.data.name', newName);
176 expect(store.getState()).toEqual(expectedStore);
180 it('Load and edit Software Product licensing data', () => {
181 const store = storeCreator();
183 const softwareProductPostRequest = VSPEditorPostFactory.build();
184 deepFreeze(softwareProductPostRequest);
186 const licenseModelId = softwareProductPostRequest.vendorId;
187 const LMVersion = VersionControllerUtilsFactory.build().version;
188 const secondLicenseModelId = 'secondLicenseModelId';
190 let FG1 = FeatureGroup.build();
191 let LA1 = LicenseAgreement.build({
192 featureGroupsIds: [FG1.id]
195 let FG2 = FeatureGroup.build();
196 let LA2 = LicenseAgreement.build({
197 featureGroupsIds: [FG2.id]
200 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
201 expect(baseUrl).toEqual('/sdc1/feProxy/rest/v1/categories/resources/');
202 expect(data).toEqual(undefined);
203 expect(options).toEqual(undefined);
207 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
208 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-license-models/?versionFilter=Final');
209 expect(data).toEqual(undefined);
210 expect(options).toEqual(undefined);
211 return {results: []};
214 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
215 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${licenseModelId}/versions/${LMVersion.id}/license-agreements`);
216 expect(data).toEqual(undefined);
217 expect(options).toEqual(undefined);
218 return {results: [LA1]};
221 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
222 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${licenseModelId}/versions/${LMVersion.id}/feature-groups`);
223 expect(data).toEqual(undefined);
224 expect(options).toEqual(undefined);
225 return {results: [FG1]};
228 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
229 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${secondLicenseModelId}/versions/${LMVersion.id}/license-agreements`);
230 expect(data).toEqual(undefined);
231 expect(options).toEqual(undefined);
232 return {results: [LA2]};
235 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
236 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${secondLicenseModelId}/versions/${LMVersion.id}/feature-groups`);
237 expect(data).toEqual(undefined);
238 expect(options).toEqual(undefined);
239 return {results: [FG2]};
242 return SoftwareProductActionHelper.loadSoftwareProductDetailsData(store.dispatch, {licenseModelId, licensingVersion: LMVersion}).then(() => {
243 let state = store.getState();
244 expect(state.licenseModel.licenseAgreement.licenseAgreementList).toEqual([LA1]);
245 expect(state.licenseModel.featureGroup.featureGroupsList).toEqual([FG1]);
246 return SoftwareProductActionHelper.softwareProductEditorVendorChanged(store.dispatch,
247 {deltaData: {vendorId: secondLicenseModelId, licensingVersion: LMVersion},
248 formName: forms.VENDOR_SOFTWARE_PRODUCT_DETAILS});
250 let state = store.getState();
251 expect(state.licenseModel.licenseAgreement.licenseAgreementList).toEqual([LA2]);
252 expect(state.licenseModel.featureGroup.featureGroupsList).toEqual([FG2]);
256 it('Save Software product', () => {
258 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
259 deepFreeze(softwareProduct);
261 const store = storeCreator({
263 softwareProductEditor: {data: softwareProduct},
264 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
267 deepFreeze(store.getState());
269 const dataForUpdate = {
270 name: 'VSP5_UPDATED',
271 description: 'A software model for Fortigate._UPDATED'
274 const toBeUpdatedSoftwareProductId = softwareProduct.id;
275 let softwareProductUpdateData = VSPEditorPostFactoryWithLicensingData.build(dataForUpdate);
276 delete softwareProductUpdateData.version;
278 const softwareProductPutRequest = buildFromExistingObject(VSPEditorFactoryWithLicensingData, softwareProductUpdateData, {id: toBeUpdatedSoftwareProductId, version: softwareProduct.version});
280 deepFreeze(softwareProductUpdateData);
282 const expectedStore = cloneAndSet(store.getState(), 'softwareProductList', [softwareProductPutRequest]);
283 const questionnaireData = {
286 affinityGrouping: true,
287 antiAffinityGrouping: false
291 deepFreeze(questionnaireData);
293 mockRest.addHandler('put', ({data, options, baseUrl}) => {
294 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${softwareProduct.version.id}`);
295 expect(data).toEqual(softwareProductUpdateData);
296 expect(options).toEqual(undefined);
297 return {returnCode: 'OK'};
299 mockRest.addHandler('put', ({data, options, baseUrl}) => {
300 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${softwareProduct.version.id}/questionnaire`);
301 expect(data).toEqual(questionnaireData);
302 expect(options).toEqual(undefined);
303 return {returnCode: 'OK'};
306 return SoftwareProductActionHelper.updateSoftwareProduct(store.dispatch, {
307 softwareProduct: softwareProductPutRequest,
308 qdata: questionnaireData
310 expect(store.getState()).toEqual(expectedStore);
314 it('Save Software product data only', () => {
316 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
317 deepFreeze(softwareProduct);
319 const store = storeCreator({
321 softwareProductEditor: {data: softwareProduct},
322 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
325 deepFreeze(store.getState());
326 const expectedStore = store.getState();
328 const dataForUpdate = {
329 name: 'VSP5_UPDATED',
330 description: 'A software model for Fortigate._UPDATED'
333 const toBeUpdatedSoftwareProductId = softwareProduct.id;
334 let softwareProductUpdateData = VSPEditorPostFactoryWithLicensingData.build(dataForUpdate);
335 delete softwareProductUpdateData.version;
337 const softwareProductPutRequest = buildFromExistingObject(VSPEditorFactoryWithLicensingData, softwareProductUpdateData, {id: toBeUpdatedSoftwareProductId, version: softwareProduct.version});
339 deepFreeze(softwareProductUpdateData);
341 mockRest.addHandler('put', ({data, options, baseUrl}) => {
342 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${softwareProduct.version.id}`);
343 expect(data).toEqual(softwareProductUpdateData);
344 expect(options).toEqual(undefined);
345 return {returnCode: 'OK'};
348 return SoftwareProductActionHelper.updateSoftwareProductData(store.dispatch, {
349 softwareProduct: softwareProductPutRequest
351 expect(store.getState()).toEqual(expectedStore);
355 it('Save Software product questionnaire only', () => {
356 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
357 deepFreeze(softwareProduct);
359 const store = storeCreator({
361 softwareProductEditor: {data: softwareProduct},
362 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
365 deepFreeze(store.getState());
366 const expectedStore = store.getState();
368 const toBeUpdatedSoftwareProductId = softwareProduct.id;
369 const questionnaireData = {
372 affinityGrouping: true,
373 antiAffinityGrouping: false
377 deepFreeze(questionnaireData);
379 mockRest.addHandler('put', ({data, options, baseUrl}) => {
380 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${softwareProduct.version.id}/questionnaire`);
381 expect(data).toEqual(questionnaireData);
382 expect(options).toEqual(undefined);
383 return {returnCode: 'OK'};
386 return SoftwareProductActionHelper.updateSoftwareProductQuestionnaire(store.dispatch, {
387 softwareProductId: softwareProduct.id,
388 version: softwareProduct.version,
389 qdata: questionnaireData
391 expect(store.getState()).toEqual(expectedStore);
395 it('Handle category without subcategories', () => {
397 const categories = CategoryFactory.buildList(3);
398 categories[0].subcategories = CategoryFactory.buildList(3);
399 categories[2].subcategories = CategoryFactory.buildList(3);
401 const category = SoftwareProductCategoriesHelper.getCurrentCategoryOfSubCategory(categories[2].subcategories[2].uniqueId, categories);
402 expect(category).toEqual(categories[2].uniqueId);