/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * 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 org.seasar.extension.jdbc.query; import java.sql.SQLException; import java.util.Date; import javax.persistence.TemporalType; import junit.framework.TestCase; import org.seasar.extension.jdbc.SqlLog; import org.seasar.extension.jdbc.SqlLogRegistry; import org.seasar.extension.jdbc.SqlLogRegistryLocator; import org.seasar.extension.jdbc.dialect.StandardDialect; import org.seasar.extension.jdbc.entity.Aaa; import org.seasar.extension.jdbc.entity.MyDto; import org.seasar.extension.jdbc.handler.BeanResultSetHandler; import org.seasar.extension.jdbc.manager.JdbcManagerImpl; import org.seasar.extension.jdbc.manager.JdbcManagerImplementor; import org.seasar.extension.jdbc.parameter.Parameter; import org.seasar.extension.jdbc.types.ValueTypes; import org.seasar.framework.convention.impl.PersistenceConventionImpl; import org.seasar.framework.mock.sql.MockColumnMetaData; import org.seasar.framework.mock.sql.MockDataSource; import org.seasar.framework.mock.sql.MockPreparedStatement; import org.seasar.framework.mock.sql.MockResultSet; import org.seasar.framework.mock.sql.MockResultSetMetaData; import org.seasar.framework.util.ArrayMap; /** * @author higa * */ public class AbsQueryTest extends TestCase { private JdbcManagerImpl manager; private Object bindVariable; private int parameterIndex; @Override protected void setUp() throws Exception { manager = new JdbcManagerImpl(); manager.setDataSource(new MockDataSource()); manager.setDialect(new StandardDialect()); manager.setPersistenceConvention(new PersistenceConventionImpl()); } @Override protected void tearDown() throws Exception { SqlLogRegistry regisry = SqlLogRegistryLocator.getInstance(); regisry.clear(); } /** * */ public void testLogSql() { String sql = "select * from aaa where id = ?"; String completeSql = "select * from aaa where id = 1"; MyQuery query = new MyQuery(manager); query.executedSql = sql; query.addParam(1); query.prepareCallerClassAndMethodName("testLogSql"); query.logSql(); SqlLogRegistry registry = SqlLogRegistryLocator.getInstance(); SqlLog log = registry.getLast(); assertEquals(sql, log.getRawSql()); assertEquals(completeSql, log.getCompleteSql()); assertEquals(1, log.getBindArgs().length); assertEquals(new Integer(1), log.getBindArgs()[0]); assertEquals(1, log.getBindArgTypes().length); assertEquals(Integer.class, log.getBindArgTypes()[0]); } /** * */ public void testLogSql_withArgs() { String sql = "select * from aaa where id = ?"; String completeSql = "select * from aaa where id = 1"; MyQuery query = new MyQuery(manager); query.prepareCallerClassAndMethodName("testLogSql_withArgs"); query.logSql(sql, 1); SqlLogRegistry registry = SqlLogRegistryLocator.getInstance(); SqlLog log = registry.getLast(); assertEquals(sql, log.getRawSql()); assertEquals(completeSql, log.getCompleteSql()); assertEquals(1, log.getBindArgs().length); assertEquals(new Integer(1), log.getBindArgs()[0]); assertEquals(1, log.getBindArgTypes().length); assertEquals(Integer.class, log.getBindArgTypes()[0]); } /** * */ public void testPrepareCallerClassAndMethodName() { MyQuery query = new MyQuery(manager); query.prepareCallerClassAndMethodName("hoge"); assertEquals(MyQuery.class, query.callerClass); assertNotNull(query.logger); assertEquals("hoge", query.callerMethodName); } /** * */ public void testPrepareCallerClass_preSetup() { MyQuery query = new MyQuery(manager); query.callerClass = getClass(); query.callerMethodName = "foo"; query.prepareCallerClassAndMethodName("hoge"); assertEquals(getClass(), query.callerClass); assertEquals("foo", query.callerMethodName); } /** * */ public void testAddParam() { MyQuery query = new MyQuery(manager); Param param = query.addParam(1); assertEquals(1, param.value); assertEquals(Integer.class, param.paramClass); assertEquals(ValueTypes.INTEGER, param.valueType); } /** * */ public void testAddParam_temporal() { MyQuery query = new MyQuery(manager); Param param = query.addParam(Parameter.date(new Date(1))); assertEquals(new Date(1), param.value); assertEquals(Date.class, param.paramClass); assertEquals(ValueTypes.DATE_SQLDATE, param.valueType); } /** * */ public void testAddParam_clob() { MyQuery query = new MyQuery(manager); Param param = query.addParam(Parameter.lob("aaa")); assertEquals("aaa", param.value); assertEquals(String.class, param.paramClass); assertEquals(ValueTypes.CLOB, param.valueType); } /** * */ public void testAddParam_blob() { MyQuery query = new MyQuery(manager); Param param = query.addParam(Parameter.lob(new byte[10])); assertEquals(10, ((byte[]) param.value).length); assertEquals(byte[].class, param.paramClass); assertEquals(ValueTypes.BLOB, param.valueType); } /** * */ public void testAddParam_blob_serializable() { MyQuery query = new MyQuery(manager); MyDto myDto = new MyDto(); Param param = query.addParam(Parameter.lob(myDto)); assertEquals(myDto, param.value); assertEquals(MyDto.class, param.paramClass); assertEquals(ValueTypes.SERIALIZABLE_BLOB, param.valueType); } /** * */ public void testAddParam_serializable() { MyQuery query = new MyQuery(manager); MyDto myDto = new MyDto(); Param param = query.addParam(myDto); assertEquals(myDto, param.value); assertEquals(MyDto.class, param.paramClass); assertEquals(ValueTypes.SERIALIZABLE_BYTE_ARRAY, param.valueType); } /** * */ public void testAddParam_null() { MyQuery query = new MyQuery(manager); try { query.addParam(null); fail(); } catch (NullPointerException e) { System.out.println(e); } } /** * */ public void testAddParam_valueType() { MyQuery query = new MyQuery(manager); Param param = query.addParam(1, Integer.class, ValueTypes.INTEGER); assertEquals(1, query.getParamSize()); assertEquals(1, param.value); assertEquals(Integer.class, param.paramClass); assertEquals(ValueTypes.INTEGER, param.valueType); } /** * @throws Exception * */ public void testPrepareInParams() throws Exception { MyQuery query = new MyQuery(manager); Param param = new Param(); param.value = "aaa"; param.paramClass = String.class; param.valueType = ValueTypes.STRING; query.paramList.add(param); MockPreparedStatement ps = new MockPreparedStatement(null, null) { @Override public void setString(int index, String x) throws SQLException { bindVariable = x; parameterIndex = index; super.setString(parameterIndex, x); } }; query.prepareInParams(ps); assertEquals("aaa", bindVariable); assertEquals(1, parameterIndex); } /** * */ public void testResetParams() { MyQuery query = new MyQuery(manager); query.addParam(1); query.resetParams(); assertEquals(0, query.paramList.size()); } /** * */ public void testGetParamSize() { MyQuery query = new MyQuery(manager); query.addParam(1); assertEquals(1, query.getParamSize()); } /** * */ public void testGetParam() { MyQuery query = new MyQuery(manager); Param param = query.addParam(1); assertSame(param, query.getParam(0)); } /** * @throws Exception * */ public void testHandleResultSet() throws Exception { MyQuery query = new MyQuery(manager); MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("ID"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("NAME"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); ArrayMap data = new ArrayMap(); data.put("ID", "111"); data.put("NAME", "222"); rs.addRowData(data); BeanResultSetHandler handler = new BeanResultSetHandler(Aaa.class, manager.getDialect(), manager.getPersistenceConvention(), "select * from aaa"); Object ret = query.handleResultSet(handler, rs); assertTrue(rs.isClosed()); assertNotNull(ret); } /** * @throws Exception * */ public void testGetValueType() throws Exception { MyQuery query = new MyQuery(manager); assertEquals(ValueTypes.CLOB, query.getValueType(String.class, true, null)); assertEquals(ValueTypes.INTEGER, query.getValueType(Integer.class, false, null)); assertEquals(ValueTypes.DATE_TIME, query.getValueType(Date.class, false, TemporalType.TIME)); assertEquals(ValueTypes.SERIALIZABLE_BYTE_ARRAY, query.getValueType( MyDto.class, false, null)); } private static class MyQuery extends AbstractQuery<MyQuery> { /** * @param jdbcManager */ public MyQuery(JdbcManagerImplementor jdbcManager) { super(jdbcManager); } @Override protected void prepare(String methodName) { } } }