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>© 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 }