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.
17 import React from 'react';
18 import {mount} from 'enzyme';
19 import {mapStateToProps} from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependencies.js';
21 SoftwareProductDependenciesResponseFactory,
22 SoftwareProductDependenciesStoreFactory} from 'test-utils/factories/softwareProduct/SoftwareProductDependenciesFactories.js';
23 import {VSPComponentsFactory} from 'test-utils/factories/softwareProduct/SoftwareProductComponentsFactories.js';
24 import VersionFactory from 'test-utils/factories/common/VersionFactory.js';
25 import {storeCreator} from 'sdc-app/AppStore.js';
26 import {cloneAndSet} from 'test-utils/Util.js';
27 import mockRest from 'test-utils/MockRest.js';
29 import SoftwareProductComponentsActionHelper from 'sdc-app/onboarding/softwareProduct/components/SoftwareProductComponentsActionHelper.js';
30 import {relationTypes, NEW_RULE_TEMP_ID} from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependenciesConstants.js';
31 import SoftwareProductDependenciesActionHelper from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependenciesActionHelper.js';
32 import SoftwareProductDependenciesView from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependenciesView.jsx';
33 import {VSPEditorFactory} from 'test-utils/factories/softwareProduct/SoftwareProductEditorFactories.js';
35 function addNewRowElement(arr, data) {
36 if (data === undefined) {
37 arr.push({id: NEW_RULE_TEMP_ID, targetId: null, sourceId: null, relationType: relationTypes.DEPENDS_ON});
43 describe('Software Product Dependencies Module Tests', function () {
44 const softwareProductId = '555';
45 const version = VersionFactory.build();
48 it('mapStateToProps mapper exists', () => {
49 expect(mapStateToProps).toBeTruthy();
52 it('Get Software Product Dependencies List', () => {
53 const store = storeCreator();
54 const dispatch = store.dispatch;
56 let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(2);
57 let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
58 addNewRowElement(DependenciesListStore);
59 const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);
61 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
62 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
63 expect(data).toEqual(undefined);
64 expect(options).toEqual(undefined);
65 return {results: DependenciesListResponse};
68 return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
69 const state = store.getState();
70 const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
71 const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
72 let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
73 const newExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
74 expect(state).toEqual(newExpectedStore);
81 - update existing item
84 it('Update Software Product Dependency', () => {
85 const store = storeCreator();
86 const dispatch = store.dispatch;
88 let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(1);
89 let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
90 addNewRowElement(DependenciesListStore);
91 const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);
93 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
94 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
95 expect(data).toEqual(undefined);
96 expect(options).toEqual(undefined);
97 return {results: DependenciesListResponse};
99 return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
101 const state = store.getState();
102 const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
103 const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
104 let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
105 let item = expectedStoreDependencies.find((dep) => dep.id !== NEW_RULE_TEMP_ID);
106 item.targetId = 'testChangeTarget';
107 item.sourceId = 'testChangesource';
108 // removing 'new row' from response
109 expectedStoreDependencies = expectedStoreDependencies.slice(0, expectedStoreDependencies.length - 1);
110 let expDependenciesListStore = expectedStoreDependencies.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
112 mockRest.addHandler('put', ({data, options, baseUrl}) => {
113 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies/${item.id}`);
114 expect(data.targetId).toEqual('testChangeTarget');
115 expect(data.sourceId).toEqual('testChangesource');
116 expect(options).toEqual(undefined);
117 return {results: null};
119 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
120 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
121 expect(data).toEqual(undefined);
122 expect(options).toEqual(undefined);
123 return {results: expDependenciesListStore};
126 addNewRowElement(expectedStoreDependencies);
127 const newExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
128 return SoftwareProductDependenciesActionHelper.updateDependency(dispatch, {softwareProductId, version, item}).then(() => {
129 const newState = store.getState();
130 expect(newState).toEqual(newExpectedStore);
138 - Delete item from list
141 it('Delete Software Product Dependency', () => {
142 const store = storeCreator();
143 const dispatch = store.dispatch;
144 let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(1);
145 let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
146 addNewRowElement(DependenciesListStore);
147 const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);
149 let deleteItem = DependenciesListStore.find((dep) => dep.id !== NEW_RULE_TEMP_ID);
151 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
152 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
153 expect(data).toEqual(undefined);
154 expect(options).toEqual(undefined);
155 return {results: DependenciesListResponse};
157 mockRest.addHandler('destroy', ({data, options, baseUrl}) => {
158 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies/${deleteItem.id}`);
159 expect(data).toEqual(undefined);
160 expect(options).toEqual(undefined);
161 return {results: null};
163 return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
164 const state = store.getState();
165 const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
166 const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
167 let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}))
169 const newExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
170 expect(state).toEqual(newExpectedStore);
172 expectedStoreDependencies = expectedStoreDependencies.filter((dep) => dep.id !== deleteItem.id);
173 const postDeleteExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
175 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
176 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
177 expect(data).toEqual(undefined);
178 expect(options).toEqual(undefined);
179 return {results: []};
182 return SoftwareProductDependenciesActionHelper.removeDependency(dispatch, {softwareProductId, version, item: deleteItem}).then(() => {
183 const state = store.getState();
184 const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
185 const currentDependencies = postDeleteExpectedStore.softwareProduct.softwareProductDependencies;
186 expect(depndenciesWithGeneratedId).toEqual(currentDependencies);
192 - Create initial list
193 - Update the new row and make sure there is no API call
195 - Getch data with reset new row and new entity with info from the new item
198 it('Create Software Product Dependency', () => {
199 const store = storeCreator();
200 const dispatch = store.dispatch;
202 let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(1);
203 let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
204 addNewRowElement(DependenciesListStore);
205 const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);
207 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
208 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
209 expect(data).toEqual(undefined);
210 expect(options).toEqual(undefined);
211 return {results: DependenciesListResponse};
213 return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
214 // setting properties on the 'new role' should not call an API
215 let addItem = {id: NEW_RULE_TEMP_ID, sourceId: 'sId', targetId : 'tId',relationType: relationTypes.DEPENDS_ON};
217 SoftwareProductDependenciesActionHelper.updateDependency(dispatch, {softwareProductId, version, item: addItem}).then(()=> {
218 //go to error that fetch was not defined
221 if(error.name === 'TypeError') {
222 // Expected error because we expected there is no promise
224 fail('Error:' + error);
228 const state = store.getState();
229 const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
230 const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
231 let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
232 // creating the new item
233 let item = SoftwareProductDependenciesResponseFactory.buildList(1,
234 {sourceId: 'sId', targetId : 'tId',relationType: relationTypes.DEPENDS_ON})[0];
235 addNewRowElement(expectedStoreDependencies, item);
236 expectedStoreDependencies = expectedStoreDependencies.filter((dep) => dep.id !== NEW_RULE_TEMP_ID);
238 mockRest.addHandler('post', ({data, options, baseUrl}) => {
239 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
240 expect(data.targetId).toEqual('tId');
241 expect(data.sourceId).toEqual('sId');
242 expect(data.id).toEqual(undefined);
243 expect(options).toEqual(undefined);
244 return {results: item.id};
246 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
247 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
248 expect(data).toEqual(undefined);
249 expect(options).toEqual(undefined);
250 return {results: expectedStoreDependencies};
253 let PostCreateItemListStore = expectedStoreDependencies.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
254 addNewRowElement(PostCreateItemListStore);
255 const newExpectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', PostCreateItemListStore);
257 return SoftwareProductDependenciesActionHelper.createDependency(dispatch, {softwareProductId, version, item: addItem}).then(() => {
258 const newState = store.getState();
259 expect(newState.softwareProduct.softwareProductDependencies.length).toEqual(3);
260 expect(newState).toEqual(newExpectedStore);
268 it('Get Software Product Dependencies List with loop, and render to JSX', () => {
269 const store = storeCreator();
270 const dispatch = store.dispatch;
272 let components = VSPComponentsFactory.buildList(2);
273 let vspEditor = VSPEditorFactory.build({id: softwareProductId, version});
275 let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(2);
276 let firstDependecy = DependenciesListResponse[0];
277 let secondDependency = DependenciesListResponse[1];
278 firstDependecy.sourceId = components[0].id;
279 secondDependency.sourceId = components[1].id;
280 firstDependecy.targetId = secondDependency.sourceId;
281 secondDependency.targetId = firstDependecy.sourceId;
283 let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build({...dependency, hasCycle: true}));
284 addNewRowElement(DependenciesListStore);
285 const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);
287 mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
288 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
289 expect(data).toEqual(undefined);
290 expect(options).toEqual(undefined);
291 return {results: DependenciesListResponse};
294 mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
295 expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/components`);
296 expect(data).toEqual(undefined);
297 expect(options).toEqual(undefined);
298 return {results: components};
301 return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
302 return SoftwareProductComponentsActionHelper.fetchSoftwareProductComponents(dispatch, {softwareProductId, version});
304 const state = store.getState();
305 state.softwareProduct.softwareProductEditor = {data: vspEditor};
306 const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
307 const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
308 let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
310 const newExpectedStore = {
313 ...expectedStore.softwareProduct,
314 softwareProductDependencies: expectedStoreDependencies,
315 softwareProductEditor: {data: vspEditor},
316 softwareProductComponents: {
317 ...expectedStore.softwareProduct.softwareProductComponents,
318 componentsList: components
323 expect(state).toEqual(newExpectedStore);
325 const props = mapStateToProps(state);
326 expect(props.softwareProductDependencies).toEqual(expectedStoreDependencies);
327 const wrapper = mount(<SoftwareProductDependenciesView {...props}/>);
328 expect(wrapper).toBeTruthy();