Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Added a few unit tests for conflict resolution
  • Loading branch information
chenson42 committed Mar 26, 2012
1 parent e18d220 commit e2f7c68
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 1 deletion.
Expand Up @@ -161,6 +161,7 @@ public void write(CsvData data) {

} catch (IgnoreBatchException ex) {
rollback();
throw ex;
}

}
Expand Down
Expand Up @@ -45,6 +45,9 @@ public void needsResolved(DatabaseWriter writer, CsvData data, LoadStatus loadSt
throw ex;
}
} else {
if (!conflict.isResolveRowOnly()) {
throw new IgnoreBatchException();
}
}
break;
case IGNORE:
Expand Down Expand Up @@ -74,6 +77,9 @@ public void needsResolved(DatabaseWriter writer, CsvData data, LoadStatus loadSt
conflict, writer, data))) {
performFallbackToUpdate(writer, data, conflict.isResolveChangesOnly());
} else {
if (!conflict.isResolveRowOnly()) {
throw new IgnoreBatchException();
}
}
break;
case IGNORE:
Expand All @@ -94,6 +100,10 @@ public void needsResolved(DatabaseWriter writer, CsvData data, LoadStatus loadSt
if (resolvedData != null) {
if (!resolvedData.isIgnoreRow()) {
writer.delete(data, false);
} else {
if (!conflict.isResolveRowOnly()) {
throw new IgnoreBatchException();
}
}
}
default:
Expand Down
Expand Up @@ -71,6 +71,11 @@ protected void writeData(CsvData data, String[] expectedValues) {
protected String getTestTable() {
return TEST_TABLE;
}

protected void writeData(CsvData... data) {
Table table = buildSourceTable(TEST_TABLE, TEST_KEYS, TEST_COLUMNS);
writeData(new TableCsvData(table, data));
}

protected void writeData(CsvData data, String[] expectedValues, String[] columnNames) {
writeData(data, expectedValues, getTestTable(), TEST_KEYS, columnNames);
Expand Down Expand Up @@ -106,6 +111,8 @@ protected long writeData(IDataWriter writer, TableCsvData... datas) {
writer.end(tableCsvData.table);
}
writer.end(batch, false);
} catch (IgnoreBatchException ex) {
writer.end(batch, false);
} catch (Exception ex) {
writer.end(batch, true);
if (!isErrorExpected()) {
Expand Down
Expand Up @@ -75,15 +75,99 @@ public void testUpdateDetectTimestampNewerWins() {

@Test
public void testInsertDetectTimestampNewerWins() {
Conflict setting = new Conflict();
setting.setDetectType(DetectConflict.USE_TIMESTAMP);
setting.setDetectExpression("time_value");
setting.setResolveRowOnly(true);
setting.setResolveChangesOnly(false);
setting.setResolveType(ResolveConflict.NEWER_WINS);
writerSettings.setDefaultConflictSetting(setting);

String id = getNextId();
String[] originalValues = massageExpectectedResultsForDialect(new String[] { id,
"string2", "string not null2", "char2", "char not null2", "2007-01-02 03:20:10.0",
"2012-03-12 07:00:00.0", "0", "47", "67.89", "-0.0747663" });

CsvData data = new CsvData(DataEventType.INSERT, originalValues);
writeData(data, originalValues);

String[] updateShouldNotBeApplied = Arrays.copyOf(originalValues, originalValues.length);
updateShouldNotBeApplied[2] = "updated string";
updateShouldNotBeApplied[6] = "2012-03-12 06:00:00.0";
data = new CsvData(DataEventType.INSERT, massageExpectectedResultsForDialect(updateShouldNotBeApplied));
writeData(data, originalValues);

String[] updateShouldBeApplied = Arrays.copyOf(originalValues, originalValues.length);
updateShouldBeApplied[2] = "string3";
updateShouldBeApplied[6] = "2012-03-12 08:00:00.0";
data = new CsvData(DataEventType.INSERT, massageExpectectedResultsForDialect(updateShouldBeApplied));
writeData(data, updateShouldBeApplied);
}

@Test
public void testUpdateDetectVersionIgnoreRow() {
public void testUpdateDetectVersionNewWins() {
Conflict setting = new Conflict();
setting.setDetectType(DetectConflict.USE_VERSION);
setting.setDetectExpression("integer_value");
setting.setResolveRowOnly(true);
setting.setResolveChangesOnly(false);
setting.setResolveType(ResolveConflict.NEWER_WINS);
writerSettings.setDefaultConflictSetting(setting);

String id = getNextId();
String[] originalValues = massageExpectectedResultsForDialect(new String[] { id,
"string2", "string not null2", "char2", "char not null2", "2007-01-02 03:20:10.0",
"2012-03-12 07:00:00.0", "0", "47", "67.89", "-0.0747663" });

CsvData data = new CsvData(DataEventType.INSERT, originalValues);
writeData(data, originalValues);

String[] updateShouldNotBeApplied = Arrays.copyOf(originalValues, originalValues.length);
updateShouldNotBeApplied[2] = "updated string";
updateShouldNotBeApplied[8] = "46";
data = new CsvData(DataEventType.UPDATE, massageExpectectedResultsForDialect(updateShouldNotBeApplied));
writeData(data, originalValues);


String[] updateShouldBeApplied = Arrays.copyOf(originalValues, originalValues.length);
updateShouldBeApplied[2] = "string3";
updateShouldBeApplied[8] = "48";
data = new CsvData(DataEventType.UPDATE, massageExpectectedResultsForDialect(updateShouldBeApplied));
writeData(data, updateShouldBeApplied);
}

@Test
public void testUpdateDetectVersionIgnoreBatch() {
Conflict setting = new Conflict();
setting.setDetectType(DetectConflict.USE_VERSION);
setting.setDetectExpression("integer_value");
setting.setResolveRowOnly(false);
setting.setResolveChangesOnly(false);
setting.setResolveType(ResolveConflict.NEWER_WINS);
writerSettings.setDefaultConflictSetting(setting);

String id = getNextId();
String[] originalValues = massageExpectectedResultsForDialect(new String[] { id,
"string2", "string not null2", "char2", "char not null2", "2007-01-02 03:20:10.0",
"2012-03-12 07:00:00.0", "0", "2", "67.89", "-0.0747663" });

CsvData data = new CsvData(DataEventType.INSERT, originalValues);
writeData(data, originalValues);

long before = countRows(TEST_TABLE);

String[] updateShouldNotBeApplied = Arrays.copyOf(originalValues, originalValues.length);
updateShouldNotBeApplied[2] = "updated string";
updateShouldNotBeApplied[8] = "1";
CsvData update = new CsvData(DataEventType.UPDATE, massageExpectectedResultsForDialect(updateShouldNotBeApplied));
String newId = getNextId();
CsvData newInsert = new CsvData(DataEventType.INSERT, massageExpectectedResultsForDialect(new String[] { newId,
"string2", "string not null2", "char2", "char not null2", "2007-01-02 03:20:10.0",
"2012-03-12 07:00:00.0", "0", "2", "67.89", "-0.0747663" }));

writeData(update, newInsert);

Assert.assertEquals(before, countRows(TEST_TABLE));

}

Expand Down Expand Up @@ -129,6 +213,16 @@ public void testDeleteDetectTimestampIgnoreBatch() {
@Test
public void testDeleteDetectTimestampNewerWins() {

}

@Test
public void testInsertDetectTimestampManual () {

}

@Test
public void testUpdateDetectChangedDataManual () {

}

@Test
Expand Down
@@ -1,5 +1,6 @@
package org.jumpmind.db.sql;

import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
Expand Down Expand Up @@ -28,6 +29,16 @@ public static <T> T getObjectFromResultSet(ResultSet rs, Class<T> clazz) throws
result = (T) rs.getTimestamp(1);
} else if (String.class.isAssignableFrom(clazz)) {
result = (T) rs.getString(1);
} else if (Long.class.isAssignableFrom(clazz)) {
result = (T)new Long(rs.getLong(1));
} else if (Integer.class.isAssignableFrom(clazz)) {
result = (T)new Integer(rs.getInt(1));
} else if (Float.class.isAssignableFrom(clazz)) {
result = (T)new Float(rs.getFloat(1));
} else if (Double.class.isAssignableFrom(clazz)) {
result = (T)new Double(rs.getDouble(1));
} else if (BigDecimal.class.isAssignableFrom(clazz)) {
result = (T)rs.getBigDecimal(1);
} else {
result = (T) rs.getObject(1);
}
Expand Down

0 comments on commit e2f7c68

Please sign in to comment.