diff --git a/src/main/java/it/inaf/ia2/transfer/controller/CopyController.java b/src/main/java/it/inaf/ia2/transfer/controller/CopyController.java index 0a50dcd74ec140f124b04f4e0af05dd1ebcc7976..d711d1664f13037b4efc92c275be7b8399047c7a 100644 --- a/src/main/java/it/inaf/ia2/transfer/controller/CopyController.java +++ b/src/main/java/it/inaf/ia2/transfer/controller/CopyController.java @@ -40,6 +40,8 @@ public class CopyController extends AuthenticatedFileController { } else if (!jobDAO.isJobExisting(jobId)) { throw new InvalidArgumentException("Job " + jobId + " not found"); } + + LOG.debug("copyFiles called from jobId {}", jobId); diff --git a/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java index 49155915e3eefb986ae2a97ec5f4b8650c28fb5c..a9d606e804872f53960981bbfd7e26bca6179eec 100644 --- a/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java +++ b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java @@ -5,45 +5,35 @@ */ package it.inaf.ia2.transfer.controller; +import com.fasterxml.jackson.databind.ObjectMapper; +import it.inaf.ia2.transfer.auth.TokenPrincipal; import it.inaf.ia2.transfer.persistence.model.FileInfo; import it.inaf.ia2.transfer.persistence.FileDAO; import it.inaf.ia2.transfer.persistence.JobDAO; -import it.inaf.oats.vospace.exception.QuotaExceededException; -import java.io.ByteArrayInputStream; import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.util.Optional; -import java.util.UUID; -import javax.servlet.ServletInputStream; -import net.ivoa.xml.uws.v1.ExecutionPhase; +import java.util.List; +import org.apache.commons.io.FileUtils; import org.assertj.core.util.Files; import org.junit.jupiter.api.AfterAll; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.AfterEach; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import org.mockito.Mockito; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockMultipartFile; +import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.request.RequestPostProcessor; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.springframework.util.FileSystemUtils; @@ -63,33 +53,78 @@ public class CopyControllerTest { private static File sourceDirectory; private static File destinationDirectory; + private static File sourceFile; + private static String jobId; + private static String sourceVosRootPath; + private static String destVosRootPath; + private static String filename; + + private static final ObjectMapper MAPPER = new ObjectMapper(); @BeforeAll public static void setUp() { + jobId = "pippo_copy"; + filename = "file.txt"; + sourceVosRootPath = "/source/" + filename; + destVosRootPath = "/destination/" + filename; + } + + @BeforeEach + public void setUpPerTest() throws Exception { sourceDirectory = Files.newTemporaryFolder(); destinationDirectory = Files.newTemporaryFolder(); + sourceFile = this.createFile(sourceDirectory, filename); } - @AfterAll - public static void tearDown() { + @AfterEach + public void tearDown() { FileSystemUtils.deleteRecursively(sourceDirectory); FileSystemUtils.deleteRecursively(destinationDirectory); } // TODO: complete test + @Test + public void testCopyController() throws Exception { + + CopyRequest copyRequest = this.getCopyRequest(jobId, + sourceVosRootPath, destVosRootPath); + + when(fileDao.getBranchFileInfos(eq(sourceVosRootPath), eq(jobId))) + .thenReturn( + List.of(this.createBaseFileInfo( + filename, sourceDirectory, sourceVosRootPath))); + + when(fileDao.getBranchFileInfos(eq(destVosRootPath), eq(jobId))) + .thenReturn( + List.of(this.createBaseFileInfo( + filename, destinationDirectory, destVosRootPath))); + + when(fileDao.getRemainingQuota(any())).thenReturn(null); + + assertTrue(sourceFile.exists()); + File destinationFile = destinationDirectory.toPath().resolve(filename).toFile(); + assertFalse(destinationFile.exists()); + + mockMvc.perform(post("/copy") + .principal(fakePrincipal("user_copy")) + .contentType(MediaType.APPLICATION_JSON) + .content(MAPPER.writeValueAsString(copyRequest))) + .andDo(print()) + .andExpect(status().isOk()); + + assertTrue(sourceFile.exists()); + assertTrue(destinationFile.exists()); + + assertTrue(FileUtils.contentEquals(sourceFile, destinationFile)); - private FileInfo createBaseFileInfo() { - String randomFileName = UUID.randomUUID().toString(); - return createBaseFileInfo(randomFileName); } - - private FileInfo createBaseFileInfo(String fileName, File directory, String vosPath) { + + private FileInfo createBaseFileInfo(String fileName, File directory, String vosPath) { FileInfo fileInfo = new FileInfo(); fileInfo.setOsPath(getTestFilePath(fileName, directory)); - String virtualPath = vosPath + "/" + fileName; - fileInfo.setVirtualPath(vosPath + "/" + fileName); + fileInfo.setVirtualPath(vosPath); fileInfo.setPublic(false); - + return fileInfo; } @@ -97,4 +132,29 @@ public class CopyControllerTest { return directory.toPath().resolve("subdir").resolve(fileName).toFile().getAbsolutePath(); } + private CopyRequest getCopyRequest(String jobId, + String sourceRootVosPath, String destinationRootVosPath) { + CopyRequest result = new CopyRequest(); + result.setJobId(jobId); + result.setSourceRootVosPath(sourceRootVosPath); + result.setDestinationRootVosPath(destinationRootVosPath); + return result; + } + + private TokenPrincipal fakePrincipal(String name) { + TokenPrincipal principal = mock(TokenPrincipal.class); + when(principal.getName()).thenReturn(name); + return principal; + } + + private File createFile(File parent, String filename) throws Exception { + parent.mkdir(); + + File file = parent.toPath().resolve(filename).toFile(); + file.createNewFile(); + java.nio.file.Files.write(file.toPath(), "content_of_file".getBytes()); + + return file; + } + }