2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
19 * Modifications copyright (c) 2019 Nokia
20 * ================================================================================
22 package org.openecomp.sdc.be.components.impl;
24 import java.util.ArrayList;
25 import java.util.List;
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.mockito.InjectMocks;
30 import org.mockito.Mock;
31 import org.mockito.Mockito;
32 import org.mockito.MockitoAnnotations;
33 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
34 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
35 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
36 import org.openecomp.sdc.be.components.validation.UserValidations;
37 import org.openecomp.sdc.be.components.validation.ValidationUtils;
38 import org.openecomp.sdc.be.dao.api.ActionStatus;
39 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
40 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
41 import org.openecomp.sdc.be.datatypes.elements.ProductMetadataDataDefinition;
42 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
43 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
44 import org.openecomp.sdc.be.impl.ComponentsUtils;
45 import org.openecomp.sdc.be.model.ComponentMetadataDefinition;
46 import org.openecomp.sdc.be.model.Product;
47 import org.openecomp.sdc.be.model.User;
48 import org.openecomp.sdc.be.model.category.CategoryDefinition;
49 import org.openecomp.sdc.be.model.category.GroupingDefinition;
50 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
51 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
52 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
53 import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation;
54 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
55 import fj.data.Either;
56 import org.openecomp.sdc.exception.ResponseFormat;
58 import static org.junit.Assert.assertEquals;
59 import static org.junit.Assert.assertTrue;
60 import static org.mockito.ArgumentMatchers.any;
61 import static org.mockito.ArgumentMatchers.anyBoolean;
62 import static org.mockito.ArgumentMatchers.anyList;
63 import static org.mockito.ArgumentMatchers.anyString;
64 import static org.mockito.ArgumentMatchers.eq;
65 import static org.mockito.Mockito.doThrow;
66 import static org.mockito.Mockito.when;
68 public class ProductBusinessLogicTest {
70 private Product product;
72 private List<String> contacts;
73 private List<String> tags;
84 private ProductBusinessLogic productBusinessLogic;
87 private ToscaOperationFacade toscaOperationFacade;
90 private JanusGraphDao janusGraphDao;
93 private ValidationUtils validationUtils;
96 private ComponentsUtils componentsUtils;
99 private IGraphLockOperation iGraphLockOperation;
102 private UserValidations userValidations;
105 private IElementOperation elementOperation;
108 public void setUp() {
109 productBusinessLogic = new ProductBusinessLogic();
110 MockitoAnnotations.initMocks(this);
111 product = new Product();
113 contacts = new ArrayList<>();
114 tags = new ArrayList<>();
119 pCode = "productCode";
120 pIcon = "projectIcon";
121 desc = "Testing Product Business Logic";
122 role = "PROJECT_MANAGER";
129 public void testCreateProduct_givenValidProductAndUser_thenReturnsProduct() {
130 product.setName(pName);
131 product.setFullName("avengers");
132 product.setInvariantUUID("ABCD1234");
133 product.setContacts(getContacts());
134 product.setTags(getTags());
135 product.setIcon(pIcon);
136 product.setProjectCode(pCode);
137 product.setDescription(desc);
139 when(userValidations.validateUserNotEmpty(Mockito.any(User.class), Mockito.anyString()))
141 when(userValidations.validateUserExists(Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean()))
143 when(toscaOperationFacade.validateComponentNameExists(Mockito.anyString(), Mockito.any(), Mockito.any(ComponentTypeEnum.class)))
144 .thenReturn(Either.left(Boolean.FALSE));
145 when(iGraphLockOperation.lockComponentByName(Mockito.any(), Mockito.any(NodeTypeEnum.class)))
146 .thenReturn(StorageOperationStatus.OK);
147 when(toscaOperationFacade.createToscaComponent(any(org.openecomp.sdc.be.model.Product.class)))
148 .thenReturn(Either.left(product));
149 Either result = productBusinessLogic.createProduct(product, user);
150 assertTrue(result.isLeft());
151 Product returnedProduct = (Product) result.left().value();
153 assertEquals(product.getFullName(), returnedProduct.getFullName());
157 @Test(expected = ComponentException.class)
158 public void testCreateProduct_givenEmptyUserId_thenReturnsException() {
159 when(userValidations.validateUserNotEmpty(Mockito.any(User.class), Mockito.anyString()))
160 .thenThrow(new ByResponseFormatComponentException(new ResponseFormat()));
161 productBusinessLogic.createProduct(product, user);
164 @Test(expected = ComponentException.class)
165 public void testCreateProduct_givenUnknownUser_thenReturnsException() {
166 ComponentException componentException = new ByActionStatusComponentException(ActionStatus.USER_NOT_FOUND);
167 when(userValidations.validateUserNotEmpty(any(User.class), anyString()))
169 when(userValidations.validateUserExists(anyString(), anyString(), anyBoolean()))
170 .thenThrow(componentException);
171 productBusinessLogic.createProduct(product, user);
174 @Test(expected = ComponentException.class)
175 public void testCreateProduct_givenInvalidUserRole_thenReturnsException() {
176 user.setRole("CREATOR");
177 doThrow(new ByResponseFormatComponentException(new ResponseFormat())).when(userValidations).validateUserRole(any(), anyList());
178 assertTrue(productBusinessLogic.createProduct(product, user).isRight());
182 public void testCreateProduct_givenProductIsNull_thenReturnsError() {
184 assertTrue(productBusinessLogic.createProduct(product, user).isRight());
188 public void testCreateProduct_givenInvalidProductFullNames_thenReturnsErrors() {
189 List<String> invalidProductNames = new ArrayList<>();
190 invalidProductNames.add(null);
191 invalidProductNames.add("~~");
192 invalidProductNames.add("yo");
193 invalidProductNames.add("infinity");
194 when(toscaOperationFacade.validateComponentNameExists(anyString(), any(), any(ComponentTypeEnum.class)))
195 .thenReturn(Either.left(Boolean.TRUE));
196 for (String s : invalidProductNames) {
198 assertTrue(productBusinessLogic.createProduct(product, user).isRight());
203 public void testValidateProductName_givenValidName_thenReturnsSuccessful() {
204 when(userValidations.validateUserExists(anyString(), anyString(), anyBoolean()))
206 when(toscaOperationFacade.validateComponentNameUniqueness(eq(pName), any(), any(ComponentTypeEnum.class)))
207 .thenReturn(Either.left(Boolean.TRUE));
209 Map result = productBusinessLogic.validateProductNameExists(pName, uId).left().value();
210 assertEquals(Boolean.TRUE, result.get("isValid"));
214 public void testValidateProductName_givenInvalidName_thenReturnsError() {
215 String invalidProductName = "~~";
216 when(userValidations.validateUserExists(anyString(), anyString(), anyBoolean()))
218 when(toscaOperationFacade.validateComponentNameUniqueness(eq(invalidProductName), any(), any(ComponentTypeEnum.class)))
219 .thenReturn(Either.left(Boolean.FALSE));
220 Map result = productBusinessLogic.validateProductNameExists(invalidProductName, uId).left().value();
221 assertEquals(Boolean.FALSE, result.get("isValid"));
225 public void testValidateProductName_givenNameUniquenessCheckFails_thenReturnsError() {
226 when(userValidations.validateUserExists(anyString(), anyString(), anyBoolean()))
228 when(toscaOperationFacade.validateComponentNameUniqueness(eq(pName), any(), any(ComponentTypeEnum.class)))
229 .thenReturn(Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS));
230 assertTrue(productBusinessLogic.validateProductNameExists(pName, uId).isRight());
234 public void testGetProduct_givenValidProductIdAndUser_thenReturnsSuccessful() {
235 when(toscaOperationFacade.getToscaElement(eq(pName)))
236 .thenReturn(Either.left(product));
237 assertTrue(productBusinessLogic.getProduct(pName, user).isLeft());
241 public void testGetProduct_givenInvalidProductId_thenReturnsError() {
242 when(toscaOperationFacade.getToscaElement(eq(pName)))
243 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
244 assertTrue(productBusinessLogic.getProduct(pName, user).isRight());
248 public void testDeleteProduct_givenValidProductIdAndUser_thenReturnsSuccessful() {
249 when(toscaOperationFacade.deleteToscaComponent(pId))
250 .thenReturn(Either.left(product));
251 assertTrue(productBusinessLogic.deleteProduct(pId, user).isLeft());
255 public void testDeleteProduct_givenInvalidProductId_thenReturnsError() {
256 when(toscaOperationFacade.deleteToscaComponent(pId))
257 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
258 assertTrue(productBusinessLogic.deleteProduct(pId, user).isRight());
262 public void testUpdateProductMetadata_givenValidProductAndUser_thenReturnsSuccessful() {
263 String componentId = "component1";
264 String projectName = "Product1";
265 String version = "2.0";
266 String lifecycleState = "NOT_CERTIFIED_CHECKOUT";
267 String uniqueId = "pUniqueId";
269 Product product = new Product();
270 ProductMetadataDataDefinition productMetadataDataDefinition = new ProductMetadataDataDefinition();
271 ComponentMetadataDefinition componentMetadataDefinition = new ComponentMetadataDefinition(productMetadataDataDefinition);
272 CategoryDefinition categoryDefinition = new CategoryDefinition();
273 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition();
274 GroupingDefinition groupingDefinition = new GroupingDefinition();
276 List<CategoryDefinition> categoryDefinitionList = new ArrayList<>();
277 List<SubCategoryDefinition> subCategoryDefinitionList = new ArrayList<>();
278 List<GroupingDefinition> groupingDefinitionsList = new ArrayList<>();
280 categoryDefinition.setName("cat1");
281 subCategoryDefinition.setName("subCat1");
282 groupingDefinition.setName("subCatGroup1");
284 groupingDefinitionsList.add(groupingDefinition);
285 subCategoryDefinition.setGroupings(groupingDefinitionsList);
286 subCategoryDefinitionList.add(subCategoryDefinition);
287 categoryDefinition.setSubcategories(subCategoryDefinitionList);
288 categoryDefinitionList.add(categoryDefinition);
290 productMetadataDataDefinition.setFullName(projectName);
291 productMetadataDataDefinition.setName(projectName);
292 productMetadataDataDefinition.setState(lifecycleState);
293 productMetadataDataDefinition.setUniqueId(uniqueId);
294 productMetadataDataDefinition.setComponentType(ComponentTypeEnum.PRODUCT);
296 product.setMetadataDefinition(componentMetadataDefinition);
297 product.setLastUpdaterUserId(uId);
298 product.setDescription(desc);
299 product.setVersion(version);
300 product.setProjectCode(pCode);
301 product.setIcon(pIcon);
302 product.setCategories(categoryDefinitionList);
303 product.setContacts(contacts);
304 product.setTags(tags);
306 when(userValidations.validateUserExists(eq(uId), anyString(), anyBoolean()))
308 when(toscaOperationFacade.getToscaElement(eq(componentId)))
309 .thenReturn(Either.left(product));
310 when(toscaOperationFacade.getToscaElement(eq(componentId), any(JsonParseFlagEnum.class)))
311 .thenReturn(Either.left(product));
312 when(elementOperation.getAllProductCategories())
313 .thenReturn(Either.left(categoryDefinitionList));
314 when(iGraphLockOperation.lockComponent(anyString(), any(NodeTypeEnum.class)))
315 .thenReturn(StorageOperationStatus.OK);
316 when(toscaOperationFacade.updateToscaElement(any(Product.class)))
317 .thenReturn(Either.left(product));
319 assertTrue(productBusinessLogic.updateProductMetadata(componentId, product, user).isLeft());
323 public void testUpdateProductMetadata_givenUpdateProductNull_thenReturnsError() {
324 Product updateProduct = null;
325 String productId = null;
326 assertTrue(productBusinessLogic.updateProductMetadata(productId, updateProduct, user).isRight());
330 public void testUpdateProductMetadata_givenProductDoesNotExist_thenReturnsError() {
331 String productId = "product1";
332 when(toscaOperationFacade.getToscaElement(eq(productId)))
333 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
334 assertTrue(productBusinessLogic.updateProductMetadata(productId, product, user).isRight());
338 public void testUpdateProductMetada_givenUserRestricted_thenReturnsError() {
340 ProductMetadataDataDefinition productMetadataDataDefinition = new ProductMetadataDataDefinition();
341 productMetadataDataDefinition.setLifecycleState("CERTIFIED");
342 ComponentMetadataDefinition componentMetadataDefinition = new ComponentMetadataDefinition(productMetadataDataDefinition);
343 product.setMetadataDefinition(componentMetadataDefinition);
346 when(userValidations.validateUserExists(eq(uId), anyString(), anyBoolean()))
348 when(toscaOperationFacade.getToscaElement(eq(pId)))
349 .thenReturn(Either.left(product));
350 when(toscaOperationFacade.getToscaElement(eq(pId), eq(JsonParseFlagEnum.ParseMetadata)))
351 .thenReturn(Either.left(product));
352 assertTrue(productBusinessLogic.updateProductMetadata(pId, product, user).isRight());
357 public void testGetProductByNameAndVersion_givenValidNameAndVersion_thenReturnsSuccessful() {
358 String productVersion = "2.0";
360 when(toscaOperationFacade.getComponentByNameAndVersion(eq(ComponentTypeEnum.PRODUCT), eq(pName), eq(productVersion)))
361 .thenReturn(Either.left(product));
362 assertTrue(productBusinessLogic.getProductByNameAndVersion(pName, productVersion, uId).isLeft());
366 public void testGetProductByNameAndVersion_givenInvalidDetails_thenReturnsError() {
367 String productVersion = "2.0";
368 when(toscaOperationFacade.getComponentByNameAndVersion(eq(ComponentTypeEnum.PRODUCT), eq(pName), eq(productVersion)))
369 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
370 assertTrue(productBusinessLogic.getProductByNameAndVersion(pName, productVersion, uId).isRight());
373 private List<String> getContacts() {
374 contacts.add("user1");
378 private List<String> getTags() {
379 tags.add("product1");