package com.pugh.sockso.db; import com.pugh.sockso.tests.SocksoTestCase; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; import joptsimple.OptionSet; import static org.easymock.EasyMock.*; public class JDBCDatabaseTest extends SocksoTestCase { public void testUpdate() throws Exception { final Statement st = createMock( Statement.class ); expect( st.executeUpdate((String)anyObject()) ).andReturn( 0 ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.createStatement() ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); assertTrue( db.update(" some sql... ") == 0 ); verify( cnn ); verify( st ); } public void testUpdateFailed() throws Exception { final Statement st = createMock( Statement.class ); expect( st.executeUpdate((String)anyObject()) ).andThrow( new SQLException() ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.createStatement() ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); boolean gotException = false; try { db.update(" some sql... " ); } catch ( final SQLException e ) { gotException = true; } assertTrue( gotException ); verify( cnn ); verify( st ); } public void testPrepare() throws Exception { final PreparedStatement st1 = createMock( PreparedStatement.class ); replay( st1 ); final Connection cnn = createMock( Connection.class ); expect( cnn.prepareStatement((String)anyObject()) ).andReturn( st1 ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); final PreparedStatement st2 = db.prepare( " some sql " ); assertEquals( st1, st2 ); verify( cnn ); verify( st1 ); } public void testPropertyExists() throws Exception { final ResultSet rs = createMock( ResultSet.class ); expect( rs.next() ).andReturn( true ); rs.close(); replay( rs ); final PreparedStatement st = createNiceMock( PreparedStatement.class ); expect( st.executeQuery() ).andReturn( rs ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.prepareStatement((String)anyObject()) ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); assertTrue( db.propertyExists("someProp") ); verify( cnn ); verify( st ); verify( rs ); } public void testUpdateProperty() throws Exception { final PreparedStatement st = createNiceMock( PreparedStatement.class ); expect( st.execute() ).andReturn( true ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.prepareStatement((String)anyObject()) ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); assertTrue( db.updateProperty( "foo", "bar" ) ); verify( cnn ); verify( st ); } public void testUpdatePropertyFailed() throws Exception { final PreparedStatement st = createNiceMock( PreparedStatement.class ); expect( st.execute() ).andReturn( false ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.prepareStatement((String)anyObject()) ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); assertFalse( db.updateProperty( "foo", "bar" ) ); verify( cnn ); verify( st ); } public void testCreateProperty() throws Exception { final PreparedStatement st = createNiceMock( PreparedStatement.class ); expect( st.execute() ).andReturn( true ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.prepareStatement((String)anyObject()) ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); assertTrue( db.createProperty( "foo", "bar" ) ); verify( cnn ); verify( st ); } public void testCreatePropertyFailed() throws Exception { final PreparedStatement st = createNiceMock( PreparedStatement.class ); expect( st.execute() ).andReturn( false ); st.close(); replay( st ); final Connection cnn = createMock( Connection.class ); expect( cnn.prepareStatement((String)anyObject()) ).andReturn( st ); replay( cnn ); final MyJDBCDatabase db = new MyJDBCDatabase( cnn ); assertFalse( db.createProperty( "foo", "bar" ) ); verify( cnn ); verify( st ); } class MyJDBCDatabase extends JDBCDatabase { private final Connection cnn; public MyJDBCDatabase( final Connection cnn ) { this.cnn = cnn; } public Connection getConnection() { return cnn; } public String escape( final String str ) { return ""; } public void close() {} public void connect( final OptionSet options ) {} public String getRandomFunction() { return "rand"; } } }