package io.ebean.dbmigration.model; import io.ebean.dbmigration.migration.ChangeSet; import io.ebean.dbmigration.migration.DropColumn; import io.ebean.dbmigration.migration.Migration; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class PendingDropsTest { static final MigrationVersion V1_1 = MigrationVersion.parse("1.1"); static final MigrationVersion V1_2 = MigrationVersion.parse("1.2"); @Test public void test_add() throws Exception { PendingDrops pendingDrops = new PendingDrops(); pendingDrops.add(V1_1, new ChangeSet()); } @Test public void test_appliedDropsFor_when_matchesSome_then_removesMatched() throws Exception { PendingDrops pendingDrops = new PendingDrops(); DropColumn one = col("one"); DropColumn two = col("two"); pendingDrops.add(V1_1, changeSet(one, two)); pendingDrops.add(V1_1, changeSet("three", "four")); assertThat(pendingDrops.testGetEntryFor(V1_1).list).asList().hasSize(2); ChangeSet applied = changeSet("two"); applied.setDropsFor("1.1"); assertThat(pendingDrops.appliedDropsFor(applied)).isFalse(); assertThat(pendingDrops.testGetEntryFor(V1_1).list).asList().hasSize(2); assertThat(pendingDrops.testGetEntryFor(V1_1).list.get(0).getChangeSetChildren()).asList().containsExactly(one); } @Test public void test_appliedDropsFor_when_matchesAll_then_removesChangeSet() throws Exception { PendingDrops pendingDrops = new PendingDrops(); DropColumn one = col("one"); DropColumn two = col("two"); pendingDrops.add(V1_1, changeSet(one, two)); pendingDrops.add(V1_1, changeSet("three", "four")); assertThat(pendingDrops.testGetEntryFor(V1_1).list).asList().hasSize(2); ChangeSet applied = changeSet("two", "one"); applied.setDropsFor("1.1"); assertThat(pendingDrops.appliedDropsFor(applied)).isFalse(); assertThat(pendingDrops.testGetEntryFor(V1_1).list).asList().hasSize(1); } @Test public void test_appliedDropsFor_when_changeSetSuppressed_isIgnored() throws Exception { PendingDrops pendingDrops = new PendingDrops(); DropColumn one = col("one"); ChangeSet changeSet = changeSet(one); changeSet.setSuppressDropsForever(true); pendingDrops.add(V1_1, changeSet); ChangeSet applied = changeSet("one"); applied.setDropsFor("1.1"); assertThat(pendingDrops.appliedDropsFor(applied)).isFalse(); assertThat(pendingDrops.testGetEntryFor(V1_1).list).asList().hasSize(1); } @Test public void test_pendingDrops() throws Exception { PendingDrops pendingDrops = new PendingDrops(); assertThat(pendingDrops.pendingDrops()).isEmpty(); pendingDrops.add(V1_1, new ChangeSet()); pendingDrops.add(V1_2, new ChangeSet()); assertThat(pendingDrops.pendingDrops()).containsExactly("1.1", "1.2"); } @Test public void test_pendingDrops_when_suppressForever() throws Exception { PendingDrops pendingDrops = new PendingDrops(); assertThat(pendingDrops.pendingDrops()).isEmpty(); pendingDrops.add(V1_1, newSuppressForeverChangeSet()); assertThat(pendingDrops.pendingDrops()).isEmpty(); pendingDrops.add(V1_2, new ChangeSet()); assertThat(pendingDrops.pendingDrops()).containsExactly("1.2"); } @Test public void test_pendingDrops_when_both() throws Exception { PendingDrops pendingDrops = new PendingDrops(); assertThat(pendingDrops.pendingDrops()).isEmpty(); pendingDrops.add(V1_1, newSuppressForeverChangeSet()); pendingDrops.add(V1_1, new ChangeSet()); assertThat(pendingDrops.pendingDrops()).containsExactly("1.1"); pendingDrops.add(V1_2, new ChangeSet()); assertThat(pendingDrops.pendingDrops()).containsExactly("1.1", "1.2"); } @Test public void test_migrationForVersion() throws Exception { PendingDrops pendingDrops = new PendingDrops(); ChangeSet applyDropChangeSet1 = new ChangeSet(); ChangeSet applyDropChangeSet2 = new ChangeSet(); MigrationVersion version = V1_1; pendingDrops.add(version, applyDropChangeSet1); pendingDrops.add(version, applyDropChangeSet2); Migration migration = pendingDrops.migrationForVersion("1_1"); assertThat(migration.getChangeSet()).containsExactly(applyDropChangeSet1, applyDropChangeSet2); assertThat(pendingDrops.testContainsEntryFor(version)).isFalse(); } @Test public void test_migrationForVersion_when_both() throws Exception { PendingDrops pendingDrops = new PendingDrops(); ChangeSet applyDropChangeSet = new ChangeSet(); MigrationVersion version = V1_1; pendingDrops.add(version, newSuppressForeverChangeSet()); pendingDrops.add(version, applyDropChangeSet); Migration migration = pendingDrops.migrationForVersion("1_1"); assertThat(migration.getChangeSet()).containsExactly(applyDropChangeSet); assertThat(pendingDrops.testContainsEntryFor(version)).isTrue(); } @Test public void test_migrationForVersion_when_next() throws Exception { PendingDrops pendingDrops = new PendingDrops(); MigrationVersion version = V1_1; ChangeSet applyDropChangeSet = new ChangeSet(); pendingDrops.add(version, newSuppressForeverChangeSet()); pendingDrops.add(version, applyDropChangeSet); Migration migration = pendingDrops.migrationForVersion("next"); assertThat(migration.getChangeSet()).containsExactly(applyDropChangeSet); assertThat(pendingDrops.testContainsEntryFor(version)).isTrue(); } @Test(expected = IllegalArgumentException.class) public void test_migrationForVersion_when_next_isSuppressForever() throws Exception { PendingDrops pendingDrops = new PendingDrops(); pendingDrops.add(V1_1, newSuppressForeverChangeSet()); pendingDrops.migrationForVersion("next"); } @Test(expected = IllegalArgumentException.class) public void test_migrationForVersion_when_doesNotExist() throws Exception { PendingDrops pendingDrops = new PendingDrops(); pendingDrops.migrationForVersion("1_1"); } @Test(expected = IllegalArgumentException.class) public void test_migrationForVersion_when_next_doesNotExist() throws Exception { PendingDrops pendingDrops = new PendingDrops(); pendingDrops.migrationForVersion("next"); } @Test public void test_registerPendingHistoryDropColumns() throws Exception { TDModelContainer modelContainer = new TDModelContainer(); DropColumn drop1 = col("one"); drop1.setWithHistory(Boolean.TRUE); DropColumn drop2 = col("two"); ChangeSet changeSet = changeSet(drop1, drop2); PendingDrops pendingDrops = new PendingDrops(); pendingDrops.add(V1_1, changeSet); pendingDrops.registerPendingHistoryDropColumns(modelContainer); assertThat(modelContainer.drops).containsExactly(changeSet); } class TDModelContainer extends ModelContainer { List<ChangeSet> drops = new ArrayList<>(); @Override public void registerPendingHistoryDropColumns(ChangeSet changeSet) { drops.add(changeSet); } } private ChangeSet newSuppressForeverChangeSet() { ChangeSet changeSet = new ChangeSet(); changeSet.setSuppressDropsForever(Boolean.TRUE); return changeSet; } static ChangeSet changeSet(String... colNames) { return EntryTest.changeSet(colNames); } static ChangeSet changeSet(DropColumn... drops) { ChangeSet changeSet = new ChangeSet(); for (DropColumn dropColumn : drops) { changeSet.getChangeSetChildren().add(dropColumn); } return changeSet; } static DropColumn col(String colName) { return EntryTest.col(colName); } }