Skip to content
UriServiceTest.java 3.59 KiB
Newer Older
package it.inaf.oats.vospace;

import it.inaf.ia2.aa.ServletRapClient;
import it.inaf.ia2.aa.data.User;
import it.inaf.oats.vospace.persistence.NodeDAO;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import net.ivoa.xml.uws.v1.JobSummary;
import net.ivoa.xml.vospace.v2.DataNode;
import net.ivoa.xml.vospace.v2.Node;
import net.ivoa.xml.vospace.v2.Property;
import net.ivoa.xml.vospace.v2.Transfer;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.argThat;
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.context.TestConfiguration;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.test.context.TestPropertySource;

@SpringBootTest
@AutoConfigureMockMvc
@TestPropertySource(properties = {"vospace-authority=example.com!vospace", "file-service-url=http://file-service"})
public class UriServiceTest {

    @MockBean
    private NodeDAO dao;

    @MockBean
    private ServletRapClient rapClient;

    @Autowired
    private HttpServletRequest servletRequest;

    @Autowired
    private UriService uriService;

    @TestConfiguration
    public static class TestConfig {

        /**
         * Necessary because MockBean doesn't work with HttpServletRequest.
         */
        @Bean
        @Primary
        public HttpServletRequest servletRequest() {
            return mock(HttpServletRequest.class);
        }
    }

    @Test
    public void testPublicUrl() {

        Node node = new DataNode();
        Property property = new Property();
        property.setUri("ivo://ivoa.net/vospace/core#publicread");
        property.setValue("true");
        node.getProperties().add(property);

        when(dao.listNode(eq("/mydata1"))).thenReturn(Optional.of(node));

        JobSummary job = getJob();
        uriService.setTransferJobResult(job);

        assertEquals("http://file-service/mydata1?jobId=job-id", job.getResults().get(0).getHref());
    }
    public void testPrivateUrl() {

        Node node = new DataNode();

        when(dao.listNode(eq("/mydata1"))).thenReturn(Optional.of(node));

        User user = mock(User.class);
        when(user.getAccessToken()).thenReturn("<token>");

        when(servletRequest.getUserPrincipal()).thenReturn(user);

        when(rapClient.exchangeToken(argThat(req -> {
            assertEquals("<token>", req.getSubjectToken());
            assertEquals("http://file-service/mydata1", req.getResource());
            return true;
        }), any())).thenReturn("<new-token>");

        JobSummary job = getJob();
        uriService.setTransferJobResult(job);

        assertEquals("http://file-service/mydata1?jobId=job-id&token=<new-token>", job.getResults().get(0).getHref());
    }

    private JobSummary getJob() {

        Transfer transfer = new Transfer();
        transfer.setTarget("vos://example.com!vospace/mydata1");

        JobSummary job = new JobSummary();
        job.setJobId("job-id");

        JobSummary.JobInfo jobInfo = new JobSummary.JobInfo();
        jobInfo.getAny().add(transfer);

        job.setJobInfo(jobInfo);