package liquibase.ext.ora.truncate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
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.Assert;
import org.junit.Before;
import org.junit.Test;
public class TruncateChangeTest extends BaseTestCase {
@Before
public void setUp() throws Exception {
changeLogFile = "liquibase/ext/ora/truncate/changelog.test.xml";
BaseTestCase.connectToDB();
cleanDB();
}
@Test
public void getChangeMetaData() {
TruncateChange truncateChange = new TruncateChange();
assertEquals("truncate", ChangeFactory.getInstance().getChangeMetaData(truncateChange).getName());
assertEquals("Truncate", ChangeFactory.getInstance().getChangeMetaData(truncateChange).getDescription());
assertEquals(ChangeMetaData.PRIORITY_DEFAULT, ChangeFactory.getInstance().getChangeMetaData(truncateChange).getPriority());
}
@Test
public void getConfirmationMessage() {
TruncateChange change = new TruncateChange();
change.setTableName("TABLE_NAME");
assertEquals("Table TABLE_NAME truncated", change.getConfirmationMessage());
}
@Test
public void generateStatement() {
TruncateChange change = new TruncateChange();
change.setSchemaName("SCHEMA_NAME");
change.setTableName("TABLE_NAME");
change.setClusterName("CLUSTER_NAME");
change.setPurgeMaterializedViewLog(true);
change.setReuseStorage(true);
Database database = new OracleDatabase();
SqlStatement[] sqlStatements = change.generateStatements(database);
assertEquals(1, sqlStatements.length);
assertTrue(sqlStatements[0] instanceof TruncateStatement);
assertEquals("SCHEMA_NAME", ((TruncateStatement) sqlStatements[0]).getSchemaName());
assertEquals("TABLE_NAME", ((TruncateStatement) sqlStatements[0]).getTableName());
assertEquals("CLUSTER_NAME", ((TruncateStatement) sqlStatements[0]).getClusterName());
assertTrue(((TruncateStatement) sqlStatements[0]).purgeMaterializedViewLog());
assertTrue(((TruncateStatement) sqlStatements[0]).reuseStorage());
}
@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 TABLE LBUSER.truncatetest (id NUMBER(10), name VARCHAR2(50))");
expectedQuery.add("insert into truncatetest (id, name) values (1, 'dgolda')");
expectedQuery.add("TRUNCATE TABLE LBUSER.truncatetest PURGE MATERIALIZED VIEW LOG REUSE STORAGE");
// expectedQuery.add("TRUNCATE TABLE artur.truncatetest PURGE MATERIALIZED VIEW LOG REUSE STORAGE");
int i = 0;
for (ChangeSet changeSet : changeSets) {
for (Change change : changeSet.getChanges()) {
// Change change = changeSet.getChanges().get(0);
Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(change.generateStatements(database)[0], database);
assertEquals(expectedQuery.get(i), sql[0].toSql());
}
i++;
}
}
@Test
public void test() throws Exception {
if (connection == null) {
return;
}
liquiBase.update((String) null);
dbTest();
}
public void dbTest() {
Statement statement;
ResultSet resultSet;
try {
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT * FROM truncatetest");
assertTrue("Table is not empty after truncate.", !resultSet.next());
} catch (SQLException e) {
Assert.fail("dbTest Fail!\n" + e.getMessage());
}
}
}