package liquibase.changelog.visitor;
import liquibase.change.ColumnConfig;
import liquibase.change.core.CreateTableChange;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.RanChangeSet;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.sdk.database.MockDatabase;
import liquibase.exception.SetupException;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import liquibase.database.Database;
import liquibase.exception.ValidationErrors;
public class ValidatingVisitorTest {
private ChangeSet changeSet1;
private ChangeSet changeSet2;
@Before
public void setup() {
changeSet1 = new ChangeSet("1", "testAuthor", false, false, "path/changelog", null, null, null);
changeSet2 = new ChangeSet("2", "testAuthor", false, false, "path/changelog", null, null, null);
}
@Test
public void visit_successful() throws Exception {
CreateTableChange change1 = new CreateTableChange();
change1.setTableName("table1");
ColumnConfig column1 = new ColumnConfig();
change1.addColumn(column1);
column1.setName("col1");
column1.setType("int");
CreateTableChange change2 = new CreateTableChange();
change2.setTableName("table2");
ColumnConfig column2 = new ColumnConfig();
change2.addColumn(column2);
column2.setName("col2");
column2.setType("int");
changeSet1.addChange(change1);
changeSet2.addChange(change2);
ValidatingVisitor handler = new ValidatingVisitor(new ArrayList<RanChangeSet>());
handler.visit(changeSet1, new DatabaseChangeLog(), new MockDatabase(), null);
handler.visit(changeSet2, new DatabaseChangeLog(), new MockDatabase(), null);
assertTrue(handler.validationPassed());
}
@Test
public void visit_setupException() throws Exception {
changeSet1.addChange(new CreateTableChange() {
@Override
public void finishInitialization() throws SetupException {
throw new SetupException("Test message");
}
});
ValidatingVisitor handler = new ValidatingVisitor(new ArrayList<RanChangeSet>());
handler.visit(changeSet1, new DatabaseChangeLog(), null, null);
assertEquals(1, handler.getSetupExceptions().size());
assertEquals("Test message", handler.getSetupExceptions().get(0).getMessage());
assertFalse(handler.validationPassed());
}
@Test
public void visit_duplicate() throws Exception {
ValidatingVisitor handler = new ValidatingVisitor(new ArrayList<RanChangeSet>());
handler.visit(changeSet1, new DatabaseChangeLog(), null, null);
handler.visit(changeSet1, new DatabaseChangeLog(), null, null);
assertEquals(1, handler.getDuplicateChangeSets().size());
assertFalse(handler.validationPassed());
}
@Test
public void visit_validateError() throws Exception {
changeSet1.addChange(new CreateTableChange() {
@Override
public ValidationErrors validate(Database database) {
ValidationErrors changeValidationErrors = new ValidationErrors();
changeValidationErrors.addError("Test message");
return changeValidationErrors;
}
});
List<RanChangeSet> ran = new ArrayList<RanChangeSet>();
ValidatingVisitor handler = new ValidatingVisitor(ran);
handler.visit(changeSet1, new DatabaseChangeLog(), null, null);
assertEquals(1, handler.getValidationErrors().getErrorMessages().size());
assertTrue(handler.getValidationErrors().getErrorMessages().get(0).startsWith("Test message"));
assertFalse(handler.validationPassed());
}
@Test
public void visit_torunOnly() throws Exception {
changeSet1.addChange(new CreateTableChange() {
@Override
public ValidationErrors validate(Database database) {
ValidationErrors changeValidationErrors = new ValidationErrors();
changeValidationErrors.addError("Test message");
return changeValidationErrors;
}
});
List<RanChangeSet> ran = new ArrayList<RanChangeSet>();
ran.add(new RanChangeSet(changeSet1));
ValidatingVisitor handler = new ValidatingVisitor(ran);
handler.visit(changeSet1, new DatabaseChangeLog(), null, null);
assertEquals(0, handler.getSetupExceptions().size());
assertTrue(handler.validationPassed());
}
}