package liquibase.parser.core.formattedsql;
import liquibase.change.Change;
import liquibase.change.core.EmptyChange;
import liquibase.change.core.RawSQLChange;
import liquibase.changelog.ChangeLogParameters;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.resource.ResourceAccessor;
import liquibase.test.JUnitResourceAccessor;
import liquibase.util.StringUtils;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import static org.junit.Assert.*;
public class FormattedSqlChangeLogParserTest {
private static final String VALID_CHANGELOG = "--liquibase formatted sql\n" +
"\n" +
"--changeset nvoxland:1\n" +
"select * from table1;\n" +
"\n" +
"--changeset nvoxland:2 (stripComments:false splitStatements:false endDelimiter:X runOnChange:true runAlways:true context:y dbms:mysql runInTransaction:false failOnError:false)\n" +
"create table table1 (\n" +
" id int primary key\n" +
");\n" +
"\n" +
"--rollback delete from table1;\n"+
"--rollback drop table table1;\n"+
"\n" +
"--ChangeSet nvoxland:3\n" +
"create table table2 (\n" +
" id int primary key\n" +
");\n" +
"create table table3 (\n" +
" id int primary key\n" +
");\n"+
"--rollback drop table table2;\n"+
"--ChangeSet alwyn:4\n" +
"select (*) from table2;\n" +
"--rollback not required\n" +
"--ChangeSet nvoxland:5\n" +
"select (*) from table2;\n" +
"--rollback not required\n"
;
private static final String INVALID_CHANGELOG = "select * from table1";
@Test
public void supports() throws Exception {
assertTrue(new MockFormattedSqlChangeLogParser(VALID_CHANGELOG).supports("asdf.sql", new JUnitResourceAccessor()));
assertFalse(new MockFormattedSqlChangeLogParser(INVALID_CHANGELOG).supports("asdf.sql", new JUnitResourceAccessor()));
}
@Test
public void parse() throws Exception {
DatabaseChangeLog changeLog = new MockFormattedSqlChangeLogParser(VALID_CHANGELOG).parse("asdf.sql", new ChangeLogParameters(), new JUnitResourceAccessor());
assertEquals("asdf.sql", changeLog.getLogicalFilePath());
assertEquals(5, changeLog.getChangeSets().size());
assertEquals("nvoxland", changeLog.getChangeSets().get(0).getAuthor());
assertEquals("1", changeLog.getChangeSets().get(0).getId());
assertEquals(1, changeLog.getChangeSets().get(0).getChanges().size());
assertEquals("select * from table1;", ((RawSQLChange) changeLog.getChangeSets().get(0).getChanges().get(0)).getSql());
assertNull(((RawSQLChange) changeLog.getChangeSets().get(0).getChanges().get(0)).getEndDelimiter());
assertTrue(((RawSQLChange) changeLog.getChangeSets().get(0).getChanges().get(0)).isSplittingStatements());
assertTrue(((RawSQLChange) changeLog.getChangeSets().get(0).getChanges().get(0)).isStrippingComments());
assertFalse(changeLog.getChangeSets().get(0).isAlwaysRun());
assertFalse(changeLog.getChangeSets().get(0).isRunOnChange());
assertTrue(changeLog.getChangeSets().get(0).isRunInTransaction());
assertNull(changeLog.getChangeSets().get(0).getContexts());
assertNull(changeLog.getChangeSets().get(0).getDbmsSet());
assertEquals("nvoxland", changeLog.getChangeSets().get(1).getAuthor());
assertEquals("2", changeLog.getChangeSets().get(1).getId());
assertEquals(1, changeLog.getChangeSets().get(1).getChanges().size());
assertEquals("create table table1 (\n" +
" id int primary key\n" +
");", ((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).getSql());
assertEquals("X", ((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).getEndDelimiter());
assertFalse(((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).isSplittingStatements());
assertFalse(((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).isStrippingComments());
assertEquals("X", ((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).getEndDelimiter());
assertFalse(((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).isSplittingStatements());
assertFalse(((RawSQLChange) changeLog.getChangeSets().get(1).getChanges().get(0)).isStrippingComments());
assertTrue(changeLog.getChangeSets().get(1).isAlwaysRun());
assertTrue(changeLog.getChangeSets().get(1).isRunOnChange());
assertFalse(changeLog.getChangeSets().get(1).isRunInTransaction());
assertEquals("y", StringUtils.join(changeLog.getChangeSets().get(1).getContexts(), ","));
assertEquals("mysql", StringUtils.join(changeLog.getChangeSets().get(1).getDbmsSet(), ","));
assertEquals(1, changeLog.getChangeSets().get(1).getRollBackChanges().length);
assertEquals("delete from table1;\n" +
"drop table table1;", ((RawSQLChange) changeLog.getChangeSets().get(1).getRollBackChanges()[0]).getSql());
assertEquals("nvoxland", changeLog.getChangeSets().get(2).getAuthor());
assertEquals("3", changeLog.getChangeSets().get(2).getId());
assertEquals(1, changeLog.getChangeSets().get(2).getChanges().size());
assertEquals("create table table2 (\n" +
" id int primary key\n" +
");\n" +
"create table table3 (\n" +
" id int primary key\n" +
");", ((RawSQLChange) changeLog.getChangeSets().get(2).getChanges().get(0)).getSql());
assertNull(((RawSQLChange) changeLog.getChangeSets().get(2).getChanges().get(0)).getEndDelimiter());
assertTrue(((RawSQLChange) changeLog.getChangeSets().get(2).getChanges().get(0)).isSplittingStatements());
assertTrue(((RawSQLChange) changeLog.getChangeSets().get(2).getChanges().get(0)).isStrippingComments());
assertEquals(1, changeLog.getChangeSets().get(2).getRollBackChanges().length);
assertTrue(changeLog.getChangeSets().get(2).getRollBackChanges()[0] instanceof RawSQLChange);
assertEquals("drop table table2;", ((RawSQLChange) changeLog.getChangeSets().get(2).getRollBackChanges()[0]).getSql());
assertEquals("alwyn", changeLog.getChangeSets().get(3).getAuthor());
assertEquals("4", changeLog.getChangeSets().get(3).getId());
assertEquals(1, changeLog.getChangeSets().get(3).getRollBackChanges().length);
assertTrue(changeLog.getChangeSets().get(3).getRollBackChanges()[0] instanceof EmptyChange);
assertEquals("nvoxland", changeLog.getChangeSets().get(4).getAuthor());
assertEquals("5", changeLog.getChangeSets().get(4).getId());
assertEquals(1, changeLog.getChangeSets().get(4).getRollBackChanges().length);
assertTrue(changeLog.getChangeSets().get(4).getRollBackChanges()[0] instanceof EmptyChange);
}
private static class MockFormattedSqlChangeLogParser extends FormattedSqlChangeLogParser {
private String changeLog;
public MockFormattedSqlChangeLogParser(String changeLog) {
this.changeLog = changeLog;
}
@Override
protected InputStream openChangeLogFile(String physicalChangeLogLocation, ResourceAccessor resourceAccessor) throws IOException {
return new ByteArrayInputStream(changeLog.getBytes());
}
}
}