Import multiple node types in a single endpoint
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / servlets / ResourceUploadServletTest.java
index 9d0966b..7a7b07f 100644 (file)
@@ -22,6 +22,9 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.io.File;
@@ -29,6 +32,7 @@ import java.io.FileReader;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.nio.file.Path;
 import java.util.Optional;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -50,11 +54,8 @@ import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 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.Mock;
 import org.mockito.MockitoAnnotations;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
@@ -62,7 +63,8 @@ import org.openecomp.sdc.be.components.impl.ModelBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
 import org.openecomp.sdc.be.components.impl.ResponseFormatManager;
-import org.openecomp.sdc.be.components.validation.UserValidations;
+import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.config.ConfigurationManager;
 import org.openecomp.sdc.be.config.SpringConfig;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
@@ -85,9 +87,9 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.web.context.WebApplicationContext;
 
-@TestInstance(Lifecycle.PER_CLASS)
 class ResourceUploadServletTest extends JerseyTest {
     private static final String USER_ID = "cs0008";
+    private static final User USER = new User(USER_ID);
 
     @Mock
     private HttpServletRequest request;
@@ -114,39 +116,21 @@ class ResourceUploadServletTest extends JerseyTest {
     @Mock
     private ResponseFormat responseFormat;
     @Mock
-    private UserValidations userValidations;
-    @Mock
     private ModelBusinessLogic modelBusinessLogic;
     @Mock
     private ResponseFormatManager responseFormatManager;
     private final String modelName = "ETSI-SOL001-331";
 
-    private final String rootPath = "/v1/catalog/upload/multipart";
+    private final Path rootPath = Path.of("/v1/catalog/upload");
+    private final Path bulkImportPath = rootPath.resolve("resource/import");
+    private final String multipartPath = "/v1/catalog/upload/multipart";
     private User user;
 
-    @BeforeAll
-    public void initClass() {
-        when(request.getSession()).thenReturn(session);
-        when(session.getServletContext()).thenReturn(servletContext);
-        when(servletContext.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR))
-            .thenReturn(webAppContextWrapper);
-        when(webAppContextWrapper.getWebAppContext(servletContext)).thenReturn(webApplicationContext);
-        when(webApplicationContext.getBean(ModelBusinessLogic.class)).thenReturn(modelBusinessLogic);
-        when(request.getHeader(Constants.USER_ID_HEADER)).thenReturn(USER_ID);
-        when(webApplicationContext.getBean(ServletUtils.class)).thenReturn(servletUtils);
-        when(servletUtils.getComponentsUtils()).thenReturn(componentsUtils);
-        final String appConfigDir = "src/test/resources/config/catalog-be";
-        final ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
-        final ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
-        final org.openecomp.sdc.be.config.Configuration configuration = new org.openecomp.sdc.be.config.Configuration();
-        configuration.setJanusGraphInMemoryGraph(true);
-        configurationManager.setConfiguration(configuration);
-        ExternalConfiguration.setAppName("catalog-be");
-    }
-
     @BeforeEach
     void resetMock() throws Exception {
         super.setUp();
+        initMocks();
+        initConfig();
         initTestData();
     }
 
@@ -155,13 +139,6 @@ class ResourceUploadServletTest extends JerseyTest {
         super.tearDown();
     }
 
-    private void initTestData() {
-        user = new User();
-        user.setUserId(USER_ID);
-        user.setRole(Role.ADMIN.name());
-        when(userBusinessLogic.getUser(USER_ID)).thenReturn(user);
-    }
-
     @Override
     protected ResourceConfig configure() {
         MockitoAnnotations.openMocks(this);
@@ -179,7 +156,6 @@ class ResourceUploadServletTest extends JerseyTest {
                     bind(resourceImportManager).to(ResourceImportManager.class);
                     bind(resourceBusinessLogic).to(ResourceBusinessLogic.class);
                     bind(modelBusinessLogic).to(ModelBusinessLogic.class);
-                    bind(userValidations).to(UserValidations.class);
                 }
             })
             .register(new OperationExceptionMapper(new ServletResponseBuilder(), responseFormatManager))
@@ -192,6 +168,37 @@ class ResourceUploadServletTest extends JerseyTest {
         config.register(MultiPartFeature.class);
     }
 
