From d493a2b3eda0d6d16a922e4a413f0567b1003113 Mon Sep 17 00:00:00 2001 From: MangKyu Date: Sat, 18 Feb 2023 20:58:39 +0900 Subject: [PATCH] Update using Quizzes --- .../interview/app/quiz/entity/Quizzes.java | 27 +++++++++ .../app/quiz/service/QuizService.java | 20 ------- .../interview/cron/SendQuizCronJob.java | 8 +-- .../app/quiz/entity/QuizzesTest.java | 57 ++++++++++++++++++- .../app/quiz/service/QuizServiceTest.java | 25 -------- .../interview/cron/SendQuizCronJobTest.java | 30 +++------- 6 files changed, 92 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/entity/Quizzes.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/entity/Quizzes.java index 75c8c72..5b887fa 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/entity/Quizzes.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/entity/Quizzes.java @@ -14,7 +14,9 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.List; +import java.util.Random; @Getter @Builder @@ -27,4 +29,29 @@ public class Quizzes { public boolean isLastMail(final Integer quizSize) { return quizList.size() <= quizSize; } + + + public List getRandomQuizListUnderLimit(final Integer quizSize) { + return quizList.size() <= quizSize + ? quizList + : createRandomQuizListUnderLimit(quizList, quizSize); + } + + private List createRandomQuizListUnderLimit(final List quizList, final Integer quizSize) { + final Random rand = new Random(); + final List 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(); + } } diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/service/QuizService.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/service/QuizService.java index 9401c40..67ad4c5 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/service/QuizService.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/service/QuizService.java @@ -73,26 +73,6 @@ public class QuizService { return new Quizzes(quizRepository.customFindByIdNotInAndQuizCategoryInAndQuizLevel(solvedQuizIdList, quizCategorySet, quizLevel)); } - public List getRandomQuizListUnderLimit(final List quizList, final Integer quizSize) { - return quizList.size() <= quizSize - ? quizList - : createRandomQuizListUnderLimit(quizList, quizSize); - } - - private List createRandomQuizListUnderLimit(final List quizList, final Integer quizSize) { - final Random rand = new Random(); - final List 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 getQuizCategoryList() { final List enumMapperValueList = enumMapperFactory.get(EnumMapperKey.QUIZ_CATEGORY).stream().filter(EnumMapperValue::isExpose).collect(Collectors.toList()); return enumMapperValueList.stream() diff --git a/src/main/java/com/mangkyu/employment/interview/cron/SendQuizCronJob.java b/src/main/java/com/mangkyu/employment/interview/cron/SendQuizCronJob.java index 645dc82..fd3de11 100644 --- a/src/main/java/com/mangkyu/employment/interview/cron/SendQuizCronJob.java +++ b/src/main/java/com/mangkyu/employment/interview/cron/SendQuizCronJob.java @@ -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.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.Quizzes; import com.mangkyu.employment.interview.app.quiz.service.QuizService; 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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -46,10 +46,10 @@ public class SendQuizCronJob { } private void sendUnsolvedQuizForUser(final Member member) { - final Quizzes unsolvedQuizList = quizService.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet()); - final boolean isLastMail = unsolvedQuizList.isLastMail(member.getQuizSize()); + final Quizzes quizzes = quizService.getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet()); + final boolean isLastMail = quizzes.isLastMail(member.getQuizSize()); - final List randomQuizList = quizService.getRandomQuizListUnderLimit(unsolvedQuizList.getQuizList(), member.getQuizSize()); + final List randomQuizList = quizzes.getRandomQuizListUnderLimit(member.getQuizSize()); if (isLastMail) { member.disableUser(); } diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/entity/QuizzesTest.java b/src/test/java/com/mangkyu/employment/interview/app/quiz/entity/QuizzesTest.java index 69243a4..5d08297 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/entity/QuizzesTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/quiz/entity/QuizzesTest.java @@ -1,23 +1,53 @@ 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.extension.ExtendWith; 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.junit.jupiter.api.Assertions.*; class QuizzesTest { + + @Test + public void getRandomQuizListUnderLimitSuccess_UnderLimit() { + // given + final Quizzes quizzes = new Quizzes(List.of(quiz(4L))); + + // when + final List result = quizzes.getRandomQuizListUnderLimit(3); + + // then + assertThat(result.size()).isEqualTo(quizzes.size()); + } + + @Test + public void getRandomQuizListUnderLimitSuccess_OverLimit() { + // given + final Quizzes quizzes = quizzes(); + + // when + final List result = quizzes.getRandomQuizListUnderLimit(3); + + // then + assertThat(result.size()).isEqualTo(3); + } + + @Test void 마지막메일_True(){ // given Quizzes quizzes = quizzes(); // when - boolean result = quizzes.isLastMail(3); + boolean result = quizzes.isLastMail(5); // then assertThat(result).isTrue(); @@ -35,8 +65,29 @@ class QuizzesTest { 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() { - return new Quizzes(List.of(new Quiz(), new Quiz())); + final List unsolvedQuizList = new ArrayList<>(); + + unsolvedQuizList.add(quiz(1L)); + unsolvedQuizList.add(quiz(2L)); + unsolvedQuizList.add(quiz(3L)); + unsolvedQuizList.add(quiz(4L)); + + return new Quizzes(unsolvedQuizList); } } \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/service/QuizServiceTest.java b/src/test/java/com/mangkyu/employment/interview/app/quiz/service/QuizServiceTest.java index 9c36e47..c139140 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/service/QuizServiceTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/quiz/service/QuizServiceTest.java @@ -53,7 +53,6 @@ class QuizServiceTest { private final Long userId = -1L; private final QuizLevel quizLevel = QuizLevel.NEW; - private final int quizSize = 3; @Test public void searchQuizList() { @@ -216,30 +215,6 @@ class QuizServiceTest { assertThat(result.getQuizList().size()).isEqualTo(unsolvedQuizList.size()); } - @Test - public void getRandomQuizListUnderLimitSuccess_UnderLimit() { - // given - final List unsolvedQuizList = Collections.singletonList(quiz(4L)); - - // when - final List result = quizService.getRandomQuizListUnderLimit(unsolvedQuizList, quizSize); - - // then - assertThat(result.size()).isEqualTo(unsolvedQuizList.size()); - } - - @Test - public void getRandomQuizListUnderLimitSuccess_OverLimit() { - // given - final List unsolvedQuizList = quizList(); - - // when - final List result = quizService.getRandomQuizListUnderLimit(unsolvedQuizList, quizSize); - - // then - assertThat(result.size()).isEqualTo(quizSize); - } - @Test public void getQuizCategoryResponseList() { // given diff --git a/src/test/java/com/mangkyu/employment/interview/cron/SendQuizCronJobTest.java b/src/test/java/com/mangkyu/employment/interview/cron/SendQuizCronJobTest.java index bc024a7..5723b7b 100644 --- a/src/test/java/com/mangkyu/employment/interview/cron/SendQuizCronJobTest.java +++ b/src/test/java/com/mangkyu/employment/interview/cron/SendQuizCronJobTest.java @@ -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.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.Quizzes; import com.mangkyu.employment.interview.app.quiz.service.QuizService; 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.QuizLevel; import org.junit.jupiter.api.BeforeEach; @@ -18,7 +18,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDate; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static org.mockito.Mockito.*; @@ -50,14 +49,14 @@ class SendQuizCronJobTest { .quizSize(3) .build(); - memberList = Collections.singletonList(member); + memberList = List.of(member); quizDay = QuizDay.findQuizDay(LocalDate.now().getDayOfWeek()); } @Test public void sendQuizMailDaily_UserNotExists() { // given - doReturn(Collections.emptyList()) + doReturn(List.of()) .when(memberService) .getEnabledUserList(quizDay); @@ -68,7 +67,6 @@ class SendQuizCronJobTest { // verify 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(solvedQuizService, times(0)).addSolvedQuizList(any(Member.class), anyList()); } @@ -76,18 +74,14 @@ class SendQuizCronJobTest { @Test public void sendQuizMailDaily_NotLastMail() { // given - final List unsolvedQuizList = quizList(5); - final List randomQuizList = unsolvedQuizList.subList(0, 3); + Quizzes quizzes = new Quizzes(quizList(5)); doReturn(memberList) .when(memberService) .getEnabledUserList(quizDay); - doReturn(new Quizzes(unsolvedQuizList)) + doReturn(quizzes) .when(quizService) .getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet()); - doReturn(randomQuizList) - .when(quizService) - .getRandomQuizListUnderLimit(unsolvedQuizList, member.getQuizSize()); // when target.sendQuizMail(); @@ -96,26 +90,19 @@ class SendQuizCronJobTest { // verify 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 public void sendQuizMailDaily_LastMail() { // given - final List unsolvedQuizList = quizList(3); - final List randomQuizList = unsolvedQuizList.subList(0, 3); + Quizzes quizzes = new Quizzes(quizList(3)); doReturn(memberList) .when(memberService) .getEnabledUserList(quizDay); - doReturn(new Quizzes(unsolvedQuizList)) + doReturn(quizzes) .when(quizService) .getUnsolvedQuizList(member.getId(), member.getQuizLevel(), member.getQuizCategorySet()); - doReturn(randomQuizList) - .when(quizService) - .getRandomQuizListUnderLimit(unsolvedQuizList, member.getQuizSize()); // when target.sendQuizMail(); @@ -124,9 +111,6 @@ class SendQuizCronJobTest { // verify 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 quizList(final int size) {