Update using Quizzes

This commit is contained in:
MangKyu
2023-02-18 20:58:39 +09:00
parent e139ae27a3
commit d493a2b3ed
6 changed files with 92 additions and 75 deletions

View File

@@ -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();
}
} }

View File

@@ -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()

View File

@@ -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();
} }

View File

@@ -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);
} }
} }

View File

@@ -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

View File

@@ -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) {