package gov.va.med.edp.springframework.security.userdetails.vistalink;
import gov.va.med.edp.springframework.security.userdetails.VistaUserDetails;
import gov.va.med.edp.vistalink.AbstractVistaLinkConnectionTest;
import gov.va.med.vistalink.security.m.SecurityAccessVerifyCodePairInvalidException;
import gov.va.med.vistalink.adapter.record.VistaLinkFaultException;
import org.springframework.security.BadCredentialsException;
import org.springframework.dao.PermissionDeniedDataAccessException;
import org.easymock.MockControl;
import javax.resource.ResourceException;
import java.io.IOException;
public class VistaLinkUserDetailServiceTest extends AbstractVistaLinkConnectionTest {
private static final String TEST_DUZ = "12345";
private static final String TEST_STATION_NUMBER = "982";
private static final String TEST_SIGNON_LOG_IEN = "3080311.14052001";
private static final String TEST_ACCESS_CODE = "FOOBAR";
private static final String TEST_VERIFY_CODE = "BARFOO";
private static final String TEST_CLIENT_IP_ADDRESS = "10.0.1.201";
private static final String TEST_APPLICATION_NAME = "Test Application Name";
private VistaLinkUserDetailService userDetailService = new VistaLinkUserDetailService();
protected String getStationNumber() {
return TEST_STATION_NUMBER;
}
protected void setUp() throws Exception {
super.setUp();
setExpectedTimeOut(VistaLinkUserDetailService.DEFAULT_TIMEOUT);
userDetailService.setConnectionFactoryLocator(mockConnectionFactoryLocator);
userDetailService.setApplicationName(TEST_APPLICATION_NAME);
userDetailService.afterPropertiesSet();
}
public void testDefaultTimeOut() {
assertEquals(VistaLinkUserDetailService.DEFAULT_TIMEOUT, userDetailService.getRpcTemplate().getTimeOut());
}
public void testRequiredApplicationName() {
try {
userDetailService = new VistaLinkUserDetailService();
userDetailService.setConnectionFactoryLocator(mockConnectionFactoryLocator);
userDetailService.afterPropertiesSet();
fail("expected illegal argument exception");
} catch (IllegalArgumentException e) {
}
}
public void testMissingCredentialsThrowsBadCredentials() {
try {
userDetailService.login(TEST_STATION_NUMBER, null, null, null);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
try {
userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, TEST_VERIFY_CODE, null);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
try {
userDetailService.login(TEST_STATION_NUMBER, null, TEST_VERIFY_CODE, TEST_CLIENT_IP_ADDRESS);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
try {
userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, null, TEST_CLIENT_IP_ADDRESS);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
}
// public void testAuthenticateFailsForIncorrectPasswordCase() {
// UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("rod", "KOala");
//
// DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
// provider.setUserDetailsService(new MockAuthenticationDaoUserrod());
// provider.setUserCache(new MockUserCache());
//
// try {
// provider.authenticate(token);
// fail("Should have thrown BadCredentialsException");
// } catch (BadCredentialsException expected) {
// assertTrue(true);
// }
// }
// test for expired credentials
// test for bad credentials after an expired credentials result
// public void testAuthenticateFailsWithEmptyUsername() {
// UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(null, "koala");
//
// DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
// provider.setUserDetailsService(new MockAuthenticationDaoUserrod());
// provider.setUserCache(new MockUserCache());
//
// try {
// provider.authenticate(token);
// fail("Should have thrown BadCredentialsException");
// } catch (BadCredentialsException expected) {
// assertTrue(true);
// }
// }
//
public void testAuthenticateFailsWithInvalidPassword() throws IOException {
expectVistaLinkAccessVerifyConnection(TEST_ACCESS_CODE, "flibberty-floo", TEST_CLIENT_IP_ADDRESS);
expectRpcAndDefaultThrow(VistaLinkUserDetailService.RPC_CONTEXT, VistaLinkUserDetailService.GET_USER_INFO_RPC, createParams(TEST_CLIENT_IP_ADDRESS, TEST_APPLICATION_NAME), new PermissionDeniedDataAccessException("", new SecurityAccessVerifyCodePairInvalidException(new VistaLinkFaultException())));
replay();
try {
userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, "flibberty-floo", TEST_CLIENT_IP_ADDRESS);
fail("Should have thrown BadCredentialsException");
} catch (BadCredentialsException expected) {
assertTrue(true);
}
}
public void testLogout() {
MockControl userControl = MockControl.createControl(VistaUserDetails.class);
VistaUserDetails user = (VistaUserDetails) userControl.getMock();
userControl.expectAndReturn(user.getDuz(), TEST_DUZ);
userControl.expectAndReturn(user.getLoginStationNumber(), TEST_STATION_NUMBER);
userControl.expectAndReturn(user.getSignonLogInternalEntryNumber(), TEST_SIGNON_LOG_IEN);
expectVistaLinkDuzConnection(TEST_DUZ);
expectRpcAndReturn(VistaLinkUserDetailService.RPC_CONTEXT, VistaLinkUserDetailService.LOGOUT_RPC_NAME, createParams(TEST_SIGNON_LOG_IEN), "");
replay();
userControl.replay();
userDetailService.logout(user);
verify();
userControl.verify();
}
public void testLogin() throws IOException {
expectVistaLinkAccessVerifyConnection(TEST_ACCESS_CODE, TEST_VERIFY_CODE, TEST_CLIENT_IP_ADDRESS);
expectRpcAndReturnXmlResource(VistaLinkUserDetailService.RPC_CONTEXT, VistaLinkUserDetailService.GET_USER_INFO_RPC, createParams(TEST_CLIENT_IP_ADDRESS, TEST_APPLICATION_NAME), "successfulLoginResponse.xml");
replay();
VistaUserDetails user = userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, TEST_VERIFY_CODE, TEST_CLIENT_IP_ADDRESS);
assertNotNull(user);
assertEquals(TEST_STATION_NUMBER, user.getLoginStationNumber());
assertEquals(TEST_DUZ, user.getDuz());
assertEquals(TEST_SIGNON_LOG_IEN, user.getSignonLogInternalEntryNumber());
assertEquals("Bar,Foo", user.getPersonName());
assertEquals("Foo Bar", user.getDisplayName());
assertEquals("BAR", user.getFamilyName());
assertEquals("FOO", user.getGivenName());
assertNull(user.getMiddleName());
assertNull(user.getPrefix());
assertNull(user.getSuffix());
assertNull(user.getDegree());
verify();
}
protected void expectVistaLinkAccessVerifyConnection(String accessCode, String verifyCode, String clientIpAddress) {
try {
mockConnectionFactoryControl.expectAndDefaultReturn(mockConnectionFactory.getConnection(new VistaLinkAccessVerifyConnectionSpec(getStationNumber(), accessCode, verifyCode, clientIpAddress)), mockVistaLinkConnection);
} catch (ResourceException e) {
fail("unexpected exception: " + e.getMessage());
}
}
}
/* source for java 5 and newer easymock
import gov.va.med.edp.springframework.security.userdetails.VistaUserDetails;
import static gov.va.med.edp.springframework.security.userdetails.vistalink.VistaLinkUserDetailService.*;
import gov.va.med.edp.vistalink.AbstractVistaLinkConnectionTest;
import gov.va.med.edp.springframework.security.userdetails.vistalink.VistaLinkAccessVerifyConnectionSpec;
import gov.va.med.edp.springframework.security.userdetails.vistalink.VistaLinkUserDetailService;
import gov.va.med.vistalink.security.m.SecurityAccessVerifyCodePairInvalidException;
import gov.va.med.vistalink.adapter.record.VistaLinkFaultException;
import org.springframework.security.BadCredentialsException;
import org.easymock.EasyMock;
import static org.easymock.EasyMock.expect;
import org.springframework.dao.PermissionDeniedDataAccessException;
import javax.resource.ResourceException;
import java.io.IOException;
public class VistaLinkUserDetailServiceTest extends AbstractVistaLinkConnectionTest {
private static final String TEST_DUZ = "12345";
private static final String TEST_STATION_NUMBER = "982";
private static final String TEST_SIGNON_LOG_IEN = "3080311.14052001";
private static final String TEST_ACCESS_CODE = "FOOBAR";
private static final String TEST_VERIFY_CODE = "BARFOO";
private static final String TEST_CLIENT_IP_ADDRESS = "10.0.1.201";
private static final String TEST_APPLICATION_NAME = "Test Application Name";
private VistaLinkUserDetailService userDetailService = new VistaLinkUserDetailService();
protected String getStationNumber() {
return TEST_STATION_NUMBER;
}
protected void setUp() throws Exception {
super.setUp();
setExpectedTimeOut(VistaLinkUserDetailService.DEFAULT_TIMEOUT);
userDetailService.setConnectionFactoryLocator(mockConnectionFactoryLocator);
userDetailService.setApplicationName(TEST_APPLICATION_NAME);
userDetailService.afterPropertiesSet();
}
public void testDefaultTimeOut() {
assertEquals(VistaLinkUserDetailService.DEFAULT_TIMEOUT, userDetailService.getRpcTemplate().getTimeOut());
}
public void testMissingCredentialsThrowsBadCredentials() {
try {
userDetailService.login(TEST_STATION_NUMBER, null, null, null);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
try {
userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, TEST_VERIFY_CODE, null);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
try {
userDetailService.login(TEST_STATION_NUMBER, null, TEST_VERIFY_CODE, TEST_CLIENT_IP_ADDRESS);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
try {
userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, null, TEST_CLIENT_IP_ADDRESS);
fail("expected bad credentials exception");
} catch (BadCredentialsException e) {
// NOOP
}
}
// public void testAuthenticateFailsForIncorrectPasswordCase() {
// UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("rod", "KOala");
//
// DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
// provider.setUserDetailsService(new MockAuthenticationDaoUserrod());
// provider.setUserCache(new MockUserCache());
//
// try {
// provider.authenticate(token);
// fail("Should have thrown BadCredentialsException");
// } catch (BadCredentialsException expected) {
// assertTrue(true);
// }
// }
// test for expired credentials
// test for bad credentials after an expired credentials result
// public void testAuthenticateFailsWithEmptyUsername() {
// UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(null, "koala");
//
// DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
// provider.setUserDetailsService(new MockAuthenticationDaoUserrod());
// provider.setUserCache(new MockUserCache());
//
// try {
// provider.authenticate(token);
// fail("Should have thrown BadCredentialsException");
// } catch (BadCredentialsException expected) {
// assertTrue(true);
// }
// }
//
public void testAuthenticateFailsWithInvalidPassword() throws IOException {
expectVistaLinkAccessVerifyConnection(TEST_ACCESS_CODE, "flibberty-floo", TEST_CLIENT_IP_ADDRESS);
expectRpcAndDefaultThrow(RPC_CONTEXT, GET_USER_INFO_RPC, createParams(TEST_CLIENT_IP_ADDRESS, TEST_APPLICATION_NAME), new PermissionDeniedDataAccessException("", new SecurityAccessVerifyCodePairInvalidException(new VistaLinkFaultException())));
replay();
try {
userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, "flibberty-floo", TEST_CLIENT_IP_ADDRESS);
fail("Should have thrown BadCredentialsException");
} catch (BadCredentialsException expected) {
assertTrue(true);
}
}
public void testLogout() {
VistaUserDetails user = EasyMock.createMock(VistaUserDetails.class);
expect(user.getDuz()).andReturn(TEST_DUZ);
expect(user.getLoginStationNumber()).andReturn(TEST_STATION_NUMBER);
expect(user.getSignonLogInternalEntryNumber()).andReturn(TEST_SIGNON_LOG_IEN);
expectVistaLinkDuzConnection(TEST_DUZ);
expectRpcAndReturn(RPC_CONTEXT, LOGOUT_RPC_NAME, createParams(TEST_SIGNON_LOG_IEN), "");
replay();
EasyMock.replay(user);
userDetailService.logout(user);
verify();
EasyMock.verify(user);
}
public void testLogin() throws IOException {
expectVistaLinkAccessVerifyConnection(TEST_ACCESS_CODE, TEST_VERIFY_CODE, TEST_CLIENT_IP_ADDRESS);
expectRpcAndReturnXmlResource(RPC_CONTEXT, GET_USER_INFO_RPC, createParams(TEST_CLIENT_IP_ADDRESS, TEST_APPLICATION_NAME), "successfulLoginResponse.xml");
replay();
VistaUserDetails user = userDetailService.login(TEST_STATION_NUMBER, TEST_ACCESS_CODE, TEST_VERIFY_CODE, TEST_CLIENT_IP_ADDRESS);
assertNotNull(user);
assertEquals(TEST_STATION_NUMBER, user.getLoginStationNumber());
assertEquals(TEST_DUZ, user.getDuz());
assertEquals(TEST_SIGNON_LOG_IEN, user.getSignonLogInternalEntryNumber());
assertEquals("Bar,Foo", user.getPersonName());
assertEquals("Foo Bar", user.getDisplayName());
assertEquals("BAR", user.getFamilyName());
assertEquals("FOO", user.getGivenName());
assertNull(user.getMiddleName());
assertNull(user.getPrefix());
assertNull(user.getSuffix());
assertNull(user.getDegree());
verify();
}
protected void expectVistaLinkAccessVerifyConnection(String accessCode, String verifyCode, String clientIpAddress) {
try {
org.easymock.EasyMock.expect(mockConnectionFactory.getConnection(new VistaLinkAccessVerifyConnectionSpec(getStationNumber(), accessCode, verifyCode, clientIpAddress))).andReturn(mockVistaLinkConnection);
} catch (ResourceException e) {
fail("unexpected exception: " + e.getMessage());
}
}
}
*/