package liquibase.change.core;
import junit.framework.Assert;
import static junit.framework.Assert.fail;
import liquibase.change.AbstractChangeTest;
import liquibase.database.core.MockDatabase;
import liquibase.exception.RollbackImpossibleException;
import liquibase.exception.UnsupportedChangeException;
import liquibase.exception.LiquibaseException;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.DeleteStatement;
import liquibase.statement.core.InsertOrUpdateStatement;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by IntelliJ IDEA.
* User: bassettt
* Date: Dec 1, 2009
* Time: 9:29:52 PM
* To change this template use File | Settings | File Templates.
*/
public class LoadUpdateDataChangeTest extends AbstractChangeTest {
LoadUpdateDataChange refactoring ;
@Before
public void setUp() throws Exception {
refactoring = new LoadUpdateDataChange();
}
public void getRefactoringName() throws Exception {
assertEquals("Smart Load Data", refactoring.getChangeMetaData().getDescription());
}
public void generateStatement() throws Exception {
MockDatabase database = new MockDatabase();
LoadUpdateDataChange change = new LoadUpdateDataChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setPrimaryKey("name");
change.setFile("liquibase/change/core/sample.data1.csv");
change.setResourceAccessor(new ClassLoaderResourceAccessor());
SqlStatement[] statements = change.generateStatements(database);
SqlStatement[] sqlStatements = change.generateStatements(new MockDatabase());
assertEquals(2, sqlStatements.length);
assertTrue(sqlStatements[0] instanceof InsertOrUpdateStatement);
assertEquals("SCHEMA_NAME", ((InsertOrUpdateStatement) sqlStatements[0]).getSchemaName());
assertEquals("TABLE_NAME", ((InsertOrUpdateStatement) sqlStatements[0]).getTableName());
assertEquals("name", ((InsertOrUpdateStatement) sqlStatements[0]).getPrimaryKey());
}
public void getConfirmationMessage() throws Exception {
LoadUpdateDataChange refactoring = new LoadUpdateDataChange();
refactoring.setTableName("TABLE_NAME");
refactoring.setFile("FILE_NAME");
assertEquals("Data loaded from FILE_NAME into TABLE_NAME", refactoring.getConfirmationMessage());
}
// Proves that LoadUpdateDataChange creates InsertOrUpdateStatements
@Test
public void getStatements() throws Exception {
MockDatabase database = new MockDatabase();
LoadUpdateDataChange change = new LoadUpdateDataChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setFile("liquibase/change/core/sample.data1.csv");
change.setResourceAccessor(new ClassLoaderResourceAccessor());
SqlStatement[] statements = change.generateStatements(database);
assertNotNull(statements);
assertEquals(InsertOrUpdateStatement.class,statements[0].getClass());
}
@Test
public void generateSql(){
MockDatabase database = new MockDatabase();
LoadUpdateDataChange change = new LoadUpdateDataChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setFile("liquibase/change/core/sample.data1.csv");
change.setResourceAccessor(new ClassLoaderResourceAccessor());
SqlStatement[] statements = change.generateStatements(database);
assertNotNull(statements);
assertEquals(InsertOrUpdateStatement.class,statements[0].getClass());
}
@Test
public void primaryKey() throws LiquibaseException {
LoadUpdateDataChange change = new LoadUpdateDataChange();
String primaryKey = "myPrimaryKey";
change.setPrimaryKey(primaryKey);
assertEquals(primaryKey, change.getPrimaryKey());
}
@Test
public void primaryKeyNullThrowsException() {
LoadUpdateDataChange change = new LoadUpdateDataChange();
try
{
change.setPrimaryKey(null);
fail("setPrimaryKey did not throw InvalidArgumentException as expected.");
}
catch(LiquibaseException e)
{
}
}
@Test
public void getWhereClause() throws LiquibaseException {
MockDatabase database = new MockDatabase();
LoadUpdateDataChange change = new LoadUpdateDataChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setFile("liquibase/change/core/sample.data1.csv");
change.setResourceAccessor(new ClassLoaderResourceAccessor());
change.setPrimaryKey("name");
SqlStatement[] statements = change.generateStatements(database);
// private String getWhereClause(InsertOrUpdateStatement insertOrUpdateStatement, Database database)
Object[] args ;
String result ;
args = new Object[] { statements[0], database };
result = (String)invokePrivateMethod(change,"getWhereClause",args);
assertEquals("name = 'Bob Johnson'",result.trim());
args = new Object[] { statements[1], database };
result = (String)invokePrivateMethod(change,"getWhereClause",args);
assertEquals("name = 'John Doe'",result.trim());
}
@Test
public void generateRollbacksForData1CSV() throws UnsupportedChangeException, RollbackImpossibleException, LiquibaseException {
MockDatabase database = new MockDatabase();
LoadUpdateDataChange change = new LoadUpdateDataChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setFile("liquibase/change/core/sample.data1.csv");
change.setResourceAccessor(new ClassLoaderResourceAccessor());
change.setPrimaryKey("name");
SqlStatement[] statements = change.generateRollbackStatements(database);
assertNotNull(statements);
assertEquals(DeleteStatement.class,statements[0].getClass());
DeleteStatement delete ;
delete = (DeleteStatement)statements[0];
assertEquals( "name = 'Bob Johnson'", delete.getWhereClause().trim());
delete = (DeleteStatement)statements[1];
assertEquals( "name = 'John Doe'", delete.getWhereClause().trim());
}
@Override
public void generateCheckSum() throws Exception {
LoadUpdateDataChange refactoring = new LoadUpdateDataChange();
refactoring.setSchemaName("SCHEMA_NAME");
refactoring.setTableName("TABLE_NAME");
refactoring.setFile("liquibase/change/core/sample.data1.csv");
refactoring.setResourceAccessor(new ClassLoaderResourceAccessor());
String md5sum1 = refactoring.generateCheckSum().toString();
refactoring.setFile("liquibase/change/core/sample.data2.csv");
String md5sum2 = refactoring.generateCheckSum().toString();
assertTrue(!md5sum1.equals(md5sum2));
assertEquals(md5sum2, refactoring.generateCheckSum().toString());
}
@Override
public void isSupported() throws Exception {
//TODO: To change body of overridden methods use File | Settings | File Templates.
}
@Override
public void validate() throws Exception {
//TODO: To change body of overridden methods use File | Settings | File Templates.
}
public static Object invokePrivateMethod (Object o, String methodName, Object[] params) {
// Check we have valid arguments...
Assert.assertNotNull(o);
Assert.assertNotNull(methodName);
Assert.assertNotNull(params);
// Go and find the private method...
final Method methods[] = o.getClass().getDeclaredMethods();
for (int i = 0; i < methods.length; ++i) {
if (methodName.equals(methods[i].getName())) {
try {
methods[i].setAccessible(true);
return methods[i].invoke(o, params);
}
catch (IllegalAccessException ex) {
Assert.fail ("IllegalAccessException accessing " + methodName);
}
catch (InvocationTargetException ite) {
Assert.fail ("InvocationTargetException accessing " + methodName);
}
}
}
Assert.fail ("Method '" + methodName +"' not found");
return null;
}
}