package org.cytoscape.rest.service; import static org.junit.Assert.*; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.StreamSupport; 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.CyColumn; import org.cytoscape.model.CyEdge; import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNode; import org.cytoscape.model.CyTable; import org.cytoscape.rest.internal.resource.TableResource; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class TableResourceTest extends BasicResourceTest { private ObjectMapper mapper = new ObjectMapper(); @Override protected Application configure() { return new ResourceConfig(TableResource.class); } @Test public void testGetTable() throws Exception { final Long suid = network.getSUID(); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode").request().get( String.class); assertNotNull(result); final JsonNode root = mapper.readTree(result); JsonNode rows = root.get("rows"); assertNotNull(rows); assertTrue(rows.isArray()); assertEquals(CyNetwork.SUID, root.get("primaryKey").asText()); assertEquals(true, root.get("public").asBoolean()); } @Test public void testGetTableAsCSV() throws Exception { final Long suid = network.getSUID(); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode.csv").request().get( String.class); assertNotNull(result); final String[] rows = result.split("\n"); assertFalse(rows.length == 0); final String header = rows[0]; final String[] columnNamesArray = header.split(","); final Set<String> columnNames = new HashSet<>(); for (String column : columnNamesArray) { columnNames.add(column); } assertTrue(columnNames.contains("SUID")); assertTrue(columnNames.contains("name")); assertTrue(columnNames.contains("shared name")); assertTrue(columnNames.contains("selected")); assertTrue(columnNames.contains("local1")); } @Test public void testGetColumnNames() throws Exception { final Long suid = network.getSUID(); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/columns") .request().get(String.class); assertNotNull(result); final JsonNode root = mapper.readTree(result); final Set<String> columnNames = new HashSet<>(); for (JsonNode column : root) { columnNames.add(column.get("name").asText()); } assertEquals(5, columnNames.size()); assertTrue(columnNames.contains("SUID")); assertTrue(columnNames.contains("name")); assertTrue(columnNames.contains("shared name")); assertTrue(columnNames.contains("selected")); assertTrue(columnNames.contains("local1")); } @Test public void testGetColumn() throws Exception { final Long suid = network.getSUID(); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/columns/name").request().get( String.class); assertNotNull(result); final JsonNode root = mapper.readTree(result); assertTrue(root.isObject()); assertTrue(root.get("values").isArray()); assertEquals("name", root.get("name").asText()); assertEquals(Integer.valueOf(4), Integer.valueOf(root.get("values").size())); String result_suid = target("/v1/networks/" + suid.toString() + "/tables/defaultnetwork/columns/SUID").request().get( String.class); assertNotNull(result_suid); final JsonNode root2 = mapper.readTree(result_suid); assertTrue(root2.isObject()); assertTrue(root2.get("values").isArray()); assertEquals("SUID", root2.get("name").asText()); assertEquals(Integer.valueOf(1), Integer.valueOf(root2.get("values").size())); String result_edge = target("/v1/networks/" + suid.toString() + "/tables/defaultedge/columns/interaction").request().get( String.class); assertNotNull(result_edge); final JsonNode root3 = mapper.readTree(result_edge); assertTrue(root3.isObject()); assertTrue(root3.get("values").isArray()); assertEquals("interaction", root3.get("name").asText()); assertEquals(Integer.valueOf(3), Integer.valueOf(root3.get("values").size())); } @Test public void testGetRows() throws Exception { final Long suid = network.getSUID(); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/rows").request().get( String.class); assertNotNull(result); final JsonNode root = mapper.readTree(result); assertTrue(root.isArray()); assertFalse(root.size() == 0); JsonNode firstRow = root.get(0); assertTrue(firstRow.isObject()); } @Test public void testGetRow() throws Exception { final Long suid = network.getSUID(); final CyNode node = network.getNodeList().get(0); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/rows/" + node.getSUID()) .request().get(String.class); assertNotNull(result); final JsonNode root = mapper.readTree(result); assertTrue(root.isObject()); JsonNode localVal = root.get("local1"); assertNotNull(localVal); assertNotNull(localVal.asDouble()); assertEquals(network.getRow(node).get("local1", Double.class), (Double)localVal.asDouble()); System.out.println(localVal.asDouble()); } @Test public void testGetCell() throws Exception { final Long suid = network.getSUID(); final List<CyNode> nodes = network.getNodeList(); CyNode node = null; // Find target node for testing for(CyNode n: nodes) { if(network.getRow(n).get("name", String.class).equals("n1")) { node = n; break; } } assertNotNull(node); String result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/rows/" + node.getSUID() + "/name").request().get( String.class); assertNotNull(result); assertEquals("n1", result); } @Test public void testUpdateColumnValues() throws Exception { // Pick SUID of some nodes CyNode node1 = network.getNodeList().get(0); CyNode node2= network.getNodeList().get(1); CyNode node3 = network.getNodeList().get(2); final String newValues = "[" + "{\"SUID\":" + node1.getSUID() + ", \"value\": \"true\" }," + "{\"SUID\":" + node2.getSUID() + ", \"value\": \"false\" }," + "{\"SUID\":" + node3.getSUID() + ", \"value\": \"true\" }" + "]"; Entity<String> entity = Entity.entity(newValues, MediaType.APPLICATION_JSON_TYPE); final Long suid = network.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/columns/selected") .request().put(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); System.out.println("res: " + result.toString()); assertTrue(network.getRow(node1).get(CyNetwork.SELECTED, Boolean.class)); assertFalse(network.getRow(node2).get(CyNetwork.SELECTED, Boolean.class)); assertTrue(network.getRow(node3).get(CyNetwork.SELECTED, Boolean.class)); CyEdge edge1 = network.getEdgeList().get(0); CyEdge edge2= network.getEdgeList().get(1); CyEdge edge3 = network.getEdgeList().get(2); final String edgeNewValues = "[" + "{\"SUID\":" + edge1.getSUID() + ", \"value\": \"false\" }," + "{\"SUID\":" + edge2.getSUID() + ", \"value\": \"false\" }," + "{\"SUID\":" + edge3.getSUID() + ", \"value\": \"true\" }" + "]"; entity = Entity.entity(edgeNewValues, MediaType.APPLICATION_JSON_TYPE); Response edgeResult = target("/v1/networks/" + suid.toString() + "/tables/defaultedge/columns/selected") .request().put(entity); assertNotNull(edgeResult); assertFalse(edgeResult.getStatus() == 500); assertEquals(200, edgeResult.getStatus()); System.out.println("res: " + edgeResult.toString()); assertFalse(network.getRow(edge1).get(CyNetwork.SELECTED, Boolean.class)); assertFalse(network.getRow(edge2).get(CyNetwork.SELECTED, Boolean.class)); assertTrue(network.getRow(edge3).get(CyNetwork.SELECTED, Boolean.class)); } @Test public void testUpdateTable() throws Exception { // Pick SUID of some nodes CyNode node1 = network.getNodeList().get(0); String newData = "{" + "\"key\":\"SUID\"," + "\"dataKey\": \"id\"," + "\"data\": [{" + "\"id\": " + node1.getSUID() + "," + "\"gene_name\": \"brca1\"," + "\"local1\": 4.5" + "}]}"; Entity<String> entity = Entity.entity(newData, MediaType.APPLICATION_JSON_TYPE); final Long suid = network.getSUID(); Response result = target( "/v1/networks/" + suid.toString() + "/tables/defaultnode") .queryParam("class", "local") .request().put(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); assertEquals("brca1", network.getRow(node1).get("gene_name", String.class)); assertEquals((Double)4.5, network.getRow(node1).get("local1", Double.class)); final CyTable localTable = network .getTable(CyNode.class, CyNetwork.LOCAL_ATTRS); Collection<CyColumn> cols = localTable.getColumns(); System.out.println("Columns: " + cols); assertEquals(7, cols.size()); } @Test public void testUpdateColumnDefaultValues() throws Exception { final Entity<String> entity = Entity.entity("", MediaType.APPLICATION_JSON_TYPE); final Long suid = network.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/tables/defaultnode/columns/selected") .queryParam("default", "true").request().put(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); System.out.println("res: " + result.toString()); for(CyNode node: network.getNodeList()) { assertTrue(network.getRow(node).get(CyNetwork.SELECTED, Boolean.class)); } } @Test public void testCreateColumn() throws Exception { testCreateColumForGivenType("defaultnode", network.getDefaultNodeTable()); testCreateColumForGivenType("defaultedge", network.getDefaultEdgeTable()); testCreateColumForGivenType("defaultnetwork", network.getDefaultNetworkTable()); } private final void testCreateColumForGivenType(final String type, CyTable table) { final String strColumn = "{" + "\"name\": \"strColumn\"," + "\"type\": \"String\" }"; final String intColumn = "{" + "\"name\": \"intColumn\"," + "\"immutable\": \"true\"," + "\"type\": \"Integer\" }"; final String doubleColumn = "{" + "\"name\": \"doubleColumn\"," + "\"isLocal\": true," + "\"type\": \"Double\"}"; final String boolColumn = "{" + "\"name\": \"boolColumn\"," + "\"type\": \"Boolean\" }"; final String srtListColumn = "{" + "\"name\": \"strListColumn\"," + "\"immutable\": \"true\"," + "\"list\": \"true\"," + "\"type\": \"String\" }"; // Test String column Entity<String> entity = Entity.entity(strColumn, MediaType.APPLICATION_JSON_TYPE); final Long suid = network.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/tables/" + type +"/columns") .request().post(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(201, result.getStatus()); System.out.println("res: " + result.toString()); final CyColumn strCol = table.getColumn("strColumn"); assertNotNull(strCol); assertEquals(String.class, strCol.getType()); // Test integer column entity = Entity.entity(intColumn, MediaType.APPLICATION_JSON_TYPE); result = target("/v1/networks/" + suid.toString() + "/tables/" + type + "/columns") .request().post(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(201, result.getStatus()); System.out.println("res: " + result.toString()); final CyColumn intCol = table.getColumn("intColumn"); assertNotNull(intCol); assertEquals(Integer.class, intCol.getType()); // Double entity = Entity.entity(doubleColumn, MediaType.APPLICATION_JSON_TYPE); result = target("/v1/networks/" + suid.toString() + "/tables/" + type + "/columns").request().post(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(201, result.getStatus()); System.out.println("res: " + result.toString()); final CyColumn doubleCol = table.getColumn("doubleColumn"); assertNotNull(doubleCol); assertEquals(Double.class, doubleCol.getType()); // Boolean entity = Entity.entity(boolColumn, MediaType.APPLICATION_JSON_TYPE); result = target("/v1/networks/" + suid.toString() + "/tables/" + type + "/columns").request().post(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(201, result.getStatus()); System.out.println("res: " + result.toString()); final CyColumn boolCol = table.getColumn("boolColumn"); assertNotNull(boolCol); assertEquals(Boolean.class, boolCol.getType()); // String List entity = Entity.entity(srtListColumn, MediaType.APPLICATION_JSON_TYPE); result = target("/v1/networks/" + suid.toString() + "/tables/" + type + "/columns").request().post(entity); assertNotNull(result); assertFalse(result.getStatus() == 500); assertEquals(201, result.getStatus()); System.out.println("res: " + result.toString()); final CyColumn strListCol = table.getColumn("strListColumn"); assertNotNull(strListCol); assertEquals(List.class, strListCol.getType()); assertEquals(String.class, strListCol.getListElementType()); } @Test public void testDeleteColumn() throws Exception { deleteColumn("defaultnode", network.getDefaultNodeTable()); deleteColumn("defaultedge", network.getDefaultEdgeTable()); deleteColumn("defaultnetwork", network.getDefaultNetworkTable()); } private void deleteColumn(final String type, final CyTable table) { // Create dummy column table.createColumn("dummy", String.class, false); final Long suid = network.getSUID(); Response result = target("/v1/networks/" + suid.toString() + "/tables/" + type + "/columns/dummy").request().delete(); assertNotNull(result); System.out.println("res: " + result.toString()); assertFalse(result.getStatus() == 500); assertEquals(200, result.getStatus()); final CyColumn dummyCol = table.getColumn("dummy"); assertNull(dummyCol); } }