package liquibase.parser.core.xml; import liquibase.change.Change; import liquibase.change.core.AddColumnChange; import liquibase.change.core.CreateTableChange; import liquibase.change.core.RawSQLChange; import liquibase.change.custom.CustomChangeWrapper; import liquibase.change.custom.ExampleCustomSqlChange; import liquibase.changelog.ChangeSet; import liquibase.changelog.DatabaseChangeLog; import liquibase.changelog.ChangeLogParameters; import liquibase.exception.ChangeLogParseException; import liquibase.precondition.core.OrPrecondition; import liquibase.precondition.core.PreconditionContainer; import liquibase.test.JUnitResourceAccessor; import static org.junit.Assert.*; import org.junit.Test; public class XMLChangeLogSAXParserTest { @Test public void simpleChangeLog() throws Exception { DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/parser/core/xml/simpleChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); assertEquals("liquibase/parser/core/xml/simpleChangeLog.xml", changeLog.getLogicalFilePath()); assertEquals("liquibase/parser/core/xml/simpleChangeLog.xml", changeLog.getPhysicalFilePath()); assertEquals(0, changeLog.getPreconditions().getNestedPreconditions().size()); assertEquals(1, changeLog.getChangeSets().size()); ChangeSet changeSet = changeLog.getChangeSets().get(0); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals("liquibase/parser/core/xml/simpleChangeLog.xml", changeSet.getFilePath()); assertEquals("Some comments go here", changeSet.getComments()); Change change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); } @Test public void multiChangeSetChangeLog() throws Exception { DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/parser/core/xml/multiChangeSetChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); assertEquals("liquibase/parser/core/xml/multiChangeSetChangeLog.xml", changeLog.getLogicalFilePath()); assertEquals("liquibase/parser/core/xml/multiChangeSetChangeLog.xml", changeLog.getPhysicalFilePath()); assertEquals(0, changeLog.getPreconditions().getNestedPreconditions().size()); assertEquals(4, changeLog.getChangeSets().size()); // change 0 ChangeSet changeSet = changeLog.getChangeSets().get(0); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals("liquibase/parser/core/xml/multiChangeSetChangeLog.xml", changeSet.getFilePath()); assertNull(changeSet.getComments()); assertFalse(changeSet.shouldAlwaysRun()); assertFalse(changeSet.shouldRunOnChange()); Change change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); // change 1 changeSet = changeLog.getChangeSets().get(1); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("2", changeSet.getId()); assertEquals(2, changeSet.getChanges().size()); assertEquals("liquibase/parser/core/xml/multiChangeSetChangeLog.xml", changeSet.getFilePath()); assertEquals("Testing add column", changeSet.getComments()); assertTrue(changeSet.shouldAlwaysRun()); assertTrue(changeSet.shouldRunOnChange()); assertEquals(2, changeSet.getRollBackChanges().length); assertTrue(changeSet.getRollBackChanges()[0] instanceof RawSQLChange); assertTrue(changeSet.getRollBackChanges()[1] instanceof RawSQLChange); change = changeSet.getChanges().get(0); assertEquals("addColumn", change.getChangeMetaData().getName()); assertTrue(change instanceof AddColumnChange); change = changeSet.getChanges().get(1); assertEquals("addColumn", change.getChangeMetaData().getName()); assertTrue(change instanceof AddColumnChange); // change 2 changeSet = changeLog.getChangeSets().get(2); assertEquals("bob", changeSet.getAuthor()); assertEquals("3", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals("liquibase/parser/core/xml/multiChangeSetChangeLog.xml", changeSet.getFilePath()); assertNull(changeSet.getComments()); assertFalse(changeSet.shouldAlwaysRun()); assertFalse(changeSet.shouldRunOnChange()); change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); // change 3 changeSet = changeLog.getChangeSets().get(3); assertEquals(1, changeSet.getChanges().size()); change = changeSet.getChanges().get(0); assertTrue(change instanceof CustomChangeWrapper); CustomChangeWrapper wrapper = (CustomChangeWrapper) change; wrapper.generateStatements(null); assertTrue(wrapper.getCustomChange() instanceof ExampleCustomSqlChange); ExampleCustomSqlChange exChg = (ExampleCustomSqlChange) wrapper.getCustomChange(); assertEquals("table", exChg.getTableName()); assertEquals("column", exChg.getColumnName()); } @Test public void logicalPathChangeLog() throws Exception { DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/parser/core/xml/logicalPathChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); assertEquals("liquibase/parser-logical/xml/logicalPathChangeLog.xml", changeLog.getLogicalFilePath()); assertEquals("liquibase/parser/core/xml/logicalPathChangeLog.xml", changeLog.getPhysicalFilePath()); assertEquals(0, changeLog.getPreconditions().getNestedPreconditions().size()); assertEquals(1, changeLog.getChangeSets().size()); assertEquals("liquibase/parser-logical/xml/logicalPathChangeLog.xml", changeLog.getChangeSets().get(0).getFilePath()); } @Test public void preconditionsChangeLog() throws Exception { DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/parser/core/xml/preconditionsChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); assertEquals("liquibase/parser/core/xml/preconditionsChangeLog.xml", changeLog.getLogicalFilePath()); assertEquals("liquibase/parser/core/xml/preconditionsChangeLog.xml", changeLog.getPhysicalFilePath()); assertNotNull(changeLog.getPreconditions()); assertEquals(2, changeLog.getPreconditions().getNestedPreconditions().size()); assertEquals("runningAs", changeLog.getPreconditions().getNestedPreconditions().get(0).getName()); assertEquals("or", changeLog.getPreconditions().getNestedPreconditions().get(1).getName()); assertEquals("dbms", ((OrPrecondition) changeLog.getPreconditions().getNestedPreconditions().get(1)).getNestedPreconditions().get(0).getName()); assertEquals("dbms", ((OrPrecondition) changeLog.getPreconditions().getNestedPreconditions().get(1)).getNestedPreconditions().get(1).getName()); assertEquals(1, changeLog.getChangeSets().size()); } @Test public void testNestedChangeLog() throws Exception { final String nestedFileName = "liquibase/parser/core/xml/nestedChangeLog.xml"; DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/parser/core/xml/nestedChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); nestedFileAssertions(changeLog, nestedFileName); } @Test public void nestedRelativeChangeLog() throws Exception { final String nestedFileName = "liquibase/parser/core/xml/nestedRelativeChangeLog.xml"; DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse(nestedFileName, new ChangeLogParameters(), new JUnitResourceAccessor()); nestedFileAssertions(changeLog, nestedFileName); } private void nestedFileAssertions(DatabaseChangeLog changeLog, String nestedFileName) { assertEquals(nestedFileName, changeLog.getLogicalFilePath()); assertEquals(nestedFileName, changeLog.getPhysicalFilePath()); assertEquals(1, changeLog.getPreconditions().getNestedPreconditions().size()); assertEquals(0, ((PreconditionContainer) changeLog.getPreconditions().getNestedPreconditions().get(0)).getNestedPreconditions().size()); assertEquals(3, changeLog.getChangeSets().size()); // change 0 ChangeSet changeSet = changeLog.getChangeSets().get(0); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals(nestedFileName, changeSet.getFilePath()); Change change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); assertEquals("employee", ((CreateTableChange) change).getTableName()); // change 1 (from included simple change log) changeSet = changeLog.getChangeSets().get(1); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals("liquibase/parser/core/xml/simpleChangeLog.xml", changeSet.getFilePath()); change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); assertEquals("person", ((CreateTableChange) change).getTableName()); // change 2 changeSet = changeLog.getChangeSets().get(2); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("2", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals(nestedFileName, changeSet.getFilePath()); change = changeSet.getChanges().get(0); assertEquals("addColumn", change.getChangeMetaData().getName()); assertTrue(change instanceof AddColumnChange); assertEquals("employee", ((AddColumnChange) change).getTableName()); } @Test public void doubleNestedChangeLog() throws Exception { final String doubleNestedFileName = "liquibase/parser/core/xml/doubleNestedChangeLog.xml"; final String nestedFileName = "liquibase/parser/core/xml/nestedChangeLog.xml"; DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse(doubleNestedFileName, new ChangeLogParameters(), new JUnitResourceAccessor()); doubleNestedFileAssertions(doubleNestedFileName, nestedFileName, changeLog); } @Test public void doubleNestedRelativeChangeLog() throws Exception { final String doubleNestedFileName = "liquibase/parser/core/xml/doubleNestedRelativeChangeLog.xml"; final String nestedFileName = "liquibase/parser/core/xml/nestedRelativeChangeLog.xml"; DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse(doubleNestedFileName, new ChangeLogParameters(), new JUnitResourceAccessor()); doubleNestedFileAssertions(doubleNestedFileName, nestedFileName, changeLog); } private void doubleNestedFileAssertions(final String doubleNestedFileName, final String nestedFileName, DatabaseChangeLog changeLog) { assertEquals(doubleNestedFileName, changeLog.getLogicalFilePath()); assertEquals(doubleNestedFileName, changeLog.getPhysicalFilePath()); assertEquals(1, changeLog.getPreconditions().getNestedPreconditions().size()); PreconditionContainer nested = (PreconditionContainer) changeLog.getPreconditions().getNestedPreconditions().get(0); assertEquals(1, nested.getNestedPreconditions().size()); assertEquals(0, ((PreconditionContainer) nested.getNestedPreconditions().get(0)).getNestedPreconditions().size()); assertEquals(4, changeLog.getChangeSets().size()); // change 0 ChangeSet changeSet = changeLog.getChangeSets().get(0); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals(doubleNestedFileName, changeSet.getFilePath()); Change change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); assertEquals("partner", ((CreateTableChange) change).getTableName()); // change 1 from nestedChangeLog changeSet = changeLog.getChangeSets().get(1); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals(nestedFileName, changeSet.getFilePath()); change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); assertEquals("employee", ((CreateTableChange) change).getTableName()); // change 2 (from included simple change log) changeSet = changeLog.getChangeSets().get(2); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("1", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals("liquibase/parser/core/xml/simpleChangeLog.xml", changeSet.getFilePath()); change = changeSet.getChanges().get(0); assertEquals("createTable", change.getChangeMetaData().getName()); assertTrue(change instanceof CreateTableChange); assertEquals("person", ((CreateTableChange) change).getTableName()); // change 3 from nested Change log changeSet = changeLog.getChangeSets().get(3); assertEquals("nvoxland", changeSet.getAuthor()); assertEquals("2", changeSet.getId()); assertEquals(1, changeSet.getChanges().size()); assertEquals(nestedFileName, changeSet.getFilePath()); change = changeSet.getChanges().get(0); assertEquals("addColumn", change.getChangeMetaData().getName()); assertTrue(change instanceof AddColumnChange); assertEquals("employee", ((AddColumnChange) change).getTableName()); } @Test public void missingChangeLog() throws Exception { try { @SuppressWarnings("unused") DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/changelog/parser/xml/missingChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); } catch (Exception e) { assertTrue(e instanceof ChangeLogParseException); assertEquals("liquibase/changelog/parser/xml/missingChangeLog.xml does not exist", e.getMessage()); } } @Test public void malformedChangeLog() throws Exception { try { DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse("liquibase/parser/core/xml/malformedChangeLog.xml", new ChangeLogParameters(), new JUnitResourceAccessor()); } catch (Exception e) { assertTrue(e instanceof ChangeLogParseException); assertTrue(e.getMessage().startsWith("Error parsing line")); } } }