package org.cytoscape.rest.service; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.awt.Color; import java.awt.Event; import java.awt.Paint; import java.io.ByteArrayOutputStream; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; 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 org.cytoscape.model.CyEdge; import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNode; import org.cytoscape.rest.internal.resource.NetworkViewResource; import org.cytoscape.view.model.View; import org.cytoscape.view.presentation.property.BasicVisualLexicon; 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 NetworkViewResourceTest extends BasicResourceTest { private ObjectMapper mapper = new ObjectMapper(); @Override protected Application configure() { return new ResourceConfig(NetworkViewResource.class); } @Test public void testConstructor() throws Exception { NetworkViewResource nvr = new NetworkViewResource(); assertNotNull(nvr); } @Test public void testCreateNetworkView() throws Exception { final Long suid = network.getSUID(); final Entity<String> entity = Entity.entity("", MediaType.APPLICATION_JSON_TYPE); Response result = target("/v1/networks/" + suid.toString() + "/views").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.isObject()); assertNotNull(root.get("networkViewSUID").asLong()); } @Test public void testGetNetworkViews() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/views").request().get(); assertNotNull(result); String body = result.readEntity(String.class); System.out.println("Result = " + result); final JsonNode root = mapper.readTree(body); assertNotNull(root); System.out.println(root); assertTrue(root.isArray()); assertEquals(1, root.size()); assertEquals(viewSuid, Long.valueOf(root.get(0).asLong())); } @Test public void testGetNetworkVisualProp() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/network/NETWORK_SIZE").request().get(); assertNotNull(result); String body = result.readEntity(String.class); System.out.println("Result = " + result); JsonNode root = mapper.readTree(body); assertNotNull(root); System.out.println(root); assertTrue(root.isObject()); assertEquals((Double)550.0, (Double)root.get("value").asDouble()); } @Test public void testGetViewsOf() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/nodes").request().get(); assertNotNull(result); String body = result.readEntity(String.class); System.out.println("Result = " + result); JsonNode root = mapper.readTree(body); assertNotNull(root); System.out.println(root); assertTrue(root.isArray()); assertEquals(view.getNodeViews().size(), root.size()); result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/edges").request().get(); assertNotNull(result); body = result.readEntity(String.class); System.out.println("Result = " + result); root = mapper.readTree(body); assertNotNull(root); System.out.println(root); assertTrue(root.isArray()); assertEquals(view.getEdgeViews().size(), root.size()); result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/network").request().get(); assertNotNull(result); body = result.readEntity(String.class); System.out.println("Network Result = " + result); root = mapper.readTree(body); assertNotNull(root); System.out.println(root); assertTrue(root.isArray()); assertEquals(12, root.size()); } @Test public void testGetNetworkView() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); // Test invalid View ID String result = target("/v1/networks/" + suid.toString() + "/views/1234567").request().get( String.class); assertNotNull(result); assertEquals("{}", result); // Test valid result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid.toString()).request().get( String.class); assertNotNull(result); System.out.println("Result = " + result); // TODO: Mock JSON writer? } @Test public void testGetFirstNetworkImage() throws Exception { final Long suid = network.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/views/first.png").request().get(); assertNotNull(result); assertEquals(500, result.getStatus()); System.out.println("Result = " + result); result = target("/v1/networks/" + suid.toString() + "/views/first.svg").request().get(); assertNotNull(result); assertEquals(500, result.getStatus()); System.out.println("Result = " + result); result = target("/v1/networks/" + suid.toString() + "/views/first.pdf").request().get(); assertNotNull(result); assertEquals(500, result.getStatus()); System.out.println("Result = " + result); // TODO: Mock IMAGE writer? } @Test public void testGetNetworkImage() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/views/"+ viewSuid.toString() +".png").request().get(); assertNotNull(result); assertEquals(500, result.getStatus()); System.out.println("Result = " + result); result = target("/v1/networks/" + suid.toString() + "/views/"+ viewSuid.toString() +".svg").request().get(); assertNotNull(result); assertEquals(500, result.getStatus()); System.out.println("Result = " + result); result = target("/v1/networks/" + suid.toString() + "/views/"+ viewSuid.toString() +".pdf").request().get(); assertNotNull(result); assertEquals(500, result.getStatus()); System.out.println("Result = " + result); // TODO: Mock IMAGE writer? } @Test public void testGetFirstView() throws Exception { final Long suid = network.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/views/first").request().get(); assertNotNull(result); assertEquals(200, result.getStatus()); } @Test public void testGetViewCount() throws Exception { final Long suid = network.getSUID(); String result = target("/v1/networks/" + suid.toString() + "/views/count").request().get( String.class); assertNotNull(result); final JsonNode root = mapper.readTree(result); assertNotNull(root); System.out.println(root); assertEquals(1, root.get("count").asInt()); } @Test public void testGetView() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); final CyNode node = network.getNodeList().iterator().next(); Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/nodes/" + node.getSUID()).request().get(); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); final JsonNode root = mapper.readTree(result.readEntity(String.class)); assertNotNull(root); System.out.println(root); assertTrue(root.isArray()); assertEquals(lexicon.getAllDescendants(BasicVisualLexicon.NODE).size(), root.size()); final Map<String, String> vps = new HashMap<>(); for(JsonNode n: root) { vps.put(n.get("visualProperty").asText(), n.get("value").asText()); } assertTrue(vps.keySet().contains("NODE_PAINT")); assertTrue(vps.keySet().contains("NODE_BORDER_PAINT")); assertEquals("#000000", vps.get("NODE_BORDER_PAINT")); } @Test public void testGetNetworkViewVP() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); final String vp = "NETWORK_BACKGROUND_PAINT"; Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/network/" + vp).request().get(); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); final JsonNode root = mapper.readTree(result.readEntity(String.class)); assertNotNull(root); System.out.println(root); assertTrue(root.isObject()); final String vpName = root.get("visualProperty").asText(); assertEquals(vp, vpName); final String val = root.get("value").asText(); assertEquals("#ffffff".toUpperCase(), val.toUpperCase()); } @Test public void testUpdateNetworkViewVP() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); final String vp = "NETWORK_BACKGROUND_PAINT"; final String newVal = "[{" + "\"visualProperty\": \"" + vp + "\"," + "\"value\": \"red\" }]"; Entity<String> entity = Entity.entity(newVal, MediaType.APPLICATION_JSON_TYPE); Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/network").request().put(entity); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); final Paint newValue = view.getVisualProperty(BasicVisualLexicon.NETWORK_BACKGROUND_PAINT); assertEquals(Color.RED, newValue); } @Test public void testUpdateView() throws Exception { final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); // Test node VPs final CyNode node = network.getNodeList().iterator().next(); String vp = BasicVisualLexicon.NODE_FILL_COLOR.getIdString(); String newVal = "[{" + "\"visualProperty\": \"" + vp + "\"," + "\"value\": \"blue\" }]"; testViewUpdates(newVal, suid, viewSuid, "nodes", node.getSUID()); Paint newColor = view.getNodeView(node).getVisualProperty(BasicVisualLexicon.NODE_FILL_COLOR); assertEquals(Color.BLUE, newColor); vp = BasicVisualLexicon.NODE_WIDTH.getIdString(); newVal = "[{" + "\"visualProperty\": \"" + vp + "\"," + "\"value\": 200.0 }]"; testViewUpdates(newVal, suid, viewSuid, "nodes", node.getSUID()); Double newWidth = view.getNodeView(node).getVisualProperty(BasicVisualLexicon.NODE_WIDTH); assertEquals(new Double(200), newWidth); // Test edges final CyEdge edge = network.getEdgeList().iterator().next(); vp = BasicVisualLexicon.EDGE_WIDTH.getIdString(); newVal = "[{" + "\"visualProperty\": \"" + vp + "\"," + "\"value\": 22.1 }]"; testViewUpdates(newVal, suid, viewSuid, "edges", edge.getSUID()); newWidth = view.getEdgeView(edge).getVisualProperty(BasicVisualLexicon.EDGE_WIDTH); assertEquals(new Double(22.1), newWidth); } private void testViewUpdates(final String newVal, final Long suid, final Long viewSuid, final String type, final Long objId) { Entity<String> entity = Entity.entity(newVal, MediaType.APPLICATION_JSON_TYPE); Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/" + type + "/" + objId).request().put(entity); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); } private final String createViewJson(Map<String, Long> idmap) throws Exception { final JsonFactory factory = new JsonFactory(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); JsonGenerator generator = null; generator = factory.createGenerator(stream); generator.writeStartArray(); // Node 1 Updates: generator.writeStartObject(); generator.writeNumberField("SUID", idmap.get("n1")); generator.writeArrayFieldStart("view"); generator.writeStartObject(); generator.writeStringField("visualProperty", "NODE_FILL_COLOR"); generator.writeStringField("value", "yellow"); generator.writeEndObject(); generator.writeStartObject(); generator.writeStringField("visualProperty", "NODE_SIZE"); generator.writeNumberField("value", 130); generator.writeEndObject(); generator.writeEndArray(); generator.writeEndObject(); generator.writeEndArray(); generator.close(); final String result = stream.toString("UTF-8"); stream.close(); return result; } private final String createEdgeViewJson(final Collection<CyEdge> edges) throws Exception { final JsonFactory factory = new JsonFactory(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); JsonGenerator generator = null; generator = factory.createGenerator(stream); generator.writeStartArray(); for(CyEdge edge: edges) { generator.writeStartObject(); generator.writeNumberField("SUID", edge.getSUID()); generator.writeArrayFieldStart("view"); generator.writeStartObject(); generator.writeStringField("visualProperty", "EDGE_WIDTH"); generator.writeNumberField("value", 22); generator.writeEndObject(); generator.writeStartObject(); generator.writeStringField("visualProperty", "EDGE_STROKE_UNSELECTED_PAINT"); generator.writeStringField("value", "#00FF00"); generator.writeEndObject(); generator.writeEndArray(); generator.writeEndObject(); } generator.writeEndArray(); generator.close(); final String result = stream.toString("UTF-8"); stream.close(); return result; } @Test public void testUpdateViews() throws Exception { 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); final Long suid = network.getSUID(); final Long viewSuid = view.getSUID(); final String newVal = createViewJson(idmap); Entity<String> entity = Entity.entity(newVal, MediaType.APPLICATION_JSON_TYPE); Response result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/nodes").request().put(entity); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); final View<CyNode> nv1 = view.getNodeView(network.getNode(idmap.get("n1"))); assertEquals((Double)130.0, nv1.getVisualProperty(BasicVisualLexicon.NODE_SIZE)); assertEquals(Color.YELLOW, nv1.getVisualProperty(BasicVisualLexicon.NODE_FILL_COLOR)); // Test bulk-update edges final String newEdgeVal = createEdgeViewJson(network.getEdgeList()); entity = Entity.entity(newEdgeVal, MediaType.APPLICATION_JSON_TYPE); result = target("/v1/networks/" + suid.toString() + "/views/" + viewSuid + "/edges").request().put(entity); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); view.getEdgeViews().stream() .forEach(ev->testUpdateEdgeViewsResult(ev)); } private final void testUpdateEdgeViewsResult(final View<CyEdge> ev) { assertEquals((Double)22.0, ev.getVisualProperty(BasicVisualLexicon.EDGE_WIDTH)); assertEquals(Color.green, ev.getVisualProperty(BasicVisualLexicon.EDGE_STROKE_UNSELECTED_PAINT)); } @Test public void testDeleteAllNetworkViews() throws Exception { final Response result = target("/v1/networks/" + network.getSUID().toString() + "/views").request().delete(); assertNotNull(result); assertEquals(200, result.getStatus()); } @Test public void testDeleteFirstView() throws Exception { final Long suid = network.getSUID(); final Response result = target("/v1/networks/" + suid.toString() + "/views/first").request().delete(); assertNotNull(result); assertEquals(200, result.getStatus()); } }