/*
* Copyright (c) 2002 Cunningham & Cunningham, Inc.
* Copyright (c) 2009-2015 by Jochen Wierum & Cologne Intelligence
*
* This file is part of FitGoodies.
*
* FitGoodies is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FitGoodies is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FitGoodies. If not, see <http://www.gnu.org/licenses/>.
*/
package de.cologneintelligence.fitgoodies.database.dynamic;
import de.cologneintelligence.fitgoodies.testsupport.FitGoodiesTestCase;
import de.cologneintelligence.fitgoodies.types.ScientificDouble;
import org.hamcrest.Matcher;
import org.junit.Test;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class ResultSetWrapperTest extends FitGoodiesTestCase {
@Test
public void testGetTypesWithOneRow() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(3);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("name");
when(meta.getColumnName(3)).thenReturn("surname");
when(rs.next()).thenReturn(true);
when(rs.getObject(1)).thenReturn(42);
when(rs.getObject(2)).thenReturn("Angela");
when(rs.getObject(3)).thenReturn("Bennett");
ResultSetWrapper reader = new ResultSetWrapper(rs);
Class<?> clazz = reader.getClazz();
assertThat(clazz.getFields().length, is(equalTo((Object) 3)));
assertThat(clazz.getField("id").getType(), (Matcher) is(equalTo(Integer.class)));
assertThat(clazz.getField("name").getType(), (Matcher) is(equalTo(String.class)));
assertThat(clazz.getField("surname").getType(), (Matcher) is(equalTo(String.class)));
}
@Test
public void testGetTypesWithThreeRows() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(2);
when(meta.getColumnName(1)).thenReturn("name");
when(meta.getColumnName(2)).thenReturn("age");
when(rs.next()).thenReturn(true, true, true);
when(rs.getObject(1)).thenReturn(null);
when(rs.getObject(2)).thenReturn(null);
when(rs.getObject(1)).thenReturn(new StringBuilder("Angela"));
when(rs.getObject(2)).thenReturn(null);
when(rs.getObject(1)).thenReturn(new StringBuilder("Anika"));
when(rs.getObject(2)).thenReturn(new BigInteger("31"));
ResultSetWrapper reader = new ResultSetWrapper(rs);
Class<?> clazz = reader.getClazz();
assertThat(clazz.getFields().length, is(equalTo((Object) 2)));
assertThat(clazz.getField("name").getType(), (Matcher) is(equalTo(StringBuilder.class)));
assertThat(clazz.getField("age").getType(), (Matcher) is(equalTo(BigInteger.class)));
}
@Test
public void testGetTypesWithIncompleteRows() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(2);
when(meta.getColumnName(1)).thenReturn("name");
when(meta.getColumnName(2)).thenReturn("age");
when(rs.next()).thenReturn(true, true, true, false);
when(rs.getObject(1)).thenReturn(null);
when(rs.getObject(2)).thenReturn(null);
when(rs.getObject(1)).thenReturn(new StringBuilder("Angela"));
when(rs.getObject(2)).thenReturn(null);
when(rs.getObject(1)).thenReturn(new StringBuilder("Anika"));
when(rs.getObject(2)).thenReturn(null);
ResultSetWrapper reader = new ResultSetWrapper(rs);
Class<?> clazz = reader.getClazz();
assertThat(clazz.getFields().length, is(equalTo((Object) 2)));
assertThat(clazz.getField("name").getType(), (Matcher) is(equalTo(StringBuilder.class)));
assertThat(clazz.getField("age").getType(), (Matcher) is(equalTo(Object.class)));
}
@Test
public void testCreateObjectOne() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(2);
when(meta.getColumnName(1)).thenReturn("name");
when(meta.getColumnName(2)).thenReturn("age");
when(rs.next()).thenReturn(true);
when(rs.getObject(1)).thenReturn(new StringBuilder("Anika"));
when(rs.getObject(2)).thenReturn(new BigInteger("31"));
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object o = reader.createContainerObject();
assertThat(o.getClass().getField("name").getType(), (Matcher) is(equalTo(StringBuilder.class)));
assertThat(o.getClass().getField("age").getType(), (Matcher) is(equalTo(BigInteger.class)));
}
@Test
public void testCreateObjectTwo() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(4);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("fullname");
when(meta.getColumnName(3)).thenReturn("age");
when(meta.getColumnName(4)).thenReturn("problem");
when(rs.next()).thenReturn(true, false);
when(rs.getObject(1)).thenReturn(42);
when(rs.getObject(2)).thenReturn(new StringBuffer("Angela Bennett"));
when(rs.getObject(3)).thenReturn(new BigDecimal("31"));
when(rs.getObject(4)).thenReturn(null);
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object o = reader.createContainerObject();
assertThat(o.getClass().getField("fullname").getType(), (Matcher) is(equalTo(StringBuffer.class)));
assertThat(o.getClass().getField("age").getType(), (Matcher) is(equalTo(BigDecimal.class)));
assertThat(o.getClass().getField("id").getType(), (Matcher) is(equalTo(Integer.class)));
assertThat(o.getClass().getField("problem").getType(), (Matcher) is(equalTo(Object.class)));
}
@Test
public void testGetObject() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(3);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("fullname");
when(meta.getColumnName(3)).thenReturn("age");
when(rs.next()).thenReturn(true, true, false);
when(rs.getObject(1)).thenReturn(42, 23);
when(rs.getObject(2)).thenReturn(new StringBuffer("Angela Bennett"), new StringBuffer("Anika Hanson"));
when(rs.getObject(3)).thenReturn(new BigDecimal("31"), new BigDecimal("32"));
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object[] o = reader.getRows();
Object expected = "Angela Bennett";
Object actual = o[0].getClass().getField("fullname").get(o[0]).toString();
assertThat(actual, is(equalTo(expected)));
expected = new BigDecimal(31);
actual = o[0].getClass().getField("age").get(o[0]);
assertThat(actual, is(equalTo(expected)));
expected = 23;
actual = o[1].getClass().getField("id").get(o[1]);
assertThat(actual, is(equalTo(expected)));
expected = new BigDecimal(32);
actual = o[1].getClass().getField("age").get(o[1]);
assertThat(actual, is(equalTo(expected)));
}
@Test
public void testGetObjectWithIncompleteData() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(3);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("name");
when(meta.getColumnName(3)).thenReturn("age");
when(rs.next()).thenReturn(true, true, false);
when(rs.getObject(1)).thenReturn(1, 2);
when(rs.getObject(2)).thenReturn(new StringBuilder("Anika Hanson"), new StringBuilder("Angela Bennett"));
when(rs.getObject(3)).thenReturn(null, new BigDecimal("25"));
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object[] o = reader.getRows();
Object expected = "Anika Hanson";
Object actual = o[0].getClass().getField("name").get(o[0]).toString();
assertThat(actual, is(equalTo(expected)));
expected = new BigDecimal(25);
actual = o[1].getClass().getField("age").get(o[1]);
assertThat(actual, is(equalTo(expected)));
expected = 1;
actual = o[0].getClass().getField("id").get(o[0]);
assertThat(actual, is(equalTo(expected)));
expected = 2;
actual = o[1].getClass().getField("id").get(o[1]);
assertThat(actual, is(equalTo(expected)));
}
@Test
public void testGetObjectWithMissingColumn() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(3);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("name");
when(meta.getColumnName(3)).thenReturn("age");
when(rs.next()).thenReturn(true, true, false);
when(rs.getObject(1)).thenReturn(1, 2);
when(rs.getObject(2)).thenReturn(new StringBuilder("Anika Hanson"), new StringBuilder("Angela Bennett"));
when(rs.getObject(3)).thenReturn(null);
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object[] o = reader.getRows();
Object expected = "Anika Hanson";
Object actual = o[0].getClass().getField("name").get(o[0]).toString();
assertThat(actual, is(equalTo(expected)));
actual = o[1].getClass().getField("age").get(o[1]);
assertThat(actual, is(nullValue()));
}
@Test
public void testGetObjectWithEmptyTable() throws SQLException {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(3);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("name");
when(meta.getColumnName(3)).thenReturn("age");
when(rs.next()).thenReturn(false);
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object[] o = reader.getRows();
assertThat(o.length, is(equalTo((Object) 0)));
}
@Test
public void testCreateObjectWithFloat() throws Exception {
final ResultSet rs = mock(ResultSet.class);
final ResultSetMetaData meta = mock(ResultSetMetaData.class);
when(rs.getMetaData()).thenReturn(meta);
when(meta.getColumnCount()).thenReturn(2);
when(meta.getColumnName(1)).thenReturn("id");
when(meta.getColumnName(2)).thenReturn("value");
when(rs.next()).thenReturn(true);
when(rs.getObject(1)).thenReturn(2);
when(rs.getObject(2)).thenReturn(2.5);
ResultSetWrapper reader = new ResultSetWrapper(rs);
Object o = reader.createContainerObject();
assertThat(o.getClass().getField("value").getType(), (Matcher) is(equalTo(ScientificDouble.class)));
}
}