/*
* Copyright 2008 Pavel Syrtsov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and limitations
* under the License.
*/
package com.sf.ddao;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.mockrunner.jdbc.BasicJDBCTestCaseAdapter;
import com.mockrunner.jdbc.PreparedStatementResultSetHandler;
import com.mockrunner.mock.jdbc.JDBCMockObjectFactory;
import com.mockrunner.mock.jdbc.MockDataSource;
import com.mockrunner.mock.jdbc.MockResultSet;
import com.sf.ddao.chain.ChainModule;
import com.sf.ddao.conn.JNDIDataSourceHandler;
import com.sf.ddao.orm.RSMapper;
import com.sf.ddao.orm.UseRSMapper;
import com.sf.ddao.orm.rsmapper.rowmapper.BeanRowMapperFactory;
import com.sf.ddao.orm.rsmapper.rowmapper.RowMapper;
import org.apache.commons.chain.Context;
import org.mockejb.jndi.MockContextFactory;
import javax.naming.InitialContext;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by: Pavel Syrtsov
* Date: Apr 6, 2007
* Time: 7:00:11 PM
*/
public class UseStatementFactoryTest extends BasicJDBCTestCaseAdapter {
@JNDIDao("jdbc/testdb")
public static interface UserDao {
@Select("select id, name from user where id = $0$")
TestUserBean getUser(int id);
@Select("select id, name from user")
List<TestUserBean> getUserList();
@Select("select id, name from user limit $0$")
TestUserBean[] getUserArray(int size);
@Select("select id, name from user")
void processUsers(@UseRSMapper RSMapper selectCallback);
}
Injector injector;
protected void setUp() throws Exception {
super.setUp();
JDBCMockObjectFactory factory = getJDBCMockObjectFactory();
MockDataSource ds = factory.getMockDataSource();
MockContextFactory.setAsInitial();
InitialContext context = new InitialContext();
context.rebind(JNDIDataSourceHandler.DS_CTX_PREFIX + "jdbc/testdb", ds);
this.injector = Guice.createInjector(new ChainModule(UserDao.class));
}
protected void tearDown() throws Exception {
super.tearDown();
MockContextFactory.revertSetAsInitial();
}
private void createResultSet(Object... data) {
PreparedStatementResultSetHandler handler = getPreparedStatementResultSetHandler();
MockResultSet rs = handler.createResultSet();
for (int i = 0; i < data.length; i++) {
Object colName = data[i++];
Object colValues = data[i];
rs.addColumn(colName.toString(), (Object[]) colValues);
}
handler.prepareGlobalResultSet(rs);
}
public void testGetUser() throws Exception {
UserDao dao = injector.getInstance(UserDao.class);
createResultSet("id", new Object[]{1}, "name", new Object[]{"foobar"});
TestUserBean res = dao.getUser(1);
assertNotNull(res);
assertEquals(res.getId(), 1);
assertEquals(res.getName(), "foobar");
verifySQLStatementExecuted("select id, name from user where id = 1");
verifyAllResultSetsClosed();
verifyAllStatementsClosed();
verifyConnectionClosed();
}
public void testGetUserList() throws Exception {
UserDao dao = injector.getInstance(UserDao.class);
createResultSet("id", new Object[]{1, 2}, "name", new Object[]{"foo", "bar"});
List<TestUserBean> res = dao.getUserList();
assertNotNull(res);
assertEquals(res.size(), 2);
assertEquals(res.get(0).getId(), 1);
assertEquals(res.get(0).getName(), "foo");
assertEquals(res.get(1).getId(), 2);
assertEquals(res.get(1).getName(), "bar");
verifySQLStatementExecuted("select id, name from user");
verifyAllResultSetsClosed();
verifyAllStatementsClosed();
verifyConnectionClosed();
}
public void testGetUserArray() throws Exception {
UserDao dao = injector.getInstance(UserDao.class);
createResultSet("id", new Object[]{1, 2}, "name", new Object[]{"foo", "bar"});
TestUserBean[] res = dao.getUserArray(2);
assertNotNull(res);
assertEquals(res.length, 2);
assertEquals(res[0].getId(), 1);
assertEquals(res[0].getName(), "foo");
assertEquals(res[1].getId(), 2);
assertEquals(res[1].getName(), "bar");
verifySQLStatementExecuted("select id, name from user limit 2");
verifyAllResultSetsClosed();
verifyAllStatementsClosed();
verifyConnectionClosed();
}
public void testSelectCallback() throws Exception {
UserDao dao = injector.getInstance(UserDao.class);
createResultSet("id", new Object[]{1, 2}, "name", new Object[]{"foo", "bar"});
final List<TestUserBean> res = new ArrayList<TestUserBean>();
dao.processUsers(new RSMapper() {
RowMapper rowMapper = new BeanRowMapperFactory(TestUserBean.class).get();
public Object handle(Context context, ResultSet rs) throws SQLException {
while (rs.next()) {
res.add((TestUserBean) rowMapper.map(rs));
}
return null;
}
});
assertNotNull(res);
assertEquals(res.size(), 2);
assertEquals(res.get(0).getId(), 1);
assertEquals(res.get(0).getName(), "foo");
assertEquals(res.get(1).getId(), 2);
assertEquals(res.get(1).getName(), "bar");
verifySQLStatementExecuted("select id, name from user");
verifyAllResultSetsClosed();
verifyAllStatementsClosed();
verifyConnectionClosed();
}
}