package gov.samhsa.consent2share.service.account;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import gov.samhsa.consent2share.domain.account.Users;
import gov.samhsa.consent2share.domain.account.UsersRepository;
import java.util.Calendar;
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.core.userdetails.UsernameNotFoundException;
@RunWith(MockitoJUnitRunner.class)
public class AccountUserDetailsServiceTest {
@Mock
UsersRepository usersRepository;
@InjectMocks
AccountUserDetailsService accountUserDetailsService = new AccountUserDetailsService(
(short) 3, 300000, usersRepository);
private String username = "username";
@Test
public void testLoadUserByUsername_when_succeeds() {
Users user = mock(Users.class);
when(usersRepository.loadUserByUsername(username)).thenReturn(user);
when(user.getFailedLoginAttempts()).thenReturn(0);
when(user.getLockoutTime()).thenReturn(null);
assertEquals(accountUserDetailsService.loadUserByUsername(username),
user);
}
@Test(expected = UsernameNotFoundException.class)
public void testLoadUserByUsername_when_username_is_wrong_verify_that_UsernameNotFoundException_is_thrown() {
when(usersRepository.loadUserByUsername(username)).thenReturn(null);
accountUserDetailsService.loadUserByUsername(username);
}
@Test()
public void testLoadUserByUsername_when_account_is_lockout_verify_that_lockout_flag_is_set() {
Users user = mock(Users.class);
when(usersRepository.loadUserByUsername(username)).thenReturn(user);
when(user.getFailedLoginAttempts()).thenReturn(5);
when(user.getLockoutTime()).thenReturn(Calendar.getInstance());
assertEquals(accountUserDetailsService.loadUserByUsername(username),
user);
verify(user).setAccountNonLocked(false);
}
@Test()
public void testLoadUserByUsername_when_account_is_lockout_verify_that_account_is_unlocked_after_5_minutes() {
Users user = mock(Users.class);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(Calendar.getInstance().getTimeInMillis() - 300000);
when(usersRepository.loadUserByUsername(username)).thenReturn(user);
when(user.getFailedLoginAttempts()).thenReturn(5);
when(user.getLockoutTime()).thenReturn(cal);
assertEquals(accountUserDetailsService.loadUserByUsername(username),
user);
verify(user).setLockoutTime(null);
verify(user).setFailedLoginAttemptsToZero();
verify(user).setAccountNonLocked(true);
verify(usersRepository).updateUser(any(Users.class));
}
}