package liquibase.ext.ora.merge;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import liquibase.change.Change;
import liquibase.change.ChangeFactory;
import liquibase.change.ChangeMetaData;
import liquibase.changelog.ChangeLogIterator;
import liquibase.changelog.ChangeLogParameters;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.database.Database;
import liquibase.database.core.OracleDatabase;
import liquibase.ext.ora.testing.BaseTestCase;
import liquibase.parser.ChangeLogParserFactory;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;
import liquibase.sql.Sql;
import liquibase.sqlgenerator.SqlGeneratorFactory;
import liquibase.statement.SqlStatement;
import org.junit.Before;
import org.junit.Test;
public class MergeChangeTest extends BaseTestCase {
@Before
public void setUp() throws Exception {
changeLogFile = "liquibase/ext/ora/merge/changelog.test.xml";
connectToDB();
cleanDB();
}
@Test
public void test() throws Exception {
if (connection == null) {
return;
}
liquiBase.update((String) null);
}
@Test
public void generateStatement() {
MergeChange change = new MergeChange();
change.setTargetSchemaName("TARGET_SCHEMA_NAME");
change.setTargetTableName("TARGET_TABLE_NAME");
change.setSourceSchemaName("SOURCE_SCHEMA_NAME");
change.setSourceTableName("SOURCE_TABLE_NAME");
change.setInsertColumnsNameList("COL_1,COL_2");
change.setInsertColumnsValueList("VAL_1,VAL2");
change.setUpdateList("COL1=VAL1,COL2=VAL2");
change.setOnCondition("ON_CONDITION");
change.setInsertCondition("INSERT_CONDITION");
change.setDeleteCondition("DELETE_CONDITION");
change.setUpdateCondition("UPDATE_CONDITION");
SqlStatement[] statements = change.generateStatements(new OracleDatabase());
assertEquals(1, statements.length);
MergeStatement statement = (MergeStatement) statements[0];
assertEquals("TARGET_SCHEMA_NAME", statement.getTargetSchemaName());
assertEquals("TARGET_TABLE_NAME", statement.getTargetTableName());
assertEquals("SOURCE_SCHEMA_NAME", statement.getSourceSchemaName());
assertEquals("SOURCE_TABLE_NAME", statement.getSourceTableName());
assertEquals("ON_CONDITION", statement.getOnCondition());
assertEquals("COL_1,COL_2", statement.getInsertColumnsNameList());
assertEquals("VAL_1,VAL2", statement.getInsertColumnsValueList());
assertEquals("COL1=VAL1,COL2=VAL2", statement.getUpdateList());
assertEquals("DELETE_CONDITION", statement.getDeleteCondition());
assertEquals("INSERT_CONDITION", statement.getInsertCondition());
assertEquals("UPDATE_CONDITION", statement.getUpdateCondition());
}
@Test
public void getConfirmationMessage() {
MergeChange change = new MergeChange();
change.setSourceSchemaName("S_SCHEMA_NAME");
change.setSourceTableName("S_TABLE_NAME");
change.setTargetSchemaName("T_SCHEMA_NAME");
change.setTargetTableName("T_TABLE_NAME");
assertEquals("Tables " + change.getSourceTableName() + " & " + change.getTargetTableName() + " merged", change
.getConfirmationMessage());
}
@Test
public void getChangeMetaData() {
MergeChange mergeTablesChange = new MergeChange();
assertEquals("merge", ChangeFactory.getInstance().getChangeMetaData(mergeTablesChange).getName());
assertEquals("Merge", ChangeFactory.getInstance().getChangeMetaData(mergeTablesChange).getDescription());
assertEquals(ChangeMetaData.PRIORITY_DEFAULT, ChangeFactory.getInstance().getChangeMetaData(mergeTablesChange).getPriority());
}
@Test
public void parseAndGenerate() throws Exception {
if (connection == null) {
return;
}
Database database = liquiBase.getDatabase();
ResourceAccessor resourceAccessor = new ClassLoaderResourceAccessor();
ChangeLogParameters changeLogParameters = new ChangeLogParameters();
DatabaseChangeLog changeLog = ChangeLogParserFactory.getInstance().getParser(changeLogFile, resourceAccessor).parse(changeLogFile,
changeLogParameters, resourceAccessor);
changeLog.validate(database);
List<ChangeSet> changeSets = changeLog.getChangeSets();
List<String> expectedQuery = new ArrayList<String>();
expectedQuery.add("MERGE INTO LBUSER.myTable2 USING LBUSER.myTable ON (myTable2.pid=myTable.pid) WHEN MATCHED THEN UPDATE SET myTable2.sales=myTable2.sales+myTable.sales,myTable2.status=myTable.status DELETE WHERE (myTable2.status='OBS') WHEN NOT MATCHED THEN INSERT VALUES(myTable.pid,myTable.sales,'OLD')");
int i = 0;
for (ChangeSet changeSet : changeSets) {
for (Change change : changeSet.getChanges()) {
Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(change.generateStatements(database)[0], database);
if (i == 3) {
assertEquals(expectedQuery.get(0), sql[0].toSql());
}
}
i++;
}
}
}