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()); } @Test 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(""); when(servletRequest.getUserPrincipal()).thenReturn(user); when(rapClient.exchangeToken(argThat(req -> { assertEquals("", req.getSubjectToken()); assertEquals("http://file-service/mydata1", req.getResource()); return true; }), any())).thenReturn(""); JobSummary job = getJob(); uriService.setTransferJobResult(job); assertEquals("http://file-service/mydata1?jobId=job-id&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); return job; } }