package com.mycompany.myapp.service; import com.mycompany.myapp.Application; import com.mycompany.myapp.ApplicationTest; import com.mycompany.myapp.domain.Authority; import com.mycompany.myapp.domain.PersistentToken; import com.mycompany.myapp.domain.User; import com.mycompany.myapp.repository.AuthorityRepository; import com.mycompany.myapp.repository.PersistentTokenRepository; import com.mycompany.myapp.repository.UserRepository; import java.time.ZonedDateTime; import com.mycompany.myapp.security.AuthoritiesConstants; import com.mycompany.myapp.service.util.RandomUtil; import java.time.LocalDate; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import javax.inject.Inject; import java.util.HashSet; import java.util.Optional; import java.util.List; import java.util.Set; import static org.assertj.core.api.Assertions.*; /** * Test class for the UserResource REST controller. * * @see UserService */ @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = ApplicationTest.class) @ActiveProfiles("test") @WebAppConfiguration @IntegrationTest public class UserServiceTest { @Inject private PersistentTokenRepository persistentTokenRepository; @Inject private UserRepository userRepository; @Inject private UserService userService; @Inject private AuthorityRepository authRepo; @Before public void setup() { // Add two nodes for Authorities Authority authAdmin = new Authority(); authAdmin.setName(AuthoritiesConstants.ADMIN); authAdmin = authRepo.save(authAdmin); Authority authUser = new Authority(); authUser.setName(AuthoritiesConstants.USER); authUser = authRepo.save(authUser); // Admin User Set<Authority> authorities = new HashSet<Authority>(); authorities.add(authUser); authorities.add(authAdmin); User user = new User(); user.setLogin("admin"); user.setPassword("$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC"); user.setFirstName(""); user.setLastName("Administrator"); user.setEmail("admin@localhost"); user.setActivated(true); user.setLangKey("en"); user.setCreatedDDate(ZonedDateTime.now()); user.setAuthorities(authorities); user = userRepository.save(user); user = new User(); user.setLogin("system"); user.setPassword("$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG"); user.setFirstName(""); user.setLastName("System"); user.setEmail("system@uth.gr"); user.setActivated(true); user.setLangKey("en"); user.setCreatedDDate(ZonedDateTime.now()); user.setAuthorities(authorities); user = userRepository.save(user); authorities = new HashSet<Authority>(); user = new User(); user.setLogin("anonymousUser"); user.setPassword("$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO"); user.setFirstName("Anonymous"); user.setLastName("User"); user.setEmail("anonymousUser@uth.gr"); user.setActivated(true); user.setLangKey("en"); user.setCreatedDDate(ZonedDateTime.now()); user.setAuthorities(authorities); user = userRepository.save(user); authorities.add(authUser); user = new User(); user.setLogin("user"); user.setPassword("$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K"); user.setFirstName(""); user.setLastName("User"); user.setEmail("user@uth.gr"); user.setActivated(true); user.setLangKey("en"); user.setCreatedDDate(ZonedDateTime.now()); user.setAuthorities(authorities); user = userRepository.save(user); } @Test public void testRemoveOldPersistentTokens() { User admin = userRepository.findOneByLogin("admin"); int existingCount = persistentTokenRepository.findByUserCypher(admin.getLogin()).size(); generateUserToken(admin, "1111-1111", LocalDate.now()); LocalDate now = LocalDate.now(); generateUserToken(admin, "2222-2222", now.minusDays(32)); assertThat(persistentTokenRepository.findByUserCypher(admin.getLogin())).hasSize(existingCount + 2); userService.removeOldPersistentTokens(); assertThat(persistentTokenRepository.findByUserCypher(admin.getLogin())).hasSize(existingCount + 1); } @Test public void assertThatUserMustExistToResetPassword() { Optional<User> maybeUser = userService.requestPasswordReset("john.doe@localhost"); assertThat(maybeUser.isPresent()).isFalse(); maybeUser = userService.requestPasswordReset("admin@localhost"); assertThat(maybeUser.isPresent()).isTrue(); assertThat(maybeUser.get().getEmail()).isEqualTo("admin@localhost"); assertThat(maybeUser.get().getResetDate()).isNotNull(); assertThat(maybeUser.get().getResetKey()).isNotNull(); } @Test public void assertThatOnlyActivatedUserCanRequestPasswordReset() { User user = userService.createUserInformation("johndoe", "johndoe", "John", "Doe", "john.doe@localhost", "en-US"); Optional<User> maybeUser = userService.requestPasswordReset("john.doe@localhost"); assertThat(maybeUser.isPresent()).isFalse(); userRepository.delete(user); } @Test public void assertThatResetKeyMustNotBeOlderThan24Hours() { User user = userService.createUserInformation("johndoe", "johndoe", "John", "Doe", "john.doe@localhost", "en-US"); ZonedDateTime daysAgo = ZonedDateTime.now().minusHours(25); String resetKey = RandomUtil.generateResetKey(); user.setActivated(true); user.setResetDDate(daysAgo); user.setResetKey(resetKey); userRepository.save(user); Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); assertThat(maybeUser.isPresent()).isFalse(); userRepository.delete(user); } @Test public void assertThatResetKeyMustBeValid() { User user = userService.createUserInformation("johndoe", "johndoe", "John", "Doe", "john.doe@localhost", "en-US"); ZonedDateTime daysAgo = ZonedDateTime.now().minusHours(25); user.setActivated(true); user.setResetDDate(daysAgo); user.setResetKey("1234"); userRepository.save(user); Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); assertThat(maybeUser.isPresent()).isFalse(); userRepository.delete(user); } @Test public void assertThatUserCanResetPassword() { User user = userService.createUserInformation("johndoe", "johndoe", "John", "Doe", "john.doe@localhost", "en-US"); String oldPassword = user.getPassword(); ZonedDateTime daysAgo = ZonedDateTime.now().minusHours(2); String resetKey = RandomUtil.generateResetKey(); user.setActivated(true); user.setResetDDate(daysAgo); user.setResetKey(resetKey); userRepository.save(user); Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); assertThat(maybeUser.isPresent()).isTrue(); assertThat(maybeUser.get().getResetDate()).isNull(); assertThat(maybeUser.get().getResetKey()).isNull(); assertThat(maybeUser.get().getPassword()).isNotEqualTo(oldPassword); userRepository.delete(user); } @Test public void testFindNotActivatedUsersByCreationDateBefore() { userService.removeNotActivatedUsers(); ZonedDateTime now = ZonedDateTime.now(); List<User> users = userRepository.findAllByActivatedIsFalseAndCreatedDateBefore(now.minusDays(3).toEpochSecond()); assertThat(users).isEmpty(); } private void generateUserToken(User user, String tokenSeries, LocalDate localDate) { PersistentToken token = new PersistentToken(); token.setSeries(tokenSeries); token.setUser(user); token.setTokenValue(tokenSeries + "-data"); token.setTokenDate(localDate.toEpochDay()); token.setIpAddress("127.0.0.1"); token.setUserAgent("Test agent"); persistentTokenRepository.save(token); } }