Commit 5944963e authored by Nicola Fulvio Calabria's avatar Nicola Fulvio Calabria
Browse files

Added CopyController Test

parent 7ba05398
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -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();        
+91 −31
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
    }

}
}