/**
* 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.api.context;
import static org.mockito.Mockito.when;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import org.mockito.InjectMocks;
import org.openmrs.Person;
import org.openmrs.PersonName;
import org.openmrs.Role;
import org.openmrs.User;
import org.openmrs.api.AdministrationService;
import org.openmrs.api.CohortService;
import org.openmrs.api.ConceptService;
import org.openmrs.api.DatatypeService;
import org.openmrs.api.EncounterService;
import org.openmrs.api.FormService;
import org.openmrs.api.LocationService;
import org.openmrs.api.ObsService;
import org.openmrs.api.OrderService;
import org.openmrs.api.PatientService;
import org.openmrs.api.ProviderService;
import org.openmrs.api.SerializationService;
import org.openmrs.api.UserService;
import org.openmrs.api.VisitService;
import org.openmrs.api.db.ContextDAO;
import org.openmrs.messagesource.MessageSourceService;
import org.openmrs.util.RoleConstants;
import org.springframework.context.ApplicationContext;
/**
* Helps to mock or spy on services. It can be used with {@link InjectMocks}. See
* {@link org.openmrs.module.ModuleUtilTest} for example. In general you should always try to refactor code first so
* that this class is not needed. In practice it is mostly enough to replace calls to
* Context.get...Service with fields, which are injected through a constructor.
* <p>
* ContextMockHelper is available in tests extending {@link org.openmrs.test.BaseContextMockTest} and
* {@link org.openmrs.test.BaseContextSensitiveTest}.
*
* @deprecated Avoid using this by not calling Context.get...Service() in your code.
* @since 1.11, 1.10, 1.9.9
*/
@Deprecated
public class ContextMockHelper {
/**
* Mockito does not call setters if there are no fields so you must add both a setter and a
* field.
*/
AdministrationService administrationService;
CohortService cohortService;
ConceptService conceptService;
DatatypeService datatypeService;
EncounterService encounterService;
FormService formService;
LocationService locationService;
MessageSourceService messageSourceService;
ObsService obsService;
OrderService orderService;
PatientService patientService;
ProviderService providerService;
SerializationService serializationService;
UserService userService;
VisitService visitService;
UserContext userContext;
ContextDAO contextDAO;
Map<Class<?>, Object> realServices = new HashMap<Class<?>, Object>();
UserContext realUserContext;
boolean userContextMocked = false;
ContextDAO realContextDAO;
boolean contextDAOMocked = false;
ApplicationContext applicationContext;
ApplicationContext realApplicationContext;
boolean applicationContextMocked = false;
public ContextMockHelper() {
}
public void authenticateMockUser() {
User user = new User();
user.setUuid("1010d442-e134-11de-babe-001e378eb67e");
user.setUserId(1);
user.setUsername("admin");
user.addRole(new Role(RoleConstants.SUPERUSER));
Person person = new Person();
person.setUuid("6adb7c42-cfd2-4301-b53b-ff17c5654ff7");
person.setId(1);
person.addName(new PersonName("Bob", "", "Smith"));
Calendar calendar = Calendar.getInstance();
calendar.set(1980, 01, 01);
person.setBirthdate(calendar.getTime());
person.setGender("M");
user.setPerson(person);
when(userContext.getAuthenticatedUser()).thenReturn(user);
when(userContext.isAuthenticated()).thenReturn(true);
}
public void revertMocks() {
for (Map.Entry<Class<?>, Object> realService : realServices.entrySet()) {
Context.getServiceContext().setService(realService.getKey(), realService.getValue());
}
realServices.clear();
if (userContextMocked) {
if (realUserContext != null) {
Context.setUserContext(realUserContext);
realUserContext = null;
} else {
Context.clearUserContext();
}
userContextMocked = false;
userContext = null;
}
if (contextDAOMocked) {
if (realContextDAO != null) {
Context.setDAO(realContextDAO);
realContextDAO = null;
}
contextDAOMocked = false;
contextDAO = null;
}
if (applicationContextMocked) {
if (realApplicationContext != null) {
Context.getServiceContext().setApplicationContext(realApplicationContext);
realApplicationContext = null;
}
applicationContextMocked = false;
applicationContext = null;
}
}
public void setService(Class<?> type, Object service) {
if (!realServices.containsKey(type)) {
Object realService = null;
try {
realService = Context.getService(type);
}
catch (Exception e) {
//let's not fail if context is not configured
}
realServices.put(type, realService);
}
Context.getServiceContext().setService(type, service);
}
public void setApplicationContext(ApplicationContext context) {
if (!applicationContextMocked) {
realApplicationContext = Context.getServiceContext().getApplicationContext();
applicationContextMocked = true;
}
Context.getServiceContext().setApplicationContext(context);
this.applicationContext = context;
}
public void setAdministrationService(AdministrationService administrationService) {
setService(AdministrationService.class, administrationService);
this.administrationService = administrationService;
}
public void setCohortService(CohortService cohortService) {
setService(CohortService.class, cohortService);
this.cohortService = cohortService;
}
public void setConceptService(ConceptService conceptService) {
setService(ConceptService.class, conceptService);
this.conceptService = conceptService;
}
public void setDatatypeService(DatatypeService datatypeService) {
setService(DatatypeService.class, datatypeService);
this.datatypeService = datatypeService;
}
public void setEncounterService(EncounterService encounterService) {
setService(EncounterService.class, encounterService);
this.encounterService = encounterService;
}
public void setFormService(FormService formService) {
setService(FormService.class, formService);
this.formService = formService;
}
public void setLocationService(LocationService locationService) {
setService(LocationService.class, locationService);
this.locationService = locationService;
}
public void setMessageSourceService(MessageSourceService messageSourceService) {
setService(MessageSourceService.class, messageSourceService);
this.messageSourceService = messageSourceService;
}
public void setObsService(ObsService obsService) {
setService(ObsService.class, obsService);
this.obsService = obsService;
}
public void setOrderService(OrderService orderService) {
setService(OrderService.class, orderService);
this.orderService = orderService;
}
public void setPatientService(PatientService patientService) {
setService(PatientService.class, patientService);
this.patientService = patientService;
}
public void setProviderService(ProviderService providerService) {
setService(ProviderService.class, providerService);
this.providerService = providerService;
}
public void setSerializationService(SerializationService serializationService) {
setService(SerializationService.class, serializationService);
this.serializationService = serializationService;
}
public void setUserService(UserService userService) {
setService(UserService.class, userService);
this.userService = userService;
}
public void setVisitService(VisitService visitService) {
setService(VisitService.class, visitService);
this.visitService = visitService;
}
public void setUserContext(UserContext userContext) {
if (!userContextMocked) {
try {
realUserContext = Context.getUserContext();
}
catch (Exception e) {
//let's not fail if context is not configured
}
userContextMocked = true;
}
Context.setUserContext(userContext);
this.userContext = userContext;
authenticateMockUser();
}
public void setContextDAO(ContextDAO contextDAO) {
if (!contextDAOMocked) {
try {
realContextDAO = Context.getContextDAO();
}
catch (Exception e) {
//let's not fail if context is not configured
}
contextDAOMocked = true;
}
Context.setDAO(contextDAO);
this.contextDAO = contextDAO;
}
}