package com.pollex.pam.service;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.mockito.Mockito.when;
|
|
import com.pollex.pam.IntegrationTest;
|
import com.pollex.pam.config.Constants;
|
import com.pollex.pam.domain.User;
|
import com.pollex.pam.repository.UserRepository;
|
import com.pollex.pam.service.dto.AdminUserDTO;
|
import java.time.Instant;
|
import java.time.LocalDateTime;
|
import java.time.temporal.ChronoUnit;
|
import java.util.List;
|
import java.util.Optional;
|
import org.apache.commons.lang3.RandomStringUtils;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.data.auditing.AuditingHandler;
|
import org.springframework.data.auditing.DateTimeProvider;
|
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.PageRequest;
|
import org.springframework.transaction.annotation.Transactional;
|
import tech.jhipster.security.RandomUtil;
|
|
/**
|
* Integration tests for {@link UserService}.
|
*/
|
@IntegrationTest
|
@Transactional
|
class UserServiceIT {
|
|
private static final String DEFAULT_LOGIN = "johndoe";
|
|
private static final String DEFAULT_EMAIL = "johndoe@localhost";
|
|
private static final String DEFAULT_FIRSTNAME = "john";
|
|
private static final String DEFAULT_LASTNAME = "doe";
|
|
private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50";
|
|
private static final String DEFAULT_LANGKEY = "dummy";
|
|
@Autowired
|
private UserRepository userRepository;
|
|
@Autowired
|
private UserService userService;
|
|
@Autowired
|
private AuditingHandler auditingHandler;
|
|
@MockBean
|
private DateTimeProvider dateTimeProvider;
|
|
private User user;
|
|
@BeforeEach
|
public void init() {
|
user = new User();
|
user.setLogin(DEFAULT_LOGIN);
|
user.setPassword(RandomStringUtils.random(60));
|
user.setActivated(true);
|
user.setEmail(DEFAULT_EMAIL);
|
user.setFirstName(DEFAULT_FIRSTNAME);
|
user.setLastName(DEFAULT_LASTNAME);
|
user.setImageUrl(DEFAULT_IMAGEURL);
|
user.setLangKey(DEFAULT_LANGKEY);
|
|
when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now()));
|
auditingHandler.setDateTimeProvider(dateTimeProvider);
|
}
|
|
@Test
|
@Transactional
|
void assertThatUserMustExistToResetPassword() {
|
userRepository.saveAndFlush(user);
|
Optional<User> maybeUser = userService.requestPasswordReset("invalid.login@localhost");
|
assertThat(maybeUser).isNotPresent();
|
|
maybeUser = userService.requestPasswordReset(user.getEmail());
|
assertThat(maybeUser).isPresent();
|
assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail());
|
assertThat(maybeUser.orElse(null).getResetDate()).isNotNull();
|
assertThat(maybeUser.orElse(null).getResetKey()).isNotNull();
|
}
|
|
@Test
|
@Transactional
|
void assertThatOnlyActivatedUserCanRequestPasswordReset() {
|
user.setActivated(false);
|
userRepository.saveAndFlush(user);
|
|
Optional<User> maybeUser = userService.requestPasswordReset(user.getLogin());
|
assertThat(maybeUser).isNotPresent();
|
userRepository.delete(user);
|
}
|
|
@Test
|
@Transactional
|
void assertThatResetKeyMustNotBeOlderThan24Hours() {
|
Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS);
|
String resetKey = RandomUtil.generateResetKey();
|
user.setActivated(true);
|
user.setResetDate(daysAgo);
|
user.setResetKey(resetKey);
|
userRepository.saveAndFlush(user);
|
|
Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey());
|
assertThat(maybeUser).isNotPresent();
|
userRepository.delete(user);
|
}
|
|
@Test
|
@Transactional
|
void assertThatResetKeyMustBeValid() {
|
Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS);
|
user.setActivated(true);
|
user.setResetDate(daysAgo);
|
user.setResetKey("1234");
|
userRepository.saveAndFlush(user);
|
|
Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey());
|
assertThat(maybeUser).isNotPresent();
|
userRepository.delete(user);
|
}
|
|
@Test
|
@Transactional
|
void assertThatUserCanResetPassword() {
|
String oldPassword = user.getPassword();
|
Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS);
|
String resetKey = RandomUtil.generateResetKey();
|
user.setActivated(true);
|
user.setResetDate(daysAgo);
|
user.setResetKey(resetKey);
|
userRepository.saveAndFlush(user);
|
|
Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey());
|
assertThat(maybeUser).isPresent();
|
assertThat(maybeUser.orElse(null).getResetDate()).isNull();
|
assertThat(maybeUser.orElse(null).getResetKey()).isNull();
|
assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword);
|
|
userRepository.delete(user);
|
}
|
|
@Test
|
@Transactional
|
void assertThatNotActivatedUsersWithNotNullActivationKeyCreatedBefore3DaysAreDeleted() {
|
Instant now = Instant.now();
|
when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS)));
|
user.setActivated(false);
|
user.setActivationKey(RandomStringUtils.random(20));
|
User dbUser = userRepository.saveAndFlush(user);
|
dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS));
|
userRepository.saveAndFlush(user);
|
Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS);
|
List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo);
|
assertThat(users).isNotEmpty();
|
userService.removeNotActivatedUsers();
|
users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo);
|
assertThat(users).isEmpty();
|
}
|
|
@Test
|
@Transactional
|
void assertThatNotActivatedUsersWithNullActivationKeyCreatedBefore3DaysAreNotDeleted() {
|
Instant now = Instant.now();
|
when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS)));
|
user.setActivated(false);
|
User dbUser = userRepository.saveAndFlush(user);
|
dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS));
|
userRepository.saveAndFlush(user);
|
Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS);
|
List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo);
|
assertThat(users).isEmpty();
|
userService.removeNotActivatedUsers();
|
Optional<User> maybeDbUser = userRepository.findById(dbUser.getId());
|
assertThat(maybeDbUser).contains(dbUser);
|
}
|
}
|