package thymeleafexamples.layouts.account; 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.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import static java.util.function.Predicate.isEqual; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class AccountServiceTest { @InjectMocks private AccountService accountService = new AccountService(); @Mock private AccountRepository accountRepositoryMock; @Mock private PasswordEncoder passwordEncoder; @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void shouldInitializeWithTwoDemoUsers() { // act accountService.initialize(); // assert verify(accountRepositoryMock, times(2)).save(any(Account.class)); } @Test public void shouldThrowExceptionWhenUserNotFound() { // arrange thrown.expect(UsernameNotFoundException.class); thrown.expectMessage("user not found"); when(accountRepositoryMock.findOneByEmail("user@example.com")).thenReturn(null); // act accountService.loadUserByUsername("user@example.com"); } @Test public void shouldReturnUserDetails() { // arrange Account demoUser = new Account("user@example.com", "demo", "ROLE_USER"); when(accountRepositoryMock.findOneByEmail("user@example.com")).thenReturn(demoUser); // act UserDetails userDetails = accountService.loadUserByUsername("user@example.com"); // assert assertThat(demoUser.getEmail()).isEqualTo(userDetails.getUsername()); assertThat(demoUser.getPassword()).isEqualTo(userDetails.getPassword()); assertThat(hasAuthority(userDetails, demoUser.getRole())).isTrue(); } private boolean hasAuthority(UserDetails userDetails, String role) { return userDetails.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .anyMatch(isEqual(role)); } }