package liquibase.ext.ora.refreshmaterializedview;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import liquibase.Contexts;
import liquibase.LabelExpression;
import liquibase.change.Change;
import liquibase.change.ChangeFactory;
import liquibase.change.ChangeMetaData;
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 RefreshMaterializedViewTest extends BaseTestCase {
@Before
public void setUp() throws Exception {
changeLogFile = "liquibase/ext/ora/refreshmaterializedview/changelog.test.xml";
connectToDB();
cleanDB();
}
@Test
public void getChangeMetaData() {
RefreshMaterializedViewChange change = new RefreshMaterializedViewChange();
assertEquals("metadata name incorrect", "refreshMaterializedView", ChangeFactory.getInstance().getChangeMetaData(change).getName());
assertEquals("metadata description incorrect", "Refresh Materialized View", ChangeFactory.getInstance().getChangeMetaData(change).getDescription());
assertEquals("metadata priority incorrect", ChangeMetaData.PRIORITY_DEFAULT, ChangeFactory.getInstance().getChangeMetaData(change).getPriority());
}
@Test
public void getConfirmationMessage() {
RefreshMaterializedViewChange change = new RefreshMaterializedViewChange();
change.setViewName("MVIEW_NAME");
assertEquals("Materialized view MVIEW_NAME has been refreshed", change.getConfirmationMessage() );
}
@Test
public void generateStatement() {
RefreshMaterializedViewChange change = new RefreshMaterializedViewChange();
change.setSchemaName("SCHEMA_NAME");
change.setViewName("VIEW_NAME");
change.setAtomicRefresh(Boolean.TRUE);
change.setRefreshType("fast");
SqlStatement[] sqlStatements = change.generateStatements(new OracleDatabase());
assertEquals("Wrong number of statements returned", 1, sqlStatements.length);
assertEquals("Statement of wrong type", RefreshMaterializedViewStatement.class, sqlStatements[0].getClass() );
assertEquals("schema name not copied", "SCHEMA_NAME", ((RefreshMaterializedViewStatement) sqlStatements[0]).getSchemaName());
assertEquals("view name not copied", "VIEW_NAME", ((RefreshMaterializedViewStatement) sqlStatements[0]).getViewName());
assertEquals("atomic refresh not copied", Boolean.TRUE, ((RefreshMaterializedViewStatement) sqlStatements[0]).getAtomicRefresh());
assertEquals("refresh type not copied", "fast", ((RefreshMaterializedViewStatement) sqlStatements[0]).getRefreshType());
}
@Test
public void parseAndGenerate() throws Exception {
if (connection == null) {
return;
}
Database database = liquiBase.getDatabase();
ResourceAccessor resourceAccessor = new ClassLoaderResourceAccessor();
DatabaseChangeLog changeLog = ChangeLogParserFactory.getInstance()
.getParser(changeLogFile, resourceAccessor)
.parse(changeLogFile, new ChangeLogParameters(), resourceAccessor);
liquiBase.checkLiquibaseTables( false, changeLog, new Contexts(), new LabelExpression());
changeLog.validate(database);
List<String> expectedSql = new ArrayList<String>();
expectedSql.add("BEGIN DBMS_MVIEW.REFRESH('TABLE1_MVIEW','?',ATOMIC_REFRESH=>TRUE); END;");
expectedSql.add("BEGIN DBMS_MVIEW.REFRESH('TABLE1_MVIEW','C',ATOMIC_REFRESH=>FALSE); END;");
expectedSql.add("BEGIN DBMS_MVIEW.REFRESH('LIQUIBASE.TABLE1_MVIEW','?',ATOMIC_REFRESH=>FALSE); END;");
List<ChangeSet> changeSets = changeLog.getChangeSets();
assertEquals( "Test is out of sync with the changelog.test.xml file. # of changesets",
6, changeSets.size());
ChangeSet changeSet = changeSets.get(changeSets.size()-1);
assertEquals( "Test is out of sync with the changelog.test.xml file. # of changes in changeset", 3, changeSet.getChanges().size() );
List<String> actualSql = new ArrayList<String>();
for (Change change : changeSet.getChanges()) {
Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(change.generateStatements(database)[0], database);
assertEquals( "Wrong number of SQL statements generated", 1, sql.length );
actualSql.add(sql[0].toSql());
}
assertEquals( "Generated SQL statements incorrect", expectedSql, actualSql );
}
@Test
public void testUpdate() throws Exception {
if (connection == null) {
return;
}
liquiBase.update(new Contexts());
}
}