package gov.samhsa.consent2share.infrastructure.eventlistener;
import static org.junit.Assert.*;
import java.util.Calendar;
import gov.samhsa.consent2share.domain.account.Users;
import gov.samhsa.consent2share.domain.account.UsersRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent;
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LoginFailureEventListenerTest {
@Mock
UsersRepository usersRepository;
@Mock
EventService eventService;
@InjectMocks
LoginFailureEventListener loginFailureEventListener=new LoginFailureEventListener((short)3, eventService, usersRepository);
private String username="username";
@Test
public void testHandle_when_account_is_not_locked() {
AuthenticationFailureBadCredentialsEvent loginFailureEvent=mock(AuthenticationFailureBadCredentialsEvent.class);
Authentication authentication=mock(Authentication.class);
WebAuthenticationDetails webAuthenticationDetails=mock(WebAuthenticationDetails.class);
Object name=new String(username);
when(loginFailureEvent.getAuthentication()).thenReturn(authentication);
when(authentication.getDetails()).thenReturn(webAuthenticationDetails);
when(webAuthenticationDetails.getRemoteAddress()).thenReturn("127.0.0.1");
when(authentication.getPrincipal()).thenReturn(name);
Users user=mock(Users.class);
when(user.getFailedLoginAttempts()).thenReturn(0);
when(usersRepository.loadUserByUsername(username)).thenReturn(user);
loginFailureEventListener.handle(loginFailureEvent);
verify(usersRepository).updateUser(user);
}
@Test
public void testHandle_when_account_is_locked() {
AuthenticationFailureBadCredentialsEvent loginFailureEvent=mock(AuthenticationFailureBadCredentialsEvent.class);
Authentication authentication=mock(Authentication.class);
WebAuthenticationDetails webAuthenticationDetails=mock(WebAuthenticationDetails.class);
Object name=new String(username);
when(loginFailureEvent.getAuthentication()).thenReturn(authentication);
when(authentication.getPrincipal()).thenReturn(name);
when(authentication.getDetails()).thenReturn(webAuthenticationDetails);
when(webAuthenticationDetails.getRemoteAddress()).thenReturn("127.0.0.1");
Users user=mock(Users.class);
when(user.getFailedLoginAttempts()).thenReturn(3);
when(usersRepository.loadUserByUsername(username)).thenReturn(user);
loginFailureEventListener.handle(loginFailureEvent);
verify(user).setLockoutTime(any(Calendar.class));
verify(usersRepository).updateUser(user);
}
@Test
public void testCanHandle_when_event_matches() {
AuthenticationFailureBadCredentialsEvent event=mock(AuthenticationFailureBadCredentialsEvent.class);
assertEquals(loginFailureEventListener.canHandle(event),true);
}
@Test
public void testCanHandle_when_event_unmatch() {
AuthenticationSuccessEvent event=mock(AuthenticationSuccessEvent.class);
assertEquals(loginFailureEventListener.canHandle(event),false);
}
}