package org.iplantc.phyloviewer.server.db; import static org.junit.Assert.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import org.iplantc.phyloviewer.shared.model.INode; import org.iplantc.phyloviewer.shared.model.Node; import org.iplantc.phyloviewer.shared.model.Tree; import org.iplantc.phyloviewer.viewer.server.db.ImportTree; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class TestImportTree { static final String DB = "testdb"; Tree tree1; Tree tree2; @BeforeClass public static void classSetUp() throws ClassNotFoundException, SQLException { Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection("jdbc:postgresql:phyloviewer", "phyloviewer", "phyloviewer"); conn.createStatement().execute("DROP DATABASE IF EXISTS " + DB); conn.createStatement().execute("CREATE DATABASE " + DB + " WITH TEMPLATE phyloviewer_template;"); //FIXME copies existing data from phyloviewer db } @AfterClass public static void classTearDown() throws SQLException { Connection conn = DriverManager.getConnection("jdbc:postgresql:phyloviewer", "phyloviewer", "phyloviewer"); conn.createStatement().execute("DROP DATABASE IF EXISTS " + DB); } @Before public void setUp() throws SQLException { Node root0 = new Node(null); tree1 = new Tree(); tree1.setId(0); tree1.setRootNode(root0); Node root1 = new Node(new Node[] { new Node(new Node[] { new Node(), new Node() }), new Node(new Node[] { new Node(new Node[] { new Node(), new Node() }), new Node() }) }); tree2 = new Tree(); tree2.setId(1); tree2.setRootNode(root1); } @Test public void testAddTree() throws SQLException { Connection conn = getConnection(); //tree1 INode node = tree1.getRootNode(); ImportTree it = new ImportTree(conn); it.addTree(tree1, "name1"); it.close(); ResultSet rs = conn.createStatement().executeQuery("select * from tree"); assertTrue(rs.next()); assertEquals(tree1.getId(), rs.getInt("tree_id")); assertEquals(node.getId(), rs.getInt("root_id")); assertFalse(rs.next()); rs = conn.createStatement().executeQuery("select * from node"); assertTrue(rs.next()); assertEquals(node.getId(), rs.getInt("node_id")); assertFalse(rs.next()); rs = conn.createStatement().executeQuery("select * from topology"); assertTrue(rs.next()); assertEquals(node.getId(), rs.getInt("node_id")); assertEquals(0, rs.getInt("parent_id")); //getInt returns 0 for values that are null in the db assertTrue(rs.wasNull()); assertEquals(tree1.getId(), rs.getInt("tree_id")); assertEquals(1, rs.getInt("LeftNode")); assertEquals(2, rs.getInt("RightNode")); assertEquals(0, rs.getInt("Depth")); assertEquals(0, rs.getInt("Height")); assertEquals(0, rs.getInt("NumChildren")); assertEquals(1, rs.getInt("NumLeaves")); assertEquals(1, rs.getInt("NumNodes")); assertFalse(rs.next()); //tree2 it = new ImportTree(conn); it.addTree(tree2, "name2"); it.close(); rs = conn.createStatement().executeQuery("select * from tree order by tree_id"); assertTrue(rs.next() && rs.next()); assertEquals(tree2.getId(), rs.getInt("tree_id")); node = tree2.getRootNode(); rs = conn.createStatement().executeQuery("select * from topology where tree_id = " + tree2.getId() + " and node_id = " + node.getId()); assertTrue(rs.next()); assertEquals(node.getId(), rs.getInt("node_id")); assertEquals(0, rs.getInt("parent_id")); //getInt returns 0 for values that are null in the db assertEquals(tree2.getId(), rs.getInt("tree_id")); assertEquals(1, rs.getInt("LeftNode")); assertEquals(18, rs.getInt("RightNode")); assertEquals(0, rs.getInt("Depth")); assertEquals(node.findMaximumDepthToLeaf(), rs.getInt("Height")); assertEquals(node.getNumberOfChildren(), rs.getInt("NumChildren")); assertEquals(node.getNumberOfLeafNodes(), rs.getInt("NumLeaves")); assertEquals(node.getNumberOfNodes(), rs.getInt("NumNodes")); node = node.getChild(0); rs = conn.createStatement().executeQuery("select * from topology where tree_id = " + tree2.getId() + " and node_id = " + node.getId()); assertTrue(rs.next()); assertEquals(node.getId(), rs.getInt("node_id")); assertEquals(tree2.getRootNode().getId(), rs.getInt("parent_id")); assertEquals(tree2.getId(), rs.getInt("tree_id")); assertEquals(2, rs.getInt("LeftNode")); assertEquals(7, rs.getInt("RightNode")); assertEquals(1, rs.getInt("Depth")); assertEquals(node.findMaximumDepthToLeaf(), rs.getInt("Height")); assertEquals(node.getNumberOfChildren(), rs.getInt("NumChildren")); assertEquals(node.getNumberOfLeafNodes(), rs.getInt("NumLeaves")); assertEquals(node.getNumberOfNodes(), rs.getInt("NumNodes")); conn.close(); } private Connection getConnection() throws SQLException { return DriverManager.getConnection("jdbc:postgresql:" + DB, "phyloviewer", "phyloviewer"); } }