package com.qprogramming.tasq.account;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import com.qprogramming.tasq.support.Utils;
import com.qprogramming.tasq.test.MockSecurityContext;
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@InjectMocks
private UserService userService = new UserService();
@Mock
private AccountService accountServiceMock;
@Mock
private MockSecurityContext securityMock;
@Mock
private Authentication authMock;
@Rule
public ExpectedException thrown = ExpectedException.none();
private Account testAccount;
@Before
public void setUp() {
testAccount = new Account("user@test.com", "", "user", Roles.ROLE_ADMIN);
when(securityMock.getAuthentication()).thenReturn(authMock);
when(authMock.getPrincipal()).thenReturn(testAccount);
SecurityContextHolder.setContext(securityMock);
}
@Test
public void shouldThrowExceptionWhenUserNotFound() {
// arrange
thrown.expect(UsernameNotFoundException.class);
thrown.expectMessage("User not found or is not confirmed");
when(accountServiceMock.findByEmail("user@example.com")).thenReturn(null);
// act
userService.loadUserByUsername("user@example.com");
}
@Test
public void shouldReturnUserDetails() {
// arrange
Account demoUser = new Account("user@example.com", "demo", "user", Roles.ROLE_POWERUSER);
demoUser.setConfirmed(true);
when(accountServiceMock.findByEmail("user@example.com")).thenReturn(demoUser);
// act
UserDetails userDetails = userService.loadUserByUsername("user@example.com");
// assert
Assert.assertTrue(demoUser.getUsername().equals(userDetails.getUsername()));
Assert.assertTrue(demoUser.getPassword().equals(userDetails.getPassword()));
}
@Test
public void signInTest() {
userService.signin(testAccount);
Assert.assertNotNull(Utils.getCurrentAccount());
}
}