PersistableTest.java :  » Content-Management-System » TransferCM » com » methodhead » persistable » Java Open Source

Java Open Source » Content Management System » TransferCM 
TransferCM » com » methodhead » persistable » PersistableTest.java
/* 
 * 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() );
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.