001    package com.sptci.rwt;
002    
003    import java.util.List;
004    
005    import static junit.framework.Assert.*;
006    import junit.framework.Test;
007    import junit.framework.TestCase;
008    import junit.framework.TestSuite;
009    
010    /**
011     * Unit test for the {@link BatchQueryExecutor} class.
012     * 
013     * <p>&copy; Copyright 2007 <a href='http://sptci.com/' target='_new'>Sans Pareil Technologies, Inc.</a></p>
014     * @author Rakesh Vidyadharan 2007-10-02
015     * @version $Id: BatchQueryExecutorTest.java 4123 2008-05-25 21:49:01Z rakesh $
016     */
017    public class BatchQueryExecutorTest extends TestCase
018    {
019      static final int total = 100;
020    
021      public static Test suite()
022      {
023        return new TestSuite( BatchQueryExecutorTest.class );
024      }
025    
026      /** Test executing <code>insert</code> statements.  */
027      public void testInsert() throws Exception
028      {
029        final List<Rows> rows = insert();
030    
031        try
032        {
033          assertEquals( "Ensuring rows are returned after insert",
034              rows.size(), total );
035          assertEquals( "Ensuring one column returned for row inserted",
036              rows.get( 0 ).getRows().get( 0 ).getColumns().size(), 1 );
037          assertEquals( "Ensuring update count after insert",
038              rows.get( 0 ).getRows().get( 0 ).getColumns().get( 0 ).getContent(), 1 );
039        }
040        finally
041        {
042          delete();
043        }
044      }
045    
046      /** Test executing <code>select</code> statements. */
047      public void testSelect() throws Exception
048      {
049        insert();
050    
051        try
052        {
053          final BatchQueryExecutor executor =
054            new BatchQueryExecutor( CreateTestObjects.manager );
055    
056          final StringBuilder builder = new StringBuilder();
057          final int count = 5;
058          for ( int i = 0; i < count; ++i )
059          {
060            builder.append( "select * from " );
061            builder.append( CreateTestObjects.tableName );
062            builder.append( ";\n" );
063          }
064          final List<Rows> rows = executor.execute( builder.toString() );
065    
066          assertEquals( "Ensuring rows are returned for select",
067              rows.size(), count );
068          assertEquals( "Ensuring two columns returned for select",
069              rows.get( 0 ).getRows().get( 0 ).getColumns().size(), 2 );
070        }
071        finally
072        {
073          delete();
074        }
075      }
076    
077      /** Test executing <code>update</code> statements. */
078      public void testUpdate() throws Exception
079      {
080        insert();
081    
082        try
083        {
084          final BatchQueryExecutor executor =
085            new BatchQueryExecutor( CreateTestObjects.manager );
086          final StringBuilder builder = new StringBuilder();
087          for ( int i = 0; i < total; ++i )
088          {
089            String statement = "update $TABLENAME$ " +
090              "set description='test description modified' " +
091              "where name = '$i$';\n";
092            statement =
093              statement.replaceAll( "\\$TABLENAME\\$", CreateTestObjects.tableName );
094            statement =
095              statement.replaceAll( "\\$i\\$", String.valueOf( i ) );
096            builder.append( statement );
097          }
098          final List<Rows> rows = executor.execute( builder.toString() );
099    
100          assertEquals( "Ensuring rows are returned after update",
101              rows.size(), total );
102          assertEquals( "Ensuring one column returned for row update",
103              rows.get( 0 ).getRows().get( 0 ).getColumns().size(), 1 );
104          assertEquals( "Ensuring update count after update",
105              rows.get( 0 ).getRows().get( 0 ).getColumns().get( 0 ).getContent(), 1 );
106        }
107        finally
108        {
109          delete();
110        }
111      }
112    
113      /** Test specifying <code>maxRows</code> to restrict result set size. */
114      public void testMaxSize() throws Exception
115      {
116        insert();
117    
118        try
119        {
120          final BatchQueryExecutor executor =
121            new BatchQueryExecutor( CreateTestObjects.manager );
122          final int count = 10;
123          final int results = 5;
124          final StringBuilder builder = new StringBuilder();
125    
126          for ( int i = 0; i < results; ++i )
127          {
128            builder.append( "select * from " );
129            builder.append( CreateTestObjects.tableName ).append( ";\n" );
130          }
131          final List<Rows> rows = executor.execute( builder.toString(), count );
132    
133          for ( int i = 0; i < results; ++i )
134          {
135            assertEquals( "Ensuring restricted result sets " + i,
136                rows.get( i ).getRows().size(), count );
137          }
138    
139          assertEquals( "Ensuring proper number of result sets",
140              rows.size(), results );
141          assertEquals( "Ensuring two columns returned for row select",
142              rows.get( 0 ).getRows().get( 0 ).getColumns().size(), 2 );
143        }
144        finally
145        {
146          delete();
147        }
148      }
149    
150      /** Test the {@link TableTypeAnalyser#getNumberOfRows} method. */
151      public void testNumberOfRows() throws Exception
152      {
153        insert();
154        try
155        {
156          TableMetaData metadata = new TableMetaData();
157          metadata.setName( CreateTestObjects.tableName );
158          TableAnalyser analyser = new TableAnalyser( CreateTestObjects.manager );
159          int rows = analyser.getNumberOfRows( metadata );
160          assertTrue( "Ensuring non-zero table row count", rows > 0 );
161        }
162        finally
163        {
164          delete();
165        }
166      }
167    
168      /** Test executing a <code>delete</code> statement. */
169      public void testZDelete() throws Exception
170      {
171        insert();
172        final List<Rows> rows = delete();
173    
174        assertEquals( "Ensuring rows are returned after delete",
175            rows.size(), total );
176        assertEquals( "Ensuring one column returned for row delete",
177            rows.get( 0 ).getRows().get( 0 ).getColumns().size(), 1 );
178        assertEquals( "Ensuring update count after delete",
179            rows.get( 0 ).getRows().get( 0 ).getColumns().get( 0 ).getContent(), 1 );
180      }
181    
182      /** Insert test records into the table. */
183      static List<Rows> insert() throws Exception
184      {
185        final BatchQueryExecutor executor =
186          new BatchQueryExecutor( CreateTestObjects.manager );
187        final StringBuilder builder = new StringBuilder( 512 );
188        for ( int i = 0; i < total; ++i )
189        {
190          String statement = "insert into $TABLENAME$ " +
191            "values ('$i$','test description');\n";
192          statement =
193            statement.replaceAll( "\\$TABLENAME\\$", CreateTestObjects.tableName );
194          statement =
195            statement.replaceAll( "\\$i\\$", String.valueOf( i ) );
196          builder.append( statement ).append( "\n" );
197        }
198    
199        return executor.execute( builder.toString() );
200      }
201    
202      /** Delete the inserted rows from the table. */
203      static List<Rows> delete() throws Exception
204      {
205        final BatchQueryExecutor executor =
206          new BatchQueryExecutor( CreateTestObjects.manager );
207        final StringBuilder builder = new StringBuilder();
208        
209        for ( int i = 0; i < total; ++i )
210        {
211          String statement = "delete from $TABLENAME$ " +
212            "where name = '$i$';\n";
213          statement =
214            statement.replaceAll( "\\$TABLENAME\\$", CreateTestObjects.tableName );
215          statement =
216            statement.replaceAll( "\\$i\\$", String.valueOf( i ) );
217          builder.append( statement );
218        }
219    
220        return executor.execute( builder.toString() );
221      }
222    }