/*
* Copyright (C) 2006 Methodhead Software LLC. All rights reserved.
*
* This file is part of TransferCM.
*
* TransferCM 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 2 of the License, or (at your option) any later
* version.
*
* TransferCM 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
* TransferCM; if not, write to the Free Software Foundation, Inc., 51 Franklin St,
* Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.methodhead.persistable;
import java.sql.*;
import java.util.*;
import junit.framework.*;
import org.apache.log4j.*;
import com.methodhead.test.*;
import org.apache.commons.beanutils.*;
import com.methodhead.persistable.ConnectionSingleton;
public class PersistableTest extends DbTestCase {
Persistable persistable = null;
protected static class TestPersistable
extends
Persistable {
private static DynaClass dynaClass_ = null;
static {
DynaProperty[] dynaProperties =
new DynaProperty[] {
new DynaProperty( "string_field", String.class ),
new DynaProperty( "int_field", Integer.class ),
new DynaProperty( "boolean_field", Boolean.class ),
new DynaProperty( "double_field", Double.class ),
new DynaProperty( "date_field", java.util.Date.class ),
};
dynaClass_ =
new BasicDynaClass(
"persistable", TestPersistable.class, dynaProperties );
}
public TestPersistable() {
super( dynaClass_ );
}
public TestPersistable( DynaClass dynaClass ) {
super( dynaClass );
}
}
protected static class PersistableComparator
implements
Comparator {
public int compare( Object o1, Object o2 ) {
try {
Integer i1 = ( Integer )( ( ( DynaBean )o1 ).get( "int_field" ) );
Integer i2 = ( Integer )( ( ( DynaBean )o2 ).get( "int_field" ) );
return i1.compareTo( i2 );
}
catch ( PersistableException e ) {
return -1;
}
}
public boolean equals( Object o1, Object o2 ) {
try {
Integer i1 = ( Integer )( ( ( DynaBean )o1 ).get( "int_field" ) );
Integer i2 = ( Integer )( ( ( DynaBean )o2 ).get( "int_field" ) );
return i1.equals( i2 );
}
catch ( PersistableException e ) {
return false;
}
}
}
DynaClass dynaClass_ = null;
Persistable persistable_ = null;
Persistable persistable1_ = null;
Persistable persistable2_ = null;
Persistable persistable3_ = null;
java.util.Date date1_ = null;
java.util.Date date2_ = null;
java.util.Date date3_ = null;
java.util.Date date4_ = null;
java.util.Date date5_ = null;
public PersistableTest( String name ) {
super( name );
}
protected void setUp() {
//setLogLevel( Level.DEBUG );
try {
try {
ConnectionSingleton.runUpdate( "DROP TABLE persistable" );
}
catch ( SQLException e ) {
}
if ( ConnectionSingleton.getDatabaseType().equals( ConnectionSingleton.DBTYPE_SQLSERVER ) ) {
ConnectionSingleton.runUpdate(
"CREATE TABLE persistable ( " +
" string_field VARCHAR(32), " +
" int_field INT, " +
" boolean_field BIT, " +
" double_field FLOAT, " +
" date_field DATETIME " +
")" );
}
else {
ConnectionSingleton.runUpdate(
"CREATE TABLE persistable ( " +
" string_field VARCHAR(32), " +
" int_field INT, " +
" boolean_field BIT, " +
" double_field FLOAT, " +
" date_field TIMESTAMP " +
")" );
}
Calendar cal = new GregorianCalendar();
cal.set( 2003, 1, 20, 20, 20, 10 );
date1_ = cal.getTime();
cal.set( 2003, 2, 25, 20, 20, 10 );
date2_ = cal.getTime();
cal.set( 2003, 3, 25, 20, 20, 10 );
date3_ = cal.getTime();
cal.set( 2003, 1, 20, 20, 20, 0 );
date4_ = cal.getTime();
cal.set( 2003, 1, 20, 0, 0, 0 );
date5_ = cal.getTime();
DynaProperty[] dynaProperties =
new DynaProperty[] {
new DynaProperty( "string_field", String.class ),
new DynaProperty( "int_field", Integer.class ),
new DynaProperty( "boolean_field", Boolean.class ),
new DynaProperty( "double_field", Double.class ),
new DynaProperty( "date_field", java.util.Date.class ),
};
dynaClass_ = new BasicDynaClass( "persistable", TestPersistable.class, dynaProperties );
persistable_ = new Persistable( dynaClass_ );
persistable1_ = new Persistable( dynaClass_ );
persistable1_.setString( "string_field", "string_value" );
persistable1_.setInt( "int_field", 666 );
persistable1_.setBoolean( "boolean_field", true );
persistable1_.setDouble( "double_field", 6.66 );
persistable1_.setDate( "date_field", date1_ );
persistable1_.saveNew();
persistable2_ = new Persistable( dynaClass_ );
persistable2_.setString( "string_field", "string_value2" );
persistable2_.setInt( "int_field", 777 );
persistable2_.setBoolean( "boolean_field", false );
persistable2_.setDouble( "double_field", 0.0 );
persistable2_.setDate( "date_field", date2_ );
persistable2_.saveNew();
persistable3_ = new Persistable( dynaClass_ );
persistable3_.setString( "string_field", "string_value3" );
persistable3_.setInt( "int_field", 888 );
persistable3_.setBoolean( "boolean_field", true );
persistable3_.setDouble( "double_field", 8.88 );
persistable3_.setDate( "date_field", date3_ );
persistable3_.saveNew();
}
catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
protected void tearDown() {
}
public void testGettersAndSetters() {
assertNull( persistable_.getString( "string_field" ) );
persistable_.setString( "string_field", "foo" );
assertEquals( "foo", persistable_.getString( "string_field" ) );
assertEquals( 0, persistable_.getInt( "int_field" ) );
persistable_.setInt( "int_field", 666 );
assertEquals( 666, persistable_.getInt( "int_field" ) );
assertEquals( false, persistable_.getBoolean( "boolean_field" ) );
persistable_.setBoolean( "boolean_field", true );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
assertEquals( 0.00, persistable_.getDouble( "double_field" ), 0.001 );
persistable_.setDouble( "double_field", 6.66 );
assertEquals( 6.66, persistable_.getDouble( "double_field" ), 0.001 );
assertNull( persistable_.getDate( "date_field" ) );
persistable_.setDate( "date_field", date1_ );
assertDatesEqual( date1_, persistable_.getDate( "date_field" ) );
}
public void testSetAsString() {
java.util.Date d = null;
//
// string
//
persistable_.setAsString( "string_field", "string_value" );
assertEquals( "string_value", persistable_.getString( "string_field" ) );
persistable_.setAsString( "string_field", null );
assertEquals( "", persistable_.getString( "string_field" ) );
//
// int
//
persistable_.setAsString( "int_field", "666" );
assertEquals( 666, persistable_.getInt( "int_field" ) );
persistable_.setAsString( "int_field", null );
assertEquals( 0, persistable_.getInt( "int_field" ) );
persistable_.setAsString( "int_field", "" );
assertEquals( 0, persistable_.getInt( "int_field" ) );
//
// double
//
persistable_.setAsString( "double_field", "6.66" );
assertEquals( 6.66, persistable_.getDouble( "double_field" ), 0.001 );
persistable_.setAsString( "double_field", null );
assertEquals( 0.0, persistable_.getDouble( "double_field" ), 0.001 );
persistable_.setAsString( "double_field", "" );
assertEquals( 0.0, persistable_.getDouble( "double_field" ), 0.001 );
//
// boolean
//
persistable_.setAsString( "boolean_field", "true" );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "True" );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "yes" );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "Yes" );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "on" );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "On" );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "false" );
assertEquals( false, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", "" );
assertEquals( false, persistable_.getBoolean( "boolean_field" ) );
persistable_.setAsString( "boolean_field", null );
assertEquals( false, persistable_.getBoolean( "boolean_field" ) );
//
// date
//
d = new java.util.Date();
persistable_.setAsString( "date_field", null );
assertDatesEqual( d, persistable_.getDate( "date_field" ) );
d = new java.util.Date();
persistable_.setAsString( "date_field", "" );
assertDatesEqual( d, persistable_.getDate( "date_field" ) );
persistable_.setAsString( "date_field", "2/20/03 8:20 PM" );
assertDatesEqual( date4_, persistable_.getDate( "date_field" ) );
persistable_.setAsString( "date_field", "2/20/2003" );
assertDatesEqual( date5_, persistable_.getDate( "date_field" ) );
}
public void testSetAsObject() {
//
// string
//
persistable_.setAsObject( "string_field", "string_value" );
assertEquals( "string_value", persistable_.getString( "string_field" ) );
persistable_.setAsObject( "string_field", null );
assertEquals( "", persistable_.getString( "string_field" ) );
}
public void testGetSqlLiteralString() {
assertEquals( "''", Persistable.getSqlLiteral( "" ) );
assertEquals( "'test'", Persistable.getSqlLiteral( "test" ) );
assertEquals( "'''test'''", Persistable.getSqlLiteral( "'test'" ) );
}
public void testGetSqlLiteralDate() {
assertEquals( "'2003-02-20 20:20:10'", Persistable.getSqlLiteral( date1_ ) );
}
public void testGetSqlLiteralBoolean() {
assertEquals( "'1'", Persistable.getSqlLiteral( new Boolean( true ) ) );
assertEquals( "'0'", Persistable.getSqlLiteral( new Boolean( false ) ) );
}
public void testGetSqlLiteralField() {
try {
persistable_.setString( "string_field", "string_value" );
persistable_.setInt( "int_field", 666 );
persistable_.setBoolean( "boolean_field", true );
persistable_.setDouble( "double_field", 6.66 );
persistable_.setDate( "date_field", date1_ );
assertEquals( "'string_value'", persistable_.getSqlLiteral( persistable_.getDynaClass().getDynaProperty( "string_field" ) ) );
assertEquals( "666", persistable_.getSqlLiteral( persistable_.getDynaClass().getDynaProperty( "int_field" ) ) );
assertEquals( "'1'", persistable_.getSqlLiteral( persistable_.getDynaClass().getDynaProperty( "boolean_field" ) ) );
assertEquals( "6.66", persistable_.getSqlLiteral( persistable_.getDynaClass().getDynaProperty( "double_field" ) ) );
assertEquals( "'2003-02-20 20:20:10'", persistable_.getSqlLiteral( persistable_.getDynaClass().getDynaProperty( "date_field" ) ) );
persistable_.setBoolean( "boolean_field", false );
assertEquals( "'0'", persistable_.getSqlLiteral( persistable_.getDynaClass().getDynaProperty( "boolean_field" ) ) );
}
catch ( PersistableException e ) {
fail( e.getMessage() );
}
}
public void testSaveNew() {
try {
persistable_.setString( "string_field", "foo" );
persistable_.setInt( "int_field", 999 );
persistable_.setBoolean( "boolean_field", true );
persistable_.setDouble( "double_field", 6.66 );
persistable_.setDate( "date_field", date1_ );
persistable_.saveNew();
ResultSet rs = ConnectionSingleton.runQuery( "SELECT string_field, int_field, boolean_field, double_field, date_field FROM persistable WHERE int_field=999" );
assertNotNull( rs );
assertTrue( rs.next() );
assertEquals( "foo", rs.getString( "string_field" ) );
assertEquals( 999, rs.getInt( "int_field" ) );
assertEquals( true, rs.getBoolean( "boolean_field" ) );
assertEquals( 6.66, rs.getDouble( "double_field" ), 0.01 );
assertDatesEqual( date1_, rs.getTimestamp( "date_field" ) );
assertTrue( !rs.next() );
ConnectionSingleton.close( rs );
}
catch ( Exception e ) {
fail( e.toString() );
}
}
public void testSave() {
try {
persistable1_.setString( "string_field", "bar" );
persistable1_.setBoolean( "boolean_field", true );
persistable1_.setDouble( "double_field", 7.77 );
persistable1_.setDate( "date_field", date1_ );
persistable1_.save( "int_field=666" );
ResultSet rs = ConnectionSingleton.runQuery( "SELECT string_field, int_field, boolean_field, double_field, date_field FROM persistable WHERE int_field=666" );
assertNotNull( rs );
assertTrue( rs.next() );
assertEquals( "bar", rs.getString( "string_field" ) );
assertEquals( true, rs.getBoolean( "boolean_field" ) );
assertEquals( 7.77, rs.getDouble( "double_field" ), 0.01 );
assertDatesEqual( date1_, rs.getTimestamp( "date_field" ) );
assertTrue( !rs.next() );
ConnectionSingleton.close( rs );
}
catch ( Exception e ) {
fail( e.toString() );
}
}
public void testLoad() {
try {
//
// load a typical row
//
persistable_.load( "int_field=666" );
assertEquals( "string_value", persistable_.getString( "string_field" ) );
assertEquals( 666, persistable_.getInt( "int_field" ) );
assertEquals( true, persistable_.getBoolean( "boolean_field" ) );
assertEquals( 6.66, persistable_.getDouble( "double_field" ), 0.01 );
assertDatesEqual( date1_, persistable_.getDate( "date_field" ) );
//
// load a row with a 0.0 double value (this causes problems in sql server)
//
persistable_.load( "int_field=777" );
assertEquals( 0.00, persistable_.getDouble( "double_field" ), 0.01 );
}
catch ( Exception e ) {
fail( e.toString() );
}
}
public void testLoadAll() {
try {
List l = TestPersistable.loadAll( dynaClass_, null, null );
assertNotNull( l );
assertEquals( 3, l.size() );
Collections.sort( l, new PersistableComparator() );
TestPersistable testPersistable = ( TestPersistable )l.get( 0 );
testPersistable = ( TestPersistable )l.get( 0 );
assertEquals( persistable1_.getString( "string_field" ), testPersistable.getString( "string_field" ) );
assertEquals( persistable1_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
assertEquals( persistable1_.getBoolean( "boolean_field" ), testPersistable.getBoolean( "boolean_field" ) );
assertEquals( persistable1_.getDouble( "double_field" ), testPersistable.getDouble( "double_field" ), 0.01 );
assertDatesEqual( persistable1_.getDate( "date_field" ), testPersistable.getDate( "date_field" ) );
testPersistable = ( TestPersistable )l.get( 1 );
assertEquals( persistable2_.getString( "string_field" ), testPersistable.getString( "string_field" ) );
assertEquals( persistable2_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
assertEquals( persistable2_.getBoolean( "boolean_field" ), testPersistable.getBoolean( "boolean_field" ) );
assertEquals( persistable2_.getDouble( "double_field" ), testPersistable.getDouble( "double_field" ), 0.01 );
assertDatesEqual( persistable2_.getDate( "date_field" ), testPersistable.getDate( "date_field" ) );
testPersistable = ( TestPersistable )l.get( 2 );
assertEquals( persistable3_.getString( "string_field" ), testPersistable.getString( "string_field" ) );
assertEquals( persistable3_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
assertEquals( persistable3_.getBoolean( "boolean_field" ), testPersistable.getBoolean( "boolean_field" ) );
assertEquals( persistable3_.getDouble( "double_field" ), testPersistable.getDouble( "double_field" ), 0.01 );
assertDatesEqual( persistable3_.getDate( "date_field" ), testPersistable.getDate( "date_field" ) );
}
catch ( Exception e ) {
e.printStackTrace();
fail();
}
}
public void testLoadAllWhere() {
try {
List l = TestPersistable.loadAll( dynaClass_, "string_field='string_value2'", null );
assertNotNull( l );
assertEquals( 1, l.size() );
TestPersistable testPersistable = ( TestPersistable )l.get( 0 );
assertEquals( persistable2_.getString( "string_field" ), testPersistable.getString( "string_field" ) );
assertEquals( persistable2_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
assertEquals( persistable2_.getBoolean( "boolean_field" ), testPersistable.getBoolean( "boolean_field" ) );
assertEquals( persistable2_.getDouble( "double_field" ), testPersistable.getDouble( "double_field" ), 0.01 );
assertDatesEqual( persistable2_.getDate( "date_field" ), testPersistable.getDate( "date_field" ) );
}
catch ( Exception e ) {
fail( e.toString() );
}
}
public void testLoadAllOrderBy() {
try {
List l = TestPersistable.loadAll( dynaClass_, null, "int_field DESC" );
assertNotNull( l );
assertEquals( 3, l.size() );
TestPersistable testPersistable = ( TestPersistable )l.get( 0 );
assertEquals( persistable3_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
testPersistable = ( TestPersistable )l.get( 1 );
assertEquals( persistable2_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
testPersistable = ( TestPersistable )l.get( 2 );
assertEquals( persistable1_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
}
catch ( Exception e ) {
fail( e.toString() );
}
}
public void testLoadAllNonStatic() {
try {
persistable = new TestPersistable();
List l = persistable.loadAll( null, "int_field DESC" );
assertNotNull( l );
assertEquals( 3, l.size() );
TestPersistable testPersistable = ( TestPersistable )l.get( 0 );
assertEquals( persistable3_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
testPersistable = ( TestPersistable )l.get( 1 );
assertEquals( persistable2_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
testPersistable = ( TestPersistable )l.get( 2 );
assertEquals( persistable1_.getInt( "int_field" ), testPersistable.getInt( "int_field" ) );
}
catch ( Exception e ) {
fail( e.toString() );
}
}
public void testDeleteAll() {
ResultSet rs = null;
try {
Persistable.deleteAll( dynaClass_, null );
rs = ConnectionSingleton.runQuery( "SELECT int_field FROM persistable" );
assertNotNull( rs );
assertTrue( !rs.next() );
ConnectionSingleton.close( rs );
}
catch ( Exception e ) {
if ( rs != null )
ConnectionSingleton.close( rs );
fail( e.toString() );
}
}
public void testDeleteAllNonStatic() {
ResultSet rs = null;
try {
persistable = new TestPersistable();
persistable.deleteAll( null );
rs = ConnectionSingleton.runQuery( "SELECT int_field FROM persistable" );
assertNotNull( rs );
assertTrue( !rs.next() );
ConnectionSingleton.close( rs );
}
catch ( Exception e ) {
if ( rs != null )
ConnectionSingleton.close( rs );
fail( e.toString() );
}
}
public void testDeleteAllWhere() {
ResultSet rs = null;
try {
Persistable.deleteAll( dynaClass_, "int_field=777" );
rs = ConnectionSingleton.runQuery( "SELECT int_field FROM persistable ORDER BY int_field" );
assertNotNull( rs );
assertTrue( rs.next() );
assertEquals( 666, rs.getInt( "int_field" ) );
assertTrue( rs.next() );
assertEquals( 888, rs.getInt( "int_field" ) );
assertTrue( !rs.next() );
ConnectionSingleton.close( rs );
}
catch ( Exception e ) {
if ( rs != null )
ConnectionSingleton.close( rs );
fail( e.toString() );
}
}
}
|