Skip to content

Commit

Permalink
TRUNK-5817 add wrapper for the DatabaseUpdater class to support mocki…
Browse files Browse the repository at this point in the history
…ng without PowerMock
  • Loading branch information
WolfSchlegel committed Aug 4, 2020
1 parent 37465a3 commit 0a5f9fe
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* <li>to decouple the org.openmrs.liquibase.ChangeLogDetective class from the
* org.openmrs.util.DatabaseUpdater class
* <li>to support integration testing of the org.openmrs.liquibase.ChangeLogDetective class with
* MariaDB
* the H2 database.
*
* @since 2.4
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.web.filter.update;

import java.util.List;
import org.openmrs.liquibase.LiquibaseProvider;
import org.openmrs.util.DatabaseUpdater;

public class DatabaseUpdaterWrapper {
public List<DatabaseUpdater.OpenMRSChangeSet> getUnrunDatabaseChanges( LiquibaseProvider liquibaseProvider) throws Exception {
return DatabaseUpdater.getUnrunDatabaseChanges( liquibaseProvider );
}

public boolean isLocked() {
return DatabaseUpdater.isLocked();
}

public boolean updatesRequired() throws Exception {
return DatabaseUpdater.updatesRequired();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

import java.util.List;
import org.openmrs.liquibase.LiquibaseProvider;
import org.openmrs.util.DatabaseUpdater;
import org.openmrs.util.DatabaseUpdater.OpenMRSChangeSet;
import org.openmrs.util.DatabaseUpdaterLiquibaseProvider;
import org.openmrs.web.filter.StartupFilter;
Expand All @@ -33,11 +32,13 @@ public class UpdateFilterModel {

private LiquibaseProvider liquibaseProvider;

private DatabaseUpdaterWrapper databaseUpdaterWrapper;

/**
* Default constructor that sets up some of the properties
*/
public UpdateFilterModel() {
this(new DatabaseUpdaterLiquibaseProvider());
this(new DatabaseUpdaterLiquibaseProvider(), new DatabaseUpdaterWrapper());
log.debug("executing default constructor...");
}

Expand All @@ -46,17 +47,18 @@ public UpdateFilterModel() {
*
* @param liquibaseProvider a Liquibase provider
*/
public UpdateFilterModel(LiquibaseProvider liquibaseProvider) {
public UpdateFilterModel(LiquibaseProvider liquibaseProvider, DatabaseUpdaterWrapper databaseUpdaterWrapper) {
log.debug("executing non-default constructor...");
this.liquibaseProvider = liquibaseProvider;
this.databaseUpdaterWrapper = databaseUpdaterWrapper;

updateChanges();

try {
if (changes != null && !changes.isEmpty()) {
updateRequired = true;
} else {
updateRequired = DatabaseUpdater.updatesRequired();
updateRequired = databaseUpdaterWrapper.updatesRequired();
}
}
catch (Exception e) {
Expand All @@ -71,11 +73,11 @@ public UpdateFilterModel(LiquibaseProvider liquibaseProvider) {
public void updateChanges() {
log.debug("executing updateChanges()...");
try {
changes = DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
changes = databaseUpdaterWrapper.getUnrunDatabaseChanges(liquibaseProvider);

// not sure why this is necessary...
if (changes == null && DatabaseUpdater.isLocked()) {
changes = DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
if (changes == null && databaseUpdaterWrapper.isLocked()) {
changes = databaseUpdaterWrapper.getUnrunDatabaseChanges(liquibaseProvider);
}
}
catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,9 @@
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openmrs.liquibase.LiquibaseProvider;
import org.openmrs.util.DatabaseUpdater;
import org.openmrs.util.DatabaseUpdater.OpenMRSChangeSet;
import org.openmrs.util.DatabaseUpdaterLiquibaseProvider;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
Expand All @@ -34,139 +28,126 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
* Tests {@link UpdateFilterModel}.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(DatabaseUpdater.class)
@PowerMockIgnore({ "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*", "org.w3c.dom.*" })
public class UpdateFilterModelTest {

private DatabaseUpdaterLiquibaseProvider liquibaseProvider;
private DatabaseUpdaterWrapper databaseUpdaterWrapper;

private UpdateFilterModel model;

@Before
public void setUp() {
liquibaseProvider = new DatabaseUpdaterLiquibaseProvider();
PowerMockito.mockStatic(DatabaseUpdater.class);
databaseUpdaterWrapper = mock( DatabaseUpdaterWrapper.class );
}

@Test
public void createUpdateFilterModel_shouldrequireAnUpdateAndSetChangesToUnrunDatabaseChangesIfChangesAreNonEmpty()
throws Exception {
List<OpenMRSChangeSet> changes = Arrays.asList(mock(OpenMRSChangeSet.class));

when(DatabaseUpdater.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(DatabaseUpdater.isLocked()).thenReturn(false);
when(databaseUpdaterWrapper.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(databaseUpdaterWrapper.isLocked()).thenReturn(false);

model = new UpdateFilterModel(liquibaseProvider);
model = new UpdateFilterModel(liquibaseProvider, databaseUpdaterWrapper);

assertTrue("should require an update", model.updateRequired);
assertThat(model.changes, is(changes));

PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
PowerMockito.verifyStatic(DatabaseUpdater.class, never());
DatabaseUpdater.updatesRequired();
verify( databaseUpdaterWrapper, times(1)).getUnrunDatabaseChanges( liquibaseProvider );
verify( databaseUpdaterWrapper, never()).updatesRequired();
}

@Test
public void createUpdateFilterModel_shouldRequiredAnUpdateIfChangesAreEmptyButDatabaseUpdaterDoesRequireAnUpdate()
throws Exception {
List<OpenMRSChangeSet> changes = new ArrayList<>();

when(DatabaseUpdater.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(DatabaseUpdater.isLocked()).thenReturn(false);
when(DatabaseUpdater.updatesRequired()).thenReturn(true);
when(databaseUpdaterWrapper.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(databaseUpdaterWrapper.isLocked()).thenReturn(false);
when(databaseUpdaterWrapper.updatesRequired()).thenReturn(true);

model = new UpdateFilterModel(liquibaseProvider);
model = new UpdateFilterModel(liquibaseProvider, databaseUpdaterWrapper);

assertTrue("should require an update", model.updateRequired);
assertThat(model.changes, is(empty()));

PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.updatesRequired();

verify( databaseUpdaterWrapper, times(1)).getUnrunDatabaseChanges( liquibaseProvider );
verify( databaseUpdaterWrapper, times(1)).updatesRequired();
}

@Test
public void createUpdateFilterModel_shouldNotRequireAnUpdateIfChangesAreEmptyAndDatabaseUpdaterDoesNotRequireAnUpdate()
throws Exception {
List<OpenMRSChangeSet> changes = new ArrayList<>();

when(DatabaseUpdater.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(DatabaseUpdater.isLocked()).thenReturn(false);
when(DatabaseUpdater.updatesRequired()).thenReturn(false);
when(databaseUpdaterWrapper.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(databaseUpdaterWrapper.isLocked()).thenReturn(false);
when(databaseUpdaterWrapper.updatesRequired()).thenReturn(false);

model = new UpdateFilterModel(liquibaseProvider);
model = new UpdateFilterModel(liquibaseProvider, databaseUpdaterWrapper);

assertFalse("should not require an update", model.updateRequired);
assertThat(model.changes, is(empty()));

PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.updatesRequired();

verify( databaseUpdaterWrapper, times(1)).getUnrunDatabaseChanges( liquibaseProvider );
verify( databaseUpdaterWrapper, times(1)).updatesRequired();
}

@Test
public void createUpdateFilterModel_shouldNotRequireAnUpdateIfChangesAreNullAndDatabaseUpdaterDoesNotRequireAnUpdate()
throws Exception {

when(DatabaseUpdater.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(null);
when(DatabaseUpdater.isLocked()).thenReturn(false);
when(DatabaseUpdater.updatesRequired()).thenReturn(false);
when(databaseUpdaterWrapper.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(null);
when(databaseUpdaterWrapper.isLocked()).thenReturn(false);
when(databaseUpdaterWrapper.updatesRequired()).thenReturn(false);

model = new UpdateFilterModel(liquibaseProvider);
model = new UpdateFilterModel(liquibaseProvider, databaseUpdaterWrapper);

assertFalse("should not require an update", model.updateRequired);
assertNull("should not have changes", model.changes);

PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.updatesRequired();

verify( databaseUpdaterWrapper, times(1)).getUnrunDatabaseChanges( liquibaseProvider );
verify( databaseUpdaterWrapper, times(1)).updatesRequired();
}

@Test
public void createUpdateFilterModel_shouldNotRequireAnUpdateIfDatabaseUpdaterIsLockedAndCallingDatabaseUpdaterTwiceAlwaysReturnsNull()
throws Exception {

when(DatabaseUpdater.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(null);
when(DatabaseUpdater.isLocked()).thenReturn(true);
when(DatabaseUpdater.updatesRequired()).thenReturn(false);
when(databaseUpdaterWrapper.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(null);
when(databaseUpdaterWrapper.isLocked()).thenReturn(true);
when(databaseUpdaterWrapper.updatesRequired()).thenReturn(false);

model = new UpdateFilterModel(liquibaseProvider);
model = new UpdateFilterModel(liquibaseProvider, databaseUpdaterWrapper);

assertFalse("should not require an update", model.updateRequired);
assertNull("should not have changes", model.changes);

PowerMockito.verifyStatic(DatabaseUpdater.class, times(2));
DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.updatesRequired();

verify( databaseUpdaterWrapper, times(2)).getUnrunDatabaseChanges( liquibaseProvider );
verify( databaseUpdaterWrapper, times(1)).updatesRequired();
}

@Test
public void createUpdateFilterModel_shouldRequireAnUpdateIfDatabaseUpdaterIsLockedAndChangesAreNotNull()
throws Exception {
List<OpenMRSChangeSet> changes = Arrays.asList(mock(OpenMRSChangeSet.class));

when(DatabaseUpdater.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(DatabaseUpdater.isLocked()).thenReturn(true);
when(databaseUpdaterWrapper.getUnrunDatabaseChanges(any(LiquibaseProvider.class))).thenReturn(changes);
when(databaseUpdaterWrapper.isLocked()).thenReturn(true);

model = new UpdateFilterModel(liquibaseProvider);
model = new UpdateFilterModel(liquibaseProvider, databaseUpdaterWrapper);

assertTrue("should require an update", model.updateRequired);
assertThat(model.changes, is(changes));

PowerMockito.verifyStatic(DatabaseUpdater.class);
DatabaseUpdater.getUnrunDatabaseChanges(liquibaseProvider);
PowerMockito.verifyStatic(DatabaseUpdater.class, never());
DatabaseUpdater.updatesRequired();

verify( databaseUpdaterWrapper, times(1)).getUnrunDatabaseChanges( liquibaseProvider );
verify( databaseUpdaterWrapper, never()).updatesRequired();
}
}

0 comments on commit 0a5f9fe

Please sign in to comment.