/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.api.context;
import java.util.List;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Test;
import org.openmrs.Location;
import org.openmrs.User;
import org.openmrs.api.APIException;
import org.openmrs.api.PatientService;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.test.Verifies;
import org.openmrs.util.LocaleUtility;
import org.springframework.validation.Validator;
/**
* TODO add methods for all context tests
*
* @see Context
*/
public class ContextTest extends BaseContextSensitiveTest {
/**
* Methods in this class might authenticate with a different user, so log that user out after
* this whole junit class is done.
*/
@AfterClass
public static void logOutAfterThisTestClass() {
Context.logout();
}
/**
* @see {@link Context#authenticate(String,String)}
*/
@Test(expected = ContextAuthenticationException.class)
@Verifies(value = "should not authenticate with null password", method = "authenticate(String,String)")
public void authenticate_shouldNotAuthenticateWithNullPassword() throws Exception {
Context.authenticate("some username", null);
}
/**
* @see {@link Context#authenticate(String,String)}
*/
@Test(expected = ContextAuthenticationException.class)
@Verifies(value = "should not authenticate with null password and proper system id", method = "authenticate(String,String)")
public void authenticate_shouldNotAuthenticateWithNullPasswordAndProperSystemId() throws Exception {
Context.authenticate("1-8", null);
}
/**
* @see {@link Context#authenticate(String,String)}
*/
@Test(expected = ContextAuthenticationException.class)
@Verifies(value = "should not authenticate with null password and proper username", method = "authenticate(String,String)")
public void authenticate_shouldNotAuthenticateWithNullPasswordAndProperUsername() throws Exception {
Context.authenticate("admin", null);
}
/**
* @see {@link Context#authenticate(String,String)}
*/
@Test(expected = ContextAuthenticationException.class)
@Verifies(value = "should not authenticate with null username", method = "authenticate(String,String)")
public void authenticate_shouldNotAuthenticateWithNullUsername() throws Exception {
Context.authenticate(null, "some password");
}
/**
* @see {@link Context#authenticate(String,String)}
*/
@Test(expected = ContextAuthenticationException.class)
@Verifies(value = "should not authenticate with null username and password", method = "authenticate(String,String)")
public void authenticate_shouldNotAuthenticateWithNullUsernameAndPassword() throws Exception {
Context.authenticate(null, null);
}
/**
* @see {@link Context#getLocale()}
*/
@Test
@Verifies(value = "should not fail if session hasnt been opened", method = "getLocale()")
public void getLocale_shouldNotFailIfSessionHasntBeenOpened() throws Exception {
Context.closeSession();
Assert.assertEquals(LocaleUtility.getDefaultLocale(), Context.getLocale());
}
/**
* @see {@link Context#getUserContext()}
*/
@Test(expected = APIException.class)
@Verifies(value = "should fail if session hasnt been opened", method = "getUserContext()")
public void getUserContext_shouldFailIfSessionHasntBeenOpened() throws Exception {
Context.closeSession();
Context.getUserContext(); // trigger the api exception
}
/**
* @see {@link Context#logout()}
*/
@Test
@Verifies(value = "should not fail if session hasnt been opened yet", method = "logout()")
public void logout_shouldNotFailIfSessionHasntBeenOpenedYet() throws Exception {
Context.closeSession();
Context.logout();
}
/**
* @see {@link Context#isSessionOpen()}
*/
@Test
@Verifies(value = "should return true if session is closed", method = "isSessionOpen()")
public void isSessionOpen_shouldReturnTrueIfSessionIsClosed() throws Exception {
Assert.assertTrue(Context.isSessionOpen());
Context.closeSession();
Assert.assertFalse(Context.isSessionOpen());
}
/**
* @see {@link Context#refreshAuthenticatedUser()}
*/
@Test
@Verifies(value = "should get fresh values from the database", method = "refreshAuthenticatedUser()")
public void refreshAuthenticatedUser_shouldGetFreshValuesFromTheDatabase() throws Exception {
User evictedUser = Context.getAuthenticatedUser();
Context.evictFromSession(evictedUser);
User fetchedUser = Context.getUserService().getUser(evictedUser.getUserId());
fetchedUser.getPersonName().setGivenName("new username");
Context.getUserService().saveUser(fetchedUser, null);
// sanity check to make sure the cached object wasn't updated already
Assert.assertNotSame(Context.getAuthenticatedUser().getGivenName(), fetchedUser.getGivenName());
Context.refreshAuthenticatedUser();
Assert.assertEquals("new username", Context.getAuthenticatedUser().getGivenName());
}
/**
* @see {@link Context#getRegisteredComponents(Class)}
*/
@Test
@Verifies(value = "should return a list of all registered beans of the passed type", method = "getRegisteredComponents(Class)")
public void getRegisteredComponents_shouldReturnAListOfAllRegisteredBeansOfThePassedType() throws Exception {
List<Validator> validators = Context.getRegisteredComponents(Validator.class);
Assert.assertTrue(validators.size() > 0);
Assert.assertTrue(Validator.class.isAssignableFrom(validators.iterator().next().getClass()));
}
/**
* @see {@link Context#getRegisteredComponents(Class)}
*/
@Test
@Verifies(value = "should return an empty list if no beans have been registered of the passed type", method = "getRegisteredComponents(Class)")
public void getRegisteredComponents_shouldReturnAnEmptyListIfNoBeansHaveBeenRegisteredOfThePassedType() throws Exception {
List<Location> l = Context.getRegisteredComponents(Location.class);
Assert.assertNotNull(l);
Assert.assertEquals(0, l.size());
}
/**
* Prevents regression after patch from #2174:
* "Prevent duplicate proxies and AOP in context services"
*
* @see {@link Context#getService(Class)}
*/
@Test
@Verifies(value = "should return the same object when called multiple times for the same class", method = "getService(Class)")
public void getService_shouldReturnTheSameObjectWhenCalledMultipleTimesForTheSameClass() throws Exception {
PatientService ps1 = Context.getService(PatientService.class);
PatientService ps2 = Context.getService(PatientService.class);
Assert.assertTrue(ps1 == ps2);
}
}