Newer
Older
Sonia Zorba
committed
import it.inaf.oats.vospace.persistence.NodeDAO;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import net.ivoa.xml.vospace.v2.Property;
import net.ivoa.xml.vospace.v2.UnstructuredDataNode;
import org.junit.jupiter.api.Test;
import static org.mockito.ArgumentMatchers.argThat;
Nicola Fulvio Calabria
committed
import static org.mockito.ArgumentMatchers.eq;
Nicola Fulvio Calabria
committed
import static org.mockito.Mockito.when;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
Sonia Zorba
committed
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;
Sonia Zorba
committed
import static org.mockito.ArgumentMatchers.any;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
Nicola Fulvio Calabria
committed
import net.ivoa.xml.vospace.v2.ContainerNode;
import net.ivoa.xml.vospace.v2.LinkNode;
import java.util.List;
import it.inaf.ia2.aa.data.User;
import java.util.Optional;
Nicola Fulvio Calabria
committed
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
Sonia Zorba
committed
@SpringBootTest
Nicola Fulvio Calabria
committed
@ContextConfiguration(classes = {TokenFilterConfig.class})
@TestPropertySource(properties = "spring.main.allow-bean-definition-overriding=true")
@AutoConfigureMockMvc
Sonia Zorba
committed
@MockBean
private NodeDAO nodeDao;
@SpyBean
@Autowired
Sonia Zorba
committed
@Autowired
Nicola Fulvio Calabria
committed
private ContainerNode getContainerParentNode(String path) {
ContainerNode parentNode = new ContainerNode();
// Set parent node address at /
parentNode.setUri("vos://example.com!vospace" + path);
// Set groupwrite property
Property groups = new Property();
groups.setUri("ivo://ivoa.net/vospace/core#groupwrite");
Nicola Fulvio Calabria
committed
groups.setValue("group1 group2");
Nicola Fulvio Calabria
committed
parentNode.setProperties(List.of(groups));
return parentNode;
}
Nicola Fulvio Calabria
committed
private ContainerNode getContainerParentNodeWithCreator(String path){
ContainerNode parentNode = new ContainerNode();
// Set parent node address at /
parentNode.setUri("vos://example.com!vospace" + path);
// Set groupwrite property
Property groups = new Property();
groups.setUri("ivo://ivoa.net/vospace/core#groupwrite");
groups.setValue("group3");
Property creator = new Property();
creator.setUri("ivo://ivoa.net/vospace/core#creator");
creator.setValue("user2");
parentNode.setProperties(List.of(groups,creator));
return parentNode;
}
Nicola Fulvio Calabria
committed
private LinkNode getLinkParentNode(String path) {
LinkNode parentNode = new LinkNode();
// Set parent node address at /
parentNode.setUri("vos://example.com!vospace" + path);
// Set groupwrite property
Property groups = new Property();
groups.setUri("ivo://ivoa.net/vospace/core#groupwrite");
Nicola Fulvio Calabria
committed
groups.setValue("group1 group2");
Nicola Fulvio Calabria
committed
parentNode.setProperties(List.of(groups));
return parentNode;
}
private User getUser() {
User user = new User();
user.setGroups(List.of("test1"));
return user;
}
@Test
public void testFromJsonToXml() throws Exception {
Nicola Fulvio Calabria
committed
String requestBody
= getResourceFileContent("create-unstructured-data-node.json");
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNode("/")));
Sonia Zorba
committed
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
.content(requestBody)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().isOk());
verifyArguments();
}
@Test
public void testFromXmlToJson() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
Nicola Fulvio Calabria
committed
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNode("/")));
Sonia Zorba
committed
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk());
verifyArguments();
}
@Test
public void testFromXmlToXml() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
Nicola Fulvio Calabria
committed
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNode("/")));
Sonia Zorba
committed
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().isOk());
verifyArguments();
}
@Test
public void testFromJsonToJson() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.json");
Nicola Fulvio Calabria
committed
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNode("/")));
Sonia Zorba
committed
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
.content(requestBody)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk());
verifyArguments();
}
Nicola Fulvio Calabria
committed
@Test
public void testURIConsistence() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNode("/")));
mockMvc.perform(put("/nodes/mydata2")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
Nicola Fulvio Calabria
committed
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().is4xxClientError());
verifyArguments();
}
@Test
public void testNodeAlreadyExisting() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNode("/")));
when(nodeDao.listNode(eq("/mydata1")))
.thenReturn(Optional.of(getContainerParentNode("/mydata1")));
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
Nicola Fulvio Calabria
committed
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().is4xxClientError());
verifyArguments();
}
@Test
public void testContainerNotFound() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.ofNullable(null));
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
Nicola Fulvio Calabria
committed
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().is4xxClientError());
verifyArguments();
}
Nicola Fulvio Calabria
committed
Nicola Fulvio Calabria
committed
@Test
public void testLinkNodeFound() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getLinkParentNode("/")));
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user2_token")
Nicola Fulvio Calabria
committed
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().is4xxClientError());
verifyArguments();
}
Nicola Fulvio Calabria
committed
Nicola Fulvio Calabria
committed
@Test
public void testPermissionDenied() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
when(nodeDao.listNode(eq("/")))
Nicola Fulvio Calabria
committed
.thenReturn(Optional.of(getContainerParentNode("/")));
Nicola Fulvio Calabria
committed
mockMvc.perform(put("/nodes/mydata1")
Nicola Fulvio Calabria
committed
.header("Authorization", "Bearer user1_token")
Nicola Fulvio Calabria
committed
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().is4xxClientError());
verifyArguments();
}
Nicola Fulvio Calabria
committed
@Test
public void testWriteWithOnlyOwnership() throws Exception {
String requestBody = getResourceFileContent("create-unstructured-data-node.xml");
when(nodeDao.listNode(eq("/")))
.thenReturn(Optional.of(getContainerParentNodeWithCreator("/")));
mockMvc.perform(put("/nodes/mydata1")
.header("Authorization", "Bearer user2_token")
.content(requestBody)
.contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().is2xxSuccessful());
verifyArguments();
}
Sonia Zorba
committed
verify(controller).createNode(
argThat(node -> {
UnstructuredDataNode udn = (UnstructuredDataNode) node;
Property property = udn.getProperties().get(0);
return "vos:UnstructuredDataNode".equals(udn.getType())
&& "test value".equals(property.getValue())
&& "ivo://ivoa.net/vospace/core#description".equals(property.getUri());
Sonia Zorba
committed
}), any());
}
protected static String getResourceFileContent(String fileName) throws Exception {
Nicola Fulvio Calabria
committed
try (InputStream in = CreateNodeControllerTest.class.getClassLoader().getResourceAsStream(fileName)) {
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
}
}