2 * Copyright © 2016-2018 European Support Limited
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 or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.be.components.impl;
19 import fj.data.Either;
20 import org.junit.Assert;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.InjectMocks;
24 import org.mockito.Mockito;
25 import org.mockito.MockitoAnnotations;
26 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
27 import org.openecomp.sdc.be.components.validation.RequirementValidation;
28 import org.openecomp.sdc.be.components.validation.UserValidations;
29 import org.openecomp.sdc.be.config.ConfigurationManager;
30 import org.openecomp.sdc.be.dao.api.ActionStatus;
31 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
32 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
33 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
34 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
35 import org.openecomp.sdc.be.impl.ComponentsUtils;
36 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
37 import org.openecomp.sdc.be.model.ComponentParametersView;
38 import org.openecomp.sdc.be.model.LifecycleStateEnum;
39 import org.openecomp.sdc.be.model.RelationshipInfo;
40 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
41 import org.openecomp.sdc.be.model.RequirementDefinition;
42 import org.openecomp.sdc.be.model.Resource;
43 import org.openecomp.sdc.be.model.Service;
44 import org.openecomp.sdc.be.model.User;
45 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.RequirementOperation;
46 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
47 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
48 import org.openecomp.sdc.be.model.operations.impl.GraphLockOperation;
49 import org.openecomp.sdc.be.user.Role;
50 import org.openecomp.sdc.be.user.UserBusinessLogic;
51 import org.openecomp.sdc.common.api.ConfigurationSource;
52 import org.openecomp.sdc.common.impl.ExternalConfiguration;
53 import org.openecomp.sdc.common.impl.FSConfigurationSource;
54 import org.openecomp.sdc.exception.ResponseFormat;
56 import java.util.ArrayList;
57 import java.util.Collections;
58 import java.util.HashMap;
59 import java.util.List;
61 import java.util.stream.Collectors;
62 import java.util.stream.Stream;
64 import static org.mockito.ArgumentMatchers.any;
65 import static org.mockito.ArgumentMatchers.anyBoolean;
66 import static org.mockito.ArgumentMatchers.anyCollection;
67 import static org.mockito.ArgumentMatchers.anyObject;
68 import static org.mockito.ArgumentMatchers.anyString;
69 import static org.mockito.ArgumentMatchers.eq;
70 import static org.mockito.Mockito.when;
72 public class RequirementBusinessLogicTest {
73 private final String componentId = "resourceId1";
74 private final String requirementId = "uniqueId1";
76 private final JanusGraphDao mockJanusGraphDao = Mockito.mock(JanusGraphDao.class);
77 private final UserBusinessLogic mockUserAdmin = Mockito.mock(UserBusinessLogic.class);
78 private final ToscaOperationFacade toscaOperationFacade = Mockito.mock(ToscaOperationFacade.class);
79 private final UserValidations userValidations = Mockito.mock(UserValidations.class);
80 private final RequirementOperation requirementOperation = Mockito.mock(RequirementOperation.class);
81 private final RequirementValidation requirementValidation = Mockito.mock(RequirementValidation.class);
83 private final GraphLockOperation graphLockOperation = Mockito.mock(GraphLockOperation.class);
84 private User user = null;
87 private RequirementBusinessLogic requirementsBusinessLogicMock = new RequirementBusinessLogic();
91 MockitoAnnotations.initMocks(this);
92 ExternalConfiguration.setAppName("catalog-be");
95 String appConfigDir = "src/test/resources/config/catalog-be";
96 ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration
97 .getChangeListener(), appConfigDir);
98 ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
100 ComponentsUtils componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
101 // User data and management
103 user.setUserId("jh0003");
104 user.setFirstName("Jimmi");
105 user.setLastName("Hendrix");
106 user.setRole(Role.ADMIN.name());
108 Either<User, ActionStatus> eitherGetUser = Either.left(user);
109 when(mockUserAdmin.getUser("jh0003", false)).thenReturn(eitherGetUser);
110 when(graphLockOperation.lockComponent(Mockito.anyString(), eq(NodeTypeEnum.Resource)))
111 .thenReturn(StorageOperationStatus.OK);
113 //CapabilityOperation
114 when(requirementValidation.validateRequirements(anyCollection(), anyObject(), anyBoolean()))
115 .thenReturn(Either.left(true));
116 when(requirementOperation.addRequirement(anyString(), anyObject()))
117 .thenReturn(Either.left(createMockRequirementListToReturn(createRequirement(
118 "reqName", "capType", "node", "source1",
121 when(requirementOperation.updateRequirement(anyString(), anyObject()))
122 .thenReturn(Either.left(createMockRequirementListToReturn(createRequirement(
123 "reqName", "capType", "node", "source1",
125 when(requirementOperation.deleteRequirements( anyObject(), anyString()))
126 .thenReturn(StorageOperationStatus.OK);
127 when(mockJanusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
129 requirementsBusinessLogicMock = new RequirementBusinessLogic();
131 requirementsBusinessLogicMock.setComponentsUtils(componentsUtils);
132 requirementsBusinessLogicMock.setUserAdmin(mockUserAdmin);
133 requirementsBusinessLogicMock.setGraphLockOperation(graphLockOperation);
134 requirementsBusinessLogicMock.setJanusGraphGenericDao(mockJanusGraphDao);
135 requirementsBusinessLogicMock.setToscaOperationFacade(toscaOperationFacade);
136 requirementsBusinessLogicMock.setUserValidations(userValidations);
137 requirementsBusinessLogicMock.setRequirementOperation(requirementOperation);
138 requirementsBusinessLogicMock.setRequirementValidation(requirementValidation);
142 public void shouldPassCreateRequirementsFirstTimeInComponentForHappyScenario(){
143 List<RequirementDefinition> requirementDefinitions = createMockRequirementListToReturn(
144 createRequirement("reqName", "reqDesc", "capType", "source1",
146 Resource resource = createComponent(false);
147 resource.setComponentType(ComponentTypeEnum.RESOURCE);
148 validateUserRoles(Role.ADMIN, Role.DESIGNER);
149 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
150 .thenReturn(Either.left(resource));
151 Either<List<RequirementDefinition>, ResponseFormat> requirements = requirementsBusinessLogicMock
152 .createRequirements(componentId, requirementDefinitions, user,
153 "createRequirements", true);
154 Assert.assertTrue(requirements.isLeft());
155 Assert.assertTrue(requirements.left().value().stream().anyMatch(requirementDefinition ->
156 requirementDefinition.getName().equals("reqName")));
160 public void shouldPassCreateRequirementsForHappyScenario(){
161 List<RequirementDefinition> requirementDefinitions = createMockRequirementListToReturn(
162 createRequirement("reqName2", "capType", "node", "source1",
164 Resource resource = createComponent(true);
165 resource.setComponentType(ComponentTypeEnum.RESOURCE);
166 validateUserRoles(Role.ADMIN, Role.DESIGNER);
167 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
168 .thenReturn(Either.left(resource));
169 Either<List<RequirementDefinition>, ResponseFormat> requirements = requirementsBusinessLogicMock
170 .createRequirements(componentId, requirementDefinitions, user,
171 "createRequirements", true);
173 Assert.assertTrue(requirements.isLeft());
174 Assert.assertTrue(requirements.left().value().stream().anyMatch(requirementDefinition ->
175 requirementDefinition.getName().equals("reqName2")));
179 public void shouldPassUpdateRequirementsForHappyScenario(){
181 List<RequirementDefinition> requirementDefinitions = createMockRequirementListToReturn(
182 createRequirement("reqName", "capType", "node", "source1",
184 Resource resource = createComponent(true);
185 resource.setComponentType(ComponentTypeEnum.RESOURCE);
186 validateUserRoles(Role.ADMIN, Role.DESIGNER);
187 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
188 .thenReturn(Either.left(resource));
189 when(toscaOperationFacade.getParentComponents(anyString()))
190 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
191 Either<List<RequirementDefinition>, ResponseFormat> capabilities = requirementsBusinessLogicMock
192 .updateRequirements(componentId, requirementDefinitions, user,
193 "updateRequirements", true);
194 Assert.assertTrue(capabilities.isLeft());
195 Assert.assertTrue(capabilities.left().value().stream().anyMatch(requirementDefinition ->
196 requirementDefinition.getMaxOccurrences().equals("11")));
200 public void shouldPassDeleteRequirementsForHappyScenario(){
201 Resource resource = createComponent(true);
202 resource.setComponentType(ComponentTypeEnum.RESOURCE);
203 validateUserRoles(Role.ADMIN, Role.DESIGNER);
204 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
205 .thenReturn(Either.left(resource));
206 when(toscaOperationFacade.getParentComponents(anyString()))
207 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
208 Either<RequirementDefinition, ResponseFormat> deleteRequirementEither
209 = requirementsBusinessLogicMock.deleteRequirement(componentId, requirementId, user, true);
210 Assert.assertTrue(deleteRequirementEither.isLeft());
215 public void shouldPassUpdateRequirementCapabilityUpdateWhenCapabilityNotExist(){
217 List<RequirementDefinition> requirementDefinitions
218 = createMockRequirementListToReturn(createRequirement(
219 "reqName", "capTypeUpdate", "node", "source1",
221 Resource resource = createComponent(true);
222 resource.setComponentType(ComponentTypeEnum.RESOURCE);
223 validateUserRoles(Role.ADMIN, Role.DESIGNER);
224 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
225 .thenReturn(Either.left(resource));
226 when(toscaOperationFacade.getParentComponents(anyString()))
227 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
228 Either<List<RequirementDefinition>, ResponseFormat> updateRequirements
229 = requirementsBusinessLogicMock.updateRequirements(componentId, requirementDefinitions,
230 user, "updateRequirements", true);
231 Assert.assertTrue(updateRequirements.isLeft());
232 Assert.assertTrue(updateRequirements.left().value().stream().anyMatch(requirementDefinition ->
233 requirementDefinition.getMaxOccurrences().equals("11")));
237 public void shouldPassUpdateRequirementTypeWhenCapabilityExist(){
239 List<RequirementDefinition> requirementDefinitions = createMockRequirementListToReturn(
240 createRequirement("reqName", "capTypeUpdate1", "node",
241 "source1","6", "11"));
242 Resource resource = createComponent(true);
243 resource.setComponentType(ComponentTypeEnum.RESOURCE);
245 RequirementDefinition requirement = createRequirement("reqName",
246 "capTypeUpdate1", "node", "source1",
248 requirement.setUniqueId("unique2");
249 List<RequirementDefinition> requirementDefinitions1 = createMockRequirementListToReturn(requirement);
250 Map<String, List<RequirementDefinition>> requirementMap = new HashMap<>();
251 requirementMap.put("capTypeUpdate1", requirementDefinitions1);
252 resource.getRequirements().putAll(requirementMap);
254 validateUserRoles(Role.ADMIN, Role.DESIGNER);
255 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
256 .thenReturn(Either.left(resource));
257 when(toscaOperationFacade.getParentComponents(anyString()))
258 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
259 Either<List<RequirementDefinition>, ResponseFormat> capabilities
260 = requirementsBusinessLogicMock.updateRequirements(componentId, requirementDefinitions,
261 user, "updateRequirements", true);
262 Assert.assertTrue(capabilities.isLeft());
263 Assert.assertTrue(capabilities.left().value().stream().anyMatch(capabilityDefinition ->
264 capabilityDefinition.getMaxOccurrences().equals("11")));
268 public void shouldFailUpdateRequirementWhenOperationFailedInJanusGraph(){
269 List<RequirementDefinition> requirementDefinitions = createMockRequirementListToReturn(
270 createRequirement("reqName", "capType", "node", "source1",
272 Resource resource = createComponent(true);
273 resource.setComponentType(ComponentTypeEnum.RESOURCE);
274 validateUserRoles(Role.ADMIN, Role.DESIGNER);
275 when(requirementOperation.addRequirement(anyString(), anyObject()))
276 .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR));
277 when(requirementOperation.updateRequirement(anyString(), anyObject()))
278 .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR));
279 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
280 .thenReturn(Either.left(resource));
281 Either<List<RequirementDefinition>, ResponseFormat> capabilities = requirementsBusinessLogicMock
282 .updateRequirements(componentId, requirementDefinitions, user,
283 "updateRequirements", true);
285 Assert.assertTrue(capabilities.isRight());
290 public void shouldFailDeleteRequirementWhenOperationFailedInJanusGraph(){
291 Resource resource = createComponent(true);
292 resource.setComponentType(ComponentTypeEnum.RESOURCE);
293 validateUserRoles(Role.ADMIN, Role.DESIGNER);
294 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
295 .thenReturn(Either.left(resource));
296 when(toscaOperationFacade.getParentComponents(anyString()))
297 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
298 when(requirementOperation.deleteRequirements(anyObject(), anyString()))
299 .thenReturn(StorageOperationStatus.GENERAL_ERROR);
300 Either<RequirementDefinition, ResponseFormat> deleteRequirementEither
301 = requirementsBusinessLogicMock.deleteRequirement(componentId, requirementId, user, true);
302 Assert.assertTrue(deleteRequirementEither.isRight());
306 public void shouldFailDeleteRequirementWhenRequirementUsedInServiceComposition(){
307 Resource resource = createComponent(true);
308 resource.setComponentType(ComponentTypeEnum.RESOURCE);
309 validateUserRoles(Role.ADMIN, Role.DESIGNER);
310 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
311 .thenReturn(Either.left(resource));
312 when(toscaOperationFacade.getParentComponents(anyString()))
313 .thenReturn(Either.left(Collections.singletonList(createParentService())));
314 Either<RequirementDefinition, ResponseFormat> deleteRequirementEither
315 = requirementsBusinessLogicMock.deleteRequirement(componentId, requirementId, user, true);
316 Assert.assertTrue(deleteRequirementEither.isRight());
320 public void shouldPassGetRequirementsForHappyScenario(){
321 Resource resource = createComponent(true);
322 resource.setComponentType(ComponentTypeEnum.RESOURCE);
323 validateUserRoles(Role.ADMIN, Role.DESIGNER);
324 when(toscaOperationFacade.getToscaElement(anyString(), any(ComponentParametersView.class)))
325 .thenReturn(Either.left(resource));
326 when(toscaOperationFacade.getParentComponents(anyString()))
327 .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
328 Either<RequirementDefinition, ResponseFormat> getRequirementEither
329 = requirementsBusinessLogicMock.getRequirement(componentId, requirementId, user, true);
330 Assert.assertTrue(getRequirementEither.isLeft());
334 private Resource createComponent(boolean needRequirements) {
335 Resource resource = new Resource();
336 resource.setName("Resource1");
337 resource.addCategory("Network Layer 2-3", "Router");
338 resource.setDescription("My short description");
339 List<String> tgs = new ArrayList<>();
341 tgs.add(resource.getName());
342 resource.setTags(tgs);
344 if(needRequirements) {
345 List<RequirementDefinition> requirementDefinitions = createMockRequirementListToReturn(
346 createRequirement("reqName", "capType", "node", "source1",
348 Map<String, List<RequirementDefinition>> requirementsMap = new HashMap<>();
349 requirementsMap.put("capType", requirementDefinitions);
350 resource.setRequirements(requirementsMap);
352 resource.setName(resource.getName());
353 resource.setVersion("0.1");
354 resource.setUniqueId(resource.getName().toLowerCase() + ":" + resource.getVersion());
355 resource.setCreatorUserId(user.getUserId());
356 resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
357 resource.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
361 private List<RequirementDefinition> createMockRequirementListToReturn(RequirementDefinition requirementDefinition) {
362 List<RequirementDefinition> requirementDefinitions = new ArrayList<>();
363 requirementDefinitions.add(requirementDefinition);
364 return requirementDefinitions;
367 private void validateUserRoles(Role... roles) {
368 List<Role> listOfRoles = Stream.of(roles).collect(Collectors.toList());
371 private RequirementDefinition createRequirement(String name, String capability, String node,
372 String relationship, String minOccurrences,
373 String maxOccurrences) {
374 RequirementDefinition requirementDefinition = new RequirementDefinition();
375 requirementDefinition.setName(name);
376 requirementDefinition.setCapability(capability);
377 requirementDefinition.setNode(node);
378 requirementDefinition.setRelationship(relationship);
379 requirementDefinition.setMaxOccurrences(maxOccurrences);
380 requirementDefinition.setMinOccurrences(minOccurrences);
381 requirementDefinition.setUniqueId(requirementId);
383 return requirementDefinition;
386 private Service createParentService() {
387 Service service = new Service();
388 service.setUniqueId("serviceUniqueId");
390 List<RequirementCapabilityRelDef> resourceInstancesRelations = new ArrayList<>();
391 RequirementCapabilityRelDef relationDef = new RequirementCapabilityRelDef();
392 relationDef.setFromNode("fromNode");
393 relationDef.setToNode("toNode");
395 List<CapabilityRequirementRelationship> relationships = new ArrayList<>();
396 CapabilityRequirementRelationship capabilityRequirementRelationship = new CapabilityRequirementRelationship();
398 RelationshipInfo relation = new RelationshipInfo();
399 relation.setCapabilityUid("capabilityId");
400 relation.setRequirementUid(requirementId);
401 capabilityRequirementRelationship.setRelation(relation);
403 relationships.add(capabilityRequirementRelationship);
404 relationDef.setRelationships(relationships);
405 resourceInstancesRelations.add(relationDef);
407 service.setComponentInstancesRelations(resourceInstancesRelations);