diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/CustomException.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/CustomException.java index acb56de7..d868e5ac 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/CustomException.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/CustomException.java @@ -23,6 +23,8 @@ public class CustomException extends RuntimeException { new CustomException(ErrorType.SURVEY_NOT_FOUND); public static final CustomException NOT_READY_FOR_NEXT_BUNDLE = new CustomException(ErrorType.NOT_READY_FOR_NEXT_BUNDLE); + public static final CustomException ALREADY_COMPLETED_SURVEY_BUNDLE = + new CustomException(ErrorType.ALREADY_COMPLETED_SURVEY_BUNDLE); private final ErrorType errorType; diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/ErrorType.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/ErrorType.java index 1183167b..66fe4909 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/ErrorType.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/common/support/error/ErrorType.java @@ -42,6 +42,9 @@ public enum ErrorType { // survey NOT_READY_FOR_NEXT_BUNDLE( HttpStatus.BAD_REQUEST, ErrorCode.E400, "다음 번들을 진행할 준비가 되지 않았습니다.", LogLevel.WARN), + + ALREADY_COMPLETED_SURVEY_BUNDLE( + HttpStatus.BAD_REQUEST, ErrorCode.E400, "이미 완료된 설문 번들입니다.", LogLevel.WARN), ; private final HttpStatus status; diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundle.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundle.java index 6627503f..f9326855 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundle.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundle.java @@ -9,6 +9,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.nexters.jaknaesocore.common.model.BaseTimeEntity; +import org.nexters.jaknaesocore.common.support.error.CustomException; @Getter @NoArgsConstructor @@ -27,12 +28,22 @@ public Survey getUnSubmittedSurvey(final List submittedSurvey) { surveys.stream().filter(survey -> !submittedSurvey.contains(survey)).toList(); if (list.isEmpty()) { - throw new IllegalStateException("모든 설문을 완료하셨습니다."); + throw CustomException.ALREADY_COMPLETED_SURVEY_BUNDLE; } int randomNum = ThreadLocalRandom.current().nextInt(list.size()); return list.get(randomNum); } + public Survey getNextSurvey(final List submittedSurvey) { + List list = + surveys.stream().filter(survey -> !submittedSurvey.contains(survey)).toList(); + + if (list.isEmpty()) { + throw CustomException.ALREADY_COMPLETED_SURVEY_BUNDLE; + } + return list.getFirst(); + } + public boolean isAllSubmitted(final List submissions) { return surveys.stream() .allMatch( diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java index 34700f0b..7b0a7498 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/survey/service/SurveyService.java @@ -32,9 +32,9 @@ public SurveyResponse getNextSurvey(final Long bundleId, final Long memberId) { .findById(bundleId) .orElseThrow(() -> new IllegalArgumentException("설문 번들을 찾을 수 없습니다.")); List submittedSurvey = getSubmittedSurvey(memberId); - Survey unSubmittedSurvey = bundle.getUnSubmittedSurvey(submittedSurvey); + Survey nextSurvey = bundle.getNextSurvey(submittedSurvey); - return SurveyResponse.of(unSubmittedSurvey); + return SurveyResponse.of(nextSurvey); } private List getSubmittedSurvey(final Long memberId) { diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundleTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundleTest.java index 08edcd6f..535a7f5f 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundleTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveyBundleTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.nexters.jaknaesocore.common.support.error.CustomException; import org.springframework.test.util.ReflectionTestUtils; class SurveyBundleTest { @@ -47,8 +48,7 @@ void getUnSubmittedSurveyByList_AllSubmitted() { // when & then thenThrownBy( () -> surveyBundle.getUnSubmittedSurvey(List.of(survey1, survey2, survey3, survey4))) - .isInstanceOf(IllegalStateException.class) - .hasMessage("모든 설문을 완료하셨습니다."); + .isEqualTo(CustomException.ALREADY_COMPLETED_SURVEY_BUNDLE); } @Nested @@ -117,6 +117,57 @@ class whenNotAllSubmitted { } } + @DisplayName("getNextSurvey 메서드는") + @Nested + class getNextSurvey { + @DisplayName("번들의 모든 설문을 제출한 경우") + @Nested + class whenAllSubmitted { + @DisplayName("예외를 던진다.") + @Test + void 모든_설문을_제출했을_때_다음_설문을_가져오려고_할_때() { + // given + SurveyBundle surveyBundle = new SurveyBundle(); + + BalanceSurvey survey1 = + createBalanceSurvey("대학 동기 모임에서 나의 승진 이야기가 나왔습니다", surveyBundle, 1L); + BalanceSurvey survey2 = createBalanceSurvey("회사에서 팀 리더로 뽑혔습니다", surveyBundle, 2L); + MultipleChoiceSurvey survey3 = createMultipleChoiceSurvey("나의 행복 지수는", surveyBundle, 3L); + MultipleChoiceSurvey survey4 = createMultipleChoiceSurvey("나는 노는게 좋다.", surveyBundle, 4L); + + surveyBundle.getSurveys().addAll(List.of(survey1, survey2, survey3, survey4)); + + // when + // then + thenThrownBy(() -> surveyBundle.getNextSurvey(List.of(survey1, survey2, survey3, survey4))) + .isEqualTo(CustomException.ALREADY_COMPLETED_SURVEY_BUNDLE); + } + } + + @DisplayName("번들의 모든 설문을 제출하지 않은 경우") + @Nested + class whenNotAllSubmitted { + @Test + void 번들_내부의_설문_중_제출하지않은_다음_설문을_가져온다() { + // given + SurveyBundle surveyBundle = new SurveyBundle(); + + BalanceSurvey survey1 = + createBalanceSurvey("대학 동기 모임에서 나의 승진 이야기가 나왔습니다", surveyBundle, 1L); + BalanceSurvey survey2 = createBalanceSurvey("회사에서 팀 리더로 뽑혔습니다", surveyBundle, 2L); + MultipleChoiceSurvey survey3 = createMultipleChoiceSurvey("나의 행복 지수는", surveyBundle, 3L); + MultipleChoiceSurvey survey4 = createMultipleChoiceSurvey("나는 노는게 좋다.", surveyBundle, 4L); + + surveyBundle.getSurveys().addAll(List.of(survey1, survey2, survey3, survey4)); + // when + Survey nextSurvey = surveyBundle.getNextSurvey(List.of(survey1, survey2)); + + // then + then(nextSurvey).extracting("id", "content").containsExactly(3L, "나의 행복 지수는"); + } + } + } + private BalanceSurvey createBalanceSurvey(String content, SurveyBundle surveyBundle, Long id) { BalanceSurvey survey = new BalanceSurvey(content, surveyBundle); ReflectionTestUtils.setField(survey, "id", id); diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java index dacb7d27..d6303162 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java @@ -55,14 +55,19 @@ void getNextSurvey() { SurveyBundle surveyBundle = new SurveyBundle(); surveyBundleRepository.save(surveyBundle); BalanceSurvey balanceSurvey = new BalanceSurvey("질문내용", surveyBundle); - surveyRepository.save(balanceSurvey); + MultipleChoiceSurvey multipleSurvey = new MultipleChoiceSurvey("다음 질문내용", surveyBundle); + surveyRepository.saveAll(List.of(balanceSurvey, multipleSurvey)); List scores = List.of( KeywordScore.builder().keyword(Keyword.ACHIEVEMENT).score(BigDecimal.ONE).build(), KeywordScore.builder().keyword(Keyword.BENEVOLENCE).score(BigDecimal.TWO).build()); SurveyOption option = SurveyOption.builder().survey(balanceSurvey).scores(scores).content("질문 옵션 내용").build(); - surveyOptionRepository.save(option); + SurveyOption multipleOption1 = + SurveyOption.builder().survey(multipleSurvey).scores(scores).content("1점").build(); + SurveyOption multipleOption2 = + SurveyOption.builder().survey(multipleSurvey).scores(scores).content("2점").build(); + surveyOptionRepository.saveAll(List.of(option, multipleOption1, multipleOption2)); // when SurveyResponse survey = surveyService.getNextSurvey(surveyBundle.getId(), member.getId());