Add models imports endpoint and persistence structure
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / ModelBusinessLogicTest.java
index 6c7bd53..b88bdfb 100644 (file)
 package org.openecomp.sdc.be.components.impl;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
-import org.junit.jupiter.api.Order;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.Optional;
+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.junit.jupiter.api.TestMethodOrder;
+import org.mockito.ArgumentCaptor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -36,10 +45,11 @@ import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.exception.BusinessException;
 import org.openecomp.sdc.be.model.Model;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.OperationException;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.ModelOperationExceptionSupplier;
 import org.openecomp.sdc.be.model.operations.impl.ModelOperation;
+import org.openecomp.sdc.common.zip.ZipUtils;
+import org.openecomp.sdc.common.zip.exception.ZipException;
 
-@TestInstance(Lifecycle.PER_CLASS)
-@TestMethodOrder(OrderAnnotation.class)
 class ModelBusinessLogicTest {
 
     @InjectMocks
@@ -47,8 +57,9 @@ class ModelBusinessLogicTest {
     @Mock
     private ModelOperation modelOperation;
     private Model model;
+    private final Path modelImportsResourcePath = Path.of("src/test/resources/modelImports");
 
-    @BeforeAll
+    @BeforeEach
     void setup() {
         MockitoAnnotations.openMocks(this);
         initTestData();
@@ -59,7 +70,6 @@ class ModelBusinessLogicTest {
     }
 
     @Test
-    @Order(1)
     void createModelTest() {
         when(modelOperation.createModel(model, false)).thenReturn(model);
         final Model result = modelBusinessLogic.createModel(model);
@@ -68,13 +78,116 @@ class ModelBusinessLogicTest {
     }
 
     @Test
-    @Order(2)
     void createModelFailTest() {
         when(modelOperation.createModel(model, false))
-            .thenThrow(new OperationException(ActionStatus.MODEL_ALREADY_EXISTS, model.getName()));
+            .thenThrow(ModelOperationExceptionSupplier.modelAlreadyExists(model.getName()).get());
         final BusinessException exception = assertThrows(BusinessException.class, () -> modelBusinessLogic.createModel(model));
         assertThat(((OperationException) exception).getActionStatus().name()).isEqualTo(ActionStatus.MODEL_ALREADY_EXISTS.name());
         assertThat(((OperationException) exception).getParams()).contains(model.getName());
     }
 
+    @Test
+    void createModelImportsSuccessTest() throws IOException, ZipException {
+        final var modelId = "modelId";
+        final var resolve = modelImportsResourcePath.resolve("modelWithSubFolderAndEmptyFolder.zip");
+        final var zipBytes = Files.readAllBytes(resolve);
+        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(zipBytes);
+        final Map<String, byte[]> expectedZipMap = ZipUtils.readZip(zipBytes, false);
+
+        when(modelOperation.findModelByName(modelId)).thenReturn(Optional.of(new Model(modelId)));
+        doNothing().when(modelOperation).createModelImports(eq(modelId), anyMap());
+
+        modelBusinessLogic.createModelImports(modelId, byteArrayInputStream);
+
+        final ArgumentCaptor<Map<String, byte[]>> zipMapArgumentCaptor = ArgumentCaptor.forClass(Map.class);
+        verify(modelOperation).createModelImports(eq(modelId), zipMapArgumentCaptor.capture());
+        expectedZipMap.keySet().forEach(key -> assertTrue(zipMapArgumentCaptor.getValue().containsKey(key), "Expecting import " + key));
+    }
+
+    @Test
+    void createModelImportsTest_invalidModel() {
+        //given an empty model
+        final var modelId = "";
+
+        final var emptyByteArrayInputStream = new ByteArrayInputStream(new byte[0]);
+        var actualOperationException = assertThrows(OperationException.class,
+            () -> modelBusinessLogic.createModelImports(modelId, emptyByteArrayInputStream));
+
+        var expectedOperationException = ModelOperationExceptionSupplier.invalidModel(modelId).get();
+        assertEquals(actualOperationException.getActionStatus(), expectedOperationException.getActionStatus());
+        assertEquals(actualOperationException.getParams().length, expectedOperationException.getParams().length);
+        assertEquals(actualOperationException.getParams()[0], expectedOperationException.getParams()[0]);
+
+        //given a null model
+        actualOperationException = assertThrows(OperationException.class,
+            () -> modelBusinessLogic.createModelImports(null, emptyByteArrayInputStream));
+
+        expectedOperationException = ModelOperationExceptionSupplier.invalidModel(null).get();
+        assertEquals(actualOperationException.getActionStatus(), expectedOperationException.getActionStatus());
+        assertEquals(actualOperationException.getParams().length, expectedOperationException.getParams().length);
+        assertEquals(actualOperationException.getParams()[0], expectedOperationException.getParams()[0]);
+    }
+
+    @Test
+    void createModelImportsTest_nullInputStream() {
+        final var modelId = "modelId";
+
+        final OperationException actualOperationException = assertThrows(OperationException.class,
+            () -> modelBusinessLogic.createModelImports(modelId, null));
+
+        final OperationException expectedOperationException = ModelOperationExceptionSupplier.emptyModelImports().get();
+        assertEquals(actualOperationException.getActionStatus(), expectedOperationException.getActionStatus());
+        assertEquals(actualOperationException.getParams().length, expectedOperationException.getParams().length);
+    }
+
+    @Test
+    void createModelImportsTest_emptyModelImports() throws IOException {
+        final var modelId = "modelId";
+
+        final var resolve = modelImportsResourcePath.resolve("emptyModelImports.zip");
+        final var zipBytes = Files.readAllBytes(resolve);
+        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(zipBytes);
+
+        when(modelOperation.findModelByName(modelId)).thenReturn(Optional.of(new Model(modelId)));
+
+        final OperationException actualOperationException = assertThrows(OperationException.class,
+            () -> modelBusinessLogic.createModelImports(modelId, byteArrayInputStream));
+
+        final OperationException expectedOperationException = ModelOperationExceptionSupplier.emptyModelImports().get();
+        assertEquals(actualOperationException.getActionStatus(), expectedOperationException.getActionStatus());
+        assertEquals(actualOperationException.getParams().length, expectedOperationException.getParams().length);
+    }
+
+    @Test
+    void createModelImportsTest_modelNotFound() {
+        final var modelId = "modelId";
+        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(new byte[0]);
+
+        when(modelOperation.findModelByName(modelId)).thenReturn(Optional.empty());
+
+        final OperationException actualOperationException = assertThrows(OperationException.class,
+            () -> modelBusinessLogic.createModelImports(modelId, byteArrayInputStream));
+
+        final OperationException expectedOperationException = ModelOperationExceptionSupplier.invalidModel(modelId).get();
+        assertEquals(actualOperationException.getActionStatus(), expectedOperationException.getActionStatus());
+        assertEquals(actualOperationException.getParams().length, expectedOperationException.getParams().length);
+    }
+
+    @Test
+    void findModelSuccessTest() {
+        final var modelId = "modelId";
+        when(modelOperation.findModelByName(modelId)).thenReturn(Optional.of(new Model(modelId)));
+        final Optional<Model> actualModel = modelBusinessLogic.findModel(modelId);
+        assertTrue(actualModel.isPresent());
+        assertEquals(new Model(modelId), actualModel.get());
+    }
+
+    @Test
+    void findModelTest_emptyOrNullModelName() {
+        when(modelOperation.findModelByName(anyString())).thenReturn(Optional.of(new Model()));
+        var actualModel = modelBusinessLogic.findModel("");
+        assertTrue(actualModel.isEmpty());
+        actualModel = modelBusinessLogic.findModel(null);
+        assertTrue(actualModel.isEmpty());
+    }
 }
\ No newline at end of file