From 97d15f764138e0d49963f168d339fc1637cc5376 Mon Sep 17 00:00:00 2001 From: aribeiro Date: Fri, 26 Feb 2021 16:28:59 +0000 Subject: Increase unit test coverage Increase ComponentInstance unit test coverage Issue-ID: SDC-3493 Signed-off-by: aribeiro Change-Id: Ife5a9b9cc41e5210005c37d368a094c86fa26db8 --- .../sdc/be/servlets/ComponentInstanceServlet.java | 3 +- .../be/servlets/ComponentInstanceServletTest.java | 589 +++++++++++++++++++-- 2 files changed, 556 insertions(+), 36 deletions(-) diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java index 8e54cc9d51..49d89c177e 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java @@ -180,7 +180,8 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet { } catch (final Exception e) { BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create Component Instance"); log.debug("create component instance failed with exception", e); - throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT); + return buildErrorResponse( + getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT, containerComponentType)); } loggerSupportability.log(LoggerSupportabilityActions.CREATE_INSTANCE, StatusCode.STARTED, diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java index d164fe3058..b3a189a670 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java @@ -20,9 +20,12 @@ package org.openecomp.sdc.be.servlets; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; @@ -31,17 +34,25 @@ import static org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum.SERVICE_PAR import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; import fj.data.Either; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Optional; +import javax.servlet.ReadListener; import javax.servlet.ServletContext; +import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.apache.commons.lang.StringUtils; import org.eclipse.jetty.http.HttpStatus; import org.glassfish.hk2.utilities.binding.AbstractBinder; import org.glassfish.jersey.server.ResourceConfig; @@ -51,6 +62,8 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic; @@ -58,24 +71,32 @@ import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic; import org.openecomp.sdc.be.components.impl.GroupBusinessLogic; import org.openecomp.sdc.be.components.impl.ResourceImportManager; import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic; -import org.openecomp.sdc.be.config.Configuration; +import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException; +import org.openecomp.sdc.be.components.validation.UserValidations; import org.openecomp.sdc.be.config.ConfigurationManager; import org.openecomp.sdc.be.config.SpringConfig; import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.impl.ServletUtils; import org.openecomp.sdc.be.impl.WebAppContextWrapper; +import org.openecomp.sdc.be.info.CreateAndAssotiateInfo; +import org.openecomp.sdc.be.model.CapabilityRequirementRelationship; +import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentInstance; import org.openecomp.sdc.be.model.ComponentInstanceInput; import org.openecomp.sdc.be.model.ComponentInstanceProperty; +import org.openecomp.sdc.be.model.RelationshipInfo; import org.openecomp.sdc.be.model.RequirementCapabilityRelDef; import org.openecomp.sdc.be.model.RequirementDefinition; import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; +import org.openecomp.sdc.be.user.Role; import org.openecomp.sdc.be.user.UserBusinessLogic; -import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.common.api.ConfigurationSource; +import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.common.impl.ExternalConfiguration; import org.openecomp.sdc.common.impl.FSConfigurationSource; import org.openecomp.sdc.exception.ResponseFormat; @@ -87,31 +108,43 @@ import org.springframework.web.context.WebApplicationContext; /** * The test suite designed for test functionality of ComponentInstanceServlet class */ +@TestInstance(Lifecycle.PER_CLASS) class ComponentInstanceServletTest extends JerseyTest { - private final static String USER_ID = "jh0003"; - private static HttpServletRequest request; - private static HttpSession session; - private static ServletContext servletContext; - private static WebAppContextWrapper webAppContextWrapper; - private static WebApplicationContext webApplicationContext; - private static ComponentInstanceBusinessLogic componentInstanceBusinessLogic; - private static ComponentsUtils componentsUtils; - private static ServletUtils servletUtils; - private static ResponseFormat responseFormat; - private static UserBusinessLogic userBusinessLogic; - private static GroupBusinessLogic groupBusinessLogic; - private static ResourceImportManager resourceImportManager; - private static ServiceBusinessLogic serviceBusinessLogic; - private static ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic; - private static ConfigurationManager configurationManager; + private static final String USER_ID = "jh0003"; + private static final String componentId = "componentId"; + private static final String componentInstanceId = "componentInstanceIdInstanceId"; + public static final String INVALID_CONTENT = "InvalidContent"; + private HttpServletRequest request; + private HttpSession session; + private ServletContext servletContext; + private WebAppContextWrapper webAppContextWrapper; + private WebApplicationContext webApplicationContext; + private ComponentInstanceBusinessLogic componentInstanceBusinessLogic; + private ComponentsUtils componentsUtils; + private ServletUtils servletUtils; + private ResponseFormat responseFormat; + private UserBusinessLogic userBusinessLogic; + private UserValidations userValidations; + private GroupBusinessLogic groupBusinessLogic; + private ResourceImportManager resourceImportManager; + private ServiceBusinessLogic serviceBusinessLogic; + private ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic; + private ConfigurationManager configurationManager; + private User user; + private String inputData; + private ComponentInstance componentInstance; + private CINodeFilterDataDefinition ciNodeFilterDataDefinition; + private RequirementCapabilityRelDef requirementCapabilityRelDef; @BeforeAll - public static void setup() { + public void setup() { createMocks(); stubMethods(); - String appConfigDir = "src/test/resources/config/catalog-be"; - ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir); + initTestData(); + final String appConfigDir = "src/test/resources/config/catalog-be"; + final ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), + appConfigDir); configurationManager = new ConfigurationManager(configurationSource); org.openecomp.sdc.be.config.Configuration configuration = new org.openecomp.sdc.be.config.Configuration(); configuration.setJanusGraphInMemoryGraph(true); @@ -129,6 +162,25 @@ class ComponentInstanceServletTest extends JerseyTest { super.tearDown(); } + private void initTestData() { + componentInstance = getComponentInstance(); + inputData = getInputData(componentInstance); + ciNodeFilterDataDefinition = getCiNodeFilterDataDefinition(); + + user = new User(); + user.setUserId(USER_ID); + user.setRole(Role.ADMIN.name()); + + requirementCapabilityRelDef = new RequirementCapabilityRelDef(); + final CapabilityRequirementRelationship capabilityRequirementRelationship = new CapabilityRequirementRelationship(); + final RelationshipInfo relationInfo = new RelationshipInfo(); + relationInfo.setId("RELATION_ID"); + capabilityRequirementRelationship.setRelation(relationInfo); + requirementCapabilityRelDef.setRelationships(Lists.newArrayList(capabilityRequirementRelationship)); + requirementCapabilityRelDef.setToNode("TO_INSTANCE_ID"); + requirementCapabilityRelDef.setFromNode("FROM_INSTANCE_ID"); + } + @Test void testGetRelationByIdSuccess() { @@ -157,7 +209,6 @@ class ComponentInstanceServletTest extends JerseyTest { void testGetRelationByIdFailure() { String containerComponentType = "unknown_type"; - String componentId = "componentId"; String relationId = "relationId"; String path = "/v1/catalog/" + containerComponentType + "/" + componentId + "/" + relationId + "/relationId"; when(responseFormat.getStatus()).thenReturn(HttpStatus.BAD_REQUEST_400); @@ -175,7 +226,6 @@ class ComponentInstanceServletTest extends JerseyTest { @Test void testBatchDeleteResourceInstancesSuccess() { - String componentId = "componentId"; String containerComponentType = ComponentTypeEnum.SERVICE_PARAM_NAME; String compId1 = "compId1"; String[] delCompIds = new String[1]; @@ -231,7 +281,6 @@ class ComponentInstanceServletTest extends JerseyTest { @Test void testBatchDissociateRIFromRISuccess() { - String componentId = "componentId"; String containerComponentType = ComponentTypeEnum.SERVICE_PARAM_NAME; String path = "/v1/catalog/" + containerComponentType + "/" + componentId + "/resourceInstance/batchDissociate"; RequirementCapabilityRelDef[] refs = new RequirementCapabilityRelDef[1]; @@ -261,7 +310,6 @@ class ComponentInstanceServletTest extends JerseyTest { @Test void testBatchDissociateRIFromRIFailure() { - String componentId = "componentId"; String containerComponentType = ComponentTypeEnum.SERVICE_PARAM_NAME; String path = "/v1/catalog/" + containerComponentType + "/" + componentId + "/resourceInstance/batchDissociate"; @@ -299,7 +347,7 @@ class ComponentInstanceServletTest extends JerseyTest { .property("contextConfig", context); } - private static void createMocks() { + private void createMocks() { request = Mockito.mock(HttpServletRequest.class); session = Mockito.mock(HttpSession.class); servletContext = Mockito.mock(ServletContext.class); @@ -314,9 +362,10 @@ class ComponentInstanceServletTest extends JerseyTest { responseFormat = Mockito.mock(ResponseFormat.class); serviceBusinessLogic = Mockito.mock(ServiceBusinessLogic.class); componentNodeFilterBusinessLogic = Mockito.mock(ComponentNodeFilterBusinessLogic.class); + userValidations = Mockito.mock(UserValidations.class); } - private static void stubMethods() { + private void stubMethods() { when(request.getSession()).thenReturn(session); when(session.getServletContext()).thenReturn(servletContext); when(servletContext.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR)) @@ -333,7 +382,6 @@ class ComponentInstanceServletTest extends JerseyTest { void testUpdateResourceInstancePropertiesSuccess() { String containerComponentType = "services"; - String componentId = "componentId"; String resourceInstanceId = "resourceInstanceId"; ComponentInstanceProperty[] properties = new ComponentInstanceProperty[1]; ComponentInstanceProperty property = new ComponentInstanceProperty(); @@ -370,7 +418,6 @@ class ComponentInstanceServletTest extends JerseyTest { void testUpdateResourceInstanceInputsSuccess() { String containerComponentType = "services"; - String componentId = "componentId"; String resourceInstanceId = "resourceInstanceId"; ComponentInstanceInput[] inputs = new ComponentInstanceInput[1]; ComponentInstanceInput input = new ComponentInstanceInput(); @@ -406,7 +453,6 @@ class ComponentInstanceServletTest extends JerseyTest { void testUpdateResourceInstancePropertiesFailure() { String containerComponentType = "services"; - String componentId = "componentId"; String resourceInstanceId = "resourceInstanceId"; ComponentInstanceProperty[] properties = new ComponentInstanceProperty[1]; ComponentInstanceProperty property = new ComponentInstanceProperty(); @@ -443,7 +489,6 @@ class ComponentInstanceServletTest extends JerseyTest { void testUpdateResourceInstanceInputsFailure() { String containerComponentType = "services"; - String componentId = "componentId"; String resourceInstanceId = "resourceInstanceId"; ComponentInstanceInput[] inputs = new ComponentInstanceInput[1]; ComponentInstanceInput input = new ComponentInstanceInput(); @@ -477,10 +522,7 @@ class ComponentInstanceServletTest extends JerseyTest { @Test void testUpdateInstanceRequirement() { - String containerComponentType = "services"; - String componentId = "componentId"; - String componentInstanceId = "componentInstanceIdInstanceId"; String capabilityType = "capabilityType"; String requirementName = "requirementName"; RequirementDefinition requirementDefinition = new RequirementDefinition(); @@ -498,7 +540,7 @@ class ComponentInstanceServletTest extends JerseyTest { eq(AuditingActionEnum.GET_TOSCA_MODEL), eq(ComponentTypeEnum.SERVICE))) .thenReturn(Either.left(requirementDefinition)); when(componentInstanceBusinessLogic.updateInstanceRequirement(ComponentTypeEnum.SERVICE, - componentId, componentInstanceId, requirementDefinition, USER_ID)) + componentId, componentInstanceId, requirementDefinition, USER_ID)) .thenReturn(Either.left(requirementDefinition)); when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); @@ -509,4 +551,481 @@ class ComponentInstanceServletTest extends JerseyTest { .header("USER_ID", USER_ID).put(Entity.entity(requirementDefinition, MediaType.APPLICATION_JSON)); assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); } + + @Test + void createComponentInstanceSuccessTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(componentInstanceBusinessLogic. + createComponentInstance(anyString(), anyString(), anyString(), any(ComponentInstance.class))) + .thenReturn(componentInstance); + when(responseFormat.getStatus()).thenReturn(HttpStatus.CREATED_201); + when(componentsUtils.getResponseFormat(ActionStatus.CREATED)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201); + } + + @Test + void createComponentInstanceFailWithEmptyContentTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.MISSING_BODY)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity("", MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void createComponentInstanceFailWithInvalidContentTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(INVALID_CONTENT, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void updateComponentInstanceMetadataSuccessTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstance)); + when(componentInstanceBusinessLogic + .updateComponentInstanceMetadata(anyString(), anyString(), anyString(), anyString(), + any(ComponentInstance.class))).thenReturn(Either.left(componentInstance)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void updateComponentInstanceMetadataFailWithInvalidContentTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream("")); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(INVALID_CONTENT, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstance)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.NO_CONTENT_204); + when(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(INVALID_CONTENT, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.NO_CONTENT_204); + } + + @Test + void updateComponentInstanceMetadataFailConvertJsonDataTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.right(new ResponseFormat())); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void updateComponentInstanceMetadataAndCreateNodeFilterSuccessTest() throws IOException, BusinessLogicException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + componentInstance.setDirectives(singletonList("substitutable")); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstance)); + when(componentInstanceBusinessLogic + .updateComponentInstanceMetadata(anyString(), anyString(), anyString(), anyString(), + any(ComponentInstance.class))).thenReturn(Either.left(componentInstance)); + + when(componentNodeFilterBusinessLogic.createNodeFilterIfNotExist(componentId, componentInstanceId, + true, ComponentTypeEnum.SERVICE)).thenReturn(Optional.of(ciNodeFilterDataDefinition)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void updateComponentInstanceMetadataAndCreateNodeFilterFailTest() throws IOException, BusinessLogicException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + componentInstance.setDirectives(singletonList("substitutable")); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstance)); + when(componentInstanceBusinessLogic + .updateComponentInstanceMetadata(anyString(), anyString(), anyString(), anyString(), + any(ComponentInstance.class))).thenReturn(Either.left(componentInstance)); + when(componentNodeFilterBusinessLogic.createNodeFilterIfNotExist(componentId, componentInstanceId, + true, ComponentTypeEnum.SERVICE)).thenReturn(Optional.empty()); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void updateComponentInstanceMetadataAndDeleteNodeFilterSuccessTest() throws IOException, BusinessLogicException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstance)); + when(componentInstanceBusinessLogic + .updateComponentInstanceMetadata(anyString(), anyString(), anyString(), anyString(), + any(ComponentInstance.class))).thenReturn(Either.left(componentInstance)); + when(componentNodeFilterBusinessLogic + .deleteNodeFilterIfExists(componentId, componentInstanceId, true, ComponentTypeEnum.SERVICE)) + .thenReturn(Optional.of(ciNodeFilterDataDefinition.getName())); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void updateComponentInstanceMetadataAndDeleteNodeFilterFailTest() throws IOException, BusinessLogicException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance.class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstance)); + when(componentInstanceBusinessLogic + .updateComponentInstanceMetadata(anyString(), anyString(), anyString(), anyString(), + any(ComponentInstance.class))).thenReturn(Either.left(componentInstance)); + when(componentNodeFilterBusinessLogic + .deleteNodeFilterIfExists(componentId, componentInstanceId, true, ComponentTypeEnum.SERVICE)) + .thenReturn(Optional.empty()); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void updateMultipleComponentInstanceSuccessTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/multipleComponentInstance"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + final ComponentInstance[] componentInstances = new ComponentInstance[1]; + componentInstances[0] = componentInstance; + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance[].class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.left(componentInstances)); + when(componentInstanceBusinessLogic + .updateComponentInstance(anyString(), any(Component.class), anyString(), anyString(), anyList(), + anyBoolean())).thenReturn( + singletonList(componentInstance)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void updateMultipleComponentInstanceFailTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/multipleComponentInstance"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream(inputData)); + when(componentsUtils + .convertJsonToObjectUsingObjectMapper(inputData, new User(), ComponentInstance[].class, + null, ComponentTypeEnum.RESOURCE_INSTANCE)).thenReturn(Either.right(new ResponseFormat())); + when(componentInstanceBusinessLogic + .updateComponentInstance(anyString(), any(Component.class), anyString(), anyString(), anyList(), + anyBoolean())).thenReturn( + singletonList(componentInstance)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void deleteResourceInstanceSuccessTest() throws BusinessLogicException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/%s"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId, componentInstanceId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(componentInstanceBusinessLogic.deleteComponentInstance(anyString(), anyString(), anyString(), anyString())) + .thenReturn(componentInstance); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).delete(); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void associateRIToRISuccessTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/associate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(componentInstanceBusinessLogic + .associateRIToRI(anyString(), anyString(), any(RequirementCapabilityRelDef.class), + any(ComponentTypeEnum.class))).thenReturn(requirementCapabilityRelDef); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(getInputData(requirementCapabilityRelDef), MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void associateRIToRIFailWithInvalidContentTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/associate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void dissociateRIFromRISuccessTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/dissociate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(componentInstanceBusinessLogic + .dissociateRIFromRI(anyString(), anyString(), any(RequirementCapabilityRelDef.class), + any(ComponentTypeEnum.class))).thenReturn(requirementCapabilityRelDef); + when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); + when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).put(Entity.entity(getInputData(requirementCapabilityRelDef), MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); + } + + @Test + void dissociateRIFromRIFailWithInvalidContentTest() { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/dissociate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(componentInstanceBusinessLogic + .dissociateRIFromRI(anyString(), anyString(), any(RequirementCapabilityRelDef.class), + any(ComponentTypeEnum.class))).thenReturn(requirementCapabilityRelDef); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).put(Entity.entity(inputData, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void createAndAssociateRIToRISuccessTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/createAndAssociate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + final CreateAndAssotiateInfo createAndAssociateInfo = new CreateAndAssotiateInfo(componentInstance, requirementCapabilityRelDef); + final String data = getInputData(createAndAssociateInfo); + when(request.getInputStream()).thenReturn(new TestServletInputStream(data)); + when(componentInstanceBusinessLogic.createAndAssociateRIToRI(anyString(), anyString(), anyString(), any( + CreateAndAssotiateInfo.class))).thenReturn(Either.left(createAndAssociateInfo)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.CREATED_201); + when(componentsUtils.getResponseFormat(ActionStatus.CREATED)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(data, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201); + } + + @Test + void createAndAssociateRIToRIFailTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/createAndAssociate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + final String data = getInputData(new CreateAndAssotiateInfo(componentInstance, requirementCapabilityRelDef)); + when(request.getInputStream()).thenReturn(new TestServletInputStream(data)); + when(componentInstanceBusinessLogic.createAndAssociateRIToRI(anyString(), anyString(), anyString(), any( + CreateAndAssotiateInfo.class))).thenReturn(Either.right(new ResponseFormat())); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(data, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void createAndAssociateRIToRIFailWithInvalidContentTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/createAndAssociate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + when(request.getInputStream()).thenReturn(new TestServletInputStream(INVALID_CONTENT)); + when(componentInstanceBusinessLogic.createAndAssociateRIToRI(anyString(), anyString(), anyString(), any( + CreateAndAssotiateInfo.class))).thenReturn(Either.right(new ResponseFormat())); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(INVALID_CONTENT, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + @Test + void createAndAssociateRIToRIFailWithEmptyContentTest() throws IOException { + final String pathFormat = "/v1/catalog/%s/%s/resourceInstance/createAndAssociate"; + final String path = String.format(pathFormat, SERVICE_PARAM_NAME, componentId); + when(userValidations.validateUserExists(USER_ID)).thenReturn(user); + when(userBusinessLogic.getUser(USER_ID)).thenReturn(user); + final String data = StringUtils.EMPTY; + when(request.getInputStream()).thenReturn(new TestServletInputStream(data)); + when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500); + when(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)).thenReturn(responseFormat); + + final Response response = target() + .path(path) + .request(MediaType.APPLICATION_JSON) + .header("USER_ID", USER_ID).post(Entity.entity(data, MediaType.APPLICATION_JSON)); + assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + + private CINodeFilterDataDefinition getCiNodeFilterDataDefinition() { + final CINodeFilterDataDefinition ciNodeFilterDataDefinition = new CINodeFilterDataDefinition(); + ciNodeFilterDataDefinition.setProperties(new ListDataDefinition<>()); + ciNodeFilterDataDefinition.setID("MyNodeFilter"); + ciNodeFilterDataDefinition.setName("NODE_FILTER_UID"); + return ciNodeFilterDataDefinition; + } + + private ComponentInstance getComponentInstance() { + final ComponentInstance componentInstance = new ComponentInstance(); + componentInstance.setName("InstanceName"); + componentInstance.setUniqueId(componentInstanceId); + componentInstance.setComponentUid("ComponentInstanceUUID"); + componentInstance.setInvariantName("ComponentInstanceInvariantName"); + return componentInstance; + } + + private String getInputData(final T elementToRepresent) { + try { + return new ObjectMapper().writeValueAsString(elementToRepresent); + } catch (final JsonProcessingException e) { + e.printStackTrace(); + } + return StringUtils.EMPTY; + } + + class TestServletInputStream extends ServletInputStream { + + private InputStream inputStream; + + TestServletInputStream(String testJson) { + inputStream = new ByteArrayInputStream(testJson.getBytes()); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + + @Override + public int read() throws IOException { + return inputStream.read(); + } + } } -- cgit 1.2.3-korg