diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 3493f216..76747269 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: platform: [ ubuntu-latest ] - java-version: [ 8 ] + java-version: [ 21 ] runs-on: ${{ matrix.platform }} env: diff --git a/omod/pom.xml b/omod/pom.xml index a0bc3b64..57a5b88c 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -117,6 +117,13 @@ jsp-api + + org.mockito + mockito-inline + test + + + diff --git a/omod/src/main/java/org/openmrs/web/controller/ForgotPasswordFormController.java b/omod/src/main/java/org/openmrs/web/controller/ForgotPasswordFormController.java index f78ebc24..03c77007 100644 --- a/omod/src/main/java/org/openmrs/web/controller/ForgotPasswordFormController.java +++ b/omod/src/main/java/org/openmrs/web/controller/ForgotPasswordFormController.java @@ -172,10 +172,12 @@ protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse try { Context.addProxyPrivilege(PrivilegeConstants.EDIT_USER_PASSWORDS); + Context.addProxyPrivilege(PrivilegeConstants.GET_GLOBAL_PROPERTIES); Context.getUserService().changePassword(user, randomPassword); } finally { Context.removeProxyPrivilege(PrivilegeConstants.EDIT_USER_PASSWORDS); + Context.removeProxyPrivilege(PrivilegeConstants.GET_GLOBAL_PROPERTIES); } httpSession.setAttribute("resetPassword", randomPassword); @@ -204,7 +206,15 @@ protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse public String getRandomPassword() { //Password should be satisfy the minimum length if any is set, must have 1 upper case letter and 1 number Integer minLength = 8; - String str = Context.getAdministrationService().getGlobalProperty(OpenmrsConstants.GP_PASSWORD_MINIMUM_LENGTH); + String str; + + try { + Context.getUserContext().addProxyPrivilege(PrivilegeConstants.GET_GLOBAL_PROPERTIES); + str = Context.getAdministrationService().getGlobalProperty(OpenmrsConstants.GP_PASSWORD_MINIMUM_LENGTH); + } finally { + Context.getUserContext().removeProxyPrivilege(PrivilegeConstants.GET_GLOBAL_PROPERTIES); + } + if (StringUtils.isNotBlank(str)) { minLength = Integer.valueOf(str); } diff --git a/omod/src/main/java/org/openmrs/web/controller/LoginController.java b/omod/src/main/java/org/openmrs/web/controller/LoginController.java index e94676fa..725b1863 100644 --- a/omod/src/main/java/org/openmrs/web/controller/LoginController.java +++ b/omod/src/main/java/org/openmrs/web/controller/LoginController.java @@ -121,7 +121,10 @@ public String handleRequest(WebRequest webRequest, ModelMap model) { //was no exception message that might contain the required privilege //will be sending the alert via ajax, so we need to escape js special chars - model.put("alertMessage", JavaScriptUtils.javaScriptEscape(alertMessage)); + if (alertMessage != null) { + model.put("alertMessage", JavaScriptUtils.javaScriptEscape(alertMessage)); + } + model.put("reason", reason); model.put("refererUrl", refererUrl); } diff --git a/omod/src/main/java/org/openmrs/web/controller/person/PersonAttributeTypeListController.java b/omod/src/main/java/org/openmrs/web/controller/person/PersonAttributeTypeListController.java index 5647a8d4..9478b0d7 100644 --- a/omod/src/main/java/org/openmrs/web/controller/person/PersonAttributeTypeListController.java +++ b/omod/src/main/java/org/openmrs/web/controller/person/PersonAttributeTypeListController.java @@ -27,6 +27,7 @@ import org.openmrs.api.context.Context; import org.openmrs.messagesource.MessageSourceService; import org.openmrs.util.OpenmrsConstants; +import org.openmrs.util.PrivilegeConstants; import org.openmrs.web.WebConstants; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; @@ -54,18 +55,23 @@ public class PersonAttributeTypeListController { public String displayPage(ModelMap modelMap) throws Exception { AdministrationService as = Context.getAdministrationService(); - - // some helpful information that gets displayed - modelMap.put("patientListingAttributeTypes", - as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_LISTING_ATTRIBUTES)); - modelMap.put("patientViewingAttributeTypes", - as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_VIEWING_ATTRIBUTES)); - modelMap.put("patientHeaderAttributeTypes", - as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_HEADER_ATTRIBUTES)); - modelMap.put("userListingAttributeTypes", - as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_USER_LISTING_ATTRIBUTES)); - modelMap.put("userViewingAttributeTypes", - as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_USER_VIEWING_ATTRIBUTES)); + + try { + Context.addProxyPrivilege(PrivilegeConstants.GET_GLOBAL_PROPERTIES); + // some helpful information that gets displayed + modelMap.put("patientListingAttributeTypes", + as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_LISTING_ATTRIBUTES)); + modelMap.put("patientViewingAttributeTypes", + as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_VIEWING_ATTRIBUTES)); + modelMap.put("patientHeaderAttributeTypes", + as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_HEADER_ATTRIBUTES)); + modelMap.put("userListingAttributeTypes", + as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_USER_LISTING_ATTRIBUTES)); + modelMap.put("userViewingAttributeTypes", + as.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_USER_VIEWING_ATTRIBUTES)); + } finally { + Context.removeProxyPrivilege(PrivilegeConstants.GET_GLOBAL_PROPERTIES); + } List attributeTypeList = new Vector(); diff --git a/omod/src/main/java/org/springframework/web/servlet/mvc/AbstractWizardFormController.java b/omod/src/main/java/org/springframework/web/servlet/mvc/AbstractWizardFormController.java index 200ff95a..41a5d2a4 100644 --- a/omod/src/main/java/org/springframework/web/servlet/mvc/AbstractWizardFormController.java +++ b/omod/src/main/java/org/springframework/web/servlet/mvc/AbstractWizardFormController.java @@ -29,6 +29,7 @@ */ package org.springframework.web.servlet.mvc; +import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -41,6 +42,8 @@ import org.springframework.web.servlet.ModelAndView; import org.springframework.web.util.WebUtils; +import static org.springframework.web.util.WebUtils.SUBMIT_IMAGE_SUFFIXES; + /** * Form controller for typical wizard-style workflows. *

@@ -654,7 +657,22 @@ protected int getTargetPage(HttpServletRequest request, Object command, Errors e * @see #PARAM_TARGET */ protected int getTargetPage(HttpServletRequest request, int currentPage) { - return WebUtils.getTargetPage(request, PARAM_TARGET, currentPage); + Enumeration parameterNames = request.getParameterNames(); + while (parameterNames.hasMoreElements()) { + String param = parameterNames.nextElement(); + if (param.startsWith(PARAM_TARGET)) { + for (String suffix : SUBMIT_IMAGE_SUFFIXES) { + // Remove any image button suffixes (like .x or .y) + if (param.endsWith(suffix)) { + param = param.substring(0, param.length() - suffix.length()); + } + } + String pageStr = param.substring(PARAM_TARGET.length()); + return Integer.parseInt(pageStr); + + } + } + return currentPage; } /** diff --git a/omod/src/test/java/org/openmrs/module/web/extension/ExtensionUtilTest.java b/omod/src/test/java/org/openmrs/module/web/extension/ExtensionUtilTest.java index 2bb9c3d9..ea55a431 100644 --- a/omod/src/test/java/org/openmrs/module/web/extension/ExtensionUtilTest.java +++ b/omod/src/test/java/org/openmrs/module/web/extension/ExtensionUtilTest.java @@ -13,8 +13,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; -import static org.powermock.api.mockito.PowerMockito.mockStatic; import java.util.ArrayList; import java.util.HashSet; @@ -22,43 +22,42 @@ import java.util.Set; import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; import org.openmrs.module.Extension; import org.openmrs.module.ModuleFactory; import org.openmrs.module.web.extension.provider.Link; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -@RunWith(PowerMockRunner.class) -@PrepareForTest(ModuleFactory.class) +@ExtendWith(MockitoExtension.class) public class ExtensionUtilTest { - + /** * @see ExtensionUtil#getFormsModulesCanAddEncounterToVisit() * @verifies return empty set if there is no AddEncounterToVisitExtension */ @Test - public void getModulesAddEncounterToVisitLinks_shouldReturnEmptySetIfThereIsNoAddEncounterToVisitExtension() - throws Exception { + public void getModulesAddEncounterToVisitLinks_shouldReturnEmptySetIfThereIsNoAddEncounterToVisitExtension() throws Exception { //given - mockStatic(ModuleFactory.class); - when(ModuleFactory.getExtensions("org.openmrs.module.web.extension.AddEncounterToVisitExtension")).thenReturn(null); - - //when - Set links = ExtensionUtil.getAllAddEncounterToVisitLinks(); - - //then - assertNotNull(links); - assertEquals(0, links.size()); + try (MockedStatic mockedModuleFactory = mockStatic(ModuleFactory.class)) { + mockedModuleFactory.when(() -> ModuleFactory.getExtensions("org.openmrs.module.web.extension.AddEncounterToVisitExtension")) + .thenReturn(null); + + //when + Set links = ExtensionUtil.getAllAddEncounterToVisitLinks(); + + //then + assertNotNull(links); + assertEquals(0, links.size()); + } } - + /** * @see ExtensionUtil#getFormsModulesCanAddEncounterToVisit() * @verifies return forms if there are AddEncounterToVisitExtensions */ @Test - public void getFormsModulesCanAddEncounterToVisit_shouldReturnFormsIfThereAreAddEncounterToVisitExtensions() - throws Exception { + public void getFormsModulesCanAddEncounterToVisit_shouldReturnFormsIfThereAreAddEncounterToVisitExtensions() throws Exception { //given AddEncounterToVisitExtension ext1 = mock(AddEncounterToVisitExtension.class); Set links1 = new HashSet(); @@ -69,28 +68,29 @@ public void getFormsModulesCanAddEncounterToVisit_shouldReturnFormsIfThereAreAdd link2.setLabel("b"); links1.add(link2); when(ext1.getAddEncounterToVisitLinks()).thenReturn(links1); - + AddEncounterToVisitExtension ext2 = mock(AddEncounterToVisitExtension.class); Set links2 = new HashSet(); Link link3 = new Link(); link3.setLabel("aa"); links2.add(link3); when(ext2.getAddEncounterToVisitLinks()).thenReturn(links2); - - List extensions = new ArrayList(); + + List extensions = new ArrayList<>(); extensions.add(ext1); extensions.add(ext2); - - mockStatic(ModuleFactory.class); - when(ModuleFactory.getExtensions("org.openmrs.module.web.extension.AddEncounterToVisitExtension")).thenReturn( - extensions); - - //when - Set allAddEncounterToVisitLinks = ExtensionUtil.getAllAddEncounterToVisitLinks(); - - //then - assertTrue(allAddEncounterToVisitLinks.contains(link1)); - assertTrue(allAddEncounterToVisitLinks.contains(link2)); - assertTrue(allAddEncounterToVisitLinks.contains(link3)); + + try (MockedStatic mockedModuleFactory = mockStatic(ModuleFactory.class)) { + mockedModuleFactory.when(() -> ModuleFactory.getExtensions("org.openmrs.module.web.extension.AddEncounterToVisitExtension")) + .thenReturn(extensions); + + //when + Set allAddEncounterToVisitLinks = ExtensionUtil.getAllAddEncounterToVisitLinks(); + + //then + assertTrue(allAddEncounterToVisitLinks.contains(link1)); + assertTrue(allAddEncounterToVisitLinks.contains(link2)); + assertTrue(allAddEncounterToVisitLinks.contains(link3)); + } } } diff --git a/omod/src/test/java/org/openmrs/web/attribute/handler/BaseMetadataFieldGenDatatypeHandlerTest.java b/omod/src/test/java/org/openmrs/web/attribute/handler/BaseMetadataFieldGenDatatypeHandlerTest.java index 6e381fa9..45694a0c 100644 --- a/omod/src/test/java/org/openmrs/web/attribute/handler/BaseMetadataFieldGenDatatypeHandlerTest.java +++ b/omod/src/test/java/org/openmrs/web/attribute/handler/BaseMetadataFieldGenDatatypeHandlerTest.java @@ -17,13 +17,10 @@ import static org.mockito.Mockito.when; import org.junit.Test; -import org.junit.runner.RunWith; import org.openmrs.Location; import org.openmrs.customdatatype.CustomDatatype; import org.openmrs.customdatatype.datatype.MockLocationDatatype; -import org.powermock.modules.junit4.PowerMockRunner; -@RunWith(PowerMockRunner.class) public class BaseMetadataFieldGenDatatypeHandlerTest { private BaseMetadataFieldGenDatatypeHandler handler = new MockLocationFieldGenDatatypeHandler(); diff --git a/omod/src/test/java/org/openmrs/web/attribute/handler/RegexValidatedTextDatatypeHandlerTest.java b/omod/src/test/java/org/openmrs/web/attribute/handler/RegexValidatedTextDatatypeHandlerTest.java index c0ee6a04..e9c227bf 100644 --- a/omod/src/test/java/org/openmrs/web/attribute/handler/RegexValidatedTextDatatypeHandlerTest.java +++ b/omod/src/test/java/org/openmrs/web/attribute/handler/RegexValidatedTextDatatypeHandlerTest.java @@ -19,23 +19,20 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; import org.openmrs.customdatatype.CustomDatatype; import org.openmrs.customdatatype.InvalidCustomValueException; import org.openmrs.customdatatype.datatype.RegexValidatedTextDatatype; -import org.powermock.modules.junit4.PowerMockRunner; import org.springframework.mock.web.MockHttpServletRequest; /** * Tests {@code RegexValidatedTextDatatypeHandler}. */ -@RunWith(PowerMockRunner.class) public class RegexValidatedTextDatatypeHandlerTest { @Rule - ExpectedException expectedException = ExpectedException.none(); + public ExpectedException expectedException = ExpectedException.none(); - private RegexValidatedTextDatatypeHandler handler = new RegexValidatedTextDatatypeHandler(); + private final RegexValidatedTextDatatypeHandler handler = new RegexValidatedTextDatatypeHandler(); /** * @see org.openmrs.web.attribute.handler.FieldGenDatatypeHandler#getValue(CustomDatatype, diff --git a/omod/src/test/java/org/openmrs/web/controller/ConceptFormControllerTest.java b/omod/src/test/java/org/openmrs/web/controller/ConceptFormControllerTest.java index 3cf5685a..d7687f31 100644 --- a/omod/src/test/java/org/openmrs/web/controller/ConceptFormControllerTest.java +++ b/omod/src/test/java/org/openmrs/web/controller/ConceptFormControllerTest.java @@ -35,7 +35,9 @@ import org.openmrs.ConceptAnswer; import org.openmrs.ConceptAttribute; import org.openmrs.ConceptAttributeType; +import org.openmrs.ConceptClass; import org.openmrs.ConceptComplex; +import org.openmrs.ConceptDatatype; import org.openmrs.ConceptDescription; import org.openmrs.ConceptMap; import org.openmrs.ConceptMapType; @@ -173,7 +175,8 @@ public void shouldAddConceptWithOnlyNameSpecified() throws Exception { mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("descriptionsByLocale[en_GB].description", "some description"); mockRequest.setParameter("concept.datatype", "1"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, new MockHttpServletResponse()); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -213,7 +216,8 @@ public void shouldAddConceptWithNameAndShortNameSpecified() throws Exception { mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("descriptionsByLocale[en_GB].description", "some description"); mockRequest.setParameter("concept.datatype", "1"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, new MockHttpServletResponse()); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -256,7 +260,8 @@ public void shouldAddConceptWithNameAndShortNameAndDescriptionSpecifiedToCodeCon mockRequest.setParameter("descriptionsByLocale[en_GB].description", EXPECTED_DESCRIPTION); mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("concept.datatype", "4"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, response); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -301,7 +306,8 @@ public void shouldAddConceptWithNameAndShortNameAndDescriptionSpecifiedToNumeric mockRequest.setParameter("descriptionsByLocale[en_GB].description", EXPECTED_DESCRIPTION); mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("concept.datatype", "1"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, response); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -357,7 +363,8 @@ public void shouldAddConceptWithAllNamingSpecified() throws Exception { mockRequest.setParameter("descriptionsByLocale[en_GB].description", EXPECTED_DESCRIPTION); mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("concept.datatype", "1"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, response); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -409,7 +416,8 @@ public void shouldUpdateConceptWithNameAlreadyInSynonymList() throws Exception { mockRequest.setParameter("descriptionsByLocale[en_GB].description", EXPECTED_DESCRIPTION); mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("concept.datatype", "1"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, response); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -458,6 +466,7 @@ public void shouldUpdateConceptWithShortNameAlreadyInSynonymList() throws Except mockRequest.setParameter("descriptionsByLocale[en_GB].description", EXPECTED_DESCRIPTION); mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("concept.datatype", "1"); + mockRequest.setParameter("concept.conceptClass", "1"); ModelAndView mav = conceptFormController.handleRequest(mockRequest, response); assertNotNull(mav); @@ -522,6 +531,8 @@ public void shouldVoidShortName() throws Exception { concept.addName(new ConceptName(CONCEPT_NAME, britishEn)); concept.setShortName(new ConceptName("shortname", britishEn)); concept.addDescription(new ConceptDescription("some description", null)); + concept.setDatatype(Context.getConceptService().getConceptDatatype(1)); + concept.setConceptClass(Context.getConceptService().getConceptClass(1)); cs.saveConcept(concept); Concept actualConcept = cs.getConceptByName(CONCEPT_NAME); @@ -573,6 +584,8 @@ public void shouldReplacePreviousDescription() throws Exception { originalConceptDescription.setLocale(britishEn); originalConceptDescription.setDescription(ORIGINAL_DESCRIPTION); conceptToUpdate.addDescription(originalConceptDescription); + conceptToUpdate.setDatatype(Context.getConceptService().getConceptDatatype(1)); + conceptToUpdate.setConceptClass(Context.getConceptService().getConceptClass(1)); cs.saveConcept(conceptToUpdate); // then submit changes through the controller @@ -590,7 +603,8 @@ public void shouldReplacePreviousDescription() throws Exception { mockRequest.setParameter("descriptionsByLocale[en_GB].description", EXPECTED_DESCRIPTION); mockRequest.setParameter("namesByLocale[en_GB].name", EXPECTED_PREFERRED_NAME); mockRequest.setParameter("concept.datatype", "1"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, response); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); @@ -608,12 +622,12 @@ public void shouldReplacePreviousDescription() throws Exception { @Test @Verifies(value = "should copy numeric values into numeric concepts", method = "onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)") public void onSubmit_shouldCopyNumericValuesIntoNumericConcepts() throws Exception { - final Double EXPECTED_LOW_ABSOLUTE = 100.0; + final Double EXPECTED_LOW_ABSOLUTE = 50.0; final Double EXPECTED_LOW_CRITICAL = 103.0; final Double EXPECTED_LOW_NORMAL = 105.0; final Double EXPECTED_HI_NORMAL = 110.0; final Double EXPECTED_HI_CRITICAL = 117.0; - final Double EXPECTED_HI_ABSOLUTE = 120.0; + final Double EXPECTED_HI_ABSOLUTE = 150.0; ConceptService cs = Context.getConceptService(); @@ -626,6 +640,7 @@ public void onSubmit_shouldCopyNumericValuesIntoNumericConcepts() throws Excepti mockRequest.setParameter("namesByLocale[en_GB].name", "WEIGHT (KG)"); mockRequest.setParameter("conceptId", "5089"); mockRequest.setParameter("concept.datatype", "1"); + mockRequest.setParameter("concept.conceptClass", "1"); mockRequest.setParameter("lowAbsolute", EXPECTED_LOW_ABSOLUTE.toString()); mockRequest.setParameter("lowCritical", EXPECTED_LOW_CRITICAL.toString()); mockRequest.setParameter("lowNormal", EXPECTED_LOW_NORMAL.toString()); @@ -926,6 +941,7 @@ public void onSubmit_shouldAddANewConceptMapWhenCreatingAConcept() throws Except mockRequest.setParameter("namesByLocale[en_GB].name", conceptName); mockRequest.setParameter("descriptionsByLocale[en_GB].description", "some description"); mockRequest.setParameter("concept.datatype", "1"); + mockRequest.setParameter("concept.conceptClass", "1"); mockRequest.setParameter("conceptMappings[0].conceptReferenceTerm", "1"); mockRequest.setParameter("conceptMappings[0].conceptMapType", "3"); @@ -1248,7 +1264,8 @@ public void shouldSaveConceptAttributeOnCreatingConcept() throws Exception { mockRequest.setParameter("descriptionsByLocale[en_GB].description", "some description"); mockRequest.setParameter("concept.datatype", "1"); mockRequest.setParameter("attribute.1.new[0]", "2011-04-25"); - + mockRequest.setParameter("concept.conceptClass", "1"); + ModelAndView mav = conceptFormController.handleRequest(mockRequest, new MockHttpServletResponse()); assertNotNull(mav); assertTrue(mav.getModel().isEmpty()); diff --git a/omod/src/test/java/org/openmrs/web/controller/provider/ProviderFormControllerTest.java b/omod/src/test/java/org/openmrs/web/controller/provider/ProviderFormControllerTest.java index 064d5f91..73464de3 100644 --- a/omod/src/test/java/org/openmrs/web/controller/provider/ProviderFormControllerTest.java +++ b/omod/src/test/java/org/openmrs/web/controller/provider/ProviderFormControllerTest.java @@ -24,6 +24,8 @@ import org.springframework.ui.ModelMap; import org.springframework.validation.BindException; +import static org.junit.jupiter.api.Assertions.assertNull; + /** * Tests against the {@link ProviderFormController} */ @@ -88,7 +90,6 @@ public void onSubmit_shouldSetAttributesToVoidIfTheValueIsNotSet() throws Except * String, String, String, String, org.openmrs.Provider, * org.springframework.validation.BindingResult, org.springframework.ui.ModelMap) */ - @Test(expected = ObjectNotFoundException.class) public void onSubmit_shouldPurgeTheProvider() throws Exception { executeDataSet(PROVIDERS_ATTRIBUTES_XML); executeDataSet(PROVIDERS_XML); @@ -101,7 +102,7 @@ public void onSubmit_shouldPurgeTheProvider() throws Exception { providerFormController.onSubmit(mockHttpServletRequest, null, null, null, "purge", provider, errors, createModelMap(providerAttributeType)); Context.flushSession(); - Assert.assertNull(Context.getProviderService().getProvider(2)); + assertNull(Context.getProviderService().getProvider(2)); } private ModelMap createModelMap(ProviderAttributeType providerAttributeType) { diff --git a/omod/src/test/java/org/openmrs/web/controller/user/UserListControllerTest.java b/omod/src/test/java/org/openmrs/web/controller/user/UserListControllerTest.java index 662dc714..03c006d6 100644 --- a/omod/src/test/java/org/openmrs/web/controller/user/UserListControllerTest.java +++ b/omod/src/test/java/org/openmrs/web/controller/user/UserListControllerTest.java @@ -28,10 +28,10 @@ public class UserListControllerTest extends BaseModuleWebContextSensitiveTest { * @verifies get all users if no name given */ @Test - public void displayUsers_shouldGetAllUsersIfNoNameGiven() throws Exception { + public void displayUsers_shouldGetAllUsersIfNoNameGiven() { UserListController controller = new UserListController(); List users = controller.getUsers("Search", "", null, false); - Assert.assertEquals(3, users.size()); + Assert.assertEquals(2, users.size()); } /** @@ -39,10 +39,10 @@ public void displayUsers_shouldGetAllUsersIfNoNameGiven() throws Exception { * @verifies get users just given action parameter */ @Test - public void displayUsers_shouldGetUsersJustGivenActionParameter() throws Exception { + public void displayUsers_shouldGetUsersJustGivenActionParameter() { UserListController controller = new UserListController(); List users = controller.getUsers("Search", null, null, null); - Assert.assertEquals(3, users.size()); + Assert.assertEquals(2, users.size()); } /** @@ -50,7 +50,7 @@ public void displayUsers_shouldGetUsersJustGivenActionParameter() throws Excepti * @verifies get users with a given role */ @Test - public void displayUsers_shouldGetUsersWithAGivenRole() throws Exception { + public void displayUsers_shouldGetUsersWithAGivenRole() { UserListController controller = new UserListController(); List users = controller.getUsers("Search", null, new Role("Provider"), null); Assert.assertEquals(1, users.size()); @@ -61,9 +61,9 @@ public void displayUsers_shouldGetUsersWithAGivenRole() throws Exception { * @verifies include disabled users if requested */ @Test - public void displayUsers_shouldIncludeDisabledUsersIfRequested() throws Exception { + public void displayUsers_shouldIncludeDisabledUsersIfRequested() { UserListController controller = new UserListController(); List users = controller.getUsers("Search", "", new Role(""), true); - Assert.assertEquals(4, users.size()); + Assert.assertEquals(3, users.size()); } } diff --git a/omod/src/test/java/org/openmrs/web/dwr/DWRPatientServiceTest.java b/omod/src/test/java/org/openmrs/web/dwr/DWRPatientServiceTest.java index db6b7454..35ee2d74 100644 --- a/omod/src/test/java/org/openmrs/web/dwr/DWRPatientServiceTest.java +++ b/omod/src/test/java/org/openmrs/web/dwr/DWRPatientServiceTest.java @@ -112,6 +112,7 @@ public void findCountAndPatients_shouldMatchPatientWithIdentifiersThatContainNoD .getLocationService().getLocation(1)); patient.addIdentifier(pId); ps.savePatient(patient); + updateSearchIndex(); //Let's do this in a case insensitive way Map resultObjects = new DWRPatientService().findCountAndPatients(identifier.toLowerCase(), 0, null, diff --git a/omod/src/test/java/org/openmrs/web/patient/PatientDashboardGraphControllerTest.java b/omod/src/test/java/org/openmrs/web/patient/PatientDashboardGraphControllerTest.java index e889d458..8a5d14de 100644 --- a/omod/src/test/java/org/openmrs/web/patient/PatientDashboardGraphControllerTest.java +++ b/omod/src/test/java/org/openmrs/web/patient/PatientDashboardGraphControllerTest.java @@ -41,6 +41,7 @@ public void shouldReturnJSONWithPatientObservationDetails() throws Exception { long firstObsDate = new GregorianCalendar(2006, Calendar.FEBRUARY, 9).getTimeInMillis(); long secondObsDate = new GregorianCalendar(2006, Calendar.FEBRUARY, 10).getTimeInMillis(); + long thirdObsDate = new GregorianCalendar(2006, Calendar.FEBRUARY, 10).getTimeInMillis(); ModelMap map = new ModelMap(); controller.showGraphData(2, 1, map); @@ -48,8 +49,8 @@ public void shouldReturnJSONWithPatientObservationDetails() throws Exception { String expectedData = String .format( - "{\"absolute\":{\"high\":50.0,\"low\":2.0},\"critical\":{\"high\":null,\"low\":null},\"name\":\"Some concept name\",\"normal\":{\"high\":null,\"low\":null},\"data\":[[%d,null],[%d,1.0]],\"units\":\"\"}", - secondObsDate, firstObsDate); + "{\"absolute\":{\"high\":50.0,\"low\":2.0},\"critical\":{\"high\":null,\"low\":null},\"name\":\"Some concept name\",\"normal\":{\"high\":null,\"low\":null},\"data\":[[%d,null],[%d, null],[%d,1.0]],\"units\":\"\"}", + secondObsDate, thirdObsDate, firstObsDate); ObjectMapper mapper = new ObjectMapper(); JsonNode expectedJson = mapper.readTree(expectedData); diff --git a/omod/src/test/java/org/openmrs/web/taglib/PortletTagTest.java b/omod/src/test/java/org/openmrs/web/taglib/PortletTagTest.java index 830e2a49..cd97141e 100644 --- a/omod/src/test/java/org/openmrs/web/taglib/PortletTagTest.java +++ b/omod/src/test/java/org/openmrs/web/taglib/PortletTagTest.java @@ -10,22 +10,20 @@ package org.openmrs.web.taglib; import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; import org.openmrs.module.Module; import org.openmrs.module.ModuleFactory; import org.openmrs.test.Verifies; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.when; -import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.mockito.Mockito.mockStatic; /** * Tests the {@link PortletTag} */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(ModuleFactory.class) +@ExtendWith(MockitoExtension.class) public class PortletTagTest { /** @@ -33,7 +31,7 @@ public class PortletTagTest { */ @Test @Verifies(value = "return the correct url for a core portlet", method = "generatePortletUrl(String, String)") - public void getModulePortletUrl_shouldReturnTheCorrectUrlForACorePortlet() throws Exception { + public void getModulePortletUrl_shouldReturnTheCorrectUrlForACorePortlet() { String portletUrl = "test.portlet"; String moduleId = null; @@ -50,20 +48,22 @@ public void getModulePortletUrl_shouldReturnTheCorrectUrlForACorePortlet() throw */ @Test @Verifies(value = "return the correct url for a module portlet", method = "generatePortletUrl(String, String)") - public void getModulePortletUrl_shouldReturnTheCorrectUrlForAModulePortlet() throws Exception { + public void getModulePortletUrl_shouldReturnTheCorrectUrlForAModulePortlet() { String portletUrl = "test.portlet"; String moduleId = "moduleId"; // Setup the mocking for the ModuleFactory - mockStatic(ModuleFactory.class); - when(ModuleFactory.getModuleById(moduleId)).thenReturn(new Module(moduleId)); - - // Instantiate the portlet and get the module url - PortletTag portlet = new PortletTag(); - String result = portlet.generatePortletUrl(portletUrl, moduleId); - - // Verify the portlet url - assertEquals("/module/" + moduleId + "/portlets/" + portletUrl, result); + try (MockedStatic mock = mockStatic(ModuleFactory.class)) { + + mock.when(() -> ModuleFactory.getModuleById(moduleId)).thenReturn(new Module(moduleId)); + + // Instantiate the portlet and get the module url + PortletTag portlet = new PortletTag(); + String result = portlet.generatePortletUrl(portletUrl, moduleId); + + // Verify the portlet url + assertEquals("/module/" + moduleId + "/portlets/" + portletUrl, result); + } } /** @@ -75,13 +75,15 @@ public void getModulePortletUrl_shouldReplacePeriodInAModuleIdWithAForwardSlashW String portletUrl = "test.portlet"; String moduleId = "module.id"; - mockStatic(ModuleFactory.class); - when(ModuleFactory.getModuleById(moduleId)).thenReturn(new Module(moduleId)); - - PortletTag portlet = new PortletTag(); - String result = portlet.generatePortletUrl(portletUrl, moduleId); - - assertEquals("/module/" + moduleId.replace('.', '/') + "/portlets/" + portletUrl, result); + try (MockedStatic mock = mockStatic(ModuleFactory.class)) { + mock.when(() -> ModuleFactory.getModuleById(moduleId)).thenReturn(new Module(moduleId)); + + PortletTag portlet = new PortletTag(); + String result = portlet.generatePortletUrl(portletUrl, moduleId); + + assertEquals("/module/" + moduleId.replace('.', '/') + "/portlets/" + portletUrl, result); + } + } /** @@ -92,16 +94,17 @@ public void getModulePortletUrl_shouldReplacePeriodInAModuleIdWithAForwardSlashW public void getModulePortletUrl_shouldNotUpdateTheModuleIdFieldForAModulePortlet() { String portletUrl = "test.portlet"; String moduleId = "module.id"; - - mockStatic(ModuleFactory.class); - when(ModuleFactory.getModuleById(moduleId)).thenReturn(new Module(moduleId)); - - PortletTag portlet = new PortletTag(); - portlet.setModuleId(moduleId); - String result = portlet.generatePortletUrl(portletUrl, moduleId); - - assertEquals("/module/" + moduleId.replace('.', '/') + "/portlets/" + portletUrl, result); - assertEquals(moduleId, portlet.getModuleId()); + + try (MockedStatic mock = mockStatic(ModuleFactory.class)) { + mock.when(() -> ModuleFactory.getModuleById(moduleId)).thenReturn(new Module(moduleId)); + + PortletTag portlet = new PortletTag(); + portlet.setModuleId(moduleId); + String result = portlet.generatePortletUrl(portletUrl, moduleId); + + assertEquals("/module/" + moduleId.replace('.', '/') + "/portlets/" + portletUrl, result); + assertEquals(moduleId, portlet.getModuleId()); + } } /** @@ -114,13 +117,14 @@ public void getModulePortletUrl_shouldReturnACorePortletUrlWhenTheSpecifiedModul String moduleId = "moduleId"; // Setup the mocking for ModuleFactory to return null to test when the module is not found - mockStatic(ModuleFactory.class); - when(ModuleFactory.getModuleById(moduleId)).thenReturn(null); - - PortletTag portlet = new PortletTag(); - String result = portlet.generatePortletUrl(portletUrl, moduleId); - - assertEquals("/portlets/" + portletUrl, result); + try (MockedStatic mock = mockStatic(ModuleFactory.class)) { + mock.when(() -> ModuleFactory.getModuleById(moduleId)).thenReturn(null); + + PortletTag portlet = new PortletTag(); + String result = portlet.generatePortletUrl(portletUrl, moduleId); + + assertEquals("/portlets/" + portletUrl, result); + } } /** diff --git a/omod/src/test/resources/org/openmrs/web/controller/include/PortletControllerTest-bmi.xml b/omod/src/test/resources/org/openmrs/web/controller/include/PortletControllerTest-bmi.xml index 6e1df3c0..bc24352d 100644 --- a/omod/src/test/resources/org/openmrs/web/controller/include/PortletControllerTest-bmi.xml +++ b/omod/src/test/resources/org/openmrs/web/controller/include/PortletControllerTest-bmi.xml @@ -14,11 +14,11 @@ - + - - + + diff --git a/pom.xml b/pom.xml index bc14e824..fc5f273a 100644 --- a/pom.xml +++ b/pom.xml @@ -13,12 +13,6 @@ 4.0.0 - - org.openmrs.maven.parents - maven-parent-openmrs-module - 1.1.1 - - org.openmrs.module legacyui 2.0.0-SNAPSHOT @@ -51,9 +45,9 @@ - 2.0.0 + 2.7.3 UTF-8 - 1.8 + 21 @@ -116,6 +110,26 @@ + + org.mockito + mockito-inline + 3.12.4 + test + + + + net.bytebuddy + byte-buddy + 1.17.4 + test + + + + net.bytebuddy + byte-buddy-agent + 1.17.4 + test +