Loading src/main/java/it/inaf/ia2/transfer/controller/CopyController.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,8 @@ public class CopyController extends AuthenticatedFileController { throw new InvalidArgumentException("Job " + jobId + " not found"); throw new InvalidArgumentException("Job " + jobId + " not found"); } } LOG.debug("copyFiles called from jobId {}", jobId); LOG.debug("copyFiles called from jobId {}", jobId); TokenPrincipal principal = getPrincipal(); TokenPrincipal principal = getPrincipal(); Loading src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java +91 −31 Original line number Original line Diff line number Diff line Loading @@ -5,45 +5,35 @@ */ */ package it.inaf.ia2.transfer.controller; 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.model.FileInfo; import it.inaf.ia2.transfer.persistence.FileDAO; import it.inaf.ia2.transfer.persistence.FileDAO; import it.inaf.ia2.transfer.persistence.JobDAO; 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.File; import java.io.IOException; import java.util.List; import java.nio.charset.StandardCharsets; import org.apache.commons.io.FileUtils; 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 org.assertj.core.util.Files; import org.assertj.core.util.Files; import org.junit.jupiter.api.AfterAll; 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 static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; 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.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 static org.mockito.Mockito.when; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 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.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.springframework.util.FileSystemUtils; import org.springframework.util.FileSystemUtils; Loading @@ -63,31 +53,76 @@ public class CopyControllerTest { private static File sourceDirectory; private static File sourceDirectory; private static File destinationDirectory; 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 @BeforeAll public static void setUp() { 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(); sourceDirectory = Files.newTemporaryFolder(); destinationDirectory = Files.newTemporaryFolder(); destinationDirectory = Files.newTemporaryFolder(); sourceFile = this.createFile(sourceDirectory, filename); } } @AfterAll @AfterEach public static void tearDown() { public void tearDown() { FileSystemUtils.deleteRecursively(sourceDirectory); FileSystemUtils.deleteRecursively(sourceDirectory); FileSystemUtils.deleteRecursively(destinationDirectory); FileSystemUtils.deleteRecursively(destinationDirectory); } } // TODO: complete test // 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 fileInfo = new FileInfo(); fileInfo.setOsPath(getTestFilePath(fileName, directory)); fileInfo.setOsPath(getTestFilePath(fileName, directory)); String virtualPath = vosPath + "/" + fileName; fileInfo.setVirtualPath(vosPath); fileInfo.setVirtualPath(vosPath + "/" + fileName); fileInfo.setPublic(false); fileInfo.setPublic(false); return fileInfo; return fileInfo; Loading @@ -97,4 +132,29 @@ public class CopyControllerTest { return directory.toPath().resolve("subdir").resolve(fileName).toFile().getAbsolutePath(); 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; } } } Loading
src/main/java/it/inaf/ia2/transfer/controller/CopyController.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,8 @@ public class CopyController extends AuthenticatedFileController { throw new InvalidArgumentException("Job " + jobId + " not found"); throw new InvalidArgumentException("Job " + jobId + " not found"); } } LOG.debug("copyFiles called from jobId {}", jobId); LOG.debug("copyFiles called from jobId {}", jobId); TokenPrincipal principal = getPrincipal(); TokenPrincipal principal = getPrincipal(); Loading
src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java +91 −31 Original line number Original line Diff line number Diff line Loading @@ -5,45 +5,35 @@ */ */ package it.inaf.ia2.transfer.controller; 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.model.FileInfo; import it.inaf.ia2.transfer.persistence.FileDAO; import it.inaf.ia2.transfer.persistence.FileDAO; import it.inaf.ia2.transfer.persistence.JobDAO; 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.File; import java.io.IOException; import java.util.List; import java.nio.charset.StandardCharsets; import org.apache.commons.io.FileUtils; 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 org.assertj.core.util.Files; import org.assertj.core.util.Files; import org.junit.jupiter.api.AfterAll; 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 static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; 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.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 static org.mockito.Mockito.when; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 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.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.springframework.util.FileSystemUtils; import org.springframework.util.FileSystemUtils; Loading @@ -63,31 +53,76 @@ public class CopyControllerTest { private static File sourceDirectory; private static File sourceDirectory; private static File destinationDirectory; 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 @BeforeAll public static void setUp() { 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(); sourceDirectory = Files.newTemporaryFolder(); destinationDirectory = Files.newTemporaryFolder(); destinationDirectory = Files.newTemporaryFolder(); sourceFile = this.createFile(sourceDirectory, filename); } } @AfterAll @AfterEach public static void tearDown() { public void tearDown() { FileSystemUtils.deleteRecursively(sourceDirectory); FileSystemUtils.deleteRecursively(sourceDirectory); FileSystemUtils.deleteRecursively(destinationDirectory); FileSystemUtils.deleteRecursively(destinationDirectory); } } // TODO: complete test // 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 fileInfo = new FileInfo(); fileInfo.setOsPath(getTestFilePath(fileName, directory)); fileInfo.setOsPath(getTestFilePath(fileName, directory)); String virtualPath = vosPath + "/" + fileName; fileInfo.setVirtualPath(vosPath); fileInfo.setVirtualPath(vosPath + "/" + fileName); fileInfo.setPublic(false); fileInfo.setPublic(false); return fileInfo; return fileInfo; Loading @@ -97,4 +132,29 @@ public class CopyControllerTest { return directory.toPath().resolve("subdir").resolve(fileName).toFile().getAbsolutePath(); 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; } } }