2 * Copyright © 2016-2018 European Support Limited
3 * Modifications Copyright (C) 2021 Nordix Foundation.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 import deepFreeze from 'deep-freeze';
18 import mockRest from 'test-utils/MockRest.js';
19 import {cloneAndSet, buildFromExistingObject} from 'test-utils/Util.js';
20 import {storeCreator} from 'sdc-app/AppStore.js';
22 import SoftwareProductCreationActionHelper from 'sdc-app/onboarding/softwareProduct/creation/SoftwareProductCreationActionHelper.js';
23 import SoftwareProductActionHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductActionHelper.js';
24 import SoftwareProductCategoriesHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductCategoriesHelper.js';
25 import {forms} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
26 import ValidationHelper from 'sdc-app/common/helpers/ValidationHelper.js';
28 import {VSPEditorFactory, VSPEditorPostFactory, VSPEditorFactoryWithLicensingData, VSPEditorPostFactoryWithLicensingData} from 'test-utils/factories/softwareProduct/SoftwareProductEditorFactories.js';
29 import {CategoryFactory} from 'test-utils/factories/softwareProduct/VSPCategoriesFactory.js';
30 import {heatSetupManifest} from 'test-utils/factories/softwareProduct/SoftwareProductAttachmentsFactories.js';
32 import { FeatureGroupStoreFactory as FeatureGroup} from 'test-utils/factories/licenseModel/FeatureGroupFactories.js';
33 import {LicenseAgreementStoreFactory as LicenseAgreement} from 'test-utils/factories/licenseModel/LicenseAgreementFactories.js';
35 import VersionFactory from 'test-utils/factories/common/VersionFactory.js';
36 import {InitializedCurrentScreenFactory} from 'test-utils/factories/common/CurrentScreenFactory.js';
38 describe('Software Product Details Module Tests', function () {
39 it('Get Software Products List', async () => {
40 const store = storeCreator();
41 deepFreeze(store.getState());
42 const softwareProductList = VSPEditorFactory.buildList(2);
43 deepFreeze(softwareProductList);
44 deepFreeze(store.getState());
45 const expectedStore = cloneAndSet(store.getState(), 'softwareProductList', softwareProductList);
47 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
48 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/?versionFilter=Draft');
49 expect(data).toEqual(undefined);
50 expect(options).toEqual(undefined);
51 return {results: softwareProductList};
54 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
55 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/?versionFilter=Certified');
56 expect(data).toEqual(undefined);
57 expect(options).toEqual(undefined);
61 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
62 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/?Status=ARCHIVED');
63 expect(data).toEqual(undefined);
64 expect(options).toEqual(undefined);
68 await SoftwareProductActionHelper.fetchSoftwareProductList(store.dispatch);
69 await SoftwareProductActionHelper.fetchFinalizedSoftwareProductList(store.dispatch);
70 await SoftwareProductActionHelper.fetchArchivedSoftwareProductList(store.dispatch);
72 expect(store.getState()).toEqual(expectedStore);
75 it('Add Software Product', () => {
76 const store = storeCreator();
77 deepFreeze(store.getState());
79 const softwareProductPostRequest = VSPEditorPostFactory.build();
80 deepFreeze(softwareProductPostRequest);
81 const idFromResponse = '1';
82 const expectedVSP = VSPEditorPostFactory.build({id: idFromResponse, vendorId: softwareProductPostRequest.vendorId});
83 deepFreeze(expectedVSP);
85 mockRest.addHandler('post', ({options, data, baseUrl}) => {
86 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
87 expect(data).toEqual(softwareProductPostRequest);
88 expect(options).toEqual(undefined);
94 return SoftwareProductCreationActionHelper.createSoftwareProduct(store.dispatch, {
95 softwareProduct: softwareProductPostRequest
96 }).then((response) => {
97 expect(response.vspId).toEqual(idFromResponse);
101 it('Fetch Software Product with manifest', () => {
102 const store = storeCreator();
103 deepFreeze(store.getState());
105 const softwareProductPostRequest = VSPEditorPostFactory.build();
106 deepFreeze(softwareProductPostRequest);
108 const expectedGenericInfo = {
112 validations: [{type: 'validateName', data: true}, {type: 'maxLength', data: 25}, {
120 validations: [{type: 'validateName', data: true}, {type: 'required', data: true}]
123 const expectedFormName = forms.VENDOR_SOFTWARE_PRODUCT_DETAILS;
125 const idFromResponse = '1';
126 const version = { id: '0.1', label: '0.1'};
127 const expectedVSP = VSPEditorPostFactory.build({id: idFromResponse, vendorId: softwareProductPostRequest.vendorId});
128 deepFreeze(expectedVSP);
129 let expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductEditor.data', expectedVSP);
130 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.genericFieldInfo', expectedGenericInfo);
131 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.formName', expectedFormName);
132 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductQuestionnaire', {qdata: {}, dataMap: {}, qgenericFieldInfo: {}});
134 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductAttachments.heatValidation', {
135 'attachmentsTree': {},
137 'selectedNode': 'All'
139 let manifest = heatSetupManifest.build();
140 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductAttachments.heatSetup', manifest);
142 const expectedCurrentScreen = InitializedCurrentScreenFactory.build();
143 expectedStore = cloneAndSet(expectedStore, 'currentScreen.itemPermission', expectedCurrentScreen.itemPermission);
144 expectedStore = cloneAndSet(expectedStore, 'currentScreen.props', expectedCurrentScreen.props);
146 mockRest.addHandler('post', ({options, data, baseUrl}) => {
147 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-software-products/');
148 expect(data).toEqual(softwareProductPostRequest);
149 expect(options).toEqual(undefined);
151 vspId: idFromResponse,
156 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
157 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}`);
158 expect(data).toEqual(undefined);
159 expect(options).toEqual(undefined);
163 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
164 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}/questionnaire`);
165 expect(data).toEqual(undefined);
166 expect(options).toEqual(undefined);
167 return {data: JSON.stringify({}), schema: JSON.stringify({})};
170 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
171 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${idFromResponse}/versions/${version.id}/orchestration-template-candidate/manifest`);
172 expect(data).toEqual(undefined);
173 expect(options).toEqual(undefined);
177 return SoftwareProductCreationActionHelper.createSoftwareProduct(store.dispatch, {
178 softwareProduct: softwareProductPostRequest
180 return SoftwareProductActionHelper.fetchSoftwareProduct(store.dispatch, {softwareProductId: idFromResponse, version});
182 return SoftwareProductActionHelper.loadSoftwareProductHeatCandidate(store.dispatch, {softwareProductId: idFromResponse, version});
184 expect(store.getState()).toEqual(expectedStore);
185 let newName = 'newName';
186 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.formReady', null);
187 ValidationHelper.dataChanged(store.dispatch, {deltaData: {'name': newName}, formName: forms.VENDOR_SOFTWARE_PRODUCT_DETAILS});
188 expectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductEditor.data.name', newName);
189 expect(store.getState()).toEqual(expectedStore);
193 it('Load and edit Software Product licensing data', () => {
194 const store = storeCreator();
196 const softwareProductPostRequest = VSPEditorPostFactory.build();
197 deepFreeze(softwareProductPostRequest);
199 const licenseModelId = softwareProductPostRequest.vendorId;
200 const LMVersion = VersionFactory.build();
201 const secondLicenseModelId = 'secondLicenseModelId';
203 let FG1 = FeatureGroup.build();
204 let LA1 = LicenseAgreement.build({
205 featureGroupsIds: [FG1.id]
208 let FG2 = FeatureGroup.build();
209 let LA2 = LicenseAgreement.build({
210 featureGroupsIds: [FG2.id]
213 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
214 expect(baseUrl).toEqual('/sdc1/feProxy/rest/v1/categories/resources/');
215 expect(data).toEqual(undefined);
216 expect(options).toEqual(undefined);
220 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
221 expect(baseUrl).toEqual('/sdc1/feProxy/rest/v1/catalog/model/');
222 expect(data).toEqual(undefined);
223 expect(options).toEqual(undefined);
227 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
228 expect(baseUrl).toEqual('/onboarding-api/v1.0/vendor-license-models/?versionFilter=Certified');
229 expect(data).toEqual(undefined);
230 expect(options).toEqual(undefined);
231 return {results: []};
234 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
235 expect(baseUrl).toEqual(`/onboarding-api/v1.0/items/${licenseModelId}/versions/${LMVersion.id}`);
236 expect(data).toEqual(undefined);
237 expect(options).toEqual(undefined);
238 return {results: {}};
241 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
242 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${licenseModelId}/versions/${LMVersion.id}/license-agreements`);
243 expect(data).toEqual(undefined);
244 expect(options).toEqual(undefined);
245 return {results: [LA1]};
248 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
249 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${licenseModelId}/versions/${LMVersion.id}/feature-groups`);
250 expect(data).toEqual(undefined);
251 expect(options).toEqual(undefined);
252 return {results: [FG1]};
255 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
256 expect(baseUrl).toEqual(`/onboarding-api/v1.0/items/${secondLicenseModelId}/versions/${LMVersion.id}`);
257 expect(data).toEqual(undefined);
258 expect(options).toEqual(undefined);
259 return {results: {}};
262 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
263 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${secondLicenseModelId}/versions/${LMVersion.id}/license-agreements`);
264 expect(data).toEqual(undefined);
265 expect(options).toEqual(undefined);
266 return {results: [LA2]};
269 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
270 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-license-models/${secondLicenseModelId}/versions/${LMVersion.id}/feature-groups`);
271 expect(data).toEqual(undefined);
272 expect(options).toEqual(undefined);
273 return {results: [FG2]};
276 return SoftwareProductActionHelper.loadSoftwareProductDetailsData(store.dispatch, {licenseModelId, licensingVersion: LMVersion.id}).then(() => {
277 let state = store.getState();
278 expect(state.licenseModel.licenseAgreement.licenseAgreementList).toEqual([LA1]);
279 expect(state.licenseModel.featureGroup.featureGroupsList).toEqual([FG1]);
280 return SoftwareProductActionHelper.softwareProductEditorVendorChanged(store.dispatch,
281 {deltaData: {vendorId: secondLicenseModelId, licensingVersion: LMVersion.id},
282 formName: forms.VENDOR_SOFTWARE_PRODUCT_DETAILS}
284 let state = store.getState();
285 expect(state.licenseModel.licenseAgreement.licenseAgreementList).toEqual([LA2]);
286 expect(state.licenseModel.featureGroup.featureGroupsList).toEqual([FG2]);
291 it('Save Software product', () => {
293 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
294 deepFreeze(softwareProduct);
296 const version = VersionFactory.build();
298 const store = storeCreator({
300 softwareProductEditor: {data: softwareProduct},
301 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
304 deepFreeze(store.getState());
306 const dataForUpdate = {
307 name: 'VSP5_UPDATED',
308 description: 'A software model for Fortigate._UPDATED'
311 const toBeUpdatedSoftwareProductId = softwareProduct.id;
312 let softwareProductUpdateData = VSPEditorPostFactoryWithLicensingData.build(dataForUpdate);
313 delete softwareProductUpdateData.version;
315 const softwareProductPutRequest = buildFromExistingObject(VSPEditorFactoryWithLicensingData, softwareProductUpdateData, {id: toBeUpdatedSoftwareProductId, version: softwareProduct.version});
317 deepFreeze(softwareProductUpdateData);
319 const expectedStore = cloneAndSet(store.getState(), 'softwareProductList', [softwareProductPutRequest]);
320 const questionnaireData = {
323 affinityGrouping: true,
324 antiAffinityGrouping: false
328 deepFreeze(questionnaireData);
330 mockRest.addHandler('put', ({data, options, baseUrl}) => {
331 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}`);
332 expect(data).toEqual(softwareProductUpdateData);
333 expect(options).toEqual(undefined);
334 return {returnCode: 'OK'};
336 mockRest.addHandler('put', ({data, options, baseUrl}) => {
337 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}/questionnaire`);
338 expect(data).toEqual(questionnaireData);
339 expect(options).toEqual(undefined);
340 return {returnCode: 'OK'};
343 return SoftwareProductActionHelper.updateSoftwareProduct(store.dispatch, {
344 softwareProduct: softwareProductPutRequest,
345 qdata: questionnaireData,
348 expect(store.getState()).toEqual(expectedStore);
352 it('Save Software product data only', () => {
354 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
355 deepFreeze(softwareProduct);
357 const version = VersionFactory.build();
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 dataForUpdate = {
369 name: 'VSP5_UPDATED',
370 description: 'A software model for Fortigate._UPDATED'
373 const toBeUpdatedSoftwareProductId = softwareProduct.id;
374 let softwareProductUpdateData = VSPEditorPostFactoryWithLicensingData.build(dataForUpdate);
375 delete softwareProductUpdateData.version;
377 const softwareProductPutRequest = buildFromExistingObject(VSPEditorFactoryWithLicensingData, softwareProductUpdateData, {id: toBeUpdatedSoftwareProductId});
379 deepFreeze(softwareProductUpdateData);
381 mockRest.addHandler('put', ({data, options, baseUrl}) => {
382 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}`);
383 expect(data).toEqual(softwareProductUpdateData);
384 expect(options).toEqual(undefined);
385 return {returnCode: 'OK'};
388 return SoftwareProductActionHelper.updateSoftwareProductData(store.dispatch, {
389 softwareProduct: softwareProductPutRequest,
392 expect(store.getState()).toEqual(expectedStore);
396 it('Save Software product questionnaire only', () => {
397 const softwareProduct = VSPEditorFactoryWithLicensingData.build();
398 deepFreeze(softwareProduct);
400 const version = VersionFactory.build();
402 const store = storeCreator({
404 softwareProductEditor: {data: softwareProduct},
405 softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
408 deepFreeze(store.getState());
409 const expectedStore = store.getState();
411 const toBeUpdatedSoftwareProductId = softwareProduct.id;
412 const questionnaireData = {
415 affinityGrouping: true,
416 antiAffinityGrouping: false
420 deepFreeze(questionnaireData);
422 mockRest.addHandler('put', ({data, options, baseUrl}) => {
423 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${toBeUpdatedSoftwareProductId}/versions/${version.id}/questionnaire`);
424 expect(data).toEqual(questionnaireData);
425 expect(options).toEqual(undefined);
426 return {returnCode: 'OK'};
429 return SoftwareProductActionHelper.updateSoftwareProductQuestionnaire(store.dispatch, {
430 softwareProductId: softwareProduct.id,
432 qdata: questionnaireData
434 expect(store.getState()).toEqual(expectedStore);
438 it('Handle category without subcategories', () => {
440 const categories = CategoryFactory.buildList(3);
441 categories[0].subcategories = CategoryFactory.buildList(3);
442 categories[2].subcategories = CategoryFactory.buildList(3);
444 const category = SoftwareProductCategoriesHelper.getCurrentCategoryOfSubCategory(categories[2].subcategories[2].uniqueId, categories);
445 expect(category).toEqual(categories[2].uniqueId);