package liquibase.changelog;
import liquibase.Contexts;
import liquibase.RuntimeEnvironment;
import liquibase.changelog.filter.ChangeSetFilterResult;
import liquibase.changelog.filter.ContextChangeSetFilter;
import liquibase.changelog.filter.DbmsChangeSetFilter;
import liquibase.changelog.visitor.ChangeSetVisitor;
import liquibase.database.Database;
import liquibase.database.core.MySQLDatabase;
import static org.junit.Assert.*;
import liquibase.exception.LiquibaseException;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ChangeLogIteratorTest {
private DatabaseChangeLog changeLog;
@Before
public void setUp() {
changeLog = new DatabaseChangeLog();
changeLog.addChangeSet(new ChangeSet("1", "nvoxland", false, false, "/path/to/changelog", "test1", "mysql", null));
changeLog.addChangeSet(new ChangeSet("2", "nvoxland", false, false, "/path/to/changelog", "test1", "oracle", null));
changeLog.addChangeSet(new ChangeSet("3", "nvoxland", false, false, "/path/to/changelog", "test2", "mysql", null));
changeLog.addChangeSet(new ChangeSet("4", "nvoxland", false, false, "/path/to/changelog", null, null, null));
changeLog.addChangeSet(new ChangeSet("5", "nvoxland", false, false, "/path/to/changelog", null, "mysql", null));
changeLog.addChangeSet(new ChangeSet("6", "nvoxland", false, false, "/path/to/changelog", "test2", null, null));
}
@Test
public void runChangeSet_emptyFiltersIterator() throws Exception {
TestChangeSetVisitor testChangeLogVisitor = new TestChangeSetVisitor();
ChangeLogIterator iterator = new ChangeLogIterator(changeLog);
iterator.run(testChangeLogVisitor, new RuntimeEnvironment(null, null, null));
assertEquals(6, testChangeLogVisitor.visitedChangeSets.size());
}
@Test
public void runChangeSet_singleFilterIterator() throws Exception {
TestChangeSetVisitor testChangeLogVisitor = new TestChangeSetVisitor();
ChangeLogIterator iterator = new ChangeLogIterator(changeLog, new ContextChangeSetFilter(new Contexts("test1")));
iterator.run(testChangeLogVisitor, new RuntimeEnvironment(null, null, null));
assertEquals(4, testChangeLogVisitor.visitedChangeSets.size());
}
@Test
public void runChangeSet_doubleFilterIterator() throws Exception {
TestChangeSetVisitor testChangeLogVisitor = new TestChangeSetVisitor();
ChangeLogIterator iterator = new ChangeLogIterator(changeLog, new ContextChangeSetFilter(new Contexts("test1")), new DbmsChangeSetFilter(new MySQLDatabase()));
iterator.run(testChangeLogVisitor, new RuntimeEnvironment(null, null, null));
assertEquals(3, testChangeLogVisitor.visitedChangeSets.size());
assertEquals("1", testChangeLogVisitor.visitedChangeSets.get(0).getId());
assertEquals("4", testChangeLogVisitor.visitedChangeSets.get(1).getId());
assertEquals("5", testChangeLogVisitor.visitedChangeSets.get(2).getId());
}
@Test
public void runChangeSet_reverseVisitor() throws Exception {
TestChangeSetVisitor testChangeLogVisitor = new ReverseChangeSetVisitor();
ChangeLogIterator iterator = new ChangeLogIterator(changeLog, new ContextChangeSetFilter(new Contexts("test1")), new DbmsChangeSetFilter(new MySQLDatabase()));
iterator.run(testChangeLogVisitor, new RuntimeEnvironment(null, null, null));
assertEquals(3, testChangeLogVisitor.visitedChangeSets.size());
assertEquals("5", testChangeLogVisitor.visitedChangeSets.get(0).getId());
assertEquals("4", testChangeLogVisitor.visitedChangeSets.get(1).getId());
assertEquals("1", testChangeLogVisitor.visitedChangeSets.get(2).getId());
}
private static class TestChangeSetVisitor implements ChangeSetVisitor {
public List<ChangeSet> visitedChangeSets = new ArrayList<ChangeSet>();
@Override
public Direction getDirection() {
return ChangeSetVisitor.Direction.FORWARD;
}
@Override
public void visit(ChangeSet changeSet, DatabaseChangeLog databaseChangeLog, Database database, Set<ChangeSetFilterResult> filterResults) throws LiquibaseException {
visitedChangeSets.add(changeSet);
}
}
private static class ReverseChangeSetVisitor extends TestChangeSetVisitor {
@Override
public Direction getDirection() {
return ChangeSetVisitor.Direction.REVERSE;
}
}
}