diff --git a/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..49155915e3eefb986ae2a97ec5f4b8650c28fb5c
--- /dev/null
+++ b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
@@ -0,0 +1,100 @@
+/*
+ * This file is part of vospace-file-service
+ * Copyright (C) 2021 Istituto Nazionale di Astrofisica
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+package it.inaf.ia2.transfer.controller;
+
+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 org.assertj.core.util.Files;
+import org.junit.jupiter.api.AfterAll;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.BeforeAll;
+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.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.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.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import org.springframework.util.FileSystemUtils;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+public class CopyControllerTest {
+
+    @MockBean
+    private FileDAO fileDao;
+
+    @MockBean
+    private JobDAO jobDAO;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    private static File sourceDirectory;
+    private static File destinationDirectory;
+
+    @BeforeAll
+    public static void setUp() {
+        sourceDirectory = Files.newTemporaryFolder();
+        destinationDirectory = Files.newTemporaryFolder();
+    }
+
+    @AfterAll
+    public static void tearDown() {
+        FileSystemUtils.deleteRecursively(sourceDirectory);
+        FileSystemUtils.deleteRecursively(destinationDirectory);
+    }
+
+    // TODO: complete test
+
+    private FileInfo createBaseFileInfo() {
+        String randomFileName = UUID.randomUUID().toString();
+        return createBaseFileInfo(randomFileName);
+    }
+    
+    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.setPublic(false);
+                       
+        return fileInfo;
+    }
+
+    private String getTestFilePath(String fileName, File directory) {
+        return directory.toPath().resolve("subdir").resolve(fileName).toFile().getAbsolutePath();
+    }
+
+}