/* * 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.crud; 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.MockConnection; import com.mockrunner.mock.jdbc.MockResultSet; import com.sf.ddao.JDBCDao; import com.sf.ddao.TestUserBean; import com.sf.ddao.chain.ChainModule; import org.mockejb.jndi.MockContextFactory; import java.util.HashSet; /** * Created by psyrtsov */ public class CRUDDaoTest extends BasicJDBCTestCaseAdapter { Injector injector; @JDBCDao(value = "jdbc://test", driver = "com.mockrunner.mock.jdbc.MockDriver") public static interface TestUserDao extends CRUDDao<TestUserBean>, UpdateCallbackDao<TestUserBean> { } protected void setUp() throws Exception { super.setUp(); this.injector = Guice.createInjector(new ChainModule(TestUserDao.class)); } protected void tearDown() throws Exception { super.tearDown(); MockContextFactory.revertSetAsInitial(); } private void createResultSet(Object... data) { MockConnection connection = getJDBCMockObjectFactory().getMockConnection(); PreparedStatementResultSetHandler handler = connection.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 testCreate() throws Exception { // create dao object TestUserDao dao = injector.getInstance(TestUserDao.class); final long id = 77; createResultSet("id", new Object[]{id}); // setup test TestUserBean data = new TestUserBean(true); data.setName("name"); // execute dao method dao.create(data); final String sql = "insert into test_user(gender,long_name,name) values(?,?,?)"; verifySQLStatementExecuted(sql); verifyPreparedStatementParameter(sql, 1, data.getGender().name()); verifyPreparedStatementParameter(sql, 3, data.getName()); verifyAllResultSetsClosed(); verifyAllStatementsClosed(); verifyConnectionClosed(); } public void testRead() throws Exception { // create dao object TestUserDao dao = injector.getInstance(TestUserDao.class); final long id = 77; String name = "name77"; String gender = TestUserBean.Gender.GIRL.name(); createResultSet("name", new Object[]{name}, "gender", new Object[]{gender}); // setup test TestUserBean res = dao.read(id); // verify result assertNotNull(res); assertEquals(true, res.beanIsLoaded); assertEquals(name, res.getName()); assertEquals(TestUserBean.Gender.GIRL, res.getGender()); final String sql = "select * from test_user where id=? limit 1"; verifySQLStatementExecuted(sql); verifyPreparedStatementParameter(sql, 1, id); verifyAllResultSetsClosed(); verifyAllStatementsClosed(); verifyConnectionClosed(); } public void testUpdate() throws Exception { // create dao object TestUserDao dao = injector.getInstance(TestUserDao.class); // setup test TestUserBean data = new TestUserBean(true); data.setId(77); data.setName("name"); data.dirtyProps(new HashSet<String>() {{ add("gender"); add("name"); }}); createResultSet("id", new Object[]{data.getId()}); // execute dao method dao.update(data); final String sql = "update test_user set gender=?,name=? where id=?"; verifySQLStatementExecuted(sql); verifyPreparedStatementParameter(sql, 1, data.getGender().name()); verifyPreparedStatementParameter(sql, 2, data.getName()); verifyPreparedStatementParameter(sql, 3, data.getId()); verifyAllResultSetsClosed(); verifyAllStatementsClosed(); verifyConnectionClosed(); } public void testUpdateIfDirty() throws Exception { // create dao object TestUserDao dao = injector.getInstance(TestUserDao.class); // setup test TestUserBean data = new TestUserBean(true); data.setId(77); data.setName("name"); data.dirtyProps(new HashSet<String>() {{ add("gender"); add("name"); }}); createResultSet("id", new Object[]{data.getId()}); // execute dao method dao.updateIfDirty(data); verifyNumberPreparedStatements(0); verifyAllResultSetsClosed(); verifyAllStatementsClosed(); } public void testDelete() throws Exception { // create dao object TestUserDao dao = injector.getInstance(TestUserDao.class); final long id = 77; createResultSet("id", new Object[]{id}); // execute dao method dao.delete(id); final String sql = "delete from test_user where id=?"; verifySQLStatementExecuted(sql); verifyPreparedStatementParameter(sql, 1, id); verifyAllResultSetsClosed(); verifyAllStatementsClosed(); verifyConnectionClosed(); } public void testReadWithCallbackThenUpdate() throws Exception { // create dao object TestUserDao dao = injector.getInstance(TestUserDao.class); final long id = 77; String name = "name77"; String longName = "longName77"; createResultSet("id", new Object[]{id}, "name", new Object[]{name}, "longName", new Object[]{longName}); // setup test ResultHolderUpdateCallback<TestUserBean> updateCallback = new ResultHolderUpdateCallback<TestUserBean>(); dao.update(id, updateCallback); TestUserBean res = updateCallback.getRes(); // verify result assertNotNull(res); assertEquals(name, res.getName()); final String selectSql = "select * from test_user where id=? limit 1"; verifySQLStatementExecuted(selectSql); verifyPreparedStatementParameter(selectSql, 1, id); final String updateSql = "update test_user set gender=?,long_name=?,name=? where id=?"; verifySQLStatementExecuted(updateSql); verifyPreparedStatementParameter(updateSql, 1, TestUserBean.Gender.GIRL.name()); verifyPreparedStatementParameter(updateSql, 2, longName); verifyPreparedStatementParameter(updateSql, 3, name); verifyPreparedStatementParameter(updateSql, 4, id); verifyAllResultSetsClosed(); verifyAllStatementsClosed(); verifyConnectionClosed(); } private class ResultHolderUpdateCallback<T> implements UpdateCallback<T> { private T res; public void update(T bean) { res = bean; } public T getRes() { return res; } } }