+    void initMocks() {
+        when(request.getSession()).thenReturn(session);
+        when(session.getServletContext()).thenReturn(servletContext);
+        when(servletContext.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR))
+            .thenReturn(webAppContextWrapper);
+        when(webAppContextWrapper.getWebAppContext(servletContext)).thenReturn(webApplicationContext);
+        when(webApplicationContext.getBean(ModelBusinessLogic.class)).thenReturn(modelBusinessLogic);
+        when(webApplicationContext.getBean(UserBusinessLogic.class)).thenReturn(userBusinessLogic);
+        when(userBusinessLogic.getUser(USER_ID, false)).thenReturn(USER);
+        when(request.getHeader(Constants.USER_ID_HEADER)).thenReturn(USER_ID);
+        when(webApplicationContext.getBean(ServletUtils.class)).thenReturn(servletUtils);
+        when(servletUtils.getComponentsUtils()).thenReturn(componentsUtils);
+    }
+
+    void initConfig() {
+        final String appConfigDir = "src/test/resources/config/catalog-be";
+        final ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
+        final ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
+        final org.openecomp.sdc.be.config.Configuration configuration = new org.openecomp.sdc.be.config.Configuration();
+        configuration.setJanusGraphInMemoryGraph(true);
+        configurationManager.setConfiguration(configuration);
+        ExternalConfiguration.setAppName("catalog-be");
+    }
+
+    private void initTestData() {
+        user = new User();
+        user.setUserId(USER_ID);
+        user.setRole(Role.ADMIN.name());
+        when(userBusinessLogic.getUser(USER_ID)).thenReturn(user);
+    }
+
     @Test
     void uploadMultipartWithModelSuccessTest() throws IOException, ParseException, URISyntaxException {
         when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200);
@@ -199,10 +206,10 @@ class ResourceUploadServletTest extends JerseyTest {
         when(servletUtils.getUserAdmin()).thenReturn(userBusinessLogic);
         when(userBusinessLogic.getUser(anyString())).thenReturn(user);
         when(resourceBusinessLogic.validatePropertiesDefaultValues(any())).thenReturn(true);
-        when(resourceImportManager.importNormativeResource(anyString(), any(), any(), anyBoolean(), anyBoolean()))
+        when(resourceImportManager.importNormativeResource(anyString(), any(), any(), anyBoolean(), anyBoolean(), anyBoolean()))
             .thenReturn(new ImmutablePair<>(new Resource(), ActionStatus.CREATED));
         when(modelBusinessLogic.findModel(modelName)).thenReturn(Optional.of(new Model(modelName)));
-        final var response = target().path(rootPath).request(MediaType.APPLICATION_JSON)
+        final var response = target().path(multipartPath).request(MediaType.APPLICATION_JSON)
             .header(Constants.USER_ID_HEADER, USER_ID)
             .post(Entity.entity(buildFormDataMultiPart("node-types/TestNodeType001.zip",
                 "src/test/resources/node-types/nodeTypeWithModelsField.json"), MediaType.MULTIPART_FORM_DATA), Response.class);
@@ -216,9 +223,9 @@ class ResourceUploadServletTest extends JerseyTest {
         when(servletUtils.getUserAdmin()).thenReturn(userBusinessLogic);
         when(userBusinessLogic.getUser(anyString())).thenReturn(user);
         when(resourceBusinessLogic.validatePropertiesDefaultValues(any())).thenReturn(true);
-        when(resourceImportManager.importNormativeResource(anyString(), any(), any(), anyBoolean(), anyBoolean()))
+        when(resourceImportManager.importNormativeResource(anyString(), any(), any(), anyBoolean(), anyBoolean(), anyBoolean()))
             .thenReturn(new ImmutablePair<>(new Resource(), ActionStatus.CREATED));
-        final var response = target().path(rootPath).request(MediaType.APPLICATION_JSON)
+        final var response = target().path(multipartPath).request(MediaType.APPLICATION_JSON)
             .header(Constants.USER_ID_HEADER, USER_ID)
             .post(Entity.entity(buildFormDataMultiPart("node-types/TestNodeType002.zip",
                 "src/test/resources/node-types/nodeTypeWithoutModelsField.json"), MediaType.MULTIPART_FORM_DATA), Response.class);
@@ -233,7 +240,7 @@ class ResourceUploadServletTest extends JerseyTest {
         when(userBusinessLogic.getUser(anyString())).thenReturn(user);
         when(resourceBusinessLogic.validatePropertiesDefaultValues(any())).thenReturn(true);
         when(modelBusinessLogic.findModel("")).thenReturn(Optional.empty());
-        final Response response = target().path(rootPath).request(MediaType.APPLICATION_JSON)
+        final Response response = target().path(multipartPath).request(MediaType.APPLICATION_JSON)
             .header(Constants.USER_ID_HEADER, USER_ID)
             .post(Entity.entity(buildFormDataMultiPart("node-types/TestNodeType002.zip",
                 "src/test/resources/node-types/nodeTypeWithEmptyModels.json"), MediaType.MULTIPART_FORM_DATA), Response.class);
@@ -246,7 +253,7 @@ class ResourceUploadServletTest extends JerseyTest {
         when(userBusinessLogic.getUser(anyString())).thenReturn(user);
         when(resourceBusinessLogic.validatePropertiesDefaultValues(any())).thenReturn(true);
         when(modelBusinessLogic.findModel(modelName)).thenReturn(Optional.empty());
-        final var response = target().path(rootPath).request(MediaType.APPLICATION_JSON)
+        final var response = target().path(multipartPath).request(MediaType.APPLICATION_JSON)
             .header(Constants.USER_ID_HEADER, USER_ID)
             .post(Entity.entity(buildFormDataMultiPart("node-types/TestNodeType001.zip",
                 "src/test/resources/node-types/nodeTypeWithModelsField.json"), MediaType.MULTIPART_FORM_DATA), Response.class);
@@ -260,16 +267,75 @@ class ResourceUploadServletTest extends JerseyTest {
         when(servletUtils.getUserAdmin()).thenReturn(userBusinessLogic);
         when(userBusinessLogic.getUser(anyString())).thenReturn(user);
         when(resourceBusinessLogic.validatePropertiesDefaultValues(any())).thenReturn(true);
-        final var response = target().path(rootPath).request(MediaType.APPLICATION_JSON)
+        final var response = target().path(multipartPath).request(MediaType.APPLICATION_JSON)
             .header(Constants.USER_ID_HEADER, USER_ID)
             .post(Entity.entity(buildFormDataMultiPart("node-types/TestNodeType001.zip",
                 "src/test/resources/node-types/invalid.json"), MediaType.MULTIPART_FORM_DATA), Response.class);
         assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500);
     }
 
-    private String getInputData(final String jsonFilename) throws IOException, ParseException {
+    @Test
+    void bulkImportSuccessTest() throws IOException, ParseException {
+        when(responseFormat.getStatus()).thenReturn(HttpStatus.CREATED_201);
+        when(componentsUtils.getResponseFormat(ActionStatus.CREATED)).thenReturn(responseFormat);
+
+        final Response response = doValidCallToBulkImport(USER_ID);
+
+        verify(resourceImportManager).importAllNormativeResource(anyString(), any(), eq(USER), eq(false), eq(false));
+        assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201);
+    }
+
+    @Test
+    void bulkImportFailTest_businessException() throws IOException, ParseException {
+        doThrow(new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR))
+            .when(resourceImportManager)
+            .importAllNormativeResource(anyString(), any(), eq(USER), eq(false), eq(false));
+
+        final Response response = doValidCallToBulkImport(USER_ID);
+
+        assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500);
+    }
+
+    @Test
+    void bulkImportFailTest_unexpectedException() throws IOException, ParseException {
+        when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500);
+        when(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(responseFormat);
+
+        doThrow(RuntimeException.class)
+            .when(resourceImportManager)
+            .importAllNormativeResource(anyString(), any(), eq(USER), eq(false), eq(false));
+
+        final Response response = doValidCallToBulkImport(USER_ID);
+
+        assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500);
+    }
+
+    @Test
+    void bulkImportFailTest_invalidUser() throws IOException, ParseException {
+        var userId = "userId";
+        when(userBusinessLogic.getUser(userId, false)).thenThrow(ComponentException.class);
+        when(responseFormat.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR_500);
+        when(componentsUtils.getResponseFormat(any(ComponentException.class))).thenReturn(responseFormat);
+
+        final Response response = doValidCallToBulkImport(userId);
+
+        assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500);
+    }
+
+    private Response doValidCallToBulkImport(final String userId) throws IOException, ParseException {
+        final Path nodeTypesYamlPath = Path.of("src/test/resources/node-types/nodeTypes.yaml");
+        final Path nodeTypeMetadataJsonPath = Path.of("src/test/resources/node-types/payload.json");
+        return target().path(bulkImportPath.toString()).request(MediaType.APPLICATION_JSON)
+            .header(Constants.USER_ID_HEADER, userId)
+            .post(
+                Entity.entity(buildBulkImportMultiPartData(nodeTypesYamlPath, nodeTypeMetadataJsonPath), MediaType.MULTIPART_FORM_DATA),
+                Response.class
+            );
+    }
+
+    private String parseFileToJsonString(final Path jsonFilePath) throws IOException, ParseException {
         final JSONObject inputData = (JSONObject) new JSONParser().parse(
-            new FileReader(jsonFilename));
+            new FileReader(jsonFilePath.toString()));
         return inputData.toJSONString();
     }
 
