From 3d890fb3c109f05b506c67962654df6fce3005e9 Mon Sep 17 00:00:00 2001
From: Nicola Fulvio Calabria <nicola.calabria@inaf.it>
Date: Mon, 9 Aug 2021 11:50:59 +0200
Subject: [PATCH] Finished CopyController Test

---
 .../controller/CopyControllerTest.java        | 102 +++----------
 .../ia2/transfer/service/CopyServiceTest.java | 140 ++++++++++++++++++
 2 files changed, 163 insertions(+), 79 deletions(-)
 create mode 100644 src/test/java/it/inaf/ia2/transfer/service/CopyServiceTest.java

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 a9d606e..c084b25 100644
--- a/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
+++ b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
@@ -7,23 +7,11 @@ 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 java.io.File;
-import java.util.List;
-import org.apache.commons.io.FileUtils;
-import org.assertj.core.util.Files;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.AfterEach;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import it.inaf.ia2.transfer.service.FileCopyService;
 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 static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,28 +20,24 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MockMvc;
-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;
+
 
 @SpringBootTest
-@AutoConfigureMockMvc
+@AutoConfigureMockMvc(addFilters = false)
 public class CopyControllerTest {
 
     @MockBean
-    private FileDAO fileDao;
-
-    @MockBean
-    private JobDAO jobDAO;
+    private JobDAO jobDao;
 
     @Autowired
     private MockMvc mockMvc;
 
-    private static File sourceDirectory;
-    private static File destinationDirectory;
-    private static File sourceFile;
+    @MockBean
+    private FileCopyService fileCopyService;
+    
     private static String jobId;
     private static String sourceVosRootPath;
     private static String destVosRootPath;
@@ -68,68 +52,38 @@ public class CopyControllerTest {
         sourceVosRootPath = "/source/" + filename;
         destVosRootPath = "/destination/" + filename;
     }
-    
-    @BeforeEach
-    public void setUpPerTest() throws Exception {
-        sourceDirectory = Files.newTemporaryFolder();
-        destinationDirectory = Files.newTemporaryFolder();
-        sourceFile = this.createFile(sourceDirectory, filename);
-    }
 
-    @AfterEach
-    public void tearDown() {
-        FileSystemUtils.deleteRecursively(sourceDirectory);
-        FileSystemUtils.deleteRecursively(destinationDirectory);
-    }
-
-    // TODO: complete test
     @Test
-    public void testCopyController() throws Exception {
+    public void testCopyControllerNoJobMatching() throws Exception {
 
         CopyRequest copyRequest = this.getCopyRequest(jobId,
                 sourceVosRootPath, destVosRootPath);
+
+        when(jobDao.isJobExisting(eq(jobId))).thenReturn(false);
         
-        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));
+                .andExpect(status().is4xxClientError());
 
     }
+    
+    @Test
+    public void testCopyControllerAnonymousForbidden() throws Exception {
 
-    private FileInfo createBaseFileInfo(String fileName, File directory, String vosPath) {
-        FileInfo fileInfo = new FileInfo();
-        fileInfo.setOsPath(getTestFilePath(fileName, directory));
-        fileInfo.setVirtualPath(vosPath);
-        fileInfo.setPublic(false);
+        CopyRequest copyRequest = this.getCopyRequest(jobId,
+                sourceVosRootPath, destVosRootPath);
 
-        return fileInfo;
-    }
+        when(jobDao.isJobExisting(eq(jobId))).thenReturn(true);
 
-    private String getTestFilePath(String fileName, File directory) {
-        return directory.toPath().resolve("subdir").resolve(fileName).toFile().getAbsolutePath();
+        mockMvc.perform(post("/copy")
+                .principal(fakePrincipal("anonymous"))
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(MAPPER.writeValueAsString(copyRequest)))
+                .andDo(print())
+                .andExpect(status().is4xxClientError());
     }
 
     private CopyRequest getCopyRequest(String jobId,
@@ -146,15 +100,5 @@ public class CopyControllerTest {
         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;
-    }
 
 }
diff --git a/src/test/java/it/inaf/ia2/transfer/service/CopyServiceTest.java b/src/test/java/it/inaf/ia2/transfer/service/CopyServiceTest.java
new file mode 100644
index 0000000..5c1c1c3
--- /dev/null
+++ b/src/test/java/it/inaf/ia2/transfer/service/CopyServiceTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.service;
+
+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 java.io.File;
+import java.util.List;
+import org.apache.commons.io.FileUtils;
+import org.assertj.core.util.Files;
+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 static org.mockito.Mockito.mock;
+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.test.web.servlet.MockMvc;
+import org.springframework.util.FileSystemUtils;
+
+@SpringBootTest
+@AutoConfigureMockMvc(addFilters = false)
+public class CopyServiceTest {
+
+    @MockBean
+    private FileDAO fileDao;
+
+    @MockBean
+    private JobDAO jobDao;
+
+    @Autowired
+    private MockMvc mockMvc;
+    
+    @Autowired
+    private FileCopyService fileCopyService;
+
+    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 String userId;
+
+    @BeforeAll
+    public static void setUp() {
+        jobId = "pippo_copy";
+        userId = "user_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);
+    }
+
+    @AfterEach
+    public void tearDown() {
+        FileSystemUtils.deleteRecursively(sourceDirectory);
+        FileSystemUtils.deleteRecursively(destinationDirectory);
+    }
+
+    @Test
+    public void testCopyService() throws Exception {
+        
+        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());
+   
+        fileCopyService.copyFiles(
+                sourceVosRootPath, destVosRootPath, jobId, fakePrincipal(userId));
+                
+        assertTrue(sourceFile.exists());        
+        assertTrue(destinationFile.exists());
+        
+        assertTrue(FileUtils.contentEquals(sourceFile, destinationFile));
+
+    }
+
+    private FileInfo createBaseFileInfo(String fileName, File directory, String vosPath) {
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setOsPath(getTestFilePath(fileName, directory));
+        fileInfo.setVirtualPath(vosPath);
+        fileInfo.setPublic(false);
+        fileInfo.setOwnerId("user_copy");
+        
+        return fileInfo;
+    }
+
+    private String getTestFilePath(String fileName, File directory) {
+        return directory.toPath().resolve("subdir").resolve(fileName).toFile().getAbsolutePath();
+    }
+     
+    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;
+    }
+    
+    private TokenPrincipal fakePrincipal(String name) {
+        TokenPrincipal principal = mock(TokenPrincipal.class);
+        when(principal.getName()).thenReturn(name);
+        return principal;
+    }
+
+}
-- 
GitLab