Add DayOfWeek on user
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
package com.mangkyu.employment.interview.app.user.dto;
|
package com.mangkyu.employment.interview.app.user.dto;
|
||||||
|
|
||||||
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@@ -10,7 +9,10 @@ import org.hibernate.validator.constraints.Range;
|
|||||||
|
|
||||||
import javax.validation.constraints.Email;
|
import javax.validation.constraints.Email;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.time.DayOfWeek;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static com.mangkyu.employment.interview.app.quiz.constants.QuizConstants.*;
|
import static com.mangkyu.employment.interview.app.quiz.constants.QuizConstants.*;
|
||||||
|
|
||||||
@@ -30,6 +32,6 @@ public class AddUserRequest {
|
|||||||
@Range(min = MINIMUM_QUIZ_SIZE, max = MAXIMUM_QUIZ_SIZE)
|
@Range(min = MINIMUM_QUIZ_SIZE, max = MAXIMUM_QUIZ_SIZE)
|
||||||
private final Integer quizSize = DEFAULT_QUIZ_SIZE;
|
private final Integer quizSize = DEFAULT_QUIZ_SIZE;
|
||||||
|
|
||||||
@NotNull
|
@NotEmpty
|
||||||
private final UserQuizCycle userQuizCycle;
|
private final Set<DayOfWeek> quizDaySet;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,15 +3,16 @@ package com.mangkyu.employment.interview.app.user.entity;
|
|||||||
import com.mangkyu.employment.interview.app.common.entity.BaseEntity;
|
import com.mangkyu.employment.interview.app.common.entity.BaseEntity;
|
||||||
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
||||||
import com.mangkyu.employment.interview.app.solvedquiz.entity.SolvedQuiz;
|
import com.mangkyu.employment.interview.app.solvedquiz.entity.SolvedQuiz;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
import java.time.DayOfWeek;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static com.mangkyu.employment.interview.app.quiz.constants.QuizConstants.DEFAULT_QUIZ_SIZE;
|
import static com.mangkyu.employment.interview.app.quiz.constants.QuizConstants.DEFAULT_QUIZ_SIZE;
|
||||||
|
|
||||||
@@ -29,9 +30,10 @@ public class User extends BaseEntity {
|
|||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
private QuizLevel quizLevel;
|
private QuizLevel quizLevel;
|
||||||
|
|
||||||
@Builder.Default
|
@ElementCollection(targetClass = DayOfWeek.class)
|
||||||
|
@CollectionTable
|
||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
private UserQuizCycle userQuizCycle = UserQuizCycle.REGULAR_INTERVALS;
|
private Set<DayOfWeek> quizDaySet;
|
||||||
|
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private Integer quizSize = DEFAULT_QUIZ_SIZE;
|
private Integer quizSize = DEFAULT_QUIZ_SIZE;
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
package com.mangkyu.employment.interview.app.user.enums;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public enum UserQuizCycle {
|
|
||||||
|
|
||||||
DAILY("Quiz Everyday"),
|
|
||||||
REGULAR_INTERVALS("Quiz Regular Intervals"),
|
|
||||||
;
|
|
||||||
|
|
||||||
private final String desc;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
package com.mangkyu.employment.interview.app.user.repository;
|
package com.mangkyu.employment.interview.app.user.repository;
|
||||||
|
|
||||||
import com.mangkyu.employment.interview.app.user.entity.User;
|
import com.mangkyu.employment.interview.app.user.entity.User;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.time.DayOfWeek;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface UserRepository extends JpaRepository <User, Long> {
|
public interface UserRepository extends JpaRepository <User, Long> {
|
||||||
|
|
||||||
List<User> findAllByIsEnableTrueAndUserQuizCycleIs(final UserQuizCycle userQuizCycle);
|
List<User> findAllByIsEnableTrueAndQuizDaySetIs(final DayOfWeek dayOfWeek);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ package com.mangkyu.employment.interview.app.user.service;
|
|||||||
|
|
||||||
import com.mangkyu.employment.interview.app.user.dto.AddUserRequest;
|
import com.mangkyu.employment.interview.app.user.dto.AddUserRequest;
|
||||||
import com.mangkyu.employment.interview.app.user.entity.User;
|
import com.mangkyu.employment.interview.app.user.entity.User;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import com.mangkyu.employment.interview.app.user.repository.UserRepository;
|
import com.mangkyu.employment.interview.app.user.repository.UserRepository;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.modelmapper.ModelMapper;
|
import org.modelmapper.ModelMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.DayOfWeek;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -31,7 +31,7 @@ public class UserService {
|
|||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<User> getEnabledUserList(final UserQuizCycle userQuizCycle) {
|
public List<User> getEnabledUserList(final DayOfWeek dayOfWeek) {
|
||||||
return userRepository.findAllByIsEnableTrueAndUserQuizCycleIs(userQuizCycle);
|
return userRepository.findAllByIsEnableTrueAndQuizDaySetIs(dayOfWeek);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
package com.mangkyu.employment.interview.cron;
|
package com.mangkyu.employment.interview.cron;
|
||||||
|
|
||||||
import com.mangkyu.employment.interview.app.mail.service.MailService;
|
import com.mangkyu.employment.interview.app.mail.service.MailService;
|
||||||
import com.mangkyu.employment.interview.app.quiz.constants.QuizConstants;
|
|
||||||
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
|
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
|
||||||
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
|
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
|
||||||
import com.mangkyu.employment.interview.app.solvedquiz.service.SolvedQuizService;
|
import com.mangkyu.employment.interview.app.solvedquiz.service.SolvedQuizService;
|
||||||
import com.mangkyu.employment.interview.app.user.entity.User;
|
import com.mangkyu.employment.interview.app.user.entity.User;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import com.mangkyu.employment.interview.app.user.service.UserService;
|
import com.mangkyu.employment.interview.app.user.service.UserService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -14,6 +12,7 @@ import org.springframework.scheduling.annotation.Scheduled;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@@ -31,20 +30,10 @@ public class SendQuizCronJob {
|
|||||||
* https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronExpression.html
|
* https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronExpression.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @Scheduled(cron = "*/30 * * * * *") // every 30 seconds
|
@Scheduled(cron = "0 0 1 * * ?")
|
||||||
@Scheduled(cron = "0 0 01 * * 1,4") // every Monday, Thursday at 1am
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void sendQuizMailEveryMondayAndThursday1AM() {
|
public void sendQuizMail() {
|
||||||
final List<User> userList = userService.getEnabledUserList(UserQuizCycle.REGULAR_INTERVALS);
|
final List<User> userList = userService.getEnabledUserList(LocalDate.now().getDayOfWeek());
|
||||||
for (final User user : userList) {
|
|
||||||
sendUnsolvedQuizForUser(user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 01 * * *") // everyday at 1am
|
|
||||||
@Transactional
|
|
||||||
public void sendQuizMailEveryDay1AM() {
|
|
||||||
final List<User> userList = userService.getEnabledUserList(UserQuizCycle.DAILY);
|
|
||||||
for (final User user : userList) {
|
for (final User user : userList) {
|
||||||
sendUnsolvedQuizForUser(user);
|
sendUnsolvedQuizForUser(user);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package com.mangkyu.employment.interview.app.user.controller;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
||||||
import com.mangkyu.employment.interview.app.user.dto.AddUserRequest;
|
import com.mangkyu.employment.interview.app.user.dto.AddUserRequest;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import com.mangkyu.employment.interview.app.user.service.UserService;
|
import com.mangkyu.employment.interview.app.user.service.UserService;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -17,6 +16,10 @@ import org.springframework.test.web.servlet.ResultActions;
|
|||||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||||
|
|
||||||
|
import java.time.DayOfWeek;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||||
|
|
||||||
@ExtendWith(MockitoExtension.class)
|
@ExtendWith(MockitoExtension.class)
|
||||||
@@ -94,12 +97,37 @@ class UserControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void addUserSuccess() throws Exception {
|
public void addUserFail_QuizDaySetIsEmpty() throws Exception {
|
||||||
// given
|
// given
|
||||||
|
final AddUserRequest addUserRequest = AddUserRequest.builder()
|
||||||
|
.email("whalsrb1226@gmail.com")
|
||||||
|
.quizLevel(QuizLevel.NEW)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// when
|
||||||
|
final ResultActions result = mockMvc.perform(
|
||||||
|
MockMvcRequestBuilders.post("/user")
|
||||||
|
.content(new Gson().toJson(addUserRequest))
|
||||||
|
.contentType(MediaType.APPLICATION_JSON)
|
||||||
|
);
|
||||||
|
|
||||||
|
// then
|
||||||
|
result.andExpect(status().isBadRequest());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addUserSuccess() throws Exception {
|
||||||
|
// given
|
||||||
|
final Set<DayOfWeek> quizDaySet = new HashSet<>();
|
||||||
|
quizDaySet.add(DayOfWeek.MONDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.WEDNESDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.FRIDAY);
|
||||||
|
|
||||||
final AddUserRequest addUserRequest = AddUserRequest.builder()
|
final AddUserRequest addUserRequest = AddUserRequest.builder()
|
||||||
.email("whalsrb1226@gmail.com")
|
.email("whalsrb1226@gmail.com")
|
||||||
.quizLevel(QuizLevel.JUNIOR)
|
.quizLevel(QuizLevel.JUNIOR)
|
||||||
.userQuizCycle(UserQuizCycle.DAILY)
|
.quizDaySet(quizDaySet)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ package com.mangkyu.employment.interview.app.user.repository;
|
|||||||
|
|
||||||
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
||||||
import com.mangkyu.employment.interview.app.user.entity.User;
|
import com.mangkyu.employment.interview.app.user.entity.User;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||||
|
|
||||||
import java.util.List;
|
import java.time.DayOfWeek;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
@@ -21,18 +21,24 @@ class UserRepositoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void selectUserListByCycle() {
|
public void selectUserListByCycle() {
|
||||||
// given
|
// given
|
||||||
|
final Set<DayOfWeek> quizDaySet = new HashSet<>();
|
||||||
|
quizDaySet.add(DayOfWeek.MONDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.WEDNESDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.FRIDAY);
|
||||||
|
|
||||||
final User user = User.builder()
|
final User user = User.builder()
|
||||||
.email("minkyu@test.com")
|
.email("minkyu@test.com")
|
||||||
.quizLevel(QuizLevel.JUNIOR)
|
.quizLevel(QuizLevel.JUNIOR)
|
||||||
.userQuizCycle(UserQuizCycle.DAILY)
|
.quizSize(5)
|
||||||
|
.quizDaySet(quizDaySet)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final User savedUser = userRepository.save(user);
|
final User savedUser = userRepository.save(user);
|
||||||
userRepository.save(savedUser);
|
userRepository.save(savedUser);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final List<User> dailyResult = userRepository.findAllByIsEnableTrueAndUserQuizCycleIs(UserQuizCycle.DAILY);
|
final List<User> dailyResult = userRepository.findAllByIsEnableTrueAndQuizDaySetIs(DayOfWeek.MONDAY);
|
||||||
final List<User> regularResult = userRepository.findAllByIsEnableTrueAndUserQuizCycleIs(UserQuizCycle.REGULAR_INTERVALS);
|
final List<User> regularResult = userRepository.findAllByIsEnableTrueAndQuizDaySetIs(DayOfWeek.THURSDAY);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(dailyResult.size()).isOne();
|
assertThat(dailyResult.size()).isOne();
|
||||||
@@ -60,10 +66,15 @@ class UserRepositoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void updateUserDisabled() {
|
public void updateUserDisabled() {
|
||||||
// given
|
// given
|
||||||
|
final Set<DayOfWeek> quizDaySet = new HashSet<>();
|
||||||
|
quizDaySet.add(DayOfWeek.MONDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.WEDNESDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.FRIDAY);
|
||||||
|
|
||||||
final User user = User.builder()
|
final User user = User.builder()
|
||||||
.email("minkyu@test.com")
|
.email("minkyu@test.com")
|
||||||
.quizLevel(QuizLevel.JUNIOR)
|
.quizLevel(QuizLevel.JUNIOR)
|
||||||
.userQuizCycle(UserQuizCycle.REGULAR_INTERVALS)
|
.quizDaySet(quizDaySet)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final User savedUser = userRepository.save(user);
|
final User savedUser = userRepository.save(user);
|
||||||
@@ -71,7 +82,7 @@ class UserRepositoryTest {
|
|||||||
userRepository.save(savedUser);
|
userRepository.save(savedUser);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final List<User> result = userRepository.findAllByIsEnableTrueAndUserQuizCycleIs(UserQuizCycle.REGULAR_INTERVALS);
|
final List<User> result = userRepository.findAllByIsEnableTrueAndQuizDaySetIs(DayOfWeek.MONDAY);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result.size()).isZero();
|
assertThat(result.size()).isZero();
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package com.mangkyu.employment.interview.app.user.service;
|
|||||||
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
||||||
import com.mangkyu.employment.interview.app.user.dto.AddUserRequest;
|
import com.mangkyu.employment.interview.app.user.dto.AddUserRequest;
|
||||||
import com.mangkyu.employment.interview.app.user.entity.User;
|
import com.mangkyu.employment.interview.app.user.entity.User;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import com.mangkyu.employment.interview.app.user.repository.UserRepository;
|
import com.mangkyu.employment.interview.app.user.repository.UserRepository;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -15,8 +14,11 @@ import org.mockito.junit.jupiter.MockitoExtension;
|
|||||||
import org.modelmapper.ModelMapper;
|
import org.modelmapper.ModelMapper;
|
||||||
import org.modelmapper.config.Configuration;
|
import org.modelmapper.config.Configuration;
|
||||||
|
|
||||||
|
import java.time.DayOfWeek;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
@@ -32,7 +34,7 @@ class UserServiceTest {
|
|||||||
@Spy
|
@Spy
|
||||||
private ModelMapper modelMapper;
|
private ModelMapper modelMapper;
|
||||||
|
|
||||||
private final UserQuizCycle userQuizCycle = UserQuizCycle.DAILY;
|
private final DayOfWeek dayOfWeek = DayOfWeek.MONDAY;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void init() {
|
public void init() {
|
||||||
@@ -44,9 +46,15 @@ class UserServiceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void addUserSuccess() {
|
public void addUserSuccess() {
|
||||||
// given
|
// given
|
||||||
|
final Set<DayOfWeek> quizDaySet = new HashSet<>();
|
||||||
|
quizDaySet.add(DayOfWeek.MONDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.WEDNESDAY);
|
||||||
|
quizDaySet.add(DayOfWeek.SATURDAY);
|
||||||
|
|
||||||
final AddUserRequest addUserRequest = AddUserRequest.builder()
|
final AddUserRequest addUserRequest = AddUserRequest.builder()
|
||||||
.email("whalsrb1226@gmail.com")
|
.email("whalsrb1226@gmail.com")
|
||||||
.quizLevel(QuizLevel.JUNIOR)
|
.quizLevel(QuizLevel.JUNIOR)
|
||||||
|
.quizDaySet(quizDaySet)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
@@ -73,16 +81,16 @@ class UserServiceTest {
|
|||||||
public void getEnabledUserListSuccess() {
|
public void getEnabledUserListSuccess() {
|
||||||
// given
|
// given
|
||||||
final List<User> enabledUserList = Arrays.asList(user(true), user(true));
|
final List<User> enabledUserList = Arrays.asList(user(true), user(true));
|
||||||
doReturn(enabledUserList).when(userRepository).findAllByIsEnableTrueAndUserQuizCycleIs(userQuizCycle);
|
doReturn(enabledUserList).when(userRepository).findAllByIsEnableTrueAndQuizDaySetIs(dayOfWeek);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final List<User> result = target.getEnabledUserList(userQuizCycle);
|
final List<User> result = target.getEnabledUserList(dayOfWeek);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result.size()).isEqualTo(enabledUserList.size());
|
assertThat(result.size()).isEqualTo(enabledUserList.size());
|
||||||
|
|
||||||
// verify
|
// verify
|
||||||
verify(userRepository, times(1)).findAllByIsEnableTrueAndUserQuizCycleIs(userQuizCycle);
|
verify(userRepository, times(1)).findAllByIsEnableTrueAndQuizDaySetIs(dayOfWeek);
|
||||||
}
|
}
|
||||||
|
|
||||||
private User user(final boolean isEnable) {
|
private User user(final boolean isEnable) {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import com.mangkyu.employment.interview.app.quiz.enums.QuizLevel;
|
|||||||
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
|
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
|
||||||
import com.mangkyu.employment.interview.app.solvedquiz.service.SolvedQuizService;
|
import com.mangkyu.employment.interview.app.solvedquiz.service.SolvedQuizService;
|
||||||
import com.mangkyu.employment.interview.app.user.entity.User;
|
import com.mangkyu.employment.interview.app.user.entity.User;
|
||||||
import com.mangkyu.employment.interview.app.user.enums.UserQuizCycle;
|
|
||||||
import com.mangkyu.employment.interview.app.user.service.UserService;
|
import com.mangkyu.employment.interview.app.user.service.UserService;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -15,6 +14,8 @@ import org.mockito.InjectMocks;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import java.time.DayOfWeek;
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -38,6 +39,7 @@ class SendQuizCronJobTest {
|
|||||||
|
|
||||||
private User user;
|
private User user;
|
||||||
private List<User> userList;
|
private List<User> userList;
|
||||||
|
private DayOfWeek dayOfWeek;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void init() {
|
public void init() {
|
||||||
@@ -48,6 +50,7 @@ class SendQuizCronJobTest {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
userList = Collections.singletonList(user);
|
userList = Collections.singletonList(user);
|
||||||
|
dayOfWeek = LocalDate.now().getDayOfWeek();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -55,10 +58,10 @@ class SendQuizCronJobTest {
|
|||||||
// given
|
// given
|
||||||
doReturn(Collections.emptyList())
|
doReturn(Collections.emptyList())
|
||||||
.when(userService)
|
.when(userService)
|
||||||
.getEnabledUserList(UserQuizCycle.DAILY);
|
.getEnabledUserList(dayOfWeek);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
target.sendQuizMailEveryDay1AM();
|
target.sendQuizMail();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
|
|
||||||
@@ -78,7 +81,7 @@ class SendQuizCronJobTest {
|
|||||||
|
|
||||||
doReturn(userList)
|
doReturn(userList)
|
||||||
.when(userService)
|
.when(userService)
|
||||||
.getEnabledUserList(UserQuizCycle.DAILY);
|
.getEnabledUserList(dayOfWeek);
|
||||||
doReturn(unsolvedQuizList)
|
doReturn(unsolvedQuizList)
|
||||||
.when(quizService)
|
.when(quizService)
|
||||||
.getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
.getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
||||||
@@ -87,7 +90,7 @@ class SendQuizCronJobTest {
|
|||||||
.getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
.getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
||||||
|
|
||||||
// when
|
// when
|
||||||
target.sendQuizMailEveryDay1AM();
|
target.sendQuizMail();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
|
|
||||||
@@ -107,7 +110,7 @@ class SendQuizCronJobTest {
|
|||||||
|
|
||||||
doReturn(userList)
|
doReturn(userList)
|
||||||
.when(userService)
|
.when(userService)
|
||||||
.getEnabledUserList(UserQuizCycle.DAILY);
|
.getEnabledUserList(dayOfWeek);
|
||||||
doReturn(unsolvedQuizList)
|
doReturn(unsolvedQuizList)
|
||||||
.when(quizService)
|
.when(quizService)
|
||||||
.getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
.getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
||||||
@@ -116,85 +119,7 @@ class SendQuizCronJobTest {
|
|||||||
.getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
.getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
||||||
|
|
||||||
// when
|
// when
|
||||||
target.sendQuizMailEveryDay1AM();
|
target.sendQuizMail();
|
||||||
|
|
||||||
// then
|
|
||||||
|
|
||||||
// verify
|
|
||||||
verify(quizService, times(1)).getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
|
||||||
verify(quizService, times(1)).getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
|
||||||
verify(userService, times(1)).disableUser(user);
|
|
||||||
verify(mailService, times(1)).sendMail(user.getEmail(), randomQuizList, true);
|
|
||||||
verify(solvedQuizService, times(1)).addSolvedQuizList(user, randomQuizList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void sendQuizMailRegulary_UserNotExists() {
|
|
||||||
// given
|
|
||||||
doReturn(Collections.emptyList())
|
|
||||||
.when(userService)
|
|
||||||
.getEnabledUserList(UserQuizCycle.REGULAR_INTERVALS);
|
|
||||||
|
|
||||||
// when
|
|
||||||
target.sendQuizMailEveryMondayAndThursday1AM();
|
|
||||||
|
|
||||||
// then
|
|
||||||
|
|
||||||
// verify
|
|
||||||
verify(quizService, times(0)).getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
|
||||||
verify(quizService, times(0)).getRandomQuizListUnderLimit(anyList(), anyInt());
|
|
||||||
verify(userService, times(0)).disableUser(user);
|
|
||||||
verify(mailService, times(0)).sendMail(anyString(), anyList(), anyBoolean());
|
|
||||||
verify(solvedQuizService, times(0)).addSolvedQuizList(any(User.class), anyList());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void sendQuizMailRegulary_NotLastMail() {
|
|
||||||
// given
|
|
||||||
final List<Quiz> unsolvedQuizList = quizList(5);
|
|
||||||
final List<Quiz> randomQuizList = unsolvedQuizList.subList(0, 3);
|
|
||||||
|
|
||||||
doReturn(userList)
|
|
||||||
.when(userService)
|
|
||||||
.getEnabledUserList(UserQuizCycle.REGULAR_INTERVALS);
|
|
||||||
doReturn(unsolvedQuizList)
|
|
||||||
.when(quizService)
|
|
||||||
.getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
|
||||||
doReturn(randomQuizList)
|
|
||||||
.when(quizService)
|
|
||||||
.getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
|
||||||
|
|
||||||
// when
|
|
||||||
target.sendQuizMailEveryMondayAndThursday1AM();
|
|
||||||
|
|
||||||
// then
|
|
||||||
|
|
||||||
// verify
|
|
||||||
verify(quizService, times(1)).getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
|
||||||
verify(quizService, times(1)).getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
|
||||||
verify(userService, times(0)).disableUser(user);
|
|
||||||
verify(mailService, times(1)).sendMail(user.getEmail(), randomQuizList, false);
|
|
||||||
verify(solvedQuizService, times(1)).addSolvedQuizList(user, randomQuizList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void sendQuizMailRegulary_LastMail() {
|
|
||||||
// given
|
|
||||||
final List<Quiz> unsolvedQuizList = quizList(3);
|
|
||||||
final List<Quiz> randomQuizList = unsolvedQuizList.subList(0, 3);
|
|
||||||
|
|
||||||
doReturn(userList)
|
|
||||||
.when(userService)
|
|
||||||
.getEnabledUserList(UserQuizCycle.REGULAR_INTERVALS);
|
|
||||||
doReturn(unsolvedQuizList)
|
|
||||||
.when(quizService)
|
|
||||||
.getUnsolvedQuizList(user.getId(), user.getQuizLevel());
|
|
||||||
doReturn(randomQuizList)
|
|
||||||
.when(quizService)
|
|
||||||
.getRandomQuizListUnderLimit(unsolvedQuizList, user.getQuizSize());
|
|
||||||
|
|
||||||
// when
|
|
||||||
target.sendQuizMailEveryMondayAndThursday1AM();
|
|
||||||
|
|
||||||
// then
|
// then
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user