/* * * * Copyright (c) 2017 OBiBa. All rights reserved. * * * * This program and the accompanying materials * * are made available under the terms of the GNU Public License v3.0. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.obiba.runtime.upgrade.support; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.runners.MockitoJUnitRunner; import org.obiba.runtime.Version; import org.obiba.runtime.upgrade.UpgradeException; import org.obiba.runtime.upgrade.UpgradeStep; import org.obiba.runtime.upgrade.VersionModifier; import static java.util.Arrays.asList; import static org.mockito.Matchers.any; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class DefaultUpgradeManagerTest { private DefaultUpgradeManager defaultUpgradeManager; @Before public void setUp() throws Exception { defaultUpgradeManager = new DefaultUpgradeManager(); defaultUpgradeManager.setCurrentVersionProvider(versionModifier(1, 5, 0)); defaultUpgradeManager.setRuntimeVersionProvider(versionModifier(2, 1, 0)); defaultUpgradeManager.setNewInstallationDetectionStrategy(notANewInstallation()); } @Test public void when_no_upgrade_step__do_nothing() throws UpgradeException { defaultUpgradeManager.executeUpgrade(); } @Test public void when_many_upgradeSetp__execute_in_correct_order() throws UpgradeException { UpgradeStep upgrade1 = upgradeStep(new Version(1, 6, 0)); UpgradeStep upgrade2 = upgradeStep(new Version(2, 0, 0)); UpgradeStep upgrade3 = upgradeStep(new Version(1, 7, 0)); defaultUpgradeManager.setUpgradeSteps(asList(upgrade1, upgrade2, upgrade3)); InOrder inOrder = inOrder(upgrade1, upgrade2, upgrade3); defaultUpgradeManager.executeUpgrade(); inOrder.verify(upgrade1).execute(any(Version.class)); inOrder.verify(upgrade3).execute(any(Version.class)); inOrder.verify(upgrade2).execute(any(Version.class)); } @Test public void when_disabled_step__dont_execute_disabled_steps() throws UpgradeException { UpgradeStep upgrade1 = upgradeStep(new Version(1, 6, 0)); UpgradeStep upgrade2 = upgradeStepDisabled(new Version(2, 0, 0)); UpgradeStep upgrade3 = upgradeStep(new Version(1, 7, 0)); defaultUpgradeManager.setUpgradeSteps(asList(upgrade1, upgrade2, upgrade3)); defaultUpgradeManager.executeUpgrade(); verify(upgrade2, never()).execute(any(Version.class)); } @Test public void when_upgrade_step__older_than_migration_start_version__ignore_these_steps() throws UpgradeException { UpgradeStep upgrade1 = upgradeStep(new Version(1, 6, 0)); UpgradeStep upgrade2 = upgradeStepDisabled(new Version(1, 7, 0)); defaultUpgradeManager.setUpgradeSteps(asList(upgrade1, upgrade2)); defaultUpgradeManager.executeUpgrade(); verify(upgrade1).execute(any(Version.class)); verify(upgrade2, never()).execute(any(Version.class)); } private UpgradeStep upgradeStep(Version version) { UpgradeStep upgrade1 = mock(UpgradeStep.class); when(upgrade1.getAppliesTo()).thenReturn(version); when(upgrade1.mustBeApplied(any(Version.class), any(Version.class))).thenReturn(true); return upgrade1; } private UpgradeStep upgradeStepDisabled(Version version) { UpgradeStep upgradeStep = upgradeStep(version); when(upgradeStep.mustBeApplied(any(Version.class), any(Version.class))).thenReturn(false); return upgradeStep; } private VersionModifier versionModifier(int major, int minor, int micro) { return new VersionModifier() { @Override public void setVersion(Version version) { } @Override public Version getVersion() { return new Version(major, minor, micro); } }; } private NewInstallationDetectionStrategy notANewInstallation() { return runtimeVersionProvider -> false; } }