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';
34 import VersionFactory from 'test-utils/factories/common/VersionFactory.js';
35 import {InitializedCurrentScreenFactory} from 'test-utils/factories/common/CurrentScreenFactory.js';
37 describe('Software Product Details Module Tests', function () {
38 it('Get Software Products List', () => {
39 const store = storeCreator();
40 deepFreeze(store.getState());
41 const softwareProductList = VSPEditorFactory.buildList(2);
42 deepFreeze(softwareProductList);
43 deepFreeze(store.getState());
44 const expectedStore = cloneAndSet(store.getState(), 'softwareProductList', softwareProductList);
46 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
47 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/?versionFilter=Draft');
48 expect(data).toEqual(undefined);
49 expect(options).toEqual(undefined);
50 return {results: softwareProductList};
53 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
54 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/?versionFilter=Certified');
55 expect(data).toEqual(undefined);
56 expect(options).toEqual(undefined);
60 return SoftwareProductActionHelper.fetchSoftwareProductList(store.dispatch).then(() => {
61 return SoftwareProductActionHelper.fetchFinalizedSoftwareProductList(store.dispatch);
63 expect(store.getState()).toEqual(expectedStore);
67 it('Add Software Product', () => {
68 const store = storeCreator();
69 deepFreeze(store.getState());
71 const softwareProductPostRequest = VSPEditorPostFactory.build();
72 deepFreeze(softwareProductPostRequest);
73 const idFromResponse = '1';
74 const expectedVSP = VSPEditorPostFactory.build({id: idFromResponse, vendorId: softwareProductPostRequest.vendorId});
75 deepFreeze(expectedVSP);
77 mockRest.addHandler('post', ({options, data, baseUrl}) => {
78 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
79 expect(data).toEqual(softwareProductPostRequest);
80 expect(options).toEqual(undefined);
86 return SoftwareProductCreationActionHelper.createSoftwareProduct(store.dispatch, {
87 softwareProduct: softwareProductPostRequest
88 }).then((response) => {
89 expect(response.vspId).toEqual(idFromResponse);
93 it('Fetch Software Product with manifest', () => {
94 const store = storeCreator();
95 deepFreeze(store.getState());
97 const softwareProductPostRequest = VSPEditorPostFactory.build();
98 deepFreeze(softwareProductPostRequest);
100 const expectedGenericInfo = {
104 validations: [{type: 'validateName', data: true}, {type: 'maxLength', data: 25}, {
112 validations: [{type: 'required', data: true}]
115 const expectedFormName = forms.VENDOR_SOFTWARE_PRODUCT_DETAILS;
117 const idFromResponse = '1';
118 const version = { id: '0.1', label: '0.1'};
119 const expectedVSP = VSPEditorPostFactory.build({id: idFromResponse, vendorId: softwareProductPostRequest.vendorId});
120 deepFreeze(expectedVSP);
121 let expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductEditor.data', expectedVSP);
122 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.genericFieldInfo', expectedGenericInfo);
123 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.formName', expectedFormName);
124 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductQuestionnaire', {qdata: {}, dataMap: {}, qgenericFieldInfo: {}});
126 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductAttachments.heatValidation', {
127 'attachmentsTree': {},
129 'selectedNode': 'All'
131 let manifest = heatSetupManifest.build();
132 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductAttachments.heatSetup', manifest);
134 const expectedCurrentScreen = InitializedCurrentScreenFactory.build();
135 expectedStore = cloneAndSet(expectedStore, 'currentScreen.itemPermission', expectedCurrentScreen.itemPermission);
136 expectedStore = cloneAndSet(expectedStore, 'currentScreen.props', expectedCurrentScreen.props);
138 mockRest.addHandler('post', ({options, data, baseUrl}) => {
139 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
140 expect(data).toEqual(softwareProductPostRequest);
141 expect(options).toEqual(undefined);
143 vspId: idFromResponse,
148 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
149 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}`);
150 expect(data).toEqual(undefined);
151 expect(options).toEqual(undefined);
155 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
156 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}/questionnaire`);
157 expect(data).toEqual(undefined);
158 expect(options).toEqual(undefined);
159 return {data: JSON.stringify({}), schema: JSON.stringify({})};
162 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
163 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}/orchestration-template-candidate/manifest`);
164 expect(data).toEqual(undefined);
165 expect(options).toEqual(undefined);
169 return SoftwareProductCreationActionHelper.createSoftwareProduct(store.dispatch, {
170 softwareProduct: softwareProductPostRequest
172 return SoftwareProductActionHelper.fetchSoftwareProduct(store.dispatch, {softwareProductId: idFromResponse, version});
174 return SoftwareProductActionHelper.loadSoftwareProductHeatCandidate(store.dispatch, {softwareProductId: idFromResponse, version});
176 expect(store.getState()).toEqual(expectedStore);
177 let newName = 'newName';
178 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.formReady', null);
179 ValidationHelper.dataChanged(store.dispatch, {deltaData: {'name': newName}, formName: forms.VENDOR_SOFTWARE_PRODUCT_DETAILS});
180 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.data.name', newName);
181 expect(store.getState()).toEqual(expectedStore);
185 it('Load and edit Software Product licensing data', () => {
186 const store = storeCreator();
188 const softwareProductPostRequest = VSPEditorPostFactory.build();
189 deepFreeze(softwareProductPostRequest);
191 const licenseModelId = softwareProductPostRequest.vendorId;
192 const LMVersion = VersionFactory.build();
193 const secondLicenseModelId = 'secondLicenseModelId';
195 let FG1 = FeatureGroup.build();
196 let LA1 = LicenseAgreement.build({
197 featureGroupsIds: [FG1.id]
200 let FG2 = FeatureGroup.build();
201 let LA2 = LicenseAgreement.build({
202 featureGroupsIds: [FG2.id]
205 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
206 expect(baseUrl).toEqual('/sdc1/feProxy/rest/v1/categories/resources/');
207 expect(data).toEqual(undefined);
208 expect(options).toEqual(undefined);
212 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
213 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-license-models/?versionFilter=Certified');
214 expect(data).toEqual(undefined);
215 expect(options).toEqual(undefined);
216 return {results: []};
219 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
220 expect(baseUrl).toEqual(`/onboarding-api/v1.0/items/${licenseModelId}/versions/${LMVersion.id}`);
221 expect(data).toEqual(undefined);
222 expect(options).toEqual(undefined);
223 return {results: {}};
226 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
227 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${licenseModelId}/versions/${LMVersion.id}/license-agreements`);
228 expect(data).toEqual(undefined);
229 expect(options).toEqual(undefined);
230 return {results: [LA1]};
233 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
234 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${licenseModelId}/versions/${LMVersion.id}/feature-groups`);
235 expect(data).toEqual(undefined);
236 expect(options).toEqual(undefined);
237 return {results: [FG1]};
240 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
241 expect(baseUrl).toEqual(`/onboarding-api/v1.0/items/${secondLicenseModelId}/versions/${LMVersion.id}`);
242 expect(data).toEqual(undefined);
243 expect(options).toEqual(undefined);
244 return {results: {}};
247 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
248 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${secondLicenseModelId}/versions/${LMVersion.id}/license-agreements`);
249 expect(data).toEqual(undefined);
250 expect(options).toEqual(undefined);
251 return {results: [LA2]};
254 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
255 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${secondLicenseModelId}/versions/${LMVersion.id}/feature-groups`);
256 expect(data).toEqual(undefined);
257 expect(options).toEqual(undefined);
258 return {results: [FG2]};
261 return SoftwareProductActionHelper.loadSoftwareProductDetailsData(store.dispatch, {licenseModelId, licensingVersion: LMVersion.id}).then(() => {
262 let state = store.getState();
263 expect(state.licenseModel.licenseAgreement.licenseAgreementList).toEqual([LA1]);
264 expect(state.licenseModel.featureGroup.featureGroupsList).toEqual([FG1]);
265 return SoftwareProductActionHelper.softwareProductEditorVendorChanged(store.dispatch,
266 {deltaData: {vendorId: secondLicenseModelId, licensingVersion: LMVersion.id},
267 formName: forms.VENDOR_SOFTWARE_PRODUCT_DETAILS}
269 let state = store.getState();
270 expect(state.licenseModel.licenseAgreement.licenseAgreementList).toEqual([LA2]);
271 expect(state.licenseModel.featureGroup.featureGroupsList).toEqual([FG2]);
276 it('Save Software product', () => {
278 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
279 deepFreeze(softwareProduct);
281 const version = VersionFactory.build();
283 const store = storeCreator({
285 softwareProductEditor: {data: softwareProduct},
286 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
289 deepFreeze(store.getState());
291 const dataForUpdate = {
292 name: 'VSP5_UPDATED',
293 description: 'A software model for Fortigate._UPDATED'
296 const toBeUpdatedSoftwareProductId = softwareProduct.id;
297 let softwareProductUpdateData = VSPEditorPostFactoryWithLicensingData.build(dataForUpdate);
298 delete softwareProductUpdateData.version;
300 const softwareProductPutRequest = buildFromExistingObject(VSPEditorFactoryWithLicensingData, softwareProductUpdateData, {id: toBeUpdatedSoftwareProductId, version: softwareProduct.version});
302 deepFreeze(softwareProductUpdateData);
304 const expectedStore = cloneAndSet(store.getState(), 'softwareProductList', [softwareProductPutRequest]);
305 const questionnaireData = {
308 affinityGrouping: true,
309 antiAffinityGrouping: false
313 deepFreeze(questionnaireData);
315 mockRest.addHandler('put', ({data, options, baseUrl}) => {
316 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}`);
317 expect(data).toEqual(softwareProductUpdateData);
318 expect(options).toEqual(undefined);
319 return {returnCode: 'OK'};
321 mockRest.addHandler('put', ({data, options, baseUrl}) => {
322 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}/questionnaire`);
323 expect(data).toEqual(questionnaireData);
324 expect(options).toEqual(undefined);
325 return {returnCode: 'OK'};
328 return SoftwareProductActionHelper.updateSoftwareProduct(store.dispatch, {
329 softwareProduct: softwareProductPutRequest,
330 qdata: questionnaireData,
333 expect(store.getState()).toEqual(expectedStore);
337 it('Save Software product data only', () => {
339 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
340 deepFreeze(softwareProduct);
342 const version = VersionFactory.build();
344 const store = storeCreator({
346 softwareProductEditor: {data: softwareProduct},
347 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
350 deepFreeze(store.getState());
351 const expectedStore = store.getState();
353 const dataForUpdate = {
354 name: 'VSP5_UPDATED',
355 description: 'A software model for Fortigate._UPDATED'
358 const toBeUpdatedSoftwareProductId = softwareProduct.id;
359 let softwareProductUpdateData = VSPEditorPostFactoryWithLicensingData.build(dataForUpdate);
360 delete softwareProductUpdateData.version;
362 const softwareProductPutRequest = buildFromExistingObject(VSPEditorFactoryWithLicensingData, softwareProductUpdateData, {id: toBeUpdatedSoftwareProductId});
364 deepFreeze(softwareProductUpdateData);
366 mockRest.addHandler('put', ({data, options, baseUrl}) => {
367 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}`);
368 expect(data).toEqual(softwareProductUpdateData);
369 expect(options).toEqual(undefined);
370 return {returnCode: 'OK'};
373 return SoftwareProductActionHelper.updateSoftwareProductData(store.dispatch, {
374 softwareProduct: softwareProductPutRequest,
377 expect(store.getState()).toEqual(expectedStore);
381 it('Save Software product questionnaire only', () => {
382 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
383 deepFreeze(softwareProduct);
385 const version = VersionFactory.build();
387 const store = storeCreator({
389 softwareProductEditor: {data: softwareProduct},
390 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
393 deepFreeze(store.getState());
394 const expectedStore = store.getState();
396 const toBeUpdatedSoftwareProductId = softwareProduct.id;
397 const questionnaireData = {
400 affinityGrouping: true,
401 antiAffinityGrouping: false
405 deepFreeze(questionnaireData);
407 mockRest.addHandler('put', ({data, options, baseUrl}) => {
408 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}/questionnaire`);
409 expect(data).toEqual(questionnaireData);
410 expect(options).toEqual(undefined);
411 return {returnCode: 'OK'};
414 return SoftwareProductActionHelper.updateSoftwareProductQuestionnaire(store.dispatch, {
415 softwareProductId: softwareProduct.id,
417 qdata: questionnaireData
419 expect(store.getState()).toEqual(expectedStore);
423 it('Handle category without subcategories', () => {
425 const categories = CategoryFactory.buildList(3);
426 categories[0].subcategories = CategoryFactory.buildList(3);
427 categories[2].subcategories = CategoryFactory.buildList(3);
429 const category = SoftwareProductCategoriesHelper.getCurrentCategoryOfSubCategory(categories[2].subcategories[2].uniqueId, categories);
430 expect(category).toEqual(categories[2].uniqueId);