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;
+    }
+
 }