package org.cytoscape.rest.service;
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.naming.spi.DirStateFactory.Result;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.crypto.NodeSetData;
import org.cytoscape.model.CyEdge;
import org.cytoscape.model.CyIdentifiable;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode;
import org.cytoscape.rest.internal.resource.NetworkResource;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class NetworkResourceTest extends BasicResourceTest {
private ObjectMapper mapper = new ObjectMapper();
@Override
protected Application configure() {
return new ResourceConfig(NetworkResource.class);
}
@Test
public void testGetNetworkCount() throws Exception {
Response result = target("/v1/networks/count").request().get();
assertNotNull(result);
assertEquals(200, result.getStatus());
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
final JsonNode root = mapper.readTree(body);
Long count = root.get("count").asLong();
assertTrue(count == 2);
}
@Test
public void testGetNetworks() throws Exception {
String result = target("/v1/networks").request().get(
String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertEquals(2, root.size());
}
@Test
public void testGetNodeCount() throws Exception {
final Long suid = network.getSUID();
Response result = target("/v1/networks/" + suid.toString() + "/nodes/count").request().get();
assertNotNull(result);
assertEquals(200, result.getStatus());
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
final JsonNode root = mapper.readTree(body);
Long count = root.get("count").asLong();
assertTrue(count == 4);
}
@Test
public void testGetEdgeCount() throws Exception {
final Long suid = network.getSUID();
Response result = target("/v1/networks/" + suid.toString() + "/edges/count").request().get();
assertNotNull(result);
assertEquals(200, result.getStatus());
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
final JsonNode root = mapper.readTree(body);
Long count = root.get("count").asLong();
assertTrue(count == 3);
}
@Test
public void testGetNodes() throws Exception {
final Long suid = network.getSUID();
String result = target("/v1/networks/" + suid.toString() + "/nodes").request().get(
String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(4, root.size());
}
@Test
/**
* Test to delete node and then get all nodes. This is currently broken.
*
* @throws Exception
*/
public void testDeleteAndGetNodes() throws Exception {
final Long suid = network.getSUID();
final int nodeCount = network.getNodeCount();
// First, delete first node
final CyNode node1 = network.getNodeList().get(0);
final Long nodeSuid = node1.getSUID();
final Response delResult = target("/v1/networks/" + suid.toString() + "/nodes/" + nodeSuid).request().delete();
assertNotNull(delResult);
assertEquals(200, delResult.getStatus());
assertEquals(nodeCount-1, network.getNodeCount());
String result = target("/v1/networks/" + suid.toString() + "/nodes").request().get(String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(nodeCount-1, root.size());
}
@Test
public void testDeleteAndGetNodesByQuery() throws Exception {
final Long suid = network.getSUID();
final int nodeCount = network.getNodeCount();
// First, delete two nodes
final CyNode node1 = network.getNodeList().get(0);
final CyNode node2 = network.getNodeList().get(1);
final CyNode node3 = network.getNodeList().get(2);
final Long nodeSuid1 = node1.getSUID();
final Long nodeSuid2 = node2.getSUID();
String nodeName1 = network.getRow(node1).get(CyNetwork.NAME, String.class);
String nodeName2 = network.getRow(node2).get(CyNetwork.NAME, String.class);
String nodeName3 = network.getRow(node3).get(CyNetwork.NAME, String.class);
Response delResult = target("/v1/networks/" + suid.toString() + "/nodes/" + nodeSuid1).request().delete();
assertNotNull(delResult);
assertEquals(200, delResult.getStatus());
delResult = target("/v1/networks/" + suid.toString() + "/nodes/" + nodeSuid2).request().delete();
assertNotNull(delResult);
assertEquals(200, delResult.getStatus());
assertEquals(nodeCount-2, network.getNodeCount());
// Check node count
final String countResult = target("/v1/networks/" + suid.toString() + "/nodes/count").request().get(String.class);
assertNotNull(countResult);
System.out.println(countResult);
final JsonNode countRoot = mapper.readTree(countResult);
System.out.println(countRoot.get("count"));
assertEquals(nodeCount-2, countRoot.get("count").asInt());
// Get by query
// Test existing node
System.out.println(nodeName1);
System.out.println(nodeName2);
System.out.println(nodeName3);
String result = target("/v1/networks/" + suid.toString() + "/nodes").request().get(String.class);
assertNotNull(result);
System.out.println(result);
JsonNode root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(nodeCount-2, root.size());
String queryUrl = "/v1/networks/" + suid.toString() + "/nodes";
result = target(queryUrl).queryParam("query", nodeName3).queryParam("column", "name").request().get(String.class);
assertNotNull(result);
System.out.println(result);
root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(1, root.size());
assertEquals(node3.getSUID(), (Long)root.get(0).asLong());
// Check with deleted node
result = target(queryUrl).queryParam("query", nodeName1).queryParam("column", "name").request().get(String.class);
assertNotNull(result);
root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(0, root.size());
result = target(queryUrl).queryParam("query", nodeName2).queryParam("column", "name").request().get(String.class);
assertNotNull(result);
root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(0, root.size());
}
@Test
public void testGetSelectedNodes() throws Exception {
final Long suid = network.getSUID();
final List<CyNode> nodes = network.getNodeList();
final CyNode node1 = nodes.get(0);
final CyNode node2 = nodes.get(1);
final CyNode node3 = nodes.get(2);
// Set selected.
network.getRow(node1).set(CyNetwork.SELECTED, true);
network.getRow(node2).set(CyNetwork.SELECTED, true);
network.getRow(node3).set(CyNetwork.SELECTED, false);
String result = target("/v1/networks/" + suid.toString() + "/nodes/selected")
.request()
.get(String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(2, root.size());
System.out.println(root.asText());
final Set<Long> selected = new HashSet<>();
for(final JsonNode node: root) {
final String idstr = node.asText();
long id = Long.parseLong(idstr);
selected.add(id);
}
assertTrue(selected.contains(node1.getSUID()));
assertTrue(selected.contains(node2.getSUID()));
assertFalse(selected.contains(node3.getSUID()));
}
@Test
public void testGetNeighbors() throws Exception {
final Long suid = network.getSUID();
final List<CyNode> nodes = network.getNodeList();
final List<CyNode> node1 = nodes.stream()
.filter(node->network.getRow(node).get(CyNetwork.NAME, String.class).equals("n1"))
.collect(Collectors.toList());
assertEquals(1, node1.size());
final CyNode node = node1.get(0);
// Set selected.
network.getRow(node).set(CyNetwork.SELECTED, true);
String result = target("/v1/networks/" + suid.toString() + "/nodes/selected/neighbors")
.request()
.get(String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(2, root.size());
System.out.println(root.asText());
final Set<Long> selected = new HashSet<>();
for(final JsonNode n: root) {
final String idstr = n.asText();
long id = Long.parseLong(idstr);
selected.add(id);
}
assertEquals(2,selected.size());
}
@Test
public void testGetSelectedEdges() throws Exception {
final Long suid = network.getSUID();
final List<CyEdge> edges = network.getEdgeList();
final CyEdge edge1 = edges.get(0);
final CyEdge edge2 = edges.get(1);
// Set selected.
network.getRow(edge1).set(CyNetwork.SELECTED, true);
network.getRow(edge2).set(CyNetwork.SELECTED, true);
String result = target("/v1/networks/" + suid.toString() + "/edges/selected")
.request()
.get(String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertTrue(root.isArray());
assertEquals(2, root.size());
System.out.println(root.asText());
final Set<Long> selected = new HashSet<>();
for(final JsonNode edge: root) {
final String idstr = edge.asText();
long id = Long.parseLong(idstr);
selected.add(id);
}
assertTrue(selected.contains(edge1.getSUID()));
assertTrue(selected.contains(edge2.getSUID()));
}
@Test
public void testGetEdges() throws Exception {
final Long suid = network.getSUID();
String result = target("/v1/networks/" + suid.toString() + "/edges").request().get(
String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
assertEquals(3, root.size());
}
@Test
public void testGetNode() throws Exception {
final Long suid = network.getSUID();
final List<CyNode> nodes = network.getNodeList();
final CyNode node1 = nodes.get(0);
String result = target("/v1/networks/" + suid.toString() + "/nodes/" + node1.getSUID()).request().get(
String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
JsonNode data = root.get("data");
assertNotNull(data);
assertEquals(node1.getSUID(), (Long)data.get("id").asLong());
assertEquals(node1.getSUID(), (Long)data.get("SUID").asLong());
assertEquals(false, (Boolean)data.get("selected").asBoolean());
}
@Test
public void testGetNetworkPointer() throws Exception {
final Long suid = network.getSUID();
final List<CyNode> nodes = network.getNodeList();
final CyNode node1 = nodes.get(0);
Response result = target("/v1/networks/" + suid.toString() + "/nodes/" + node1.getSUID() + "/pointer").request().get();
assertNotNull(result);
assertEquals(404, result.getStatus());
// Now set pointer to a network
node1.setNetworkPointer(network);
result = target("/v1/networks/" + suid.toString() + "/nodes/" + node1.getSUID() + "/pointer").request().get();
assertNotNull(result);
assertEquals(200, result.getStatus());
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
final JsonNode root = mapper.readTree(body);
JsonNode data = root.get("networkSUID");
assertNotNull(data);
assertEquals(network.getSUID(), (Long)data.asLong());
}
@Test
public void testGetEdge() throws Exception {
final Long suid = network.getSUID();
final List<CyEdge> edges = network.getEdgeList();
final CyEdge edge1 = edges.get(0);
final CyNode source = edge1.getSource();
final CyNode target = edge1.getTarget();
String result = target("/v1/networks/" + suid.toString() + "/edges/" + edge1.getSUID()).request().get(
String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
JsonNode data = root.get("data");
System.out.println(result);
assertNotNull(data);
assertEquals(edge1.getSUID(), (Long)data.get("SUID").asLong());
assertEquals(source.getSUID().toString(), data.get("source").asText());
assertEquals(target.getSUID().toString(), data.get("target").asText());
assertEquals(false, (Boolean)data.get("selected").asBoolean());
}
@Test
public void testCreateNode() throws Exception {
final Long suid = network.getSUID();
final int originalNodeCount = network.getNodeCount();
final String newVal = "[\"new_node_1\", \"new_node_2\"]";
final Entity<String> entity = Entity.entity(newVal, MediaType.APPLICATION_JSON_TYPE);
Response result = target("/v1/networks/" + suid.toString() + "/nodes").request().post(entity);
assertNotNull(result);
System.out.println("res: " + result.toString());
assertFalse(result.getStatus() == 500);
assertEquals(201, result.getStatus());
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
final JsonNode root = mapper.readTree(body);
assertTrue(root.isArray());
final Set<String> names = StreamSupport.stream(root.spliterator(), false)
.map(entry->entry.get("name").asText())
.collect(Collectors.toSet());
assertTrue(names.contains("new_node_1"));
assertTrue(names.contains("new_node_2"));
assertEquals(2, network.getNodeCount() - originalNodeCount);
final List<CyNode> nodes = network.getNodeList();
final Set<String> nodeNames = nodes.stream()
.map(node->network.getRow(node).get(CyNetwork.NAME, String.class))
.collect(Collectors.toSet());
System.out.println(nodeNames);
assertTrue(nodeNames.contains("new_node_1"));
assertTrue(nodeNames.contains("new_node_2"));
}
private final String createEdgeJson() throws Exception {
final JsonFactory factory = new JsonFactory();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
JsonGenerator generator = null;
generator = factory.createGenerator(stream);
generator.writeStartArray();
final List<CyNode> nodes = network.getNodeList();
Map<String, Long> idmap = nodes.stream()
.collect(Collectors.toMap(
node->network.getRow(node).get(CyNetwork.NAME, String.class),
n->n.getSUID()
)
);
System.out.println("Nodes: " + idmap);
// Edge 1:
generator.writeStartObject();
generator.writeNumberField("source", idmap.get("n1"));
generator.writeNumberField("target", idmap.get("n4"));
generator.writeStringField("interaction", "itr1");
generator.writeBooleanField("directed", true);
generator.writeEndObject();
// Edge 2:
generator.writeStartObject();
generator.writeNumberField("source", idmap.get("n2"));
generator.writeNumberField("target", idmap.get("n4"));
generator.writeStringField("interaction", "itr1");
generator.writeEndObject();
// Edge 3:
generator.writeStartObject();
generator.writeNumberField("source", idmap.get("n3"));
generator.writeNumberField("target", idmap.get("n1"));
generator.writeEndObject();
// Edge 4:
generator.writeStartObject();
generator.writeNumberField("source", idmap.get("n3"));
generator.writeNumberField("target", idmap.get("n3"));
generator.writeStringField("interaction", "itr2");
generator.writeBooleanField("directed", false);
generator.writeEndObject();
generator.writeEndArray();
generator.close();
final String result = stream.toString("UTF-8");
stream.close();
return result;
}
@Test
public void testCreateEdge() throws Exception {
final Long suid = network.getSUID();
final int originalEdgeCount = network.getEdgeCount();
final String newVal = createEdgeJson();
System.out.println("New values: " + newVal);
final Entity<String> entity = Entity.entity(newVal, MediaType.APPLICATION_JSON_TYPE);
Response result = target("/v1/networks/" + suid.toString() + "/edges").request().post(entity);
assertNotNull(result);
System.out.println("res: " + result.toString());
assertFalse(result.getStatus() == 500);
assertEquals(201, result.getStatus());
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
final JsonNode root = mapper.readTree(body);
assertTrue(root.isArray());
List<Long> sources = StreamSupport.stream(root.spliterator(), false)
.map(entry->entry.get("source").asLong())
.collect(Collectors.toList());
System.out.println("Source: " + sources);
assertEquals(4, network.getEdgeCount() - originalEdgeCount);
assertEquals(4, sources.size());
}
private final String createNetworkJson() throws Exception {
final JsonFactory factory = new JsonFactory();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
JsonGenerator generator = null;
generator = factory.createGenerator(stream);
generator.writeStartObject();
// Network Data
generator.writeObjectFieldStart("data");
generator.writeStringField("name", "new_network1");
generator.writeEndObject();
generator.writeObjectFieldStart("elements");
generator.writeArrayFieldStart("nodes");
generator.writeEndArray();
generator.writeArrayFieldStart("edges");
generator.writeEndArray();
generator.writeEndObject();
generator.writeEndObject();
generator.close();
final String result = stream.toString("UTF-8");
stream.close();
return result;
}
@Test
public void testCreateNetwork() throws Exception {
final String newVal = createNetworkJson();
System.out.println("New values: " + newVal);
final Entity<String> entity = Entity.entity(newVal, MediaType.APPLICATION_JSON_TYPE);
Response result = target("/v1/networks").request().post(entity);
assertNotNull(result);
final String body = result.readEntity(String.class);
System.out.println("BODY: " + body);
System.out.println("res: " + result.toString());
// assertFalse(result.getStatus() == 500);
// assertEquals(201, result.getStatus());
}
@Test
public void testGetNeighbours() throws Exception {
final Long suid = network.getSUID();
final CyNode node = network.getNodeList().get(1);
String result = target("/v1/networks/" + suid.toString() + "/nodes/" + node.getSUID() + "/neighbors").request().get(String.class);
assertNotNull(result);
final JsonNode root = mapper.readTree(result);
System.out.println(result);
assertTrue(root.isArray());
assertEquals(2, root.size());
}
@Test
public void testDeleteNode() throws Exception {
final Long suid = network.getSUID();
final CyNode node = network.getNodeList().get(1);
final Long nodeSuid = node.getSUID();
final int nodeCount = network.getNodeCount();
final Response result = target("/v1/networks/" + suid.toString() + "/nodes/" + nodeSuid).request().delete();
assertNotNull(result);
assertEquals(200, result.getStatus());
assertNull(network.getNode(nodeSuid));
assertEquals(nodeCount-1, network.getNodeCount());
}
@Test
public void testDeleteAllNodes() throws Exception {
final Long suid = network.getSUID();
final Response result = target("/v1/networks/" + suid.toString() + "/nodes").request().delete();
assertNotNull(result);
assertEquals(200, result.getStatus());
assertEquals(0, network.getNodeCount());
}
@Test
public void testDeleteEdge() throws Exception {
final Long suid = network.getSUID();
final CyEdge edge = network.getEdgeList().get(1);
final Long edgeSuid = edge.getSUID();
final int edgeCount = network.getEdgeCount();
final Response result = target("/v1/networks/" + suid.toString() + "/edges/" + edgeSuid).request().delete();
assertNotNull(result);
assertEquals(200, result.getStatus());
assertNull(network.getNode(edgeSuid));
assertEquals(edgeCount-1, network.getEdgeCount());
}
@Test
public void testDeleteAllEdges() throws Exception {
final Long suid = network.getSUID();
final Response result = target("/v1/networks/" + suid.toString() + "/edges").request().delete();
assertNotNull(result);
assertEquals(200, result.getStatus());
assertEquals(0, network.getEdgeCount());
}
@Test
public void testDeleteAllNetwork() throws Exception {
assertEquals(2, this.networkManager.getNetworkSet().size());
final Response result = target("/v1/networks").request().delete();
assertNotNull(result);
assertEquals(200, result.getStatus());
assertEquals(0, this.networkManager.getNetworkSet().size());
}
@Test
public void testDeleteNetwork() throws Exception {
assertEquals(2, this.networkManager.getNetworkSet().size());
final Long suid = network.getSUID();
final Response result = target("/v1/networks/" + suid).request().delete();
assertNotNull(result);
assertEquals(200, result.getStatus());
assertEquals(1, this.networkManager.getNetworkSet().size());
}
}