Update using Quizzes
This commit is contained in:
@@ -14,7 +14,9 @@ import lombok.Builder;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Builder
|
@Builder
|
||||||
@@ -27,4 +29,29 @@ public class Quizzes {
|
|||||||
public boolean isLastMail(final Integer quizSize) {
|
public boolean isLastMail(final Integer quizSize) {
|
||||||
return quizList.size() <= quizSize;
|
return quizList.size() <= quizSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<Quiz> getRandomQuizListUnderLimit(final Integer quizSize) {
|
||||||
|
return quizList.size() <= quizSize
|
||||||
|
? quizList
|
||||||
|
: createRandomQuizListUnderLimit(quizList, quizSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Quiz> createRandomQuizListUnderLimit(final List<Quiz> quizList, final Integer quizSize) {
|
||||||
|
final Random rand = new Random();
|
||||||
|
final List<Quiz> randomQuizList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < quizSize; i++) {
|
||||||
|
final int randomIndex = rand.nextInt(quizList.size());
|
||||||
|
final Quiz quiz = quizList.get(randomIndex);
|
||||||
|
randomQuizList.add(quiz);
|
||||||
|
quizList.remove(quiz);
|
||||||
|
}
|
||||||
|
|
||||||
|
return randomQuizList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size() {
|
||||||
|
return quizList.size();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,26 +73,6 @@ public class QuizService {
|
|||||||
return new Quizzes(quizRepository.customFindByIdNotInAndQuizCategoryInAndQuizLevel(solvedQuizIdList, quizCategorySet, quizLevel));
|
return new Quizzes(quizRepository.customFindByIdNotInAndQuizCategoryInAndQuizLevel(solvedQuizIdList, quizCategorySet, quizLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Quiz> getRandomQuizListUnderLimit(final List<Quiz> quizList, final Integer quizSize) {
|
|
||||||
return quizList.size() <= quizSize
|
|
||||||
? quizList
|
|
||||||
: createRandomQuizListUnderLimit(quizList, quizSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Quiz> createRandomQuizListUnderLimit(final List<Quiz> quizList, final Integer quizSize) {
|
|
||||||
final Random rand = new Random();
|
|
||||||
final List<Quiz> randomQuizList = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int i = 0; i < quizSize; i++) {
|
|
||||||
final int randomIndex = rand.nextInt(quizList.size());
|
|
||||||
final Quiz quiz = quizList.get(randomIndex);
|
|
||||||
randomQuizList.add(quiz);
|
|
||||||
quizList.remove(quiz);
|
|
||||||
}
|
|
||||||
|
|
||||||
return randomQuizList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<QuizCategoryResponse> getQuizCategoryList() {
|
public List<QuizCategoryResponse> getQuizCategoryList() {
|
||||||
final List<EnumMapperValue> enumMapperValueList = enumMapperFactory.get(EnumMapperKey.QUIZ_CATEGORY).stream().filter(EnumMapperValue::isExpose).collect(Collectors.toList());
|
final List<EnumMapperValue> enumMapperValueList = enumMapperFactory.get(EnumMapperKey.QUIZ_CATEGORY).stream().filter(EnumMapperValue::isExpose).collect(Collectors.toList());
|
||||||
return enumMapperValueList.stream()
|
return enumMapperValueList.stream()
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ 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.member.entity.Member;
|
import com.mangkyu.employment.interview.app.member.entity.Member;
|
||||||
|
import com.mangkyu.employment.interview.app.member.service.GetMemberService;
|
||||||
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.entity.Quizzes;
|
import com.mangkyu.employment.interview.app.quiz.entity.Quizzes;
|
||||||
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.member.service.GetMemberService;
|
|
||||||
import com.mangkyu.employment.interview.enums.value.QuizDay;
|
import com.mangkyu.employment.interview.enums.value.QuizDay;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -46,10 +46,10 @@ public class SendQuizCronJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendUnsolvedQuizForUser(final Member member) {
|
private void sendUnsolvedQuizForUser(final Member member) {
|
||||||
final Quizzes unsolvedQuizList = quizService.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
final Quizzes quizzes = quizService.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
||||||
final boolean isLastMail = unsolvedQuizList.isLastMail(member.getQuizSize());
|
final boolean isLastMail = quizzes.isLastMail(member.getQuizSize());
|
||||||
|
|
||||||
final List<Quiz> randomQuizList = quizService.getRandomQuizListUnderLimit(unsolvedQuizList.getQuizList(), member.getQuizSize());
|
final List<Quiz> randomQuizList = quizzes.getRandomQuizListUnderLimit(member.getQuizSize());
|
||||||
if (isLastMail) {
|
if (isLastMail) {
|
||||||
member.disableUser();
|
member.disableUser();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,53 @@
|
|||||||
package com.mangkyu.employment.interview.app.quiz.entity;
|
package com.mangkyu.employment.interview.app.quiz.entity;
|
||||||
|
|
||||||
|
import com.mangkyu.employment.interview.enums.value.QuizCategory;
|
||||||
|
import com.mangkyu.employment.interview.enums.value.QuizLevel;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
class QuizzesTest {
|
class QuizzesTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getRandomQuizListUnderLimitSuccess_UnderLimit() {
|
||||||
|
// given
|
||||||
|
final Quizzes quizzes = new Quizzes(List.of(quiz(4L)));
|
||||||
|
|
||||||
|
// when
|
||||||
|
final List<Quiz> result = quizzes.getRandomQuizListUnderLimit(3);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result.size()).isEqualTo(quizzes.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getRandomQuizListUnderLimitSuccess_OverLimit() {
|
||||||
|
// given
|
||||||
|
final Quizzes quizzes = quizzes();
|
||||||
|
|
||||||
|
// when
|
||||||
|
final List<Quiz> result = quizzes.getRandomQuizListUnderLimit(3);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result.size()).isEqualTo(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void 마지막메일_True(){
|
void 마지막메일_True(){
|
||||||
// given
|
// given
|
||||||
Quizzes quizzes = quizzes();
|
Quizzes quizzes = quizzes();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
boolean result = quizzes.isLastMail(3);
|
boolean result = quizzes.isLastMail(5);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result).isTrue();
|
assertThat(result).isTrue();
|
||||||
@@ -35,8 +65,29 @@ class QuizzesTest {
|
|||||||
assertThat(result).isFalse();
|
assertThat(result).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Quiz quiz(final long id) {
|
||||||
|
final Quiz quiz = Quiz.builder()
|
||||||
|
.title("quiz")
|
||||||
|
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
|
||||||
|
.quizCategory(QuizCategory.JAVA)
|
||||||
|
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
ReflectionTestUtils.setField(quiz, "id", id);
|
||||||
|
ReflectionTestUtils.setField(quiz, "resourceId", UUID.randomUUID().toString());
|
||||||
|
ReflectionTestUtils.setField(quiz, "createdAt", LocalDateTime.now());
|
||||||
|
return quiz;
|
||||||
|
}
|
||||||
|
|
||||||
private Quizzes quizzes() {
|
private Quizzes quizzes() {
|
||||||
return new Quizzes(List.of(new Quiz(), new Quiz()));
|
final List<Quiz> unsolvedQuizList = new ArrayList<>();
|
||||||
|
|
||||||
|
unsolvedQuizList.add(quiz(1L));
|
||||||
|
unsolvedQuizList.add(quiz(2L));
|
||||||
|
unsolvedQuizList.add(quiz(3L));
|
||||||
|
unsolvedQuizList.add(quiz(4L));
|
||||||
|
|
||||||
|
return new Quizzes(unsolvedQuizList);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,6 @@ class QuizServiceTest {
|
|||||||
|
|
||||||
private final Long userId = -1L;
|
private final Long userId = -1L;
|
||||||
private final QuizLevel quizLevel = QuizLevel.NEW;
|
private final QuizLevel quizLevel = QuizLevel.NEW;
|
||||||
private final int quizSize = 3;
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void searchQuizList() {
|
public void searchQuizList() {
|
||||||
@@ -216,30 +215,6 @@ class QuizServiceTest {
|
|||||||
assertThat(result.getQuizList().size()).isEqualTo(unsolvedQuizList.size());
|
assertThat(result.getQuizList().size()).isEqualTo(unsolvedQuizList.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getRandomQuizListUnderLimitSuccess_UnderLimit() {
|
|
||||||
// given
|
|
||||||
final List<Quiz> unsolvedQuizList = Collections.singletonList(quiz(4L));
|
|
||||||
|
|
||||||
// when
|
|
||||||
final List<Quiz> result = quizService.getRandomQuizListUnderLimit(unsolvedQuizList, quizSize);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertThat(result.size()).isEqualTo(unsolvedQuizList.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getRandomQuizListUnderLimitSuccess_OverLimit() {
|
|
||||||
// given
|
|
||||||
final List<Quiz> unsolvedQuizList = quizList();
|
|
||||||
|
|
||||||
// when
|
|
||||||
final List<Quiz> result = quizService.getRandomQuizListUnderLimit(unsolvedQuizList, quizSize);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertThat(result.size()).isEqualTo(quizSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getQuizCategoryResponseList() {
|
public void getQuizCategoryResponseList() {
|
||||||
// given
|
// given
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ 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.member.entity.Member;
|
import com.mangkyu.employment.interview.app.member.entity.Member;
|
||||||
|
import com.mangkyu.employment.interview.app.member.service.GetMemberService;
|
||||||
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.entity.Quizzes;
|
import com.mangkyu.employment.interview.app.quiz.entity.Quizzes;
|
||||||
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.member.service.GetMemberService;
|
|
||||||
import com.mangkyu.employment.interview.enums.value.QuizDay;
|
import com.mangkyu.employment.interview.enums.value.QuizDay;
|
||||||
import com.mangkyu.employment.interview.enums.value.QuizLevel;
|
import com.mangkyu.employment.interview.enums.value.QuizLevel;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
@@ -18,7 +18,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
|
|||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
@@ -50,14 +49,14 @@ class SendQuizCronJobTest {
|
|||||||
.quizSize(3)
|
.quizSize(3)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
memberList = Collections.singletonList(member);
|
memberList = List.of(member);
|
||||||
quizDay = QuizDay.findQuizDay(LocalDate.now().getDayOfWeek());
|
quizDay = QuizDay.findQuizDay(LocalDate.now().getDayOfWeek());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sendQuizMailDaily_UserNotExists() {
|
public void sendQuizMailDaily_UserNotExists() {
|
||||||
// given
|
// given
|
||||||
doReturn(Collections.emptyList())
|
doReturn(List.of())
|
||||||
.when(memberService)
|
.when(memberService)
|
||||||
.getEnabledUserList(quizDay);
|
.getEnabledUserList(quizDay);
|
||||||
|
|
||||||
@@ -68,7 +67,6 @@ class SendQuizCronJobTest {
|
|||||||
|
|
||||||
// verify
|
// verify
|
||||||
verify(quizService, times(0)).getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
verify(quizService, times(0)).getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
||||||
verify(quizService, times(0)).getRandomQuizListUnderLimit(anyList(), anyInt());
|
|
||||||
verify(mailService, times(0)).sendMail(anyString(), anyList(), anyBoolean());
|
verify(mailService, times(0)).sendMail(anyString(), anyList(), anyBoolean());
|
||||||
verify(solvedQuizService, times(0)).addSolvedQuizList(any(Member.class), anyList());
|
verify(solvedQuizService, times(0)).addSolvedQuizList(any(Member.class), anyList());
|
||||||
}
|
}
|
||||||
@@ -76,18 +74,14 @@ class SendQuizCronJobTest {
|
|||||||
@Test
|
@Test
|
||||||
public void sendQuizMailDaily_NotLastMail() {
|
public void sendQuizMailDaily_NotLastMail() {
|
||||||
// given
|
// given
|
||||||
final List<Quiz> unsolvedQuizList = quizList(5);
|
Quizzes quizzes = new Quizzes(quizList(5));
|
||||||
final List<Quiz> randomQuizList = unsolvedQuizList.subList(0, 3);
|
|
||||||
|
|
||||||
doReturn(memberList)
|
doReturn(memberList)
|
||||||
.when(memberService)
|
.when(memberService)
|
||||||
.getEnabledUserList(quizDay);
|
.getEnabledUserList(quizDay);
|
||||||
doReturn(new Quizzes(unsolvedQuizList))
|
doReturn(quizzes)
|
||||||
.when(quizService)
|
.when(quizService)
|
||||||
.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
||||||
doReturn(randomQuizList)
|
|
||||||
.when(quizService)
|
|
||||||
.getRandomQuizListUnderLimit(unsolvedQuizList, member.getQuizSize());
|
|
||||||
|
|
||||||
// when
|
// when
|
||||||
target.sendQuizMail();
|
target.sendQuizMail();
|
||||||
@@ -96,26 +90,19 @@ class SendQuizCronJobTest {
|
|||||||
|
|
||||||
// verify
|
// verify
|
||||||
verify(quizService, times(1)).getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
verify(quizService, times(1)).getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
||||||
verify(quizService, times(1)).getRandomQuizListUnderLimit(unsolvedQuizList, member.getQuizSize());
|
|
||||||
verify(mailService, times(1)).sendMail(member.getEmail(), randomQuizList, false);
|
|
||||||
verify(solvedQuizService, times(1)).addSolvedQuizList(member, randomQuizList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sendQuizMailDaily_LastMail() {
|
public void sendQuizMailDaily_LastMail() {
|
||||||
// given
|
// given
|
||||||
final List<Quiz> unsolvedQuizList = quizList(3);
|
Quizzes quizzes = new Quizzes(quizList(3));
|
||||||
final List<Quiz> randomQuizList = unsolvedQuizList.subList(0, 3);
|
|
||||||
|
|
||||||
doReturn(memberList)
|
doReturn(memberList)
|
||||||
.when(memberService)
|
.when(memberService)
|
||||||
.getEnabledUserList(quizDay);
|
.getEnabledUserList(quizDay);
|
||||||
doReturn(new Quizzes(unsolvedQuizList))
|
doReturn(quizzes)
|
||||||
.when(quizService)
|
.when(quizService)
|
||||||
.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
||||||
doReturn(randomQuizList)
|
|
||||||
.when(quizService)
|
|
||||||
.getRandomQuizListUnderLimit(unsolvedQuizList, member.getQuizSize());
|
|
||||||
|
|
||||||
// when
|
// when
|
||||||
target.sendQuizMail();
|
target.sendQuizMail();
|
||||||
@@ -124,9 +111,6 @@ class SendQuizCronJobTest {
|
|||||||
|
|
||||||
// verify
|
// verify
|
||||||
verify(quizService, times(1)).getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
verify(quizService, times(1)).getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet());
|
||||||
verify(quizService, times(1)).getRandomQuizListUnderLimit(unsolvedQuizList, member.getQuizSize());
|
|
||||||
verify(mailService, times(1)).sendMail(member.getEmail(), randomQuizList, true);
|
|
||||||
verify(solvedQuizService, times(1)).addSolvedQuizList(member, randomQuizList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Quiz> quizList(final int size) {
|
private List<Quiz> quizList(final int size) {
|
||||||
|
|||||||
Reference in New Issue
Block a user