Skip to content
GetFileControllerTest.java 3.93 KiB
Newer Older
Sonia Zorba's avatar
Sonia Zorba committed
package it.inaf.ia2.transfer.controller;

import it.inaf.ia2.aa.jwt.TokenParser;
import it.inaf.ia2.transfer.auth.GmsClient;
import it.inaf.ia2.transfer.persistence.FileDAO;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.assertj.core.util.Files;
import org.junit.jupiter.api.AfterEach;
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.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.test.context.TestPropertySource;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
@TestPropertySource(properties = {"path_prefix=/"})
public class GetFileControllerTest {

    @MockBean
    private TokenParser tokenParser;

    @MockBean
    private GmsClient gmsClient;

    @MockBean
    private FileDAO fileDao;

    @Autowired
    private MockMvc mockMvc;

    private File tempFile;

    @BeforeEach
    public void init() {
        tempFile = Files.newTemporaryFile();
    }

    @AfterEach
    public void cleanup() {
        tempFile.delete();
    }

    @Test
    public void getPublicFile() throws Exception {

        FileInfo fileInfo = new FileInfo();
        fileInfo.setOsRelPath(tempFile.getAbsolutePath());
        fileInfo.setIsPublic(true);

        when(fileDao.getFileInfo(any())).thenReturn(Optional.of(fileInfo));

        mockMvc.perform(get("/myfile"))
                .andDo(print())
                .andExpect(status().isOk());
    }

    @Test
    public void testFileNotFoundInDb() throws Exception {
        mockMvc.perform(get("/myfile"))
                .andDo(print())
                .andExpect(status().isNotFound());
    }

    @Test
    public void testFileNotFoundOnDisk() throws Exception {

        FileInfo fileInfo = new FileInfo();
        fileInfo.setOsRelPath("/this/doesnt/exists");
        fileInfo.setIsPublic(true);

        when(fileDao.getFileInfo(any())).thenReturn(Optional.of(fileInfo));

        mockMvc.perform(get("/myfile"))
                .andDo(print())
                .andExpect(status().isNotFound());
    }

    @Test
    public void getPrivateFileTokenInHeader() throws Exception {

        prepareMocksForPrivateFile();

        mockMvc.perform(get("/myfile")
                .header("Authorization", "Bearer: <token>"))
                .andDo(print())
                .andExpect(status().isOk());

        verify(gmsClient).isMemberOf(eq("<token>"), eq("group1"));
    }

    @Test
    public void getPrivateFileTokenInQueryString() throws Exception {

        prepareMocksForPrivateFile();

        mockMvc.perform(get("/myfile?token=<token>"))
                .andDo(print())
                .andExpect(status().isOk());

        verify(gmsClient).isMemberOf(eq("<token>"), eq("group1"));
    }

    private void prepareMocksForPrivateFile() {

        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", "123");

        when(tokenParser.getClaims(any())).thenReturn(claims);

        when(gmsClient.isMemberOf(any(), any())).thenReturn(true);

        FileInfo fileInfo = new FileInfo();
        fileInfo.setOsRelPath(tempFile.getAbsolutePath());
        fileInfo.setGroupRead(Collections.singletonList("group1"));

        when(fileDao.getFileInfo(any())).thenReturn(Optional.of(fileInfo));
    }
}