Changeset 173

Show
Ignore:
Timestamp:
12/19/07 17:01:10 (1 year ago)
Author:
chris
Message:

Test that we can successfully reverse an INSERT change.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • lex/trunk/test/com/qwirx/db/SqlDatabaseTest.java

    r165 r173  
    1313import java.sql.SQLException; 
    1414import java.util.Iterator; 
     15import java.util.List; 
     16import java.util.Map; 
     17import java.util.Set; 
    1518 
    1619import junit.framework.TestCase; 
     
    2225 * @author chris 
    2326 * 
    24  * TODO To change the template for this generated type comment go to 
    25  * Window - Preferences - Java - Code Style - Code Templates 
     27 * Tests the SqlDatabase and SqlChange classes, specifically change tracking. 
    2628 */ 
    2729public class SqlDatabaseTest extends TestCase 
    2830{ 
    2931        private SqlDatabase db; 
     32    private static final String dsn =  
     33        "jdbc:mysql://dev.aidworld.org:3306/test?user=test"; 
    3034         
    3135    public void testDatabasePreparedStatements() throws Exception 
    3236    { 
    3337        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    34         String dsn = "jdbc:mysql://localhost:3306/test?user=test"; 
    3538        // + "&useServerPrepStmts=false"; 
    3639        Connection conn = DriverManager.getConnection(dsn); 
     
    5255        { 
    5356                Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    54                 String dsn = "jdbc:mysql://localhost:3306/test?user=test"; 
    5557        Connection conn = DriverManager.getConnection(dsn); 
    5658                db = new SqlDatabase(conn, "test", "test"); 
     
    8890        private int    logRecordId; 
    8991         
    90         public void getChangeTypeAndId(int xaId)  
     92        private void getChangeTypeAndId(int xaId)  
    9193        throws DatabaseException, SQLException 
    9294        { 
     
    101103        } 
    102104         
    103         public void checkCurrentValues(String query, ChangedRow cr)  
     105        private void assertCurrentValues(String query, ChangedRow cr)  
    104106        throws DatabaseException, SQLException 
    105107        { 
     
    141143        } 
    142144         
    143         public void checkAndRemoveChanges(int rowLogId, ChangedRow cr)  
     145        private void assertChangeLogUpdated(int rowLogId, ChangedRow cr)  
    144146        throws DatabaseException, SQLException 
    145147        { 
     148                List changedValues = cr.getValues(); 
     149                 
    146150                db.prepareSelect( 
    147151                                "SELECT ID, Col_Name, Old_Value, " + 
     
    190194                        rs.getString(3); 
    191195                         
    192                         cr.remove(colName); 
    193                 } 
    194                 db.finish(); 
    195  
    196                 Iterator i = cr.iterator(); 
    197                 if (i.hasNext()) 
    198                 { 
    199                         ChangedValue cv = (ChangedValue)( i.next() ); 
    200                         assertTrue("Expected column change log not found: "+  
    201                                         cv.getName(), false); 
    202                 } 
    203         } 
    204          
    205         private int insertTestRecord() throws DatabaseException, SQLException 
     196                        changedValues.remove(cv); 
     197                } 
     198                 
     199                db.finish(); 
     200 
     201                assertEquals("Expected column change logs not found: " +  
     202                                changedValues.toString(), 0, changedValues.size()); 
     203        } 
     204         
     205        private SqlChange insertTestRecord() throws DatabaseException, SQLException 
    206206        { 
    207207                SqlChange ch = (SqlChange)db.createChange(SqlChange.INSERT,  
     
    216216        // of mysql jdbc when getting column values 
    217217                ch.execute(); 
    218                 getChangeTypeAndId(ch.getId()); 
    219                 return ch.getInsertedRowId(); 
     218                getChangeTypeAndId(ch.getId().intValue()); 
     219                return ch; 
     220        } 
     221         
     222        private void assertEquals(ChangedRow rowA, ChangedRow rowB) 
     223        { 
     224                List fieldsA = rowA.getColumns(); 
     225                 
     226                for (Iterator i = rowB.getColumns().iterator(); i.hasNext();) 
     227                { 
     228                        String colName = (String)i.next(); 
     229                        String valA = rowA.get(colName).getOldValue(); 
     230                        String valB = rowB.get(colName).getOldValue(); 
     231                        if (valA != null && valB == null) 
     232                        { 
     233                                assertEquals(colName, valA, "null"); 
     234                        } 
     235                        assertEquals(colName, valA, valB); 
     236 
     237                        valA = rowA.get(colName).getNewValue(); 
     238                        valB = rowB.get(colName).getNewValue(); 
     239                        if (valA != null && valB == null) 
     240                        { 
     241                                assertEquals(colName, valA, "null"); 
     242                        } 
     243                        assertEquals(colName, valA, valB); 
     244                         
     245                        fieldsA.remove(colName); 
     246                } 
     247                 
     248                assertEquals(fieldsA.toString(), 0, fieldsA.size()); 
    220249        } 
    221250         
    222251        public void testInsert() throws Exception  
    223252        { 
    224                 insertTestRecord(); 
     253                SqlChange insert = insertTestRecord(); 
    225254                assertEquals("INSERT", changeType); 
    226255                 
     
    239268                db.finish(); 
    240269                 
    241                 ChangedRow cr = new ChangedRow(); 
    242                 cr.put(new ChangedValue("ID",     null, "1")); 
    243                 cr.put(new ChangedValue("t_int",  null, "1234")); 
    244                 cr.put(new ChangedValue("t_str",  null, "Hello World")); 
    245                 cr.put(new ChangedValue("t_txt",  null, "A somewhat longer string")); 
    246         cr.put(new ChangedValue("t_flt",  null, "3.14")); 
    247                 cr.put(new ChangedValue("t_dat",  null, "1979-01-07")); // happy birthday 
    248                 cr.put(new ChangedValue("t_dtm",  null, "1979-01-07 06:35:00.0")); 
    249         cr.put(new ChangedValue("t_dat2", null, "0000-00-00")); 
    250                  
    251                 checkCurrentValues("SELECT * FROM logtest", cr); 
    252                 checkAndRemoveChanges(rowLogId, cr); 
     270                ChangedRow expectedRowChange = new ChangedRow(new ChangedValue[]{ 
     271                        new ChangedValue("ID",     null, "1"), 
     272                        new ChangedValue("t_int",  null, "1234"), 
     273                        new ChangedValue("t_str",  null, "Hello World"), 
     274                        new ChangedValue("t_txt",  null, "A somewhat longer string"), 
     275                new ChangedValue("t_flt",  null, "3.14"), 
     276                        new ChangedValue("t_dat",  null, "1979-01-07"), // happy birthday 
     277                        new ChangedValue("t_dtm",  null, "1979-01-07 06:35:00.0"), 
     278                new ChangedValue("t_dat2", null, "0000-00-00"), 
     279                }); 
     280                 
     281                assertCurrentValues("SELECT * FROM logtest", expectedRowChange); 
     282                assertChangeLogUpdated(rowLogId, expectedRowChange); 
     283                 
     284                List rows = insert.getChangedRows(); 
     285                assertEquals(1, rows.size()); 
     286                expectedRowChange = (ChangedRow)rows.get(0); 
     287                assertChangeLogUpdated(rowLogId, expectedRowChange); 
     288                 
     289                SqlChange delete = insert.reverse(); 
     290                assertEquals(SqlChange.DELETE, delete.getType()); 
     291                assertEquals("ID = 1", delete.getConditions()); 
     292                delete.execute(); 
     293                rows = delete.getChangedRows(); 
     294                assertEquals(1, rows.size()); 
     295                ChangedRow actualReverseRowChange = (ChangedRow)rows.get(0); 
     296                 
     297                ChangedRow expectedReverseRowChange = new ChangedRow( 
     298                                new ChangedValue[]{ 
     299                        new ChangedValue("ID",     "1", null), 
     300                        new ChangedValue("t_int",  "1234", null), 
     301                        new ChangedValue("t_str",  "Hello World", null), 
     302                        new ChangedValue("t_txt",  "A somewhat longer string", null), 
     303                new ChangedValue("t_flt",  "3.14", null), 
     304                        new ChangedValue("t_dat",  "1979-01-07", null), // happy birthday 
     305                        new ChangedValue("t_dtm",  "1979-01-07 06:35:00.0", null), 
     306                new ChangedValue("t_dat2", "0000-00-00", null), 
     307                }); 
     308                assertEquals(expectedReverseRowChange, expectedRowChange.reverse()); 
     309        assertEquals(expectedReverseRowChange, actualReverseRowChange); 
     310        assertEquals(0, db.getSingleInteger("SELECT COUNT(1) FROM logtest")); 
    253311        } 
    254312         
    255313        public void testUpdate() throws Exception 
    256314        { 
    257                 int testId = insertTestRecord(); 
    258  
    259                 Change ch = db.createChange(SqlChange.UPDATE,  
     315                SqlChange testInsert = insertTestRecord(); 
     316                int testId = testInsert.getInsertedRowId(); 
     317 
     318                Change testUpdate = db.createChange(SqlChange.UPDATE,  
    260319                                "logtest", "t_int = 1234"); 
    261                 ch.setInt   ("t_int", 23456); 
    262                 ch.setString("t_str", "Hello Again"); 
    263                 ch.setString("t_txt", "Another longer string"); 
    264                 ch.setString("t_flt", "2.81718"); // will be truncated 
    265                 ch.setString("t_dat", "1980-10-15"); // happy birthday 
    266                 ch.setString("t_dtm", "1980-10-15 12:34:56.0"); 
    267                 ch.execute(); 
    268                  
    269                 getChangeTypeAndId(ch.getId()); 
     320                testUpdate.setInt   ("t_int", 23456); 
     321                testUpdate.setString("t_str", "Hello Again"); 
     322                testUpdate.setString("t_txt", "Another longer string"); 
     323                testUpdate.setString("t_flt", "2.81718"); // will be truncated 
     324                testUpdate.setString("t_dat", "1980-10-15"); // happy birthday 
     325                testUpdate.setString("t_dtm", "1980-10-15 12:34:56.0"); 
     326                testUpdate.execute(); 
     327                 
     328                getChangeTypeAndId(testUpdate.getId().intValue()); 
    270329                assertEquals("UPDATE", changeType); 
    271330 
     
    293352                db.finish(); 
    294353 
    295                 ChangedRow cr = new ChangedRow(); 
    296                 cr.put(new ChangedValue("t_int",  
     354                ChangedRow expectedRowChange = new ChangedRow(); 
     355                expectedRowChange.put(new ChangedValue("t_int",  
    297356                                "1234",                      
    298357                                "23456")); 
    299                 cr.put(new ChangedValue("t_str",  
     358                expectedRowChange.put(new ChangedValue("t_str",  
    300359                                "Hello World", 
    301360                                "Hello Again")); 
    302                 cr.put(new ChangedValue("t_txt",  
     361                expectedRowChange.put(new ChangedValue("t_txt",  
    303362                                "A somewhat longer string", 
    304363                                "Another longer string")); 
    305         cr.put(new ChangedValue("t_flt", "3.14", "2.82")); 
    306                 cr.put(new ChangedValue("t_dat",  
     364        expectedRowChange.put(new ChangedValue("t_flt", "3.14", "2.82")); 
     365                expectedRowChange.put(new ChangedValue("t_dat",  
    307366                                "1979-01-07", "1980-10-15")); 
    308                 cr.put(new ChangedValue("t_dtm",  
     367                expectedRowChange.put(new ChangedValue("t_dtm",  
    309368                                "1979-01-07 06:35:00.0", "1980-10-15 12:34:56.0")); 
    310369 
    311                 checkCurrentValues("SELECT * FROM logtest", cr); 
    312                 checkAndRemoveChanges(rowLogId, cr); 
     370                assertCurrentValues("SELECT * FROM logtest", expectedRowChange); 
     371                assertChangeLogUpdated(rowLogId, expectedRowChange); 
    313372        } 
    314373 
     
    321380                ch.execute(); 
    322381                 
    323                 getChangeTypeAndId(ch.getId()); 
     382                getChangeTypeAndId(ch.getId().intValue()); 
    324383                assertEquals("DELETE", changeType); 
    325384 
     
    365424                db.finish(); 
    366425                 
    367                 checkAndRemoveChanges(rowLogId, cr); 
     426                assertChangeLogUpdated(rowLogId, cr); 
    368427        } 
    369428 
     
    382441            ch.execute(); 
    383442 
    384             getChangeTypeAndId(ch.getId()); 
     443            getChangeTypeAndId(ch.getId().intValue()); 
    385444            assertEquals("UPDATE", changeType); 
    386445 
     
    424483                "1979-01-07 06:35:00.0", "1980-10-15 12:34:56.0")); 
    425484 
    426             checkCurrentValues("SELECT * FROM logtest", cr); 
    427             checkAndRemoveChanges(rowLogId, cr); 
     485            assertCurrentValues("SELECT * FROM logtest", cr); 
     486            assertChangeLogUpdated(rowLogId, cr); 
    428487        } 
    429488         
     
    431490        { 
    432491        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    433         String dsn = "jdbc:mysql://localhost:3306/test?" + 
    434                         "zeroDateTimeBehaviour=convertToNull&noDatetimeStringSync=true"; 
    435         Connection conn = DriverManager.getConnection(dsn, "test", ""); 
     492                         
     493        Connection conn = DriverManager.getConnection(dsn +  
     494                "zeroDateTimeBehaviour=convertToNull" + 
     495                "&noDatetimeStringSync=true", "test", ""); 
    436496         
    437497        try