@@ -286,7 +352,17 @@ class ResourceUploadServletTest extends JerseyTest {
         final FileDataBodyPart filePart = new FileDataBodyPart("resourceZip", getFile(zipFilePath));
         final FormDataMultiPart multipartEntity = new FormDataMultiPart();
         multipartEntity.bodyPart(filePart);
-        multipartEntity.field("resourceMetadata", getInputData(inputJsonData));
+        multipartEntity.field("resourceMetadata", parseFileToJsonString(Path.of(inputJsonData)));
         return  multipartEntity;
     }
+
+    private FormDataMultiPart buildBulkImportMultiPartData(final Path nodeTypesYamlPath, final Path payloadJsonPath)
+        throws IOException, ParseException {
+        final FileDataBodyPart formDataBodyPart = new FileDataBodyPart("nodeTypesYaml", nodeTypesYamlPath.toFile());
+        final FormDataMultiPart multipartEntity = new FormDataMultiPart();
+        multipartEntity.bodyPart(formDataBodyPart);
+        multipartEntity.field("nodeTypeMetadataJson", parseFileToJsonString(payloadJsonPath), MediaType.APPLICATION_JSON_TYPE);
+        multipartEntity.field("createNewVersion", String.valueOf(false), MediaType.TEXT_PLAIN_TYPE);
+        return multipartEntity;
+    }
 }