package liquibase.ext.ora.createtrigger;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
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.After;
import org.junit.Before;
import org.junit.Test;
public class CreateTriggerTest extends BaseTestCase {
@Before
public void setUp() throws Exception {
changeLogFile = "liquibase/ext/ora/createtrigger/changelog.test.xml";
connectToDB();
cleanDB();
}
@Test
public void getChangeMetaData() {
CreateTriggerChange createTriggerChange = new CreateTriggerChange();
assertEquals("createTrigger", ChangeFactory.getInstance().getChangeMetaData(createTriggerChange).getName());
assertEquals("Create Trigger", ChangeFactory.getInstance().getChangeMetaData(createTriggerChange).getDescription());
assertEquals(ChangeMetaData.PRIORITY_DEFAULT, ChangeFactory.getInstance().getChangeMetaData(createTriggerChange).getPriority());
}
@Test
public void getConfirmationMessage() {
CreateTriggerChange change = new CreateTriggerChange();
change.setTriggerName("TRIGGER_NAME");
assertEquals("Trigger TRIGGER_NAME has been created", change.getConfirmationMessage());
}
@Test
public void generateStatement() {
CreateTriggerChange change = new CreateTriggerChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setColumnNames("COLUMN_NAMES");
change.setTablespace("TABLESPACE_NAME");
change.setAfterBeforeInsteadOf("AFTER_BEFORE_INSTEADOF");
change.setNestedTableColumn("NESTED_TABLE_COLUMN");
change.setProcedure("POCEDURE");
change.setTriggerName("TRIGGER_NAME");
change.setViewName("VIEW_NAME");
change.setWhenCondition("WHEN_CONDITION");
change.setUpdate(true);
change.setUpdateOf(true);
change.setReplace(true);
change.setDelete(true);
change.setForEachRow(true);
change.setInsert(true);
Database database = new OracleDatabase();
SqlStatement[] sqlStatements = change.generateStatements(database);
assertEquals(1, sqlStatements.length);
assertTrue(sqlStatements[0] instanceof CreateTriggerStatement);
CreateTriggerStatement sqlStatement = (CreateTriggerStatement) sqlStatements[0];
assertEquals("SCHEMA_NAME", sqlStatement.getSchemaName());
assertEquals("TABLE_NAME", sqlStatement.getTableName());
assertEquals("COLUMN_NAMES", sqlStatement.getColumnNames());
assertEquals("TABLESPACE_NAME", sqlStatement.getTablespace());
assertEquals("AFTER_BEFORE_INSTEADOF", sqlStatement.getAfterBeforeInsteadOf());
assertEquals("NESTED_TABLE_COLUMN", sqlStatement.getNestedTableColumn());
assertEquals("POCEDURE", sqlStatement.getProcedure());
assertEquals("TRIGGER_NAME", sqlStatement.getTriggerName());
assertEquals("VIEW_NAME", sqlStatement.getViewName());
assertEquals("WHEN_CONDITION", sqlStatement.getWhenCondition());
assertTrue(sqlStatement.getUpdate());
assertTrue(sqlStatement.getUpdateOf());
assertTrue(sqlStatement.getReplace());
assertTrue(sqlStatement.getDelete());
assertTrue(sqlStatement.getForEachRow());
assertTrue(sqlStatement.getInsert());
}
@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("CREATE TRIGGER zuiolTrigger before INSERT ON TriggerTest FOR EACH ROW DECLARE v_username varchar2(10); BEGIN SELECT pierwsza INTO v_username FROM TriggerTest; :new.created_by := v_username; END;");
int i = 0;
for (ChangeSet changeSet : changeSets) {
for (Change change : changeSet.getChanges()) {
Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(change.generateStatements(database)[0], database);
if (i == 2) {
assertEquals(expectedQuery.get(0), sql[0].toSql());
}
}
i++;
}
}
@Test
public void test() throws Exception {
if (connection == null) {
return;
}
liquiBase.update((String) null);
}
}