From 1febecef2dbe2a3472d06520dd06a589e37dd108 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 5 May 2024 18:59:19 +0900 Subject: [PATCH 01/65] =?UTF-8?q?feat:=20=EC=97=B0=EC=95=A0=EA=B3=A0?= =?UTF-8?q?=EC=82=AC=20=EA=B3=BC=EB=AA=A9=20=EB=93=B1=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애고사 과목 등록 구현 - 연애고사 과목 이름 중복 예외처리 - 일차적으로 연애고사 과목 이름과 필수 여부만 등록되도록 구현 --- .../survey/application/SurveyService.java | 30 +++++++++++++ .../application/dto/SurveyCreateRequest.java | 12 ++++++ .../java/com/atwoz/survey/domain/Survey.java | 43 +++++++++++++++++++ .../atwoz/survey/domain/SurveyRepository.java | 7 +++ .../exception/SurveyExceptionHandler.java | 21 +++++++++ .../SurveyNameAlreadyExistException.java | 8 ++++ .../infrastructure/SurveyJpaRepository.java | 10 +++++ .../infrastructure/SurveyRepositoryImpl.java | 23 ++++++++++ .../com/atwoz/survey/ui/SurveyController.java | 29 +++++++++++++ .../atwoz/survey/ui/dto/SurveyResponse.java | 13 ++++++ 10 files changed, 196 insertions(+) create mode 100644 src/main/java/com/atwoz/survey/application/SurveyService.java create mode 100644 src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java create mode 100644 src/main/java/com/atwoz/survey/domain/Survey.java create mode 100644 src/main/java/com/atwoz/survey/domain/SurveyRepository.java create mode 100644 src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java create mode 100644 src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java create mode 100644 src/main/java/com/atwoz/survey/ui/SurveyController.java create mode 100644 src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java diff --git a/src/main/java/com/atwoz/survey/application/SurveyService.java b/src/main/java/com/atwoz/survey/application/SurveyService.java new file mode 100644 index 00000000..84041416 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/SurveyService.java @@ -0,0 +1,30 @@ +package com.atwoz.survey.application; + +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.domain.SurveyRepository; +import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class SurveyService { + + private final SurveyRepository surveyRepository; + + public Survey addSurvey(final SurveyCreateRequest request) { + validateIsAlreadyUsedName(request.surveyName()); + + Survey survey = Survey.createWith(request.surveyName(), request.required()); + return surveyRepository.save(survey); + } + + private void validateIsAlreadyUsedName(final String name) { + if (surveyRepository.isExistedByName(name)) { + throw new SurveyNameAlreadyExistException(); + } + } +} diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java b/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java new file mode 100644 index 00000000..6d96f014 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java @@ -0,0 +1,12 @@ +package com.atwoz.survey.application.dto; + +import jakarta.validation.constraints.NotBlank; + +public record SurveyCreateRequest( + @NotBlank(message = "연애고사 과목 이름이 있어야 합니다.") + String surveyName, + + @NotBlank(message = "연애고사 과목 필수 여부가 있어야 합니다.") + Boolean required +) { +} diff --git a/src/main/java/com/atwoz/survey/domain/Survey.java b/src/main/java/com/atwoz/survey/domain/Survey.java new file mode 100644 index 00000000..b9ace23e --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/Survey.java @@ -0,0 +1,43 @@ +package com.atwoz.survey.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class Survey { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true) + private String name; + + @Column(nullable = false) + private Boolean required; + + private Survey(final String name, final Boolean required) { + this.name = name; + this.required = required; + } + + public static Survey createWith(final String name, final Boolean required) { + return new Survey(name, required); + } + + public void updateName(final String name) { + this.name = name; + } + + public void updateRequired(final Boolean required) { + this.required = required; + } +} diff --git a/src/main/java/com/atwoz/survey/domain/SurveyRepository.java b/src/main/java/com/atwoz/survey/domain/SurveyRepository.java new file mode 100644 index 00000000..93232220 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/SurveyRepository.java @@ -0,0 +1,7 @@ +package com.atwoz.survey.domain; + +public interface SurveyRepository { + + Survey save(Survey survey); + boolean isExistedByName(String name); +} diff --git a/src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java b/src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java new file mode 100644 index 00000000..0ace7140 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java @@ -0,0 +1,21 @@ +package com.atwoz.survey.exception; + +import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class SurveyExceptionHandler { + + @ExceptionHandler(SurveyNameAlreadyExistException.class) + public ResponseEntity handleSurveyNameAlreadyExistException(final SurveyNameAlreadyExistException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + private ResponseEntity getExceptionWithStatus(final Exception exception, final HttpStatus status) { + return ResponseEntity.status(status) + .body(exception.getMessage()); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java b/src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java new file mode 100644 index 00000000..2d9707db --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.exceptions; + +public class SurveyNameAlreadyExistException extends RuntimeException { + + public SurveyNameAlreadyExistException() { + super("이미 존재하는 연애고사 과목입니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java new file mode 100644 index 00000000..671acfde --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java @@ -0,0 +1,10 @@ +package com.atwoz.survey.infrastructure; + +import com.atwoz.survey.domain.Survey; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SurveyJpaRepository extends JpaRepository { + + Survey save(Survey survey); + boolean existsByName(String name); +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java new file mode 100644 index 00000000..17d78f76 --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java @@ -0,0 +1,23 @@ +package com.atwoz.survey.infrastructure; + +import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.domain.SurveyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@RequiredArgsConstructor +@Repository +public class SurveyRepositoryImpl implements SurveyRepository { + + private final SurveyJpaRepository surveyJpaRepository; + + @Override + public Survey save(final Survey survey) { + return surveyJpaRepository.save(survey); + } + + @Override + public boolean isExistedByName(final String name) { + return surveyJpaRepository.existsByName(name); + } +} diff --git a/src/main/java/com/atwoz/survey/ui/SurveyController.java b/src/main/java/com/atwoz/survey/ui/SurveyController.java new file mode 100644 index 00000000..db5329b9 --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/SurveyController.java @@ -0,0 +1,29 @@ +package com.atwoz.survey.ui; + +import com.atwoz.survey.application.SurveyService; +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.ui.dto.SurveyResponse; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RequestMapping("/api/surveys") +@RestController +public class SurveyController { + + private final SurveyService surveyService; + + @PostMapping + public ResponseEntity addSurvey(@RequestBody @Valid final SurveyCreateRequest request) { + Survey survey = surveyService.addSurvey(request); + return ResponseEntity.status(HttpStatus.CREATED) + .body(SurveyResponse.from(survey)); + } +} diff --git a/src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java b/src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java new file mode 100644 index 00000000..984dd21e --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java @@ -0,0 +1,13 @@ +package com.atwoz.survey.ui.dto; + +import com.atwoz.survey.domain.Survey; + +public record SurveyResponse( + String name, + Boolean required +) { + + public static SurveyResponse from(final Survey survey) { + return new SurveyResponse(survey.getName(), survey.getRequired()); + } +} From 6bd6bbc043757da0c5f6810e99ed1ab97a6bf374 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 5 May 2024 20:35:01 +0900 Subject: [PATCH 02/65] =?UTF-8?q?feat:=20=EC=97=B0=EC=95=A0=EA=B3=A0?= =?UTF-8?q?=EC=82=AC=20=EA=B3=BC=EB=AA=A9=20=EC=A7=88=EB=AC=B8=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애고사 과목 질문 등록 구현 - 리포지터리를 사용하지 않도록 OneToMany 방식으로 구현 --- .../survey/application/SurveyService.java | 9 +++++ .../application/dto/SurveyCreateRequest.java | 8 +++- .../dto/SurveyQuestionCreateRequest.java | 9 +++++ .../java/com/atwoz/survey/domain/Survey.java | 27 ++++++++++++++ .../atwoz/survey/domain/SurveyQuestion.java | 37 +++++++++++++++++++ ...uestionDescriptionDuplicatedException.java | 8 ++++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java create mode 100644 src/main/java/com/atwoz/survey/domain/SurveyQuestion.java create mode 100644 src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java diff --git a/src/main/java/com/atwoz/survey/application/SurveyService.java b/src/main/java/com/atwoz/survey/application/SurveyService.java index 84041416..1626a89b 100644 --- a/src/main/java/com/atwoz/survey/application/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/SurveyService.java @@ -1,6 +1,7 @@ package com.atwoz.survey.application; import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; import com.atwoz.survey.domain.Survey; import com.atwoz.survey.domain.SurveyRepository; import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; @@ -8,6 +9,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @RequiredArgsConstructor @Transactional @Service @@ -19,6 +22,12 @@ public Survey addSurvey(final SurveyCreateRequest request) { validateIsAlreadyUsedName(request.surveyName()); Survey survey = Survey.createWith(request.surveyName(), request.required()); + List questionDescriptions = request.questions() + .stream() + .map(SurveyQuestionCreateRequest::description) + .toList(); + survey.addSurveyQuestions(questionDescriptions); + return surveyRepository.save(survey); } diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java b/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java index 6d96f014..28d785d6 100644 --- a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java @@ -1,12 +1,18 @@ package com.atwoz.survey.application.dto; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import java.util.List; + public record SurveyCreateRequest( @NotBlank(message = "연애고사 과목 이름이 있어야 합니다.") String surveyName, @NotBlank(message = "연애고사 과목 필수 여부가 있어야 합니다.") - Boolean required + Boolean required, + + @Valid + List questions ) { } diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java b/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java new file mode 100644 index 00000000..d07df478 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java @@ -0,0 +1,9 @@ +package com.atwoz.survey.application.dto; + +import jakarta.validation.constraints.NotBlank; + +public record SurveyQuestionCreateRequest( + @NotBlank(message = "질문 내용이 작성되어야 합니다. (ex: 다음 중 좋아하는 여행 스타일은?)") + String description +) { +} diff --git a/src/main/java/com/atwoz/survey/domain/Survey.java b/src/main/java/com/atwoz/survey/domain/Survey.java index b9ace23e..e68693c4 100644 --- a/src/main/java/com/atwoz/survey/domain/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/Survey.java @@ -1,14 +1,22 @@ package com.atwoz.survey.domain; +import com.atwoz.survey.exception.exceptions.QuestionDescriptionDuplicatedException; +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @@ -24,6 +32,9 @@ public class Survey { @Column(nullable = false) private Boolean required; + @OneToMany(mappedBy = "survey", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) + private List questions = new ArrayList<>(); + private Survey(final String name, final Boolean required) { this.name = name; this.required = required; @@ -40,4 +51,20 @@ public void updateName(final String name) { public void updateRequired(final Boolean required) { this.required = required; } + + public void addSurveyQuestions(final List descriptions) { + validateDoesNotHaveDuplicateQuestion(descriptions); + + List questions = descriptions.stream() + .map(description -> SurveyQuestion.of(this, description)) + .toList(); + this.questions.addAll(questions); + } + + private void validateDoesNotHaveDuplicateQuestion(final List questionDescriptions) { + Set questionSet = new HashSet<>(questionDescriptions); + if (questionSet.size() != questionDescriptions.size()) { + throw new QuestionDescriptionDuplicatedException(); + } + } } diff --git a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java new file mode 100644 index 00000000..0475015d --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java @@ -0,0 +1,37 @@ +package com.atwoz.survey.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class SurveyQuestion { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String description; + + @ManyToOne(fetch = FetchType.LAZY) + private Survey survey; + + private SurveyQuestion(final Survey survey, final String description) { + this.survey = survey; + this.description = description; + } + + public static SurveyQuestion of(final Survey survey, final String description) { + return new SurveyQuestion(survey, description); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java b/src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java new file mode 100644 index 00000000..20b0e6af --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.exceptions; + +public class QuestionDescriptionDuplicatedException extends RuntimeException { + + public QuestionDescriptionDuplicatedException() { + super("한 과목에 중복된 질문이 들어갈 수 없습니다."); + } +} From 275b29ca0ff5d0ec74387960d863e9f529591b6d Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 5 May 2024 22:54:01 +0900 Subject: [PATCH 03/65] =?UTF-8?q?feat:=20=EC=97=B0=EC=95=A0=20=EB=AA=A8?= =?UTF-8?q?=EC=9D=98=EA=B3=A0=EC=82=AC=20=EA=B3=BC=EB=AA=A9,=20=ED=95=AD?= =?UTF-8?q?=EB=AA=A9,=20=EB=AC=B8=ED=95=AD=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애 모의고사 과목, 항목, 문항 등록 통합 개발 --- .../survey/application/SurveyService.java | 11 +---- .../dto/SurveyQuestionCreateRequest.java | 7 ++- .../java/com/atwoz/survey/domain/Survey.java | 45 +++++++++++-------- .../com/atwoz/survey/domain/SurveyAnswer.java | 35 +++++++++++++++ .../atwoz/survey/domain/SurveyQuestion.java | 33 +++++++++++++- .../SurveyAnswerDuplicatedException.java | 8 ++++ ...=> SurveyQuestionDuplicatedException.java} | 4 +- 7 files changed, 110 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/domain/SurveyAnswer.java create mode 100644 src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java rename src/main/java/com/atwoz/survey/exception/exceptions/{QuestionDescriptionDuplicatedException.java => SurveyQuestionDuplicatedException.java} (50%) diff --git a/src/main/java/com/atwoz/survey/application/SurveyService.java b/src/main/java/com/atwoz/survey/application/SurveyService.java index 1626a89b..05d1bba4 100644 --- a/src/main/java/com/atwoz/survey/application/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/SurveyService.java @@ -1,7 +1,6 @@ package com.atwoz.survey.application; import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; import com.atwoz.survey.domain.Survey; import com.atwoz.survey.domain.SurveyRepository; import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; @@ -9,8 +8,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @RequiredArgsConstructor @Transactional @Service @@ -21,13 +18,7 @@ public class SurveyService { public Survey addSurvey(final SurveyCreateRequest request) { validateIsAlreadyUsedName(request.surveyName()); - Survey survey = Survey.createWith(request.surveyName(), request.required()); - List questionDescriptions = request.questions() - .stream() - .map(SurveyQuestionCreateRequest::description) - .toList(); - survey.addSurveyQuestions(questionDescriptions); - + Survey survey = Survey.createWith(request); return surveyRepository.save(survey); } diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java b/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java index d07df478..69da2ec9 100644 --- a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java @@ -2,8 +2,13 @@ import jakarta.validation.constraints.NotBlank; +import java.util.List; + public record SurveyQuestionCreateRequest( @NotBlank(message = "질문 내용이 작성되어야 합니다. (ex: 다음 중 좋아하는 여행 스타일은?)") - String description + String description, + + @NotBlank(message = "질문 답변 항목이 작성되어야 합니다. (ex: 무계획 여행)") + List answers ) { } diff --git a/src/main/java/com/atwoz/survey/domain/Survey.java b/src/main/java/com/atwoz/survey/domain/Survey.java index e68693c4..016c7275 100644 --- a/src/main/java/com/atwoz/survey/domain/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/Survey.java @@ -1,6 +1,8 @@ package com.atwoz.survey.domain; -import com.atwoz.survey.exception.exceptions.QuestionDescriptionDuplicatedException; +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.exception.exceptions.SurveyQuestionDuplicatedException; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -40,31 +42,38 @@ private Survey(final String name, final Boolean required) { this.required = required; } - public static Survey createWith(final String name, final Boolean required) { - return new Survey(name, required); - } + public static Survey createWith(final SurveyCreateRequest request) { + validateQuestionsIsNotDuplicated(request.questions()); - public void updateName(final String name) { - this.name = name; - } + Survey survey = new Survey(request.surveyName(), request.required()); + survey.addSurveyQuestions(request.questions()); - public void updateRequired(final Boolean required) { - this.required = required; + return survey; } - public void addSurveyQuestions(final List descriptions) { - validateDoesNotHaveDuplicateQuestion(descriptions); + private static void validateQuestionsIsNotDuplicated(final List requests) { + List questions = requests.stream() + .map(SurveyQuestionCreateRequest::description) + .toList(); - List questions = descriptions.stream() - .map(description -> SurveyQuestion.of(this, description)) + Set questionsSet = new HashSet<>(questions); + if (questionsSet.size() != questions.size()) { + throw new SurveyQuestionDuplicatedException(); + } + } + + private void addSurveyQuestions(final List questionRequests) { + List questions = questionRequests.stream() + .map(request -> SurveyQuestion.of(this, request.description(), request.answers())) .toList(); this.questions.addAll(questions); } - private void validateDoesNotHaveDuplicateQuestion(final List questionDescriptions) { - Set questionSet = new HashSet<>(questionDescriptions); - if (questionSet.size() != questionDescriptions.size()) { - throw new QuestionDescriptionDuplicatedException(); - } + public void updateName(final String name) { + this.name = name; + } + + public void updateRequired(final Boolean required) { + this.required = required; } } diff --git a/src/main/java/com/atwoz/survey/domain/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/SurveyAnswer.java new file mode 100644 index 00000000..6486d227 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/SurveyAnswer.java @@ -0,0 +1,35 @@ +package com.atwoz.survey.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class SurveyAnswer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private SurveyQuestion question; + + @Column(nullable = false) + private String description; + + private SurveyAnswer(final SurveyQuestion question, final String description) { + this.question = question; + this.description = description; + } + + public static SurveyAnswer of(final SurveyQuestion question, final String description) { + return new SurveyAnswer(question, description); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java index 0475015d..719908e6 100644 --- a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java @@ -1,5 +1,7 @@ package com.atwoz.survey.domain; +import com.atwoz.survey.exception.exceptions.SurveyAnswerDuplicatedException; +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -7,10 +9,15 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @@ -26,12 +33,34 @@ public class SurveyQuestion { @ManyToOne(fetch = FetchType.LAZY) private Survey survey; + @OneToMany(mappedBy = "question", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) + private List answers; + private SurveyQuestion(final Survey survey, final String description) { this.survey = survey; this.description = description; } - public static SurveyQuestion of(final Survey survey, final String description) { - return new SurveyQuestion(survey, description); + public static SurveyQuestion of(final Survey survey, final String description, final List answers) { + validateAnswersIsNotDuplicated(answers); + + SurveyQuestion surveyQuestion = new SurveyQuestion(survey, description); + List surveyAnswers = answers.stream() + .map(answer -> SurveyAnswer.of(surveyQuestion, answer)) + .toList(); + surveyQuestion.addSurveyAnswers(surveyAnswers); + + return surveyQuestion; + } + + private static void validateAnswersIsNotDuplicated(final List answers) { + Set answersSet = new HashSet<>(answers); + if (answersSet.size() != answers.size()) { + throw new SurveyAnswerDuplicatedException(); + } + } + + private void addSurveyAnswers(final List answers) { + this.answers.addAll(answers); } } diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java b/src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java new file mode 100644 index 00000000..ae9485cf --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.exceptions; + +public class SurveyAnswerDuplicatedException extends RuntimeException { + + public SurveyAnswerDuplicatedException() { + super("중복된 답변 문항이 있습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java b/src/main/java/com/atwoz/survey/exception/exceptions/SurveyQuestionDuplicatedException.java similarity index 50% rename from src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java rename to src/main/java/com/atwoz/survey/exception/exceptions/SurveyQuestionDuplicatedException.java index 20b0e6af..abecdca3 100644 --- a/src/main/java/com/atwoz/survey/exception/exceptions/QuestionDescriptionDuplicatedException.java +++ b/src/main/java/com/atwoz/survey/exception/exceptions/SurveyQuestionDuplicatedException.java @@ -1,8 +1,8 @@ package com.atwoz.survey.exception.exceptions; -public class QuestionDescriptionDuplicatedException extends RuntimeException { +public class SurveyQuestionDuplicatedException extends RuntimeException { - public QuestionDescriptionDuplicatedException() { + public SurveyQuestionDuplicatedException() { super("한 과목에 중복된 질문이 들어갈 수 없습니다."); } } From 504a8fae143effd679a5b59f36867fd0ce871365 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 5 May 2024 23:37:39 +0900 Subject: [PATCH 04/65] =?UTF-8?q?fix:=20SurveyAnswer=20NPE=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyAnswer NPE 문제 수정 --- src/main/java/com/atwoz/survey/domain/SurveyQuestion.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java index 719908e6..8ed84da8 100644 --- a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java @@ -14,6 +14,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -34,7 +35,7 @@ public class SurveyQuestion { private Survey survey; @OneToMany(mappedBy = "question", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List answers; + private List answers = new ArrayList<>(); private SurveyQuestion(final Survey survey, final String description) { this.survey = survey; From 30d0c1d250527368f9e91b29a3c720638381fc94 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 5 May 2024 23:38:19 +0900 Subject: [PATCH 05/65] =?UTF-8?q?test:=20SurveyTest=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Survey 테스트 작성 - 관련 Fixture 클래스 작성 --- .../com/atwoz/survey/domain/SurveyTest.java | 92 +++++++++++++++++++ .../fixture/SurveyCreateRequestFixture.java | 16 ++++ 2 files changed, 108 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/domain/SurveyTest.java create mode 100644 src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java diff --git a/src/test/java/com/atwoz/survey/domain/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/SurveyTest.java new file mode 100644 index 00000000..024c386e --- /dev/null +++ b/src/test/java/com/atwoz/survey/domain/SurveyTest.java @@ -0,0 +1,92 @@ +package com.atwoz.survey.domain; + +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.exception.exceptions.SurveyAnswerDuplicatedException; +import com.atwoz.survey.exception.exceptions.SurveyQuestionDuplicatedException; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class SurveyTest { + + @Test + void 설문_과목_정상_생성() { + // given + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + + // when + Survey survey = Survey.createWith(request); + + // then + assertSoftly(softly -> { + softly.assertThat(survey.getName()).isEqualTo("설문 제목"); + softly.assertThat(survey.getRequired()).isTrue(); + softly.assertThat(survey.getQuestions()).hasSize(2); + }); + } + + @Test + void 과목_이름_수정() { + // given + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + Survey survey = Survey.createWith(request); + + // when + survey.updateName("설문 제목 수정"); + + // then + assertThat(survey.getName()).isEqualTo("설문 제목 수정"); + } + + @Test + void 과목_필수_여부_수정() { + // given + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + Survey survey = Survey.createWith(request); + + // when + survey.updateRequired(false); + + // then + assertThat(survey.getRequired()).isEqualTo(false); + } + + @Nested + class 설문_생성_예외 { + + @Test + void 설문_질문이_중복되면_안_된다() { + // given + SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( + new SurveyQuestionCreateRequest("질문1", List.of("답1", "답2")), + new SurveyQuestionCreateRequest("질문1", List.of("답1", "답2")) + )); + + // when & then + assertThatThrownBy(() -> Survey.createWith(request)) + .isInstanceOf(SurveyQuestionDuplicatedException.class); + } + + @Test + void 설문_답변이_중복되면_안_된다() { + // given + SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( + new SurveyQuestionCreateRequest("질문1", List.of("답1", "답1")) + )); + + // when & then + assertThatThrownBy(() -> Survey.createWith(request)) + .isInstanceOf(SurveyAnswerDuplicatedException.class); + } + } +} diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java new file mode 100644 index 00000000..51d6be27 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -0,0 +1,16 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; + +import java.util.List; + +public class SurveyCreateRequestFixture { + + public static SurveyCreateRequest 설문_필수_질문_과목_두개씩() { + return new SurveyCreateRequest("설문 제목", true, List.of( + new SurveyQuestionCreateRequest("질문 내용1", List.of("답변1", "답변2")), + new SurveyQuestionCreateRequest("질문 내용2", List.of("답변1", "답변2")) + )); + } +} From 233bff17006ebfc3929061e15af73fa8712e224e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 00:08:43 +0900 Subject: [PATCH 06/65] =?UTF-8?q?test:=20SurveyServiceTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyService 테스트 작성 - Survey FakeRepository 작성 --- .../java/com/atwoz/survey/domain/Survey.java | 8 +++ .../survey/application/SurveyServiceTest.java | 58 +++++++++++++++++++ .../infrastructure/SurveyFakeRepository.java | 34 +++++++++++ 3 files changed, 100 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/application/SurveyServiceTest.java create mode 100644 src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java diff --git a/src/main/java/com/atwoz/survey/domain/Survey.java b/src/main/java/com/atwoz/survey/domain/Survey.java index 016c7275..f2fc2ae6 100644 --- a/src/main/java/com/atwoz/survey/domain/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/Survey.java @@ -11,6 +11,8 @@ import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -20,7 +22,9 @@ import java.util.Set; @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder @Entity public class Survey { @@ -76,4 +80,8 @@ public void updateName(final String name) { public void updateRequired(final Boolean required) { this.required = required; } + + public boolean isSameName(final String name) { + return name.equals(this.name); + } } diff --git a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java new file mode 100644 index 00000000..24a59f87 --- /dev/null +++ b/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java @@ -0,0 +1,58 @@ +package com.atwoz.survey.application; + +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.domain.SurveyRepository; +import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; +import com.atwoz.survey.infrastructure.SurveyFakeRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class SurveyServiceTest { + + private SurveyService surveyService; + private SurveyRepository surveyRepository; + + @BeforeEach + void init() { + surveyRepository = new SurveyFakeRepository(); + surveyService = new SurveyService(surveyRepository); + } + + @Test + void 설문_등록() { + // given + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + + // when + Survey survey = surveyService.addSurvey(request); + + // then + assertSoftly(softly -> { + softly.assertThat(survey.getId()).isEqualTo(1L); + softly.assertThat(survey.getName()).isEqualTo("설문 제목"); + softly.assertThat(survey.getRequired()).isTrue(); + softly.assertThat(survey.getQuestions()).hasSize(2); + }); + } + + @Test + void 같은_이름의_설문을_등록할_수_없다() { + // given + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request2 = 설문_필수_질문_과목_두개씩(); + surveyService.addSurvey(request); + + // when & then + assertThatThrownBy(() -> surveyService.addSurvey(request2)) + .isInstanceOf(SurveyNameAlreadyExistException.class); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java new file mode 100644 index 00000000..1c365e4f --- /dev/null +++ b/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java @@ -0,0 +1,34 @@ +package com.atwoz.survey.infrastructure; + +import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.domain.SurveyRepository; + +import java.util.HashMap; +import java.util.Map; + +public class SurveyFakeRepository implements SurveyRepository { + + private final Map map = new HashMap<>(); + + private Long id = 1L; + + @Override + public Survey save(final Survey survey) { + Survey newSurvey = Survey.builder() + .id(id++) + .name(survey.getName()) + .required(survey.getRequired()) + .questions(survey.getQuestions()) + .build(); + map.put(newSurvey.getId(), newSurvey); + + return newSurvey; + } + + @Override + public boolean isExistedByName(final String name) { + return map.values() + .stream() + .anyMatch(survey -> survey.isSameName(name)); + } +} From 27824f83795bf4f6358b02cbd4183c25bd18edc5 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 00:30:17 +0900 Subject: [PATCH 07/65] =?UTF-8?q?test:=20SurveyJpaRepositoryTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyJpaRepository 테스트 작성 --- .../atwoz/survey/fixture/SurveyFixture.java | 10 ++++++ .../SurveyJpaRepositoryTest.java | 34 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/fixture/SurveyFixture.java create mode 100644 src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java new file mode 100644 index 00000000..648bb535 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -0,0 +1,10 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.domain.Survey; + +public class SurveyFixture { + + public static Survey 설문_필수_질문_과목_두개씩() { + return Survey.createWith(SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩()); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java new file mode 100644 index 00000000..a808c7bd --- /dev/null +++ b/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java @@ -0,0 +1,34 @@ +package com.atwoz.survey.infrastructure; + +import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.fixture.SurveyFixture; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +@DataJpaTest +public class SurveyJpaRepositoryTest { + + @Autowired + private SurveyJpaRepository surveyJpaRepository; + + @Test + void 설문_과목_등록() { + // given + Survey survey = SurveyFixture.설문_필수_질문_과목_두개씩(); + + // when + Survey saveSurvey = surveyJpaRepository.save(survey); + + // then + assertThat(saveSurvey).usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(survey); + } +} From 9aa4e33c0792c0e1d378032d6a3967a1aa6f87ff Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 02:51:15 +0900 Subject: [PATCH 08/65] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20vali?= =?UTF-8?q?d=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 잘못된 valid 어노테이션 사용 수정 - DTO 필드 이름 수정 --- .../atwoz/survey/application/dto/SurveyCreateRequest.java | 5 +++-- .../survey/application/dto/SurveyQuestionCreateRequest.java | 3 ++- src/main/java/com/atwoz/survey/domain/Survey.java | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java b/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java index 28d785d6..2ec721a9 100644 --- a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java @@ -2,14 +2,15 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import java.util.List; public record SurveyCreateRequest( @NotBlank(message = "연애고사 과목 이름이 있어야 합니다.") - String surveyName, + String name, - @NotBlank(message = "연애고사 과목 필수 여부가 있어야 합니다.") + @NotNull(message = "연애고사 과목 필수 여부가 있어야 합니다.") Boolean required, @Valid diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java b/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java index 69da2ec9..74aa8f0c 100644 --- a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java @@ -1,6 +1,7 @@ package com.atwoz.survey.application.dto; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import java.util.List; @@ -8,7 +9,7 @@ public record SurveyQuestionCreateRequest( @NotBlank(message = "질문 내용이 작성되어야 합니다. (ex: 다음 중 좋아하는 여행 스타일은?)") String description, - @NotBlank(message = "질문 답변 항목이 작성되어야 합니다. (ex: 무계획 여행)") + @NotNull(message = "질문 답변 항목이 작성되어야 합니다. (ex: 무계획 여행)") List answers ) { } diff --git a/src/main/java/com/atwoz/survey/domain/Survey.java b/src/main/java/com/atwoz/survey/domain/Survey.java index f2fc2ae6..ac1b3e6f 100644 --- a/src/main/java/com/atwoz/survey/domain/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/Survey.java @@ -49,7 +49,7 @@ private Survey(final String name, final Boolean required) { public static Survey createWith(final SurveyCreateRequest request) { validateQuestionsIsNotDuplicated(request.questions()); - Survey survey = new Survey(request.surveyName(), request.required()); + Survey survey = new Survey(request.name(), request.required()); survey.addSurveyQuestions(request.questions()); return survey; From 98771595c96265cddc1d79a69a64dde813ce5017 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 02:52:03 +0900 Subject: [PATCH 09/65] =?UTF-8?q?refactor:=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 생성 반환 타입 수정 (id만 반환하도록 수정) --- .../com/atwoz/survey/application/SurveyService.java | 6 +++--- .../java/com/atwoz/survey/ui/SurveyController.java | 10 +++++----- .../atwoz/survey/application/SurveyServiceTest.java | 12 +++--------- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/SurveyService.java b/src/main/java/com/atwoz/survey/application/SurveyService.java index 05d1bba4..4834f3cc 100644 --- a/src/main/java/com/atwoz/survey/application/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/SurveyService.java @@ -15,11 +15,11 @@ public class SurveyService { private final SurveyRepository surveyRepository; - public Survey addSurvey(final SurveyCreateRequest request) { - validateIsAlreadyUsedName(request.surveyName()); + public Long addSurvey(final SurveyCreateRequest request) { + validateIsAlreadyUsedName(request.name()); Survey survey = Survey.createWith(request); - return surveyRepository.save(survey); + return survey.getId(); } private void validateIsAlreadyUsedName(final String name) { diff --git a/src/main/java/com/atwoz/survey/ui/SurveyController.java b/src/main/java/com/atwoz/survey/ui/SurveyController.java index db5329b9..def6e088 100644 --- a/src/main/java/com/atwoz/survey/ui/SurveyController.java +++ b/src/main/java/com/atwoz/survey/ui/SurveyController.java @@ -2,17 +2,17 @@ import com.atwoz.survey.application.SurveyService; import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.domain.Survey; import com.atwoz.survey.ui.dto.SurveyResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.net.URI; + @RequiredArgsConstructor @RequestMapping("/api/surveys") @RestController @@ -22,8 +22,8 @@ public class SurveyController { @PostMapping public ResponseEntity addSurvey(@RequestBody @Valid final SurveyCreateRequest request) { - Survey survey = surveyService.addSurvey(request); - return ResponseEntity.status(HttpStatus.CREATED) - .body(SurveyResponse.from(survey)); + Long id = surveyService.addSurvey(request); + return ResponseEntity.created(URI.create("/api/surveys/" + id)) + .build(); } } diff --git a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java index 24a59f87..d9c215e0 100644 --- a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java @@ -1,7 +1,6 @@ package com.atwoz.survey.application; import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.domain.Survey; import com.atwoz.survey.domain.SurveyRepository; import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; import com.atwoz.survey.infrastructure.SurveyFakeRepository; @@ -11,8 +10,8 @@ import org.junit.jupiter.api.Test; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.SoftAssertions.assertSoftly; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @SuppressWarnings("NonAsciiCharacters") @@ -33,15 +32,10 @@ void init() { SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); // when - Survey survey = surveyService.addSurvey(request); + Long id = surveyService.addSurvey(request); // then - assertSoftly(softly -> { - softly.assertThat(survey.getId()).isEqualTo(1L); - softly.assertThat(survey.getName()).isEqualTo("설문 제목"); - softly.assertThat(survey.getRequired()).isTrue(); - softly.assertThat(survey.getQuestions()).hasSize(2); - }); + assertThat(id).isEqualTo(1L); } @Test From 07a4dcb157a9a7500319d8e978cd04990236f4be Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 02:57:13 +0900 Subject: [PATCH 10/65] =?UTF-8?q?refactor:=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=98=ED=99=98=20=EC=8B=9C=20id?= =?UTF-8?q?=EB=A7=8C=20=EC=82=AC=EC=9A=A9=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyResponse 삭제 - id만 반환하도록 수정 --- .../java/com/atwoz/survey/ui/SurveyController.java | 3 +-- .../com/atwoz/survey/ui/dto/SurveyResponse.java | 13 ------------- 2 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java diff --git a/src/main/java/com/atwoz/survey/ui/SurveyController.java b/src/main/java/com/atwoz/survey/ui/SurveyController.java index def6e088..eb685637 100644 --- a/src/main/java/com/atwoz/survey/ui/SurveyController.java +++ b/src/main/java/com/atwoz/survey/ui/SurveyController.java @@ -2,7 +2,6 @@ import com.atwoz.survey.application.SurveyService; import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.ui.dto.SurveyResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -21,7 +20,7 @@ public class SurveyController { private final SurveyService surveyService; @PostMapping - public ResponseEntity addSurvey(@RequestBody @Valid final SurveyCreateRequest request) { + public ResponseEntity addSurvey(@RequestBody @Valid final SurveyCreateRequest request) { Long id = surveyService.addSurvey(request); return ResponseEntity.created(URI.create("/api/surveys/" + id)) .build(); diff --git a/src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java b/src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java deleted file mode 100644 index 984dd21e..00000000 --- a/src/main/java/com/atwoz/survey/ui/dto/SurveyResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.atwoz.survey.ui.dto; - -import com.atwoz.survey.domain.Survey; - -public record SurveyResponse( - String name, - Boolean required -) { - - public static SurveyResponse from(final Survey survey) { - return new SurveyResponse(survey.getName(), survey.getRequired()); - } -} From 429b82bdeaaa71796f8b61ac155e548b60a40ff6 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 02:57:34 +0900 Subject: [PATCH 11/65] =?UTF-8?q?fix:=20=EC=84=A4=EB=AC=B8=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=8B=9C=20=EC=98=81=EC=86=8D=ED=99=94=EB=90=9C=20?= =?UTF-8?q?=EC=84=A4=EB=AC=B8=EC=9D=98=20id=EB=A5=BC=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/atwoz/survey/application/SurveyService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/atwoz/survey/application/SurveyService.java b/src/main/java/com/atwoz/survey/application/SurveyService.java index 4834f3cc..0f73fb88 100644 --- a/src/main/java/com/atwoz/survey/application/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/SurveyService.java @@ -18,7 +18,7 @@ public class SurveyService { public Long addSurvey(final SurveyCreateRequest request) { validateIsAlreadyUsedName(request.name()); - Survey survey = Survey.createWith(request); + Survey survey = surveyRepository.save(Survey.createWith(request)); return survey.getId(); } From 2fbe81c36328d63c8a01c0588c2b2acd12870bd3 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 02:59:15 +0900 Subject: [PATCH 12/65] =?UTF-8?q?test:=20SurveyControllerTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyControllerWebMvc 테스트 작성 - survey.adoc 문서 작성 --- src/docs/asciidoc/survey.adoc | 18 +++++ .../com/atwoz/helper/MockBeanInjection.java | 4 ++ .../survey/ui/SurveyControllerWebMvcTest.java | 67 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/docs/asciidoc/survey.adoc create mode 100644 src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java diff --git a/src/docs/asciidoc/survey.adoc b/src/docs/asciidoc/survey.adoc new file mode 100644 index 00000000..04faad14 --- /dev/null +++ b/src/docs/asciidoc/survey.adoc @@ -0,0 +1,18 @@ +:toc: left +:source-highlighter: highlightjs +:sectlinks: +:toclevels: 2 +:sectlinks: +:sectnums: + +== Survey + +=== 설문 생성 (POST /api/surveys) + +==== 요청 +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/request-fields.adoc[] +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/http-request.adoc[] + +==== 응답 +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/response-headers.adoc[] +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/http-response.adoc[] diff --git a/src/test/java/com/atwoz/helper/MockBeanInjection.java b/src/test/java/com/atwoz/helper/MockBeanInjection.java index 3616fe9b..91fce8f8 100644 --- a/src/test/java/com/atwoz/helper/MockBeanInjection.java +++ b/src/test/java/com/atwoz/helper/MockBeanInjection.java @@ -14,6 +14,7 @@ import com.atwoz.mission.application.membermission.MemberMissionsService; import com.atwoz.mission.application.mission.MissionQueryService; import com.atwoz.mission.application.mission.MissionService; +import com.atwoz.survey.application.SurveyService; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext; @@ -61,4 +62,7 @@ public class MockBeanInjection { @MockBean protected MemberService memberService; + + @MockBean + protected SurveyService surveyService; } diff --git a/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java new file mode 100644 index 00000000..b57968a3 --- /dev/null +++ b/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java @@ -0,0 +1,67 @@ +package com.atwoz.survey.ui; + +import com.atwoz.helper.MockBeanInjection; +import com.atwoz.survey.application.SurveyService; +import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; + +import static com.atwoz.helper.RestDocsHelper.customDocument; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static org.mockito.Mockito.when; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +@AutoConfigureRestDocs +@WebMvcTest(SurveyController.class) +class SurveyControllerWebMvcTest extends MockBeanInjection { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc; + @Autowired + private SurveyService surveyService; + + @Test + void 설문_과목을_생성한다() throws Exception { + // given + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + when(surveyService.addSurvey(request)).thenReturn(1L); + + // when + mockMvc.perform(post("/api/surveys") + .header(HttpHeaders.AUTHORIZATION, "bearer tokenInfo...") + .contentType("application/json") + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()) + .andDo(print()) + .andDo(customDocument("연애_모의고사_설문_생성", + requestFields( + fieldWithPath("name").description("설문 제목"), + fieldWithPath("required").description("필수 여부"), + fieldWithPath("questions").description("질문 목록"), + fieldWithPath("questions[].description").description("질문 내용"), + fieldWithPath("questions[].answers").description("질문 내용 답변들") + ), + responseHeaders( + headerWithName("location").description("생성된 설문 과목 경로") + ) + )); + } +} From 26e61ed4682fa16d856a76d80174a1b33a6c2cc0 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 12:46:46 +0900 Subject: [PATCH 13/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=84=A4?= =?UTF-8?q?=EB=AC=B8=20=EB=93=B1=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회원 설문 등록 구현 - 도메인 구분을 위해 survey와 membersurvey 패키지 분리 --- .../survey/application/SurveyService.java | 30 ------- .../membersurvey/MemberSurveyService.java | 90 +++++++++++++++++++ .../dto/SurveyQuestionSubmitRequest.java | 7 ++ .../membersurvey/dto/SurveySubmitRequest.java | 9 ++ .../application/survey/SurveyService.java | 45 ++++++++++ .../{ => survey}/dto/SurveyCreateRequest.java | 2 +- .../dto/SurveyQuestionCreateRequest.java | 2 +- .../atwoz/survey/domain/SurveyRepository.java | 7 -- .../domain/membersurvey/MemberSurvey.java | 39 ++++++++ .../membersurvey/MemberSurveyRepository.java | 7 ++ .../survey/domain/{ => survey}/Survey.java | 21 ++++- .../domain/{ => survey}/SurveyAnswer.java | 6 +- .../domain/{ => survey}/SurveyQuestion.java | 27 +++++- .../domain/survey/SurveyRepository.java | 12 +++ .../survey/dto/SurveyComparisonRequest.java | 18 ++++ .../dto/SurveyQuestionComparisonRequest.java | 13 +++ .../exception/SurveyExceptionHandler.java | 21 ----- .../MemberSurveyExceptionHandler.java | 45 ++++++++++ .../SurveyAlreadySubmittedException.java | 8 ++ .../SurveyAnswerInvalidSubmitException.java | 8 ++ .../SurveyQuestionNotSubmittedException.java | 8 ++ ...urveyQuestionSubmitDuplicateException.java | 8 ++ ...eyQuestionSubmitSizeNotMatchException.java | 8 ++ .../survey/SurveyExceptionHandler.java | 39 ++++++++ .../SurveyAnswerDuplicatedException.java | 2 +- .../SurveyNameAlreadyExistException.java | 2 +- .../exceptions/SurveyNotFoundException.java | 8 ++ .../SurveyQuestionDuplicatedException.java | 2 +- .../infrastructure/SurveyJpaRepository.java | 10 --- .../MemberSurveyJpaRepository.java | 10 +++ .../MemberSurveyRepositoryImpl.java | 23 +++++ .../survey/SurveyJpaRepository.java | 18 ++++ .../{ => survey}/SurveyRepositoryImpl.java | 19 +++- .../membersurvey/MemberSurveyController.java | 30 +++++++ .../ui/{ => survey}/SurveyController.java | 6 +- .../com/atwoz/helper/MockBeanInjection.java | 2 +- .../survey/application/SurveyServiceTest.java | 7 +- .../com/atwoz/survey/domain/SurveyTest.java | 9 +- .../fixture/SurveyCreateRequestFixture.java | 4 +- .../atwoz/survey/fixture/SurveyFixture.java | 2 +- .../infrastructure/SurveyFakeRepository.java | 19 +++- .../SurveyJpaRepositoryTest.java | 3 +- .../survey/ui/SurveyControllerWebMvcTest.java | 5 +- 43 files changed, 559 insertions(+), 102 deletions(-) delete mode 100644 src/main/java/com/atwoz/survey/application/SurveyService.java create mode 100644 src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java create mode 100644 src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java create mode 100644 src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java create mode 100644 src/main/java/com/atwoz/survey/application/survey/SurveyService.java rename src/main/java/com/atwoz/survey/application/{ => survey}/dto/SurveyCreateRequest.java (90%) rename src/main/java/com/atwoz/survey/application/{ => survey}/dto/SurveyQuestionCreateRequest.java (90%) delete mode 100644 src/main/java/com/atwoz/survey/domain/SurveyRepository.java create mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java create mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java rename src/main/java/com/atwoz/survey/domain/{ => survey}/Survey.java (75%) rename src/main/java/com/atwoz/survey/domain/{ => survey}/SurveyAnswer.java (88%) rename src/main/java/com/atwoz/survey/domain/{ => survey}/SurveyQuestion.java (62%) create mode 100644 src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java create mode 100644 src/main/java/com/atwoz/survey/domain/survey/dto/SurveyComparisonRequest.java create mode 100644 src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java delete mode 100644 src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAlreadySubmittedException.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAnswerInvalidSubmitException.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionNotSubmittedException.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitSizeNotMatchException.java create mode 100644 src/main/java/com/atwoz/survey/exception/survey/SurveyExceptionHandler.java rename src/main/java/com/atwoz/survey/exception/{ => survey}/exceptions/SurveyAnswerDuplicatedException.java (77%) rename src/main/java/com/atwoz/survey/exception/{ => survey}/exceptions/SurveyNameAlreadyExistException.java (78%) create mode 100644 src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNotFoundException.java rename src/main/java/com/atwoz/survey/exception/{ => survey}/exceptions/SurveyQuestionDuplicatedException.java (79%) delete mode 100644 src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java rename src/main/java/com/atwoz/survey/infrastructure/{ => survey}/SurveyRepositoryImpl.java (52%) create mode 100644 src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java rename src/main/java/com/atwoz/survey/ui/{ => survey}/SurveyController.java (83%) diff --git a/src/main/java/com/atwoz/survey/application/SurveyService.java b/src/main/java/com/atwoz/survey/application/SurveyService.java deleted file mode 100644 index 0f73fb88..00000000 --- a/src/main/java/com/atwoz/survey/application/SurveyService.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.atwoz.survey.application; - -import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.domain.Survey; -import com.atwoz.survey.domain.SurveyRepository; -import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@RequiredArgsConstructor -@Transactional -@Service -public class SurveyService { - - private final SurveyRepository surveyRepository; - - public Long addSurvey(final SurveyCreateRequest request) { - validateIsAlreadyUsedName(request.name()); - - Survey survey = surveyRepository.save(Survey.createWith(request)); - return survey.getId(); - } - - private void validateIsAlreadyUsedName(final String name) { - if (surveyRepository.isExistedByName(name)) { - throw new SurveyNameAlreadyExistException(); - } - } -} diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java new file mode 100644 index 00000000..b15eeeb9 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java @@ -0,0 +1,90 @@ +package com.atwoz.survey.application.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.MemberSurvey; +import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.SurveyQuestion; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAlreadySubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitDuplicateException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@RequiredArgsConstructor +@Transactional +@Service +public class MemberSurveyService { + + private final MemberSurveyRepository memberSurveyRepository; + private final SurveyRepository surveyRepository; + + public void submitSurvey(final Long memberId, final List requests) { + validateIsContainsAllRequiredSurveys(requests); + requests.forEach(request -> submitEachSurvey(memberId, request)); + } + + private void validateIsContainsAllRequiredSurveys(final List requests) { + List requiredSurveyIds = surveyRepository.findAllRequiredSurveys() + .stream() + .map(Survey::getId) + .toList(); + List submittedSurveyIds = requests.stream() + .map(SurveySubmitRequest::surveyId) + .toList(); + validateIsNotDuplicateSurveyIds(submittedSurveyIds); + if (!submittedSurveyIds.containsAll(requiredSurveyIds)) { + throw new SurveyNotFoundException(); + } + } + + private void validateIsNotDuplicateSurveyIds(final List surveyIds) { + Set set = new HashSet<>(surveyIds); + if (surveyIds.size() != set.size()) { + throw new SurveyQuestionSubmitDuplicateException(); + } + } + + private void submitEachSurvey(final Long memberId, final SurveySubmitRequest request) { + Survey survey = findSurveyById(request.surveyId()); + survey.validateIsAllContainsSubmitQuestions(SurveyComparisonRequest.from(request)); + + survey.getQuestions() + .forEach(question -> saveQuestionAnswer(memberId, request, question)); + } + + private Survey findSurveyById(final Long surveyId) { + return surveyRepository.findById(surveyId) + .orElseThrow(SurveyNotFoundException::new); + } + + private void saveQuestionAnswer(final Long memberId, final SurveySubmitRequest request, final SurveyQuestion question) { + validateIsAlreadySubmittedQuestion(memberId, question.getId()); + SurveyQuestionSubmitRequest questionRequest = findQuestionSubmitRequest(question.getId(), request); + MemberSurvey memberSurvey = MemberSurvey.of(memberId, question.getId(), questionRequest.answerId()); + memberSurveyRepository.save(memberSurvey); + } + + private void validateIsAlreadySubmittedQuestion(final Long memberId, final Long questionId) { + if (memberSurveyRepository.existsByMemberIdAndQuestionId(memberId, questionId)) { + throw new SurveyAlreadySubmittedException(); + } + } + + private SurveyQuestionSubmitRequest findQuestionSubmitRequest(final Long questionId, final SurveySubmitRequest request) { + return request.questions() + .stream() + .filter(question -> questionId.equals(question.questionId())) + .findAny() + .orElseThrow(SurveyQuestionNotSubmittedException::new); + } +} diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java new file mode 100644 index 00000000..f09c6d03 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java @@ -0,0 +1,7 @@ +package com.atwoz.survey.application.membersurvey.dto; + +public record SurveyQuestionSubmitRequest( + Long questionId, + Long answerId +) { +} diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java new file mode 100644 index 00000000..d7bb6961 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java @@ -0,0 +1,9 @@ +package com.atwoz.survey.application.membersurvey.dto; + +import java.util.List; + +public record SurveySubmitRequest( + Long surveyId, + List questions +) { +} diff --git a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java new file mode 100644 index 00000000..5c91ee8c --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java @@ -0,0 +1,45 @@ +package com.atwoz.survey.application.survey; + +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class SurveyService { + + private final SurveyRepository surveyRepository; + + public Long addSurvey(final SurveyCreateRequest request) { + validateIsAlreadyUsedName(request.name()); + + Survey survey = surveyRepository.save(Survey.createWith(request)); + return survey.getId(); + } + + private void validateIsAlreadyUsedName(final String name) { + if (surveyRepository.isExistedByName(name)) { + throw new SurveyNameAlreadyExistException(); + } + } + + public void submitSurvey(final Long memberId, final Long surveyId, final SurveySubmitRequest request) { + Survey survey = findSurveyById(surveyId); + // request + // List + // Long questionId + // Long answerId + } + + private Survey findSurveyById(final Long surveyId) { + return surveyRepository.findById(surveyId) + .orElseThrow(SurveyNotFoundException::new); + } +} diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyCreateRequest.java similarity index 90% rename from src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java rename to src/main/java/com/atwoz/survey/application/survey/dto/SurveyCreateRequest.java index 2ec721a9..efacb943 100644 --- a/src/main/java/com/atwoz/survey/application/dto/SurveyCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyCreateRequest.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.application.dto; +package com.atwoz.survey.application.survey.dto; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; diff --git a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java similarity index 90% rename from src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java rename to src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java index 74aa8f0c..eec1589e 100644 --- a/src/main/java/com/atwoz/survey/application/dto/SurveyQuestionCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.application.dto; +package com.atwoz.survey.application.survey.dto; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/com/atwoz/survey/domain/SurveyRepository.java b/src/main/java/com/atwoz/survey/domain/SurveyRepository.java deleted file mode 100644 index 93232220..00000000 --- a/src/main/java/com/atwoz/survey/domain/SurveyRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.atwoz.survey.domain; - -public interface SurveyRepository { - - Survey save(Survey survey); - boolean isExistedByName(String name); -} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java new file mode 100644 index 00000000..41b1ff41 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java @@ -0,0 +1,39 @@ +package com.atwoz.survey.domain.membersurvey; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class MemberSurvey { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private Long memberId; + + @Column(nullable = false) + private Long questionId; + + @Column(nullable = false) + private Long answerId; + + private MemberSurvey(final Long memberId, final Long questionId, final Long answerId) { + this.memberId = memberId; + this.questionId = questionId; + this.answerId = answerId; + } + + public static MemberSurvey of(final Long memberId, final Long questionId, final Long answerId) { + return new MemberSurvey(memberId, questionId, answerId); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java new file mode 100644 index 00000000..e112d213 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java @@ -0,0 +1,7 @@ +package com.atwoz.survey.domain.membersurvey; + +public interface MemberSurveyRepository { + + MemberSurvey save(MemberSurvey memberSurvey); + boolean existsByMemberIdAndQuestionId(Long memberId, Long questionId); +} diff --git a/src/main/java/com/atwoz/survey/domain/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java similarity index 75% rename from src/main/java/com/atwoz/survey/domain/Survey.java rename to src/main/java/com/atwoz/survey/domain/survey/Survey.java index ac1b3e6f..dfd78577 100644 --- a/src/main/java/com/atwoz/survey/domain/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -1,8 +1,10 @@ -package com.atwoz.survey.domain; +package com.atwoz.survey.domain.survey; -import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; -import com.atwoz.survey.exception.exceptions.SurveyQuestionDuplicatedException; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; +import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -84,4 +86,15 @@ public void updateRequired(final Boolean required) { public boolean isSameName(final String name) { return name.equals(this.name); } + + public boolean isRequired() { + return required; + } + + public void validateIsAllContainsSubmitQuestions(final SurveyComparisonRequest request) { + if (request.questions().size() != questions.size()) { + throw new SurveyQuestionSubmitSizeNotMatchException(); + } + questions.forEach(question -> question.validateIsValidSubmitAnswer(request.questions())); + } } diff --git a/src/main/java/com/atwoz/survey/domain/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java similarity index 88% rename from src/main/java/com/atwoz/survey/domain/SurveyAnswer.java rename to src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java index 6486d227..b92d11de 100644 --- a/src/main/java/com/atwoz/survey/domain/SurveyAnswer.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.domain; +package com.atwoz.survey.domain.survey; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -32,4 +32,8 @@ private SurveyAnswer(final SurveyQuestion question, final String description) { public static SurveyAnswer of(final SurveyQuestion question, final String description) { return new SurveyAnswer(question, description); } + + public boolean isSame(final Long id) { + return id.equals(this.id); + } } diff --git a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java similarity index 62% rename from src/main/java/com/atwoz/survey/domain/SurveyQuestion.java rename to src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 8ed84da8..517c4b61 100644 --- a/src/main/java/com/atwoz/survey/domain/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -1,6 +1,9 @@ -package com.atwoz.survey.domain; +package com.atwoz.survey.domain.survey; -import com.atwoz.survey.exception.exceptions.SurveyAnswerDuplicatedException; +import com.atwoz.survey.domain.survey.dto.SurveyQuestionComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -64,4 +67,24 @@ private static void validateAnswersIsNotDuplicated(final List answers) { private void addSurveyAnswers(final List answers) { this.answers.addAll(answers); } + + public void validateIsValidSubmitAnswer(final List requests) { + SurveyQuestionComparisonRequest questionRequest = findSurveyQuestionById(requests); + if (!isContainsSameAnswer(questionRequest.answerId())) { + throw new SurveyAnswerInvalidSubmitException(); + } + } + + private SurveyQuestionComparisonRequest findSurveyQuestionById(final List requests) { + return requests + .stream() + .filter(question -> id.equals(question.questionId())) + .findAny() + .orElseThrow(SurveyQuestionNotSubmittedException::new); + } + + private boolean isContainsSameAnswer(final Long answerId) { + return answers.stream() + .anyMatch(answer -> answer.isSame(answerId)); + } } diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java new file mode 100644 index 00000000..fd67a200 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java @@ -0,0 +1,12 @@ +package com.atwoz.survey.domain.survey; + +import java.util.List; +import java.util.Optional; + +public interface SurveyRepository { + + Survey save(Survey survey); + boolean isExistedByName(String name); + Optional findById(Long id); + List findAllRequiredSurveys(); +} diff --git a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyComparisonRequest.java b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyComparisonRequest.java new file mode 100644 index 00000000..bf81c38e --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyComparisonRequest.java @@ -0,0 +1,18 @@ +package com.atwoz.survey.domain.survey.dto; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; + +import java.util.List; + +public record SurveyComparisonRequest( + List questions +) { + + public static SurveyComparisonRequest from(final SurveySubmitRequest request) { + List questions = request.questions() + .stream() + .map(SurveyQuestionComparisonRequest::from) + .toList(); + return new SurveyComparisonRequest(questions); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java new file mode 100644 index 00000000..dbd00510 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java @@ -0,0 +1,13 @@ +package com.atwoz.survey.domain.survey.dto; + +import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; + +public record SurveyQuestionComparisonRequest( + Long questionId, + Long answerId +) { + + public static SurveyQuestionComparisonRequest from(final SurveyQuestionSubmitRequest request) { + return new SurveyQuestionComparisonRequest(request.questionId(), request.answerId()); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java b/src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java deleted file mode 100644 index 0ace7140..00000000 --- a/src/main/java/com/atwoz/survey/exception/SurveyExceptionHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.atwoz.survey.exception; - -import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@RestControllerAdvice -public class SurveyExceptionHandler { - - @ExceptionHandler(SurveyNameAlreadyExistException.class) - public ResponseEntity handleSurveyNameAlreadyExistException(final SurveyNameAlreadyExistException exception) { - return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); - } - - private ResponseEntity getExceptionWithStatus(final Exception exception, final HttpStatus status) { - return ResponseEntity.status(status) - .body(exception.getMessage()); - } -} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java b/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java new file mode 100644 index 00000000..6c5f904e --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java @@ -0,0 +1,45 @@ +package com.atwoz.survey.exception.membersurvey; + +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAlreadySubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitDuplicateException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class MemberSurveyExceptionHandler { + + @ExceptionHandler(SurveyAlreadySubmittedException.class) + public ResponseEntity handleSurveyAlreadySubmittedException(final SurveyAlreadySubmittedException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(SurveyAnswerInvalidSubmitException.class) + public ResponseEntity handleSurveyAnswerInvalidSubmitException(final SurveyAnswerInvalidSubmitException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(SurveyQuestionNotSubmittedException.class) + public ResponseEntity handleSurveyQuestionNotSubmittedException(final SurveyQuestionNotSubmittedException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(SurveyQuestionSubmitDuplicateException.class) + public ResponseEntity handleSurveyQuestionSubmitDuplicateException(final SurveyQuestionSubmitDuplicateException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(SurveyQuestionSubmitSizeNotMatchException.class) + public ResponseEntity handleSurveyQuestionSubmitSizeNotMatchException(final SurveyQuestionSubmitSizeNotMatchException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + private ResponseEntity getExceptionWithStatus(final Exception exception, final HttpStatus status) { + return ResponseEntity.status(status) + .body(exception.getMessage()); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAlreadySubmittedException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAlreadySubmittedException.java new file mode 100644 index 00000000..f3939ab2 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAlreadySubmittedException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class SurveyAlreadySubmittedException extends RuntimeException { + + public SurveyAlreadySubmittedException() { + super("이미 제출한 연애고사 과목입니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAnswerInvalidSubmitException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAnswerInvalidSubmitException.java new file mode 100644 index 00000000..befa03ee --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyAnswerInvalidSubmitException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class SurveyAnswerInvalidSubmitException extends RuntimeException { + + public SurveyAnswerInvalidSubmitException() { + super("제출된 답변이 유효하지 않습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionNotSubmittedException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionNotSubmittedException.java new file mode 100644 index 00000000..9dbadd7a --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionNotSubmittedException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class SurveyQuestionNotSubmittedException extends RuntimeException { + + public SurveyQuestionNotSubmittedException() { + super("제출에 작성되지 않은 질문이 있습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java new file mode 100644 index 00000000..49d59d46 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class SurveyQuestionSubmitDuplicateException extends RuntimeException { + + public SurveyQuestionSubmitDuplicateException() { + super("같은 id의 질문을 제출할 수 없습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitSizeNotMatchException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitSizeNotMatchException.java new file mode 100644 index 00000000..339e8ba5 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitSizeNotMatchException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class SurveyQuestionSubmitSizeNotMatchException extends RuntimeException { + + public SurveyQuestionSubmitSizeNotMatchException() { + super("과목의 문제 수와 제출한 문제 수가 일치하지 않습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/survey/SurveyExceptionHandler.java b/src/main/java/com/atwoz/survey/exception/survey/SurveyExceptionHandler.java new file mode 100644 index 00000000..db4170a4 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/survey/SurveyExceptionHandler.java @@ -0,0 +1,39 @@ +package com.atwoz.survey.exception.survey; + +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; +import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class SurveyExceptionHandler { + + @ExceptionHandler(SurveyNameAlreadyExistException.class) + public ResponseEntity handleSurveyNameAlreadyExistException(final SurveyNameAlreadyExistException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(SurveyAnswerDuplicatedException.class) + public ResponseEntity handleSurveyAnswerDuplicatedException(final SurveyAnswerDuplicatedException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(SurveyNotFoundException.class) + public ResponseEntity handleSurveyNotFoundException(final SurveyNotFoundException exception) { + return getExceptionWithStatus(exception, HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(SurveyQuestionDuplicatedException.class) + public ResponseEntity handleSurveyQuestionDuplicatedException(final SurveyQuestionDuplicatedException exception) { + return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); + } + + private ResponseEntity getExceptionWithStatus(final Exception exception, final HttpStatus status) { + return ResponseEntity.status(status) + .body(exception.getMessage()); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerDuplicatedException.java similarity index 77% rename from src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java rename to src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerDuplicatedException.java index ae9485cf..1d06d428 100644 --- a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyAnswerDuplicatedException.java +++ b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerDuplicatedException.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.exception.exceptions; +package com.atwoz.survey.exception.survey.exceptions; public class SurveyAnswerDuplicatedException extends RuntimeException { diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNameAlreadyExistException.java similarity index 78% rename from src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java rename to src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNameAlreadyExistException.java index 2d9707db..7e4ec51c 100644 --- a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyNameAlreadyExistException.java +++ b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNameAlreadyExistException.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.exception.exceptions; +package com.atwoz.survey.exception.survey.exceptions; public class SurveyNameAlreadyExistException extends RuntimeException { diff --git a/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNotFoundException.java b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNotFoundException.java new file mode 100644 index 00000000..81735ebe --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyNotFoundException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.survey.exceptions; + +public class SurveyNotFoundException extends RuntimeException { + + public SurveyNotFoundException() { + super("해당 연애고사 과목이 존재하지 않습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyQuestionDuplicatedException.java b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyQuestionDuplicatedException.java similarity index 79% rename from src/main/java/com/atwoz/survey/exception/exceptions/SurveyQuestionDuplicatedException.java rename to src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyQuestionDuplicatedException.java index abecdca3..2769eb0c 100644 --- a/src/main/java/com/atwoz/survey/exception/exceptions/SurveyQuestionDuplicatedException.java +++ b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyQuestionDuplicatedException.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.exception.exceptions; +package com.atwoz.survey.exception.survey.exceptions; public class SurveyQuestionDuplicatedException extends RuntimeException { diff --git a/src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java deleted file mode 100644 index 671acfde..00000000 --- a/src/main/java/com/atwoz/survey/infrastructure/SurveyJpaRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.atwoz.survey.infrastructure; - -import com.atwoz.survey.domain.Survey; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface SurveyJpaRepository extends JpaRepository { - - Survey save(Survey survey); - boolean existsByName(String name); -} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java new file mode 100644 index 00000000..4321903e --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java @@ -0,0 +1,10 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurvey; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberSurveyJpaRepository extends JpaRepository { + + MemberSurvey save(MemberSurvey memberSurvey); + boolean existsByMemberIdAndQuestionId(Long memberId, Long questionId); +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java new file mode 100644 index 00000000..055cf486 --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java @@ -0,0 +1,23 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurvey; +import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@RequiredArgsConstructor +@Repository +public class MemberSurveyRepositoryImpl implements MemberSurveyRepository { + + private final MemberSurveyJpaRepository memberSurveyJpaRepository; + + @Override + public MemberSurvey save(final MemberSurvey memberSurvey) { + return memberSurveyJpaRepository.save(memberSurvey); + } + + @Override + public boolean existsByMemberIdAndQuestionId(final Long memberId, final Long questionId) { + return memberSurveyJpaRepository.existsByMemberIdAndQuestionId(memberId, questionId); + } +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java new file mode 100644 index 00000000..1e9d777d --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java @@ -0,0 +1,18 @@ +package com.atwoz.survey.infrastructure.survey; + +import com.atwoz.survey.domain.survey.Survey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Optional; + +public interface SurveyJpaRepository extends JpaRepository { + + Survey save(Survey survey); + boolean existsByName(String name); + Optional findById(Long id); + + @Query("SELECT s FROM Survey s WHERE s.required = true") + List findAllRequiredSurveys(); +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java similarity index 52% rename from src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java rename to src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java index 17d78f76..3dba90ef 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/SurveyRepositoryImpl.java +++ b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java @@ -1,10 +1,13 @@ -package com.atwoz.survey.infrastructure; +package com.atwoz.survey.infrastructure.survey; -import com.atwoz.survey.domain.Survey; -import com.atwoz.survey.domain.SurveyRepository; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.SurveyRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + @RequiredArgsConstructor @Repository public class SurveyRepositoryImpl implements SurveyRepository { @@ -20,4 +23,14 @@ public Survey save(final Survey survey) { public boolean isExistedByName(final String name) { return surveyJpaRepository.existsByName(name); } + + @Override + public Optional findById(final Long id) { + return surveyJpaRepository.findById(id); + } + + @Override + public List findAllRequiredSurveys() { + return surveyJpaRepository.findAllRequiredSurveys(); + } } diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java new file mode 100644 index 00000000..4875cba8 --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java @@ -0,0 +1,30 @@ +package com.atwoz.survey.ui.membersurvey; + +import com.atwoz.member.ui.auth.support.auth.AuthMember; +import com.atwoz.survey.application.membersurvey.MemberSurveyService; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RequiredArgsConstructor +@RequestMapping("/api/members/me/surveys") +@RestController +public class MemberSurveyController { + + private final MemberSurveyService memberSurveyService; + + @PostMapping("/submit") + public ResponseEntity submitSurvey(@AuthMember final Long memberId, + @RequestBody @Valid final List request) { + memberSurveyService.submitSurvey(memberId, request); + return ResponseEntity.ok() + .build(); + } +} diff --git a/src/main/java/com/atwoz/survey/ui/SurveyController.java b/src/main/java/com/atwoz/survey/ui/survey/SurveyController.java similarity index 83% rename from src/main/java/com/atwoz/survey/ui/SurveyController.java rename to src/main/java/com/atwoz/survey/ui/survey/SurveyController.java index eb685637..2c13fdd9 100644 --- a/src/main/java/com/atwoz/survey/ui/SurveyController.java +++ b/src/main/java/com/atwoz/survey/ui/survey/SurveyController.java @@ -1,7 +1,7 @@ -package com.atwoz.survey.ui; +package com.atwoz.survey.ui.survey; -import com.atwoz.survey.application.SurveyService; -import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.application.survey.SurveyService; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; diff --git a/src/test/java/com/atwoz/helper/MockBeanInjection.java b/src/test/java/com/atwoz/helper/MockBeanInjection.java index 91fce8f8..384bfadb 100644 --- a/src/test/java/com/atwoz/helper/MockBeanInjection.java +++ b/src/test/java/com/atwoz/helper/MockBeanInjection.java @@ -14,7 +14,7 @@ import com.atwoz.mission.application.membermission.MemberMissionsService; import com.atwoz.mission.application.mission.MissionQueryService; import com.atwoz.mission.application.mission.MissionService; -import com.atwoz.survey.application.SurveyService; +import com.atwoz.survey.application.survey.SurveyService; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext; diff --git a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java index d9c215e0..49ce64b1 100644 --- a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java @@ -1,8 +1,9 @@ package com.atwoz.survey.application; -import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.domain.SurveyRepository; -import com.atwoz.survey.exception.exceptions.SurveyNameAlreadyExistException; +import com.atwoz.survey.application.survey.SurveyService; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; import com.atwoz.survey.infrastructure.SurveyFakeRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayNameGeneration; diff --git a/src/test/java/com/atwoz/survey/domain/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/SurveyTest.java index 024c386e..b155911f 100644 --- a/src/test/java/com/atwoz/survey/domain/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/SurveyTest.java @@ -1,9 +1,10 @@ package com.atwoz.survey.domain; -import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; -import com.atwoz.survey.exception.exceptions.SurveyAnswerDuplicatedException; -import com.atwoz.survey.exception.exceptions.SurveyQuestionDuplicatedException; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; +import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index 51d6be27..ad95d6e7 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -1,7 +1,7 @@ package com.atwoz.survey.fixture; -import com.atwoz.survey.application.dto.SurveyCreateRequest; -import com.atwoz.survey.application.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; import java.util.List; diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 648bb535..263cbc8b 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -1,6 +1,6 @@ package com.atwoz.survey.fixture; -import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.domain.survey.Survey; public class SurveyFixture { diff --git a/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java index 1c365e4f..79ec2279 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java @@ -1,10 +1,12 @@ package com.atwoz.survey.infrastructure; -import com.atwoz.survey.domain.Survey; -import com.atwoz.survey.domain.SurveyRepository; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.SurveyRepository; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Optional; public class SurveyFakeRepository implements SurveyRepository { @@ -31,4 +33,17 @@ public boolean isExistedByName(final String name) { .stream() .anyMatch(survey -> survey.isSameName(name)); } + + @Override + public Optional findById(final Long id) { + return Optional.of(map.get(id)); + } + + @Override + public List findAllRequiredSurveys() { + return map.values() + .stream() + .filter(Survey::isRequired) + .toList(); + } } diff --git a/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java index a808c7bd..904306f8 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java @@ -1,7 +1,8 @@ package com.atwoz.survey.infrastructure; -import com.atwoz.survey.domain.Survey; +import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.fixture.SurveyFixture; +import com.atwoz.survey.infrastructure.survey.SurveyJpaRepository; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java index b57968a3..6ca21890 100644 --- a/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java @@ -1,8 +1,9 @@ package com.atwoz.survey.ui; import com.atwoz.helper.MockBeanInjection; -import com.atwoz.survey.application.SurveyService; -import com.atwoz.survey.application.dto.SurveyCreateRequest; +import com.atwoz.survey.application.survey.SurveyService; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.ui.survey.SurveyController; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHeaders; import org.junit.jupiter.api.DisplayNameGeneration; From 8ba0dd3a8825dac6e64bf8d247dbb4ef115136be Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 12:48:41 +0900 Subject: [PATCH 14/65] =?UTF-8?q?refactor:=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 설문과 회원 설문 구분을 위해 테스트 패키지 수정 --- .../survey/application/{ => survey}/SurveyServiceTest.java | 5 ++--- .../com/atwoz/survey/domain/{ => survey}/SurveyTest.java | 3 +-- .../infrastructure/{ => survey}/SurveyFakeRepository.java | 2 +- .../infrastructure/{ => survey}/SurveyJpaRepositoryTest.java | 3 +-- .../survey/ui/{ => survey}/SurveyControllerWebMvcTest.java | 3 +-- 5 files changed, 6 insertions(+), 10 deletions(-) rename src/test/java/com/atwoz/survey/application/{ => survey}/SurveyServiceTest.java (91%) rename src/test/java/com/atwoz/survey/domain/{ => survey}/SurveyTest.java (97%) rename src/test/java/com/atwoz/survey/infrastructure/{ => survey}/SurveyFakeRepository.java (96%) rename src/test/java/com/atwoz/survey/infrastructure/{ => survey}/SurveyJpaRepositoryTest.java (90%) rename src/test/java/com/atwoz/survey/ui/{ => survey}/SurveyControllerWebMvcTest.java (97%) diff --git a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java similarity index 91% rename from src/test/java/com/atwoz/survey/application/SurveyServiceTest.java rename to src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index 49ce64b1..abc62b4a 100644 --- a/src/test/java/com/atwoz/survey/application/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -1,10 +1,9 @@ -package com.atwoz.survey.application; +package com.atwoz.survey.application.survey; -import com.atwoz.survey.application.survey.SurveyService; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.domain.survey.SurveyRepository; import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; -import com.atwoz.survey.infrastructure.SurveyFakeRepository; +import com.atwoz.survey.infrastructure.survey.SurveyFakeRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; diff --git a/src/test/java/com/atwoz/survey/domain/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java similarity index 97% rename from src/test/java/com/atwoz/survey/domain/SurveyTest.java rename to src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index b155911f..13edd398 100644 --- a/src/test/java/com/atwoz/survey/domain/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -1,8 +1,7 @@ -package com.atwoz.survey.domain; +package com.atwoz.survey.domain.survey; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; -import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import org.junit.jupiter.api.DisplayNameGeneration; diff --git a/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java similarity index 96% rename from src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java rename to src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java index 79ec2279..6f708dce 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/SurveyFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java @@ -1,4 +1,4 @@ -package com.atwoz.survey.infrastructure; +package com.atwoz.survey.infrastructure.survey; import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.domain.survey.SurveyRepository; diff --git a/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java similarity index 90% rename from src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java rename to src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java index 904306f8..0250a79a 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/SurveyJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java @@ -1,8 +1,7 @@ -package com.atwoz.survey.infrastructure; +package com.atwoz.survey.infrastructure.survey; import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.fixture.SurveyFixture; -import com.atwoz.survey.infrastructure.survey.SurveyJpaRepository; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java similarity index 97% rename from src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java rename to src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index 6ca21890..3fcdc5c7 100644 --- a/src/test/java/com/atwoz/survey/ui/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -1,9 +1,8 @@ -package com.atwoz.survey.ui; +package com.atwoz.survey.ui.survey; import com.atwoz.helper.MockBeanInjection; import com.atwoz.survey.application.survey.SurveyService; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; -import com.atwoz.survey.ui.survey.SurveyController; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHeaders; import org.junit.jupiter.api.DisplayNameGeneration; From 2a2542a4b8b881652408f9490535bede673f4759 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 13:35:59 +0900 Subject: [PATCH 15/65] =?UTF-8?q?refactor:=20=EC=96=91=EB=B0=A9=ED=96=A5?= =?UTF-8?q?=20=EA=B4=80=EA=B3=84=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 양방향 참조 해제되도록 수정 --- .../com/atwoz/survey/domain/survey/Survey.java | 6 ++++-- .../survey/domain/survey/SurveyAnswer.java | 12 +++--------- .../survey/domain/survey/SurveyQuestion.java | 18 +++++++----------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index dfd78577..274fe5b8 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -11,6 +11,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -40,7 +41,8 @@ public class Survey { @Column(nullable = false) private Boolean required; - @OneToMany(mappedBy = "survey", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) + @JoinColumn(name = "survey_id") + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private List questions = new ArrayList<>(); private Survey(final String name, final Boolean required) { @@ -70,7 +72,7 @@ private static void validateQuestionsIsNotDuplicated(final List questionRequests) { List questions = questionRequests.stream() - .map(request -> SurveyQuestion.of(this, request.description(), request.answers())) + .map(request -> SurveyQuestion.of(request.description(), request.answers())) .toList(); this.questions.addAll(questions); } diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java index b92d11de..ee51e6aa 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java @@ -2,11 +2,9 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -18,19 +16,15 @@ public class SurveyAnswer { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.LAZY) - private SurveyQuestion question; - @Column(nullable = false) private String description; - private SurveyAnswer(final SurveyQuestion question, final String description) { - this.question = question; + private SurveyAnswer(final String description) { this.description = description; } - public static SurveyAnswer of(final SurveyQuestion question, final String description) { - return new SurveyAnswer(question, description); + public static SurveyAnswer from(final String description) { + return new SurveyAnswer(description); } public boolean isSame(final Long id) { diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 517c4b61..49b16242 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -7,11 +7,10 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; +import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import lombok.AccessLevel; import lombok.Getter; @@ -34,23 +33,20 @@ public class SurveyQuestion { @Column(nullable = false) private String description; - @ManyToOne(fetch = FetchType.LAZY) - private Survey survey; - - @OneToMany(mappedBy = "question", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) + @JoinColumn(name = "survey_question_id") + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private List answers = new ArrayList<>(); - private SurveyQuestion(final Survey survey, final String description) { - this.survey = survey; + private SurveyQuestion(final String description) { this.description = description; } - public static SurveyQuestion of(final Survey survey, final String description, final List answers) { + public static SurveyQuestion of(final String description, final List answers) { validateAnswersIsNotDuplicated(answers); - SurveyQuestion surveyQuestion = new SurveyQuestion(survey, description); + SurveyQuestion surveyQuestion = new SurveyQuestion(description); List surveyAnswers = answers.stream() - .map(answer -> SurveyAnswer.of(surveyQuestion, answer)) + .map(SurveyAnswer::from) .toList(); surveyQuestion.addSurveyAnswers(surveyAnswers); From 72ddf388135932d58ad8762876928839747ace1b Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 13:56:49 +0900 Subject: [PATCH 16/65] =?UTF-8?q?test:=20SurveyQuestionTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyQuestion 단위 테스트 작성 - 필요한 관련 Fixture 생성 - Builder, EqualsAndHashCode 추가 --- .../survey/domain/survey/SurveyAnswer.java | 6 ++ .../survey/domain/survey/SurveyQuestion.java | 4 + .../domain/survey/SurveyQuestionTest.java | 96 +++++++++++++++++++ .../survey/fixture/SurveyAnswerFixture.java | 13 +++ .../survey/fixture/SurveyQuestionFixture.java | 17 ++++ 5 files changed, 136 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java create mode 100644 src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java create mode 100644 src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java index ee51e6aa..49125dbe 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java @@ -6,9 +6,15 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +@EqualsAndHashCode(of = "description") +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder @Entity public class SurveyAnswer { diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 49b16242..5cdf11c8 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -13,6 +13,8 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -22,7 +24,9 @@ import java.util.Set; @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder @Entity public class SurveyQuestion { diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java new file mode 100644 index 00000000..0d5b4626 --- /dev/null +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -0,0 +1,96 @@ +package com.atwoz.survey.domain.survey; + +import com.atwoz.survey.domain.survey.dto.SurveyQuestionComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.SoftAssertions.assertSoftly; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class SurveyQuestionTest { + + @Test + void 연애고사_질문_생성() { + // given + String description = "질문"; + List answers = List.of("답변1", "답변2", "답변3"); + List surveyAnswers = List.of( + SurveyAnswer.from("답변1"), + SurveyAnswer.from("답변2"), + SurveyAnswer.from("답변3") + ); + + // when + SurveyQuestion surveyQuestion = SurveyQuestion.of(description, answers); + + // then + assertSoftly(softly -> { + softly.assertThat(surveyQuestion.getDescription()).isEqualTo(description); + softly.assertThat(surveyQuestion.getAnswers()).isEqualTo(surveyAnswers); + }); + } + + @Test + void 연애고사_질문_응시() { + // given + SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + List requests = List.of( + new SurveyQuestionComparisonRequest(1L, 1L) + ); + + // when & then + assertDoesNotThrow(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)); + } + + @Nested + class 설문_질문_예외 { + + @Test + void 중복된_답변은_작성할_수_없다() { + // given + String description = "질문"; + List answers = List.of("답변1", "답변1", "답변3"); + + // when & then + assertThatThrownBy(() -> SurveyQuestion.of(description, answers)) + .isInstanceOf(SurveyAnswerDuplicatedException.class); + } + + @Test + void 연애고사_질문을_응시할_때는_관련_질문이_있어야_한다() { + // given + SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + List requests = List.of( + new SurveyQuestionComparisonRequest(2L, 1L), + new SurveyQuestionComparisonRequest(3L, 1L) + ); + + // when & then + assertThatThrownBy(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)) + .isInstanceOf(SurveyQuestionNotSubmittedException.class); + } + + @Test + void 연애고사_질문을_응시할_때는_있는_답변으로만_작성해야_한다() { + // given + SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + List requests = List.of( + new SurveyQuestionComparisonRequest(1L, 5L) + ); + + // when & then + assertThatThrownBy(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)) + .isInstanceOf(SurveyAnswerInvalidSubmitException.class); + } + } +} diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java new file mode 100644 index 00000000..e1454566 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java @@ -0,0 +1,13 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.domain.survey.SurveyAnswer; + +public class SurveyAnswerFixture { + + public static SurveyAnswer 설문_답변_id있음() { + return SurveyAnswer.builder() + .id(1L) + .description("답변 1") + .build(); + } +} diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java new file mode 100644 index 00000000..4580317c --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java @@ -0,0 +1,17 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.domain.survey.SurveyQuestion; + +import java.util.List; +import static com.atwoz.survey.fixture.SurveyAnswerFixture.설문_답변_id있음; + +public class SurveyQuestionFixture { + + public static SurveyQuestion 설문_질문_답변_한개() { + return SurveyQuestion.builder() + .id(1L) + .description("질문 1") + .answers(List.of(설문_답변_id있음())) + .build(); + } +} From 470d2a75e7d745f97f26f8ec28afb0cd77033c3d Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 14:01:09 +0900 Subject: [PATCH 17/65] =?UTF-8?q?test:=20SurveyAnswerTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyAnswer 단위 테스트 작성 - getter 추가 --- .../survey/domain/survey/SurveyAnswer.java | 2 + .../domain/survey/SurveyAnswerTest.java | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java index 49125dbe..c7285f07 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java @@ -9,8 +9,10 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; +@Getter @EqualsAndHashCode(of = "description") @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java new file mode 100644 index 00000000..bf50b3a8 --- /dev/null +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java @@ -0,0 +1,50 @@ +package com.atwoz.survey.domain.survey; + +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static com.atwoz.survey.fixture.SurveyAnswerFixture.설문_답변_id있음; +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class SurveyAnswerTest { + + @Test + void 설문_답변_생성() { + // given + String description = "답변"; + + // when + SurveyAnswer answer = SurveyAnswer.from(description); + + // then + assertThat(answer.getDescription()).isEqualTo(description); + } + + @Test + void 설문_답변_id_비교() { + // given + SurveyAnswer surveyAnswer = 설문_답변_id있음(); + + // when + boolean isSame = surveyAnswer.isSame(1L); + + // then + assertThat(isSame).isTrue(); + } + + @Test + void 동등성_비교() { + // given + SurveyAnswer surveyAnswer1 = 설문_답변_id있음(); + SurveyAnswer surveyAnswer2 = SurveyAnswer.from("답변 1"); + + // when + boolean equals = surveyAnswer1.equals(surveyAnswer2); + + // then + assertThat(equals).isTrue(); + } +} From 7225cb3d31778579794d83dab9715c575f2a5cee Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 14:06:17 +0900 Subject: [PATCH 18/65] =?UTF-8?q?refactor:=20SurveyQuestion=20equals&hashc?= =?UTF-8?q?ode=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyQuestion equals&hashcode 추가 - 관련 테스트 수정 --- .../atwoz/survey/domain/survey/SurveyQuestion.java | 2 ++ .../survey/domain/survey/SurveyQuestionTest.java | 14 ++++++++++++++ .../com/atwoz/survey/domain/survey/SurveyTest.java | 6 +++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 5cdf11c8..4f9acbc2 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -15,6 +15,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -24,6 +25,7 @@ import java.util.Set; @Getter +@EqualsAndHashCode(of = {"description", "answers"}) @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 0d5b4626..516c9770 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -11,6 +11,7 @@ import java.util.List; import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -52,6 +53,19 @@ class SurveyQuestionTest { assertDoesNotThrow(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)); } + @Test + void 동등성_비교() { + // given + SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of("답변 1")); + + // when + boolean isSame = surveyQuestion.equals(anotherSurveyQuestion); + + // then + assertThat(isSame).isTrue(); + } + @Nested class 설문_질문_예외 { diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 13edd398..a873d72a 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -23,6 +23,10 @@ class SurveyTest { void 설문_과목_정상_생성() { // given SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + List questions = List.of( + SurveyQuestion.of("질문 내용1", List.of("답변1", "답변2")), + SurveyQuestion.of("질문 내용2", List.of("답변1", "답변2")) + ); // when Survey survey = Survey.createWith(request); @@ -31,7 +35,7 @@ class SurveyTest { assertSoftly(softly -> { softly.assertThat(survey.getName()).isEqualTo("설문 제목"); softly.assertThat(survey.getRequired()).isTrue(); - softly.assertThat(survey.getQuestions()).hasSize(2); + softly.assertThat(survey.getQuestions()).isEqualTo(questions); }); } From df774fb834f6a2afb8e4b0b4684f92c2bf495286 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 14:08:31 +0900 Subject: [PATCH 19/65] =?UTF-8?q?test:=20MemberSurveyTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurvey 단위 테스트 작성 --- .../domain/membersurvey/MemberSurveyTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java diff --git a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java new file mode 100644 index 00000000..7e820be6 --- /dev/null +++ b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java @@ -0,0 +1,30 @@ +package com.atwoz.survey.domain.membersurvey; + +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class MemberSurveyTest { + + @Test + void 회원_설문_생성() { + // given + Long memberId = 1L; + Long questionId = 1L; + Long answerId = 1L; + + // when + MemberSurvey memberSurvey = MemberSurvey.of(memberId, questionId, answerId); + + // then + assertSoftly(softly -> { + softly.assertThat(memberSurvey.getMemberId()).isEqualTo(memberId); + softly.assertThat(memberSurvey.getQuestionId()).isEqualTo(questionId); + softly.assertThat(memberSurvey.getAnswerId()).isEqualTo(answerId); + }); + } +} From 7338a85b33e37b1a403553aac3dd70ad85c9f75d Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 14:26:50 +0900 Subject: [PATCH 20/65] =?UTF-8?q?test:=20SurveyTest=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyTest 추가 테스트 작성 - Fixture id 있는 타입 추가 --- .../application/survey/SurveyServiceTest.java | 8 +-- .../domain/survey/SurveyQuestionTest.java | 10 +-- .../survey/domain/survey/SurveyTest.java | 64 +++++++++++++++++-- .../fixture/SurveyCreateRequestFixture.java | 2 +- .../atwoz/survey/fixture/SurveyFixture.java | 15 ++++- .../survey/fixture/SurveyQuestionFixture.java | 2 +- .../ui/survey/SurveyControllerWebMvcTest.java | 4 +- 7 files changed, 85 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index abc62b4a..50bf4b7b 100644 --- a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -29,7 +29,7 @@ void init() { @Test void 설문_등록() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); // when Long id = surveyService.addSurvey(request); @@ -41,8 +41,8 @@ void init() { @Test void 같은_이름의_설문을_등록할_수_없다() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); - SurveyCreateRequest request2 = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request2 = 설문_필수_질문_과목_두개씩_생성_요청(); surveyService.addSurvey(request); // when & then diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 516c9770..70e5a385 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import java.util.List; -import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개_id있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -44,7 +44,7 @@ class SurveyQuestionTest { @Test void 연애고사_질문_응시() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); List requests = List.of( new SurveyQuestionComparisonRequest(1L, 1L) ); @@ -56,7 +56,7 @@ class SurveyQuestionTest { @Test void 동등성_비교() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of("답변 1")); // when @@ -83,7 +83,7 @@ class 설문_질문_예외 { @Test void 연애고사_질문을_응시할_때는_관련_질문이_있어야_한다() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); List requests = List.of( new SurveyQuestionComparisonRequest(2L, 1L), new SurveyQuestionComparisonRequest(3L, 1L) @@ -97,7 +97,7 @@ class 설문_질문_예외 { @Test void 연애고사_질문을_응시할_때는_있는_답변으로만_작성해야_한다() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개(); + SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); List requests = List.of( new SurveyQuestionComparisonRequest(1L, 5L) ); diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index a873d72a..5c7f0304 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -1,7 +1,12 @@ package com.atwoz.survey.domain.survey; +import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import org.junit.jupiter.api.DisplayNameGeneration; @@ -10,10 +15,12 @@ import org.junit.jupiter.api.Test; import java.util.List; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyFixture.설문_필수_질문_과목_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @SuppressWarnings("NonAsciiCharacters") @@ -22,7 +29,7 @@ class SurveyTest { @Test void 설문_과목_정상_생성() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); List questions = List.of( SurveyQuestion.of("질문 내용1", List.of("답변1", "답변2")), SurveyQuestion.of("질문 내용2", List.of("답변1", "답변2")) @@ -33,8 +40,8 @@ class SurveyTest { // then assertSoftly(softly -> { - softly.assertThat(survey.getName()).isEqualTo("설문 제목"); - softly.assertThat(survey.getRequired()).isTrue(); + softly.assertThat(survey.isSameName("설문 제목")).isTrue(); + softly.assertThat(survey.isRequired()).isTrue(); softly.assertThat(survey.getQuestions()).isEqualTo(questions); }); } @@ -42,7 +49,7 @@ class SurveyTest { @Test void 과목_이름_수정() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); Survey survey = Survey.createWith(request); // when @@ -55,7 +62,7 @@ class SurveyTest { @Test void 과목_필수_여부_수정() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); Survey survey = Survey.createWith(request); // when @@ -65,6 +72,20 @@ class SurveyTest { assertThat(survey.getRequired()).isEqualTo(false); } + @Test + void 설문_응시_조건_검사_통과() { + // given + Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + SurveyComparisonRequest request = SurveyComparisonRequest.from( + new SurveySubmitRequest(1L, List.of( + new SurveyQuestionSubmitRequest(1L, 1L) + )) + ); + + // when & then + assertDoesNotThrow(() -> survey.validateIsAllContainsSubmitQuestions(request)); + } + @Nested class 설문_생성_예외 { @@ -92,5 +113,36 @@ class 설문_생성_예외 { assertThatThrownBy(() -> Survey.createWith(request)) .isInstanceOf(SurveyAnswerDuplicatedException.class); } + + @Test + void 설문_응시_질문_id_갯수가_다르면_예외가_발생한다() { + // given + Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + SurveyComparisonRequest request = SurveyComparisonRequest.from( + new SurveySubmitRequest(1L, List.of( + new SurveyQuestionSubmitRequest(1L, 1L), + new SurveyQuestionSubmitRequest(2L, 1L) + )) + ); + + // when & then + assertThatThrownBy(() -> survey.validateIsAllContainsSubmitQuestions(request)) + .isInstanceOf(SurveyQuestionSubmitSizeNotMatchException.class); + } + + @Test + void 설문에_있는_질문의_답변이_아닌_답변을_내면_예외가_발생한다() { + // given + Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + SurveyComparisonRequest request = SurveyComparisonRequest.from( + new SurveySubmitRequest(1L, List.of( + new SurveyQuestionSubmitRequest(1L, 5L) + )) + ); + + // when & then + assertThatThrownBy(() -> survey.validateIsAllContainsSubmitQuestions(request)) + .isInstanceOf(SurveyAnswerInvalidSubmitException.class); + } } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index ad95d6e7..e38d9d1b 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -7,7 +7,7 @@ public class SurveyCreateRequestFixture { - public static SurveyCreateRequest 설문_필수_질문_과목_두개씩() { + public static SurveyCreateRequest 설문_필수_질문_과목_두개씩_생성_요청() { return new SurveyCreateRequest("설문 제목", true, List.of( new SurveyQuestionCreateRequest("질문 내용1", List.of("답변1", "답변2")), new SurveyQuestionCreateRequest("질문 내용2", List.of("답변1", "답변2")) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 263cbc8b..887fd4df 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -2,9 +2,22 @@ import com.atwoz.survey.domain.survey.Survey; +import java.util.List; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개_id있음; + public class SurveyFixture { public static Survey 설문_필수_질문_과목_두개씩() { - return Survey.createWith(SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩()); + return Survey.createWith(설문_필수_질문_과목_두개씩_생성_요청()); + } + + public static Survey 설문_필수_질문_과목_한개씩_전부_id_있음() { + return Survey.builder() + .id(1L) + .required(true) + .name("과목 1") + .questions(List.of(설문_질문_답변_한개_id있음())) + .build(); } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java index 4580317c..1e783543 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java @@ -7,7 +7,7 @@ public class SurveyQuestionFixture { - public static SurveyQuestion 설문_질문_답변_한개() { + public static SurveyQuestion 설문_질문_답변_한개_id있음() { return SurveyQuestion.builder() .id(1L) .description("질문 1") diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index 3fcdc5c7..575bc47c 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -14,7 +14,7 @@ import org.springframework.test.web.servlet.MockMvc; import static com.atwoz.helper.RestDocsHelper.customDocument; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; import static org.mockito.Mockito.when; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; @@ -41,7 +41,7 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { @Test void 설문_과목을_생성한다() throws Exception { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩(); + SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); when(surveyService.addSurvey(request)).thenReturn(1L); // when From 46c47d435b2380187ea290dfcf485544ec07c4b0 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 14:29:21 +0900 Subject: [PATCH 21/65] =?UTF-8?q?refactor:=20Fixture=20static=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixture import static 적용 --- .../survey/infrastructure/survey/SurveyJpaRepositoryTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java index 0250a79a..f0a2f519 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import static com.atwoz.survey.fixture.SurveyFixture.설문_필수_질문_과목_두개씩; import static org.assertj.core.api.Assertions.assertThat; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -21,7 +22,7 @@ public class SurveyJpaRepositoryTest { @Test void 설문_과목_등록() { // given - Survey survey = SurveyFixture.설문_필수_질문_과목_두개씩(); + Survey survey = 설문_필수_질문_과목_두개씩(); // when Survey saveSurvey = surveyJpaRepository.save(survey); From 4893885e04cd5fc3746bc3741970fd9c26f9567e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 16:20:53 +0900 Subject: [PATCH 22/65] =?UTF-8?q?refactor:=20=EB=8B=B5=EB=B3=80=EC=97=90?= =?UTF-8?q?=20=EC=83=81=EB=8C=80=20=EB=B2=88=ED=98=B8=20=EB=93=A4=EC=96=B4?= =?UTF-8?q?=EA=B0=80=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 답변 생성 시 문제 안에서의 상대 번호 들어가도록 수정 --- .../membersurvey/MemberSurveyService.java | 2 +- .../dto/SurveyQuestionSubmitRequest.java | 2 +- .../application/survey/SurveyService.java | 6 +-- .../survey/dto/SurveyAnswerCreateRequest.java | 17 +++++++++ .../dto/SurveyQuestionCreateRequest.java | 6 +-- .../domain/membersurvey/MemberSurvey.java | 10 ++--- .../survey/domain/survey/SurveyAnswer.java | 16 +++++--- .../survey/domain/survey/SurveyQuestion.java | 18 +++++---- .../dto/SurveyQuestionComparisonRequest.java | 4 +- .../domain/membersurvey/MemberSurveyTest.java | 6 +-- .../domain/survey/SurveyAnswerTest.java | 13 +++++-- .../domain/survey/SurveyQuestionTest.java | 37 ++++++++++++------- .../survey/domain/survey/SurveyTest.java | 35 +++++++++++++----- .../survey/fixture/SurveyAnswerFixture.java | 1 + .../fixture/SurveyCreateRequestFixture.java | 11 +++++- .../ui/survey/SurveyControllerWebMvcTest.java | 4 +- 16 files changed, 125 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/application/survey/dto/SurveyAnswerCreateRequest.java diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java index b15eeeb9..e68054c4 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java @@ -70,7 +70,7 @@ private Survey findSurveyById(final Long surveyId) { private void saveQuestionAnswer(final Long memberId, final SurveySubmitRequest request, final SurveyQuestion question) { validateIsAlreadySubmittedQuestion(memberId, question.getId()); SurveyQuestionSubmitRequest questionRequest = findQuestionSubmitRequest(question.getId(), request); - MemberSurvey memberSurvey = MemberSurvey.of(memberId, question.getId(), questionRequest.answerId()); + MemberSurvey memberSurvey = MemberSurvey.of(memberId, question.getId(), questionRequest.answerNumber()); memberSurveyRepository.save(memberSurvey); } diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java index f09c6d03..f27460c1 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java @@ -2,6 +2,6 @@ public record SurveyQuestionSubmitRequest( Long questionId, - Long answerId + Integer answerNumber ) { } diff --git a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java index 5c91ee8c..854636c3 100644 --- a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java @@ -31,11 +31,7 @@ private void validateIsAlreadyUsedName(final String name) { } public void submitSurvey(final Long memberId, final Long surveyId, final SurveySubmitRequest request) { - Survey survey = findSurveyById(surveyId); - // request - // List - // Long questionId - // Long answerId + } private Survey findSurveyById(final Long surveyId) { diff --git a/src/main/java/com/atwoz/survey/application/survey/dto/SurveyAnswerCreateRequest.java b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyAnswerCreateRequest.java new file mode 100644 index 00000000..a21de544 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyAnswerCreateRequest.java @@ -0,0 +1,17 @@ +package com.atwoz.survey.application.survey.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public record SurveyAnswerCreateRequest( + @NotNull(message = "답변 번호가 작성되어야 합니다. (ex: 1)") + Integer number, + + @NotBlank(message = "답변 내용이 작성되어야 합니다. (ex: 무계획 여행)") + String answer +) { + + public static SurveyAnswerCreateRequest of(final Integer number, final String answer) { + return new SurveyAnswerCreateRequest(number, answer); + } +} diff --git a/src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java index eec1589e..2607a2a3 100644 --- a/src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java +++ b/src/main/java/com/atwoz/survey/application/survey/dto/SurveyQuestionCreateRequest.java @@ -1,7 +1,7 @@ package com.atwoz.survey.application.survey.dto; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import java.util.List; @@ -9,7 +9,7 @@ public record SurveyQuestionCreateRequest( @NotBlank(message = "질문 내용이 작성되어야 합니다. (ex: 다음 중 좋아하는 여행 스타일은?)") String description, - @NotNull(message = "질문 답변 항목이 작성되어야 합니다. (ex: 무계획 여행)") - List answers + @Valid + List answers ) { } diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java index 41b1ff41..7aac66db 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java @@ -25,15 +25,15 @@ public class MemberSurvey { private Long questionId; @Column(nullable = false) - private Long answerId; + private Integer answerNumber; - private MemberSurvey(final Long memberId, final Long questionId, final Long answerId) { + private MemberSurvey(final Long memberId, final Long questionId, final Integer answerNumber) { this.memberId = memberId; this.questionId = questionId; - this.answerId = answerId; + this.answerNumber = answerNumber; } - public static MemberSurvey of(final Long memberId, final Long questionId, final Long answerId) { - return new MemberSurvey(memberId, questionId, answerId); + public static MemberSurvey of(final Long memberId, final Long questionId, final Integer answerNumber) { + return new MemberSurvey(memberId, questionId, answerNumber); } } diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java index c7285f07..106702d0 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java @@ -13,7 +13,7 @@ import lombok.NoArgsConstructor; @Getter -@EqualsAndHashCode(of = "description") +@EqualsAndHashCode(of = {"number", "description"}) @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @@ -24,18 +24,22 @@ public class SurveyAnswer { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(nullable = false) + private Integer number; + @Column(nullable = false) private String description; - private SurveyAnswer(final String description) { + private SurveyAnswer(final Integer number, final String description) { + this.number = number; this.description = description; } - public static SurveyAnswer from(final String description) { - return new SurveyAnswer(description); + public static SurveyAnswer of(final Integer number, final String description) { + return new SurveyAnswer(number, description); } - public boolean isSame(final Long id) { - return id.equals(this.id); + public boolean isSame(final Integer number) { + return number.equals(this.number); } } diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 4f9acbc2..c309b125 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -1,5 +1,6 @@ package com.atwoz.survey.domain.survey; +import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.domain.survey.dto.SurveyQuestionComparisonRequest; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; @@ -47,20 +48,23 @@ private SurveyQuestion(final String description) { this.description = description; } - public static SurveyQuestion of(final String description, final List answers) { + public static SurveyQuestion of(final String description, final List answers) { validateAnswersIsNotDuplicated(answers); SurveyQuestion surveyQuestion = new SurveyQuestion(description); List surveyAnswers = answers.stream() - .map(SurveyAnswer::from) + .map(answer -> SurveyAnswer.of(answer.number(), answer.answer())) .toList(); surveyQuestion.addSurveyAnswers(surveyAnswers); return surveyQuestion; } - private static void validateAnswersIsNotDuplicated(final List answers) { - Set answersSet = new HashSet<>(answers); + private static void validateAnswersIsNotDuplicated(final List answers) { + List answerNumbers = answers.stream() + .map(SurveyAnswerCreateRequest::number) + .toList(); + Set answersSet = new HashSet<>(answerNumbers); if (answersSet.size() != answers.size()) { throw new SurveyAnswerDuplicatedException(); } @@ -72,7 +76,7 @@ private void addSurveyAnswers(final List answers) { public void validateIsValidSubmitAnswer(final List requests) { SurveyQuestionComparisonRequest questionRequest = findSurveyQuestionById(requests); - if (!isContainsSameAnswer(questionRequest.answerId())) { + if (!isContainsSameAnswer(questionRequest.answerNumber())) { throw new SurveyAnswerInvalidSubmitException(); } } @@ -85,8 +89,8 @@ private SurveyQuestionComparisonRequest findSurveyQuestionById(final List answer.isSame(answerId)); + .anyMatch(answer -> answer.isSame(answerNumber)); } } diff --git a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java index dbd00510..1117470e 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java +++ b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionComparisonRequest.java @@ -4,10 +4,10 @@ public record SurveyQuestionComparisonRequest( Long questionId, - Long answerId + Integer answerNumber ) { public static SurveyQuestionComparisonRequest from(final SurveyQuestionSubmitRequest request) { - return new SurveyQuestionComparisonRequest(request.questionId(), request.answerId()); + return new SurveyQuestionComparisonRequest(request.questionId(), request.answerNumber()); } } diff --git a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java index 7e820be6..268b9ddb 100644 --- a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java @@ -15,16 +15,16 @@ class MemberSurveyTest { // given Long memberId = 1L; Long questionId = 1L; - Long answerId = 1L; + Integer answerNumber = 1; // when - MemberSurvey memberSurvey = MemberSurvey.of(memberId, questionId, answerId); + MemberSurvey memberSurvey = MemberSurvey.of(memberId, questionId, answerNumber); // then assertSoftly(softly -> { softly.assertThat(memberSurvey.getMemberId()).isEqualTo(memberId); softly.assertThat(memberSurvey.getQuestionId()).isEqualTo(questionId); - softly.assertThat(memberSurvey.getAnswerId()).isEqualTo(answerId); + softly.assertThat(memberSurvey.getAnswerNumber()).isEqualTo(answerNumber); }); } } diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java index bf50b3a8..d0bc6089 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java @@ -6,6 +6,7 @@ import static com.atwoz.survey.fixture.SurveyAnswerFixture.설문_답변_id있음; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @SuppressWarnings("NonAsciiCharacters") @@ -14,13 +15,17 @@ class SurveyAnswerTest { @Test void 설문_답변_생성() { // given + Integer number = 1; String description = "답변"; // when - SurveyAnswer answer = SurveyAnswer.from(description); + SurveyAnswer answer = SurveyAnswer.of(number, description); // then - assertThat(answer.getDescription()).isEqualTo(description); + assertSoftly(softly -> { + softly.assertThat(answer.getNumber()).isEqualTo(number); + softly.assertThat(answer.getDescription()).isEqualTo(description); + }); } @Test @@ -29,7 +34,7 @@ class SurveyAnswerTest { SurveyAnswer surveyAnswer = 설문_답변_id있음(); // when - boolean isSame = surveyAnswer.isSame(1L); + boolean isSame = surveyAnswer.isSame(1); // then assertThat(isSame).isTrue(); @@ -39,7 +44,7 @@ class SurveyAnswerTest { void 동등성_비교() { // given SurveyAnswer surveyAnswer1 = 설문_답변_id있음(); - SurveyAnswer surveyAnswer2 = SurveyAnswer.from("답변 1"); + SurveyAnswer surveyAnswer2 = SurveyAnswer.of(1, "답변 1"); // when boolean equals = surveyAnswer1.equals(surveyAnswer2); diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 70e5a385..1d44bb60 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -1,5 +1,6 @@ package com.atwoz.survey.domain.survey; +import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.domain.survey.dto.SurveyQuestionComparisonRequest; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; @@ -24,20 +25,24 @@ class SurveyQuestionTest { void 연애고사_질문_생성() { // given String description = "질문"; - List answers = List.of("답변1", "답변2", "답변3"); - List surveyAnswers = List.of( - SurveyAnswer.from("답변1"), - SurveyAnswer.from("답변2"), - SurveyAnswer.from("답변3") + List surveyAnswers = List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2"), + SurveyAnswerCreateRequest.of(3, "답변3") + ); + List answers = List.of( + SurveyAnswer.of(1, "답변1"), + SurveyAnswer.of(2, "답변2"), + SurveyAnswer.of(3, "답변3") ); // when - SurveyQuestion surveyQuestion = SurveyQuestion.of(description, answers); + SurveyQuestion surveyQuestion = SurveyQuestion.of(description, surveyAnswers); // then assertSoftly(softly -> { softly.assertThat(surveyQuestion.getDescription()).isEqualTo(description); - softly.assertThat(surveyQuestion.getAnswers()).isEqualTo(surveyAnswers); + softly.assertThat(surveyQuestion.getAnswers()).isEqualTo(answers); }); } @@ -46,7 +51,7 @@ class SurveyQuestionTest { // given SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); List requests = List.of( - new SurveyQuestionComparisonRequest(1L, 1L) + new SurveyQuestionComparisonRequest(1L, 1) ); // when & then @@ -57,7 +62,9 @@ class SurveyQuestionTest { void 동등성_비교() { // given SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); - SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of("답변 1")); + SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of( + new SurveyAnswerCreateRequest(1, "답변 1")) + ); // when boolean isSame = surveyQuestion.equals(anotherSurveyQuestion); @@ -73,7 +80,11 @@ class 설문_질문_예외 { void 중복된_답변은_작성할_수_없다() { // given String description = "질문"; - List answers = List.of("답변1", "답변1", "답변3"); + List answers = List.of( + new SurveyAnswerCreateRequest(1, "답변 1"), + new SurveyAnswerCreateRequest(1, "답변 1"), + new SurveyAnswerCreateRequest(3, "답변 3") + ); // when & then assertThatThrownBy(() -> SurveyQuestion.of(description, answers)) @@ -85,8 +96,8 @@ class 설문_질문_예외 { // given SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); List requests = List.of( - new SurveyQuestionComparisonRequest(2L, 1L), - new SurveyQuestionComparisonRequest(3L, 1L) + new SurveyQuestionComparisonRequest(2L, 1), + new SurveyQuestionComparisonRequest(3L, 1) ); // when & then @@ -99,7 +110,7 @@ class 설문_질문_예외 { // given SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); List requests = List.of( - new SurveyQuestionComparisonRequest(1L, 5L) + new SurveyQuestionComparisonRequest(1L, 5) ); // when & then diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 5c7f0304..fb4cf19e 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -2,6 +2,7 @@ import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; @@ -31,8 +32,14 @@ class SurveyTest { // given SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); List questions = List.of( - SurveyQuestion.of("질문 내용1", List.of("답변1", "답변2")), - SurveyQuestion.of("질문 내용2", List.of("답변1", "답변2")) + SurveyQuestion.of("질문 내용1", List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2")) + ), + SurveyQuestion.of("질문 내용2", List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2")) + ) ); // when @@ -78,7 +85,7 @@ class SurveyTest { Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( - new SurveyQuestionSubmitRequest(1L, 1L) + new SurveyQuestionSubmitRequest(1L, 1) )) ); @@ -93,8 +100,14 @@ class 설문_생성_예외 { void 설문_질문이_중복되면_안_된다() { // given SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( - new SurveyQuestionCreateRequest("질문1", List.of("답1", "답2")), - new SurveyQuestionCreateRequest("질문1", List.of("답1", "답2")) + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(1, "답1"), + SurveyAnswerCreateRequest.of(2, "답2") + )), + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(1, "답1"), + SurveyAnswerCreateRequest.of(2, "답2") + )) )); // when & then @@ -104,9 +117,11 @@ class 설문_생성_예외 { @Test void 설문_답변이_중복되면_안_된다() { - // given SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( - new SurveyQuestionCreateRequest("질문1", List.of("답1", "답1")) + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(1, "답1"), + SurveyAnswerCreateRequest.of(1, "답1") + )) )); // when & then @@ -120,8 +135,8 @@ class 설문_생성_예외 { Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( - new SurveyQuestionSubmitRequest(1L, 1L), - new SurveyQuestionSubmitRequest(2L, 1L) + new SurveyQuestionSubmitRequest(1L, 1), + new SurveyQuestionSubmitRequest(2L, 1) )) ); @@ -136,7 +151,7 @@ class 설문_생성_예외 { Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( - new SurveyQuestionSubmitRequest(1L, 5L) + new SurveyQuestionSubmitRequest(1L, 5) )) ); diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java index e1454566..596d70ce 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java @@ -7,6 +7,7 @@ public class SurveyAnswerFixture { public static SurveyAnswer 설문_답변_id있음() { return SurveyAnswer.builder() .id(1L) + .number(1) .description("답변 1") .build(); } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index e38d9d1b..bcddf7a2 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -1,5 +1,6 @@ package com.atwoz.survey.fixture; +import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; @@ -9,8 +10,14 @@ public class SurveyCreateRequestFixture { public static SurveyCreateRequest 설문_필수_질문_과목_두개씩_생성_요청() { return new SurveyCreateRequest("설문 제목", true, List.of( - new SurveyQuestionCreateRequest("질문 내용1", List.of("답변1", "답변2")), - new SurveyQuestionCreateRequest("질문 내용2", List.of("답변1", "답변2")) + new SurveyQuestionCreateRequest("질문 내용1", List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2") + )), + new SurveyQuestionCreateRequest("질문 내용2", List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2") + )) )); } } diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index 575bc47c..ecd9b70b 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -57,7 +57,9 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { fieldWithPath("required").description("필수 여부"), fieldWithPath("questions").description("질문 목록"), fieldWithPath("questions[].description").description("질문 내용"), - fieldWithPath("questions[].answers").description("질문 내용 답변들") + fieldWithPath("questions[].answers").description("답변 목록"), + fieldWithPath("questions[].answers[].number").description("답변 번호"), + fieldWithPath("questions[].answers[].answer").description("답변 내용") ), responseHeaders( headerWithName("location").description("생성된 설문 과목 경로") From 06cf507cfc27575e06cca0cc4f38fa4a9d800675 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 6 May 2024 16:48:55 +0900 Subject: [PATCH 23/65] =?UTF-8?q?refactor:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyService 필요없는 메서드 삭제 --- .../survey/application/survey/SurveyService.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java index 854636c3..9121f5a6 100644 --- a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java @@ -1,11 +1,9 @@ package com.atwoz.survey.application.survey; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.domain.survey.SurveyRepository; import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; -import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,13 +27,4 @@ private void validateIsAlreadyUsedName(final String name) { throw new SurveyNameAlreadyExistException(); } } - - public void submitSurvey(final Long memberId, final Long surveyId, final SurveySubmitRequest request) { - - } - - private Survey findSurveyById(final Long surveyId) { - return surveyRepository.findById(surveyId) - .orElseThrow(SurveyNotFoundException::new); - } } From 57b6e1195a38459b923b097afff877cf79e39116 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 10:32:33 +0900 Subject: [PATCH 24/65] =?UTF-8?q?refactor:=20Survey=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - questionRequests 매개변수명 통일 - 함수 위치 수정 --- .../com/atwoz/survey/domain/survey/Survey.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index 274fe5b8..75ec26b8 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -59,8 +59,8 @@ public static Survey createWith(final SurveyCreateRequest request) { return survey; } - private static void validateQuestionsIsNotDuplicated(final List requests) { - List questions = requests.stream() + private static void validateQuestionsIsNotDuplicated(final List questionRequests) { + List questions = questionRequests.stream() .map(SurveyQuestionCreateRequest::description) .toList(); @@ -77,6 +77,13 @@ private void addSurveyQuestions(final List question this.questions.addAll(questions); } + public void validateIsAllContainsSubmitQuestions(final SurveyComparisonRequest request) { + if (request.questions().size() != questions.size()) { + throw new SurveyQuestionSubmitSizeNotMatchException(); + } + questions.forEach(question -> question.validateIsValidSubmitAnswer(request.questions())); + } + public void updateName(final String name) { this.name = name; } @@ -92,11 +99,4 @@ public boolean isSameName(final String name) { public boolean isRequired() { return required; } - - public void validateIsAllContainsSubmitQuestions(final SurveyComparisonRequest request) { - if (request.questions().size() != questions.size()) { - throw new SurveyQuestionSubmitSizeNotMatchException(); - } - questions.forEach(question -> question.validateIsValidSubmitAnswer(request.questions())); - } } From 19a05d2c65a2bfbf2fe0c286b94f142299524d8e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 10:43:36 +0900 Subject: [PATCH 25/65] =?UTF-8?q?refactor:=20SurveyQuestion=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - surveyAnswers 변환 위치 수정 --- .../atwoz/survey/domain/survey/SurveyQuestion.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index c309b125..b882570d 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -52,10 +52,7 @@ public static SurveyQuestion of(final String description, final List surveyAnswers = answers.stream() - .map(answer -> SurveyAnswer.of(answer.number(), answer.answer())) - .toList(); - surveyQuestion.addSurveyAnswers(surveyAnswers); + surveyQuestion.addSurveyAnswers(answers); return surveyQuestion; } @@ -70,8 +67,11 @@ private static void validateAnswersIsNotDuplicated(final List answers) { - this.answers.addAll(answers); + private void addSurveyAnswers(final List answers) { + List surveyAnswers = answers.stream() + .map(answer -> SurveyAnswer.of(answer.number(), answer.answer())) + .toList(); + this.answers.addAll(surveyAnswers); } public void validateIsValidSubmitAnswer(final List requests) { From bc4ad88c2b65a06493d18f6bca1a956d639b984e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:09:20 +0900 Subject: [PATCH 26/65] =?UTF-8?q?refactor:=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=EB=8B=B5=EB=B3=80=20=EC=83=9D=EC=84=B1=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 설문 답변 생성 시 번호나 답변 문자열에 대해 모두 중복성 검사되도록 추가 - 관련 테스트 추가 작성 --- .../survey/domain/survey/SurveyQuestion.java | 19 +++++++++++++++-- .../survey/domain/survey/SurveyTest.java | 21 +++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index b882570d..86780bf8 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -49,7 +49,7 @@ private SurveyQuestion(final String description) { } public static SurveyQuestion of(final String description, final List answers) { - validateAnswersIsNotDuplicated(answers); + validateAnswersAreNotDuplicated(answers); SurveyQuestion surveyQuestion = new SurveyQuestion(description); surveyQuestion.addSurveyAnswers(answers); @@ -57,7 +57,12 @@ public static SurveyQuestion of(final String description, final List answers) { + private static void validateAnswersAreNotDuplicated(final List answers) { + validateAnswerNumbersAreNotDuplicated(answers); + validateAnswerDescriptionsAreNotDuplicated(answers); + } + + private static void validateAnswerNumbersAreNotDuplicated(final List answers) { List answerNumbers = answers.stream() .map(SurveyAnswerCreateRequest::number) .toList(); @@ -67,6 +72,16 @@ private static void validateAnswersIsNotDuplicated(final List answers) { + List answerDescriptions = answers.stream() + .map(SurveyAnswerCreateRequest::answer) + .toList(); + Set answersSet = new HashSet<>(answerDescriptions); + if (answersSet.size() != answers.size()) { + throw new SurveyAnswerDuplicatedException(); + } + } + private void addSurveyAnswers(final List answers) { List surveyAnswers = answers.stream() .map(answer -> SurveyAnswer.of(answer.number(), answer.answer())) diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index fb4cf19e..6ddc3584 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -14,8 +14,12 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.util.List; +import java.util.stream.Stream; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyFixture.설문_필수_질문_과목_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; @@ -115,12 +119,13 @@ class 설문_생성_예외 { .isInstanceOf(SurveyQuestionDuplicatedException.class); } - @Test - void 설문_답변이_중복되면_안_된다() { + @MethodSource(value = "invalidSurveyAnswerRequests") + @ParameterizedTest + void 설문_답변_번호나_답변이_중복되면_안_된다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( new SurveyQuestionCreateRequest("질문1", List.of( - SurveyAnswerCreateRequest.of(1, "답1"), - SurveyAnswerCreateRequest.of(1, "답1") + SurveyAnswerCreateRequest.of(answerNumber1, answer1), + SurveyAnswerCreateRequest.of(answerNumber2, answer2) )) )); @@ -129,6 +134,14 @@ class 설문_생성_예외 { .isInstanceOf(SurveyAnswerDuplicatedException.class); } + static Stream invalidSurveyAnswerRequests() { + return Stream.of( + Arguments.arguments(1, "답1", 1, "답2"), + Arguments.arguments(1, "답1", 2, "답1"), + Arguments.arguments(1, "답1", 1, "답1") + ); + } + @Test void 설문_응시_질문_id_갯수가_다르면_예외가_발생한다() { // given From 8690a98d7d1f2f4a2bae982733edeea4c2ac0f1d Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:21:29 +0900 Subject: [PATCH 27/65] =?UTF-8?q?refactor:=20Survey=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - validateIsValidSubmitSurveyRequest 함수명 수정 - SurveyTest 예외 클래스명 수정 - 설문 응시 질문이 유효하지 않을 경우의 예외 테스트 추가 --- .../membersurvey/MemberSurveyService.java | 2 +- .../atwoz/survey/domain/survey/Survey.java | 2 +- .../survey/domain/survey/SurveyTest.java | 24 +++++++++++++++---- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java index e68054c4..0fd4f1c9 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java @@ -56,7 +56,7 @@ private void validateIsNotDuplicateSurveyIds(final List surveyIds) { private void submitEachSurvey(final Long memberId, final SurveySubmitRequest request) { Survey survey = findSurveyById(request.surveyId()); - survey.validateIsAllContainsSubmitQuestions(SurveyComparisonRequest.from(request)); + survey.validateIsValidSubmitSurveyRequest(SurveyComparisonRequest.from(request)); survey.getQuestions() .forEach(question -> saveQuestionAnswer(memberId, request, question)); diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index 75ec26b8..021c5665 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -77,7 +77,7 @@ private void addSurveyQuestions(final List question this.questions.addAll(questions); } - public void validateIsAllContainsSubmitQuestions(final SurveyComparisonRequest request) { + public void validateIsValidSubmitSurveyRequest(final SurveyComparisonRequest request) { if (request.questions().size() != questions.size()) { throw new SurveyQuestionSubmitSizeNotMatchException(); } diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 6ddc3584..04000171 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -7,6 +7,7 @@ import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; @@ -94,11 +95,11 @@ class SurveyTest { ); // when & then - assertDoesNotThrow(() -> survey.validateIsAllContainsSubmitQuestions(request)); + assertDoesNotThrow(() -> survey.validateIsValidSubmitSurveyRequest(request)); } @Nested - class 설문_생성_예외 { + class 설문_예외 { @Test void 설문_질문이_중복되면_안_된다() { @@ -154,10 +155,25 @@ static Stream invalidSurveyAnswerRequests() { ); // when & then - assertThatThrownBy(() -> survey.validateIsAllContainsSubmitQuestions(request)) + assertThatThrownBy(() -> survey.validateIsValidSubmitSurveyRequest(request)) .isInstanceOf(SurveyQuestionSubmitSizeNotMatchException.class); } + @Test + void 설문_응시_질문_id가_없으면_예외가_발생한다() { + // given + Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + SurveyComparisonRequest request = SurveyComparisonRequest.from( + new SurveySubmitRequest(1L, List.of( + new SurveyQuestionSubmitRequest(5L, 1) + )) + ); + + // when & then + assertThatThrownBy(() -> survey.validateIsValidSubmitSurveyRequest(request)) + .isInstanceOf(SurveyQuestionNotSubmittedException.class); + } + @Test void 설문에_있는_질문의_답변이_아닌_답변을_내면_예외가_발생한다() { // given @@ -169,7 +185,7 @@ static Stream invalidSurveyAnswerRequests() { ); // when & then - assertThatThrownBy(() -> survey.validateIsAllContainsSubmitQuestions(request)) + assertThatThrownBy(() -> survey.validateIsValidSubmitSurveyRequest(request)) .isInstanceOf(SurveyAnswerInvalidSubmitException.class); } } From 13d3d5a892e1384190b0f929c5d6c3be0b8c7b1f Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:38:56 +0900 Subject: [PATCH 28/65] =?UTF-8?q?test:=20SurveyTest=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 설문 응시 질문 id 갯수 및 중복 예외 추가 --- .../atwoz/survey/domain/survey/SurveyTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 04000171..14a95bad 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -143,14 +143,15 @@ static Stream invalidSurveyAnswerRequests() { ); } - @Test - void 설문_응시_질문_id_갯수가_다르면_예외가_발생한다() { + @MethodSource(value = "invalidSurveyQuestionRequests") + @ParameterizedTest + void 설문_응시_질문_id_갯수가_다르거나_id가_중복되면_예외가_발생한다(final Long questionId1, final Long questionId2) { // given Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( - new SurveyQuestionSubmitRequest(1L, 1), - new SurveyQuestionSubmitRequest(2L, 1) + new SurveyQuestionSubmitRequest(questionId1, 1), + new SurveyQuestionSubmitRequest(questionId2, 1) )) ); @@ -159,6 +160,13 @@ static Stream invalidSurveyAnswerRequests() { .isInstanceOf(SurveyQuestionSubmitSizeNotMatchException.class); } + static Stream invalidSurveyQuestionRequests() { + return Stream.of( + Arguments.arguments(1L, 1L), + Arguments.arguments(1L, 2L) + ); + } + @Test void 설문_응시_질문_id가_없으면_예외가_발생한다() { // given From 55d28b530bf720b874b21fa78ee46819de99671e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:39:27 +0900 Subject: [PATCH 29/65] =?UTF-8?q?test:=20SurveyQuestionTest=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 답변 중복 예외 검사 추가 (번호, 내용 모두 적용되도록 수정) --- .../domain/survey/SurveyQuestionTest.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 1d44bb60..4a5adb32 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -9,8 +9,12 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.util.List; +import java.util.stream.Stream; import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개_id있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -76,13 +80,14 @@ class SurveyQuestionTest { @Nested class 설문_질문_예외 { - @Test - void 중복된_답변은_작성할_수_없다() { + @MethodSource(value = "invalidSurveyAnswerRequests") + @ParameterizedTest + void 번호나_내용이_같은_답변은_생성할_수_없다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { // given String description = "질문"; List answers = List.of( - new SurveyAnswerCreateRequest(1, "답변 1"), - new SurveyAnswerCreateRequest(1, "답변 1"), + new SurveyAnswerCreateRequest(answerNumber1, answer1), + new SurveyAnswerCreateRequest(answerNumber2, answer2), new SurveyAnswerCreateRequest(3, "답변 3") ); @@ -91,6 +96,14 @@ class 설문_질문_예외 { .isInstanceOf(SurveyAnswerDuplicatedException.class); } + static Stream invalidSurveyAnswerRequests() { + return Stream.of( + Arguments.arguments(1, "답1", 1, "답2"), + Arguments.arguments(1, "답1", 2, "답1"), + Arguments.arguments(1, "답1", 1, "답1") + ); + } + @Test void 연애고사_질문을_응시할_때는_관련_질문이_있어야_한다() { // given From 0209e4db02eca87958c8e6a72222737e57892dfe Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:49:37 +0900 Subject: [PATCH 30/65] =?UTF-8?q?test:=20SurveyAnswer=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyAnswer 번호 유효성 검증 추가 - Survey, SurveyQuestion에서의 테스트 추가 --- .../atwoz/survey/domain/survey/SurveyAnswer.java | 10 ++++++++++ .../SurveyAnswerNumberRangeException.java | 8 ++++++++ .../survey/domain/survey/SurveyAnswerTest.java | 13 +++++++++++++ .../survey/domain/survey/SurveyQuestionTest.java | 14 ++++++++++++++ .../atwoz/survey/domain/survey/SurveyTest.java | 16 ++++++++++++++++ 5 files changed, 61 insertions(+) create mode 100644 src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerNumberRangeException.java diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java index 106702d0..28fc9c49 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyAnswer.java @@ -1,5 +1,6 @@ package com.atwoz.survey.domain.survey; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -20,6 +21,8 @@ @Entity public class SurveyAnswer { + private static final int MINIMUM_ANSWER_NUMBER = 1; + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -36,9 +39,16 @@ private SurveyAnswer(final Integer number, final String description) { } public static SurveyAnswer of(final Integer number, final String description) { + validateNumberRange(number); return new SurveyAnswer(number, description); } + private static void validateNumberRange(final int number) { + if (number < MINIMUM_ANSWER_NUMBER) { + throw new SurveyAnswerNumberRangeException(); + } + } + public boolean isSame(final Integer number) { return number.equals(this.number); } diff --git a/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerNumberRangeException.java b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerNumberRangeException.java new file mode 100644 index 00000000..2f9e7406 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/survey/exceptions/SurveyAnswerNumberRangeException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.survey.exceptions; + +public class SurveyAnswerNumberRangeException extends RuntimeException { + + public SurveyAnswerNumberRangeException() { + super("설문 답변 번호는 자연수여야 합니다."); + } +} diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java index d0bc6089..b2c67348 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java @@ -1,11 +1,13 @@ package com.atwoz.survey.domain.survey; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; import static com.atwoz.survey.fixture.SurveyAnswerFixture.설문_답변_id있음; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -52,4 +54,15 @@ class SurveyAnswerTest { // then assertThat(equals).isTrue(); } + + @Test + void 답변_번호는_자연수여야_한다() { + // given + int number = -1; + String answer = "답변 1"; + + // when & then + assertThatThrownBy(() -> SurveyAnswer.of(number, answer)) + .isInstanceOf(SurveyAnswerNumberRangeException.class); + } } diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 4a5adb32..9956f53b 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -5,6 +5,7 @@ import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Nested; @@ -104,6 +105,19 @@ static Stream invalidSurveyAnswerRequests() { ); } + @Test + void 답변_번호가_자연수가_아니면_예외가_발생한다() { + // given + String description = "질문"; + List answers = List.of( + new SurveyAnswerCreateRequest(-1, "답변 1") + ); + + // when & then + assertThatThrownBy(() -> SurveyQuestion.of(description, answers)) + .isInstanceOf(SurveyAnswerNumberRangeException.class); + } + @Test void 연애고사_질문을_응시할_때는_관련_질문이_있어야_한다() { // given diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 14a95bad..08ff2e39 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -10,6 +10,7 @@ import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; @@ -123,6 +124,7 @@ class 설문_예외 { @MethodSource(value = "invalidSurveyAnswerRequests") @ParameterizedTest void 설문_답변_번호나_답변이_중복되면_안_된다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { + // given SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( new SurveyQuestionCreateRequest("질문1", List.of( SurveyAnswerCreateRequest.of(answerNumber1, answer1), @@ -143,6 +145,20 @@ static Stream invalidSurveyAnswerRequests() { ); } + @Test + void 설문_답변_번호는_자연수여야_한다() { + // given + SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(-1, "답변 1") + )) + )); + + // when & then + assertThatThrownBy(() -> Survey.createWith(request)) + .isInstanceOf(SurveyAnswerNumberRangeException.class); + } + @MethodSource(value = "invalidSurveyQuestionRequests") @ParameterizedTest void 설문_응시_질문_id_갯수가_다르거나_id가_중복되면_예외가_발생한다(final Long questionId1, final Long questionId2) { From e584e6ab4bdfd42380b1673167bf13043a1c7535 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:51:23 +0900 Subject: [PATCH 31/65] =?UTF-8?q?refactor:=20Survey=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - createWith에서 from으로 메서드명 수정 --- .../survey/application/survey/SurveyService.java | 2 +- .../java/com/atwoz/survey/domain/survey/Survey.java | 2 +- .../com/atwoz/survey/domain/survey/SurveyTest.java | 12 ++++++------ .../java/com/atwoz/survey/fixture/SurveyFixture.java | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java index 9121f5a6..06b34b02 100644 --- a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java @@ -18,7 +18,7 @@ public class SurveyService { public Long addSurvey(final SurveyCreateRequest request) { validateIsAlreadyUsedName(request.name()); - Survey survey = surveyRepository.save(Survey.createWith(request)); + Survey survey = surveyRepository.save(Survey.from(request)); return survey.getId(); } diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index 021c5665..d48e0037 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -50,7 +50,7 @@ private Survey(final String name, final Boolean required) { this.required = required; } - public static Survey createWith(final SurveyCreateRequest request) { + public static Survey from(final SurveyCreateRequest request) { validateQuestionsIsNotDuplicated(request.questions()); Survey survey = new Survey(request.name(), request.required()); diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 08ff2e39..8e0c6c62 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -49,7 +49,7 @@ class SurveyTest { ); // when - Survey survey = Survey.createWith(request); + Survey survey = Survey.from(request); // then assertSoftly(softly -> { @@ -63,7 +63,7 @@ class SurveyTest { void 과목_이름_수정() { // given SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); - Survey survey = Survey.createWith(request); + Survey survey = Survey.from(request); // when survey.updateName("설문 제목 수정"); @@ -76,7 +76,7 @@ class SurveyTest { void 과목_필수_여부_수정() { // given SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); - Survey survey = Survey.createWith(request); + Survey survey = Survey.from(request); // when survey.updateRequired(false); @@ -117,7 +117,7 @@ class 설문_예외 { )); // when & then - assertThatThrownBy(() -> Survey.createWith(request)) + assertThatThrownBy(() -> Survey.from(request)) .isInstanceOf(SurveyQuestionDuplicatedException.class); } @@ -133,7 +133,7 @@ class 설문_예외 { )); // when & then - assertThatThrownBy(() -> Survey.createWith(request)) + assertThatThrownBy(() -> Survey.from(request)) .isInstanceOf(SurveyAnswerDuplicatedException.class); } @@ -155,7 +155,7 @@ static Stream invalidSurveyAnswerRequests() { )); // when & then - assertThatThrownBy(() -> Survey.createWith(request)) + assertThatThrownBy(() -> Survey.from(request)) .isInstanceOf(SurveyAnswerNumberRangeException.class); } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 887fd4df..7f9aece2 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -9,7 +9,7 @@ public class SurveyFixture { public static Survey 설문_필수_질문_과목_두개씩() { - return Survey.createWith(설문_필수_질문_과목_두개씩_생성_요청()); + return Survey.from(설문_필수_질문_과목_두개씩_생성_요청()); } public static Survey 설문_필수_질문_과목_한개씩_전부_id_있음() { From 2153d8b31d57317a29d7c11d6b9f5a9408754b03 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 11:57:41 +0900 Subject: [PATCH 32/65] =?UTF-8?q?refactor:=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=EB=8C=80=EC=8B=A0=20=EC=97=B0=EC=95=A0=EA=B3=A0=EC=82=AC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 설문 대신 연애고사로 통일 표현되도록 수정 --- .../application/survey/SurveyServiceTest.java | 12 +++--- .../domain/membersurvey/MemberSurveyTest.java | 2 +- .../domain/survey/SurveyAnswerTest.java | 10 ++--- .../domain/survey/SurveyQuestionTest.java | 12 +++--- .../survey/domain/survey/SurveyTest.java | 40 +++++++++---------- .../survey/fixture/SurveyAnswerFixture.java | 2 +- .../fixture/SurveyCreateRequestFixture.java | 4 +- .../atwoz/survey/fixture/SurveyFixture.java | 12 +++--- .../survey/fixture/SurveyQuestionFixture.java | 6 +-- .../survey/SurveyJpaRepositoryTest.java | 7 ++-- .../ui/survey/SurveyControllerWebMvcTest.java | 12 +++--- 11 files changed, 59 insertions(+), 60 deletions(-) diff --git a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index 50bf4b7b..5f528ea9 100644 --- a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -27,9 +27,9 @@ void init() { } @Test - void 설문_등록() { + void 연애고사_과목_등록() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); // when Long id = surveyService.addSurvey(request); @@ -39,10 +39,10 @@ void init() { } @Test - void 같은_이름의_설문을_등록할_수_없다() { + void 같은_이름의_과목을_등록할_수_없다() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); - SurveyCreateRequest request2 = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request2 = 연애고사_필수_질문_과목_두개씩_생성_요청(); surveyService.addSurvey(request); // when & then diff --git a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java index 268b9ddb..6a9ab33b 100644 --- a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java @@ -11,7 +11,7 @@ class MemberSurveyTest { @Test - void 회원_설문_생성() { + void 회원_연애고사_생성() { // given Long memberId = 1L; Long questionId = 1L; diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java index b2c67348..fc605d7b 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyAnswerTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; -import static com.atwoz.survey.fixture.SurveyAnswerFixture.설문_답변_id있음; +import static com.atwoz.survey.fixture.SurveyAnswerFixture.연애고사_답변_id있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -15,7 +15,7 @@ class SurveyAnswerTest { @Test - void 설문_답변_생성() { + void 연애고사_답변_생성() { // given Integer number = 1; String description = "답변"; @@ -31,9 +31,9 @@ class SurveyAnswerTest { } @Test - void 설문_답변_id_비교() { + void 연애고사_답변_id_비교() { // given - SurveyAnswer surveyAnswer = 설문_답변_id있음(); + SurveyAnswer surveyAnswer = 연애고사_답변_id있음(); // when boolean isSame = surveyAnswer.isSame(1); @@ -45,7 +45,7 @@ class SurveyAnswerTest { @Test void 동등성_비교() { // given - SurveyAnswer surveyAnswer1 = 설문_답변_id있음(); + SurveyAnswer surveyAnswer1 = 연애고사_답변_id있음(); SurveyAnswer surveyAnswer2 = SurveyAnswer.of(1, "답변 1"); // when diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 9956f53b..9165101c 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.stream.Stream; -import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개_id있음; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -54,7 +54,7 @@ class SurveyQuestionTest { @Test void 연애고사_질문_응시() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); List requests = List.of( new SurveyQuestionComparisonRequest(1L, 1) ); @@ -66,7 +66,7 @@ class SurveyQuestionTest { @Test void 동등성_비교() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of( new SurveyAnswerCreateRequest(1, "답변 1")) ); @@ -79,7 +79,7 @@ class SurveyQuestionTest { } @Nested - class 설문_질문_예외 { + class 연애고사_질문_예외 { @MethodSource(value = "invalidSurveyAnswerRequests") @ParameterizedTest @@ -121,7 +121,7 @@ static Stream invalidSurveyAnswerRequests() { @Test void 연애고사_질문을_응시할_때는_관련_질문이_있어야_한다() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); List requests = List.of( new SurveyQuestionComparisonRequest(2L, 1), new SurveyQuestionComparisonRequest(3L, 1) @@ -135,7 +135,7 @@ static Stream invalidSurveyAnswerRequests() { @Test void 연애고사_질문을_응시할_때는_있는_답변으로만_작성해야_한다() { // given - SurveyQuestion surveyQuestion = 설문_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); List requests = List.of( new SurveyQuestionComparisonRequest(1L, 5) ); diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 8e0c6c62..f54eae7f 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.stream.Stream; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; -import static com.atwoz.survey.fixture.SurveyFixture.설문_필수_질문_과목_한개씩_전부_id_있음; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -34,9 +34,9 @@ class SurveyTest { @Test - void 설문_과목_정상_생성() { + void 연애고사_과목_정상_생성() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); List questions = List.of( SurveyQuestion.of("질문 내용1", List.of( SurveyAnswerCreateRequest.of(1, "답변1"), @@ -53,16 +53,16 @@ class SurveyTest { // then assertSoftly(softly -> { - softly.assertThat(survey.isSameName("설문 제목")).isTrue(); + softly.assertThat(survey.isSameName("과목 제목")).isTrue(); softly.assertThat(survey.isRequired()).isTrue(); softly.assertThat(survey.getQuestions()).isEqualTo(questions); }); } @Test - void 과목_이름_수정() { + void 연애고사_과목_이름_수정() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); Survey survey = Survey.from(request); // when @@ -73,9 +73,9 @@ class SurveyTest { } @Test - void 과목_필수_여부_수정() { + void 연애고사_과목_필수_여부_수정() { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); Survey survey = Survey.from(request); // when @@ -88,7 +88,7 @@ class SurveyTest { @Test void 설문_응시_조건_검사_통과() { // given - Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(1L, 1) @@ -100,10 +100,10 @@ class SurveyTest { } @Nested - class 설문_예외 { + class 연애고사_예외 { @Test - void 설문_질문이_중복되면_안_된다() { + void 연애고사_질문이_중복되면_안_된다() { // given SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( new SurveyQuestionCreateRequest("질문1", List.of( @@ -123,7 +123,7 @@ class 설문_예외 { @MethodSource(value = "invalidSurveyAnswerRequests") @ParameterizedTest - void 설문_답변_번호나_답변이_중복되면_안_된다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { + void 연애고사_답변_번호나_답변이_중복되면_안_된다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { // given SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( new SurveyQuestionCreateRequest("질문1", List.of( @@ -146,7 +146,7 @@ static Stream invalidSurveyAnswerRequests() { } @Test - void 설문_답변_번호는_자연수여야_한다() { + void 연애고사_답변_번호는_자연수여야_한다() { // given SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( new SurveyQuestionCreateRequest("질문1", List.of( @@ -161,9 +161,9 @@ static Stream invalidSurveyAnswerRequests() { @MethodSource(value = "invalidSurveyQuestionRequests") @ParameterizedTest - void 설문_응시_질문_id_갯수가_다르거나_id가_중복되면_예외가_발생한다(final Long questionId1, final Long questionId2) { + void 연애고사_응시_질문_id_갯수가_다르거나_id가_중복되면_예외가_발생한다(final Long questionId1, final Long questionId2) { // given - Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(questionId1, 1), @@ -184,9 +184,9 @@ static Stream invalidSurveyQuestionRequests() { } @Test - void 설문_응시_질문_id가_없으면_예외가_발생한다() { + void 연애고사_응시_질문_id가_없으면_예외가_발생한다() { // given - Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(5L, 1) @@ -199,9 +199,9 @@ static Stream invalidSurveyQuestionRequests() { } @Test - void 설문에_있는_질문의_답변이_아닌_답변을_내면_예외가_발생한다() { + void 연애고사에_있는_질문의_답변이_아닌_답변을_내면_예외가_발생한다() { // given - Survey survey = 설문_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(1L, 5) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java index 596d70ce..4863ac44 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java @@ -4,7 +4,7 @@ public class SurveyAnswerFixture { - public static SurveyAnswer 설문_답변_id있음() { + public static SurveyAnswer 연애고사_답변_id있음() { return SurveyAnswer.builder() .id(1L) .number(1) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index bcddf7a2..82aac7ea 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -8,8 +8,8 @@ public class SurveyCreateRequestFixture { - public static SurveyCreateRequest 설문_필수_질문_과목_두개씩_생성_요청() { - return new SurveyCreateRequest("설문 제목", true, List.of( + public static SurveyCreateRequest 연애고사_필수_질문_과목_두개씩_생성_요청() { + return new SurveyCreateRequest("과목 제목", true, List.of( new SurveyQuestionCreateRequest("질문 내용1", List.of( SurveyAnswerCreateRequest.of(1, "답변1"), SurveyAnswerCreateRequest.of(2, "답변2") diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 7f9aece2..ef04f434 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -3,21 +3,21 @@ import com.atwoz.survey.domain.survey.Survey; import java.util.List; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; -import static com.atwoz.survey.fixture.SurveyQuestionFixture.설문_질문_답변_한개_id있음; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id있음; public class SurveyFixture { - public static Survey 설문_필수_질문_과목_두개씩() { - return Survey.from(설문_필수_질문_과목_두개씩_생성_요청()); + public static Survey 연애고사_필수_질문_과목_두개씩() { + return Survey.from(연애고사_필수_질문_과목_두개씩_생성_요청()); } - public static Survey 설문_필수_질문_과목_한개씩_전부_id_있음() { + public static Survey 연애고사_필수_질문_과목_한개씩_전부_id_있음() { return Survey.builder() .id(1L) .required(true) .name("과목 1") - .questions(List.of(설문_질문_답변_한개_id있음())) + .questions(List.of(연애고사_질문_답변_한개_id있음())) .build(); } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java index 1e783543..7b84cf05 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java @@ -3,15 +3,15 @@ import com.atwoz.survey.domain.survey.SurveyQuestion; import java.util.List; -import static com.atwoz.survey.fixture.SurveyAnswerFixture.설문_답변_id있음; +import static com.atwoz.survey.fixture.SurveyAnswerFixture.연애고사_답변_id있음; public class SurveyQuestionFixture { - public static SurveyQuestion 설문_질문_답변_한개_id있음() { + public static SurveyQuestion 연애고사_질문_답변_한개_id있음() { return SurveyQuestion.builder() .id(1L) .description("질문 1") - .answers(List.of(설문_답변_id있음())) + .answers(List.of(연애고사_답변_id있음())) .build(); } } diff --git a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java index f0a2f519..3f2748e4 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java @@ -1,14 +1,13 @@ package com.atwoz.survey.infrastructure.survey; import com.atwoz.survey.domain.survey.Survey; -import com.atwoz.survey.fixture.SurveyFixture; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import static com.atwoz.survey.fixture.SurveyFixture.설문_필수_질문_과목_두개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_두개씩; import static org.assertj.core.api.Assertions.assertThat; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -20,9 +19,9 @@ public class SurveyJpaRepositoryTest { private SurveyJpaRepository surveyJpaRepository; @Test - void 설문_과목_등록() { + void 연애고사_과목_등록() { // given - Survey survey = 설문_필수_질문_과목_두개씩(); + Survey survey = 연애고사_필수_질문_과목_두개씩(); // when Survey saveSurvey = surveyJpaRepository.save(survey); diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index ecd9b70b..dcb6f417 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -14,7 +14,7 @@ import org.springframework.test.web.servlet.MockMvc; import static com.atwoz.helper.RestDocsHelper.customDocument; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.설문_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; import static org.mockito.Mockito.when; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; @@ -39,9 +39,9 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { private SurveyService surveyService; @Test - void 설문_과목을_생성한다() throws Exception { + void 연애고사_과목을_생성한다() throws Exception { // given - SurveyCreateRequest request = 설문_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); when(surveyService.addSurvey(request)).thenReturn(1L); // when @@ -51,9 +51,9 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { .content(objectMapper.writeValueAsString(request))) .andExpect(status().isCreated()) .andDo(print()) - .andDo(customDocument("연애_모의고사_설문_생성", + .andDo(customDocument("연애_모의고사_과목_생성", requestFields( - fieldWithPath("name").description("설문 제목"), + fieldWithPath("name").description("과목 제목"), fieldWithPath("required").description("필수 여부"), fieldWithPath("questions").description("질문 목록"), fieldWithPath("questions[].description").description("질문 내용"), @@ -62,7 +62,7 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { fieldWithPath("questions[].answers[].answer").description("답변 내용") ), responseHeaders( - headerWithName("location").description("생성된 설문 과목 경로") + headerWithName("location").description("생성된 과목 경로") ) )); } From 3e20b4bdfec1b18938077ef37957543d10657ca9 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 12:06:54 +0900 Subject: [PATCH 33/65] =?UTF-8?q?test:=20SurveyJpaRepositoryTest=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyJpaRepository 테스트 추가 작성 --- .../fixture/SurveyCreateRequestFixture.java | 13 +++++ .../atwoz/survey/fixture/SurveyFixture.java | 5 ++ .../survey/SurveyJpaRepositoryTest.java | 52 +++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index 82aac7ea..c7139b4d 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -20,4 +20,17 @@ public class SurveyCreateRequestFixture { )) )); } + + public static SurveyCreateRequest 연애고사_선택_질문_과목_두개씩_생성_요청() { + return new SurveyCreateRequest("선택 과목 제목", false, List.of( + new SurveyQuestionCreateRequest("질문 내용1", List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2") + )), + new SurveyQuestionCreateRequest("질문 내용2", List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2") + )) + )); + } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index ef04f434..8b71b70f 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -3,6 +3,7 @@ import com.atwoz.survey.domain.survey.Survey; import java.util.List; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_질문_과목_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id있음; @@ -12,6 +13,10 @@ public class SurveyFixture { return Survey.from(연애고사_필수_질문_과목_두개씩_생성_요청()); } + public static Survey 연애고사_선택_질문_과목_두개씩() { + return Survey.from(연애고사_선택_질문_과목_두개씩_생성_요청()); + } + public static Survey 연애고사_필수_질문_과목_한개씩_전부_id_있음() { return Survey.builder() .id(1L) diff --git a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java index 3f2748e4..ed0c3f66 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java @@ -7,8 +7,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import java.util.List; +import java.util.Optional; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_질문_과목_두개씩; import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_두개씩; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @SuppressWarnings("NonAsciiCharacters") @@ -31,4 +35,52 @@ public class SurveyJpaRepositoryTest { .ignoringFields("id") .isEqualTo(survey); } + + @Test + void 연애고사_과목_존재여부_검사() { + // given + Survey survey = 연애고사_필수_질문_과목_두개씩(); + surveyJpaRepository.save(survey); + + // when + boolean find = surveyJpaRepository.existsByName(survey.getName()); + + // then + assertThat(find).isTrue(); + } + + @Test + void 연애고사_id로_과목_조회() { + // given + Survey survey = 연애고사_필수_질문_과목_두개씩(); + Survey savedSurvey = surveyJpaRepository.save(survey); + + // when + Optional searchSurvey = surveyJpaRepository.findById(savedSurvey.getId()); + + // then + assertSoftly(softly -> { + softly.assertThat(searchSurvey).isPresent(); + softly.assertThat(searchSurvey.get()).isEqualTo(savedSurvey); + }); + } + + @Test + void 필수_연애고사_조회() { + // given + Survey survey = 연애고사_필수_질문_과목_두개씩(); + Survey notRequiredSurvey = 연애고사_선택_질문_과목_두개씩(); + surveyJpaRepository.save(survey); + surveyJpaRepository.save(notRequiredSurvey); + + // when + List requiredSurveys = surveyJpaRepository.findAllRequiredSurveys(); + + // then + assertSoftly(softly -> { + softly.assertThat(requiredSurveys.size()).isEqualTo(1); + softly.assertThat(requiredSurveys.contains(survey)).isTrue(); + softly.assertThat(requiredSurveys.contains(notRequiredSurvey)).isFalse(); + }); + } } From 59b1735d8aa5533153eaa2c144c68c1c48b06947 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 14:20:28 +0900 Subject: [PATCH 34/65] =?UTF-8?q?refactor:=20SurveyCreateRequest=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20Fixture=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyCreateRequest 예외 Fixture 등록 - 기존 Fixture 이름 수정 --- .../application/survey/SurveyServiceTest.java | 51 +++++++++++++++---- .../survey/domain/survey/SurveyTest.java | 27 +++------- .../fixture/SurveyCreateRequestFixture.java | 25 ++++++++- .../atwoz/survey/fixture/SurveyFixture.java | 8 +-- .../ui/survey/SurveyControllerWebMvcTest.java | 4 +- 5 files changed, 77 insertions(+), 38 deletions(-) diff --git a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index 5f528ea9..a2f2ba9e 100644 --- a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -2,14 +2,19 @@ import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; +import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import com.atwoz.survey.infrastructure.survey.SurveyFakeRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -29,7 +34,7 @@ void init() { @Test void 연애고사_과목_등록() { // given - SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); // when Long id = surveyService.addSurvey(request); @@ -38,15 +43,39 @@ void init() { assertThat(id).isEqualTo(1L); } - @Test - void 같은_이름의_과목을_등록할_수_없다() { - // given - SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); - SurveyCreateRequest request2 = 연애고사_필수_질문_과목_두개씩_생성_요청(); - surveyService.addSurvey(request); + @Nested + class 연애고사_과목_등록_예외 { + + @Test + void 같은_이름의_과목을_등록할_수_없다() { + // given + SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); + SurveyCreateRequest request2 = 연애고사_필수_과목_질문_두개씩_생성_요청(); + surveyService.addSurvey(request); + + // when & then + assertThatThrownBy(() -> surveyService.addSurvey(request2)) + .isInstanceOf(SurveyNameAlreadyExistException.class); + } + + @Test + void 연애고사_질문이_중복되면_안된다() { + // given + SurveyCreateRequest request = 연애고사_필수_과목_질문_중복(); + + // when & then + assertThatThrownBy(() -> surveyService.addSurvey(request)) + .isInstanceOf(SurveyQuestionDuplicatedException.class); + } + + @Test + void 연애고사_과목_답변_번호는_자연수여야_한다() { + // given + SurveyCreateRequest request = 연애고사_필수_과목_질문_번호_음수(); - // when & then - assertThatThrownBy(() -> surveyService.addSurvey(request2)) - .isInstanceOf(SurveyNameAlreadyExistException.class); + // when & then + assertThatThrownBy(() -> surveyService.addSurvey(request)) + .isInstanceOf(SurveyAnswerNumberRangeException.class); + } } } diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index f54eae7f..9b9c173e 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -22,7 +22,9 @@ import java.util.List; import java.util.stream.Stream; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -36,7 +38,7 @@ class SurveyTest { @Test void 연애고사_과목_정상_생성() { // given - SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); List questions = List.of( SurveyQuestion.of("질문 내용1", List.of( SurveyAnswerCreateRequest.of(1, "답변1"), @@ -62,7 +64,7 @@ class SurveyTest { @Test void 연애고사_과목_이름_수정() { // given - SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); Survey survey = Survey.from(request); // when @@ -75,7 +77,7 @@ class SurveyTest { @Test void 연애고사_과목_필수_여부_수정() { // given - SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); Survey survey = Survey.from(request); // when @@ -105,16 +107,7 @@ class 연애고사_예외 { @Test void 연애고사_질문이_중복되면_안_된다() { // given - SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( - new SurveyQuestionCreateRequest("질문1", List.of( - SurveyAnswerCreateRequest.of(1, "답1"), - SurveyAnswerCreateRequest.of(2, "답2") - )), - new SurveyQuestionCreateRequest("질문1", List.of( - SurveyAnswerCreateRequest.of(1, "답1"), - SurveyAnswerCreateRequest.of(2, "답2") - )) - )); + SurveyCreateRequest request = 연애고사_필수_과목_질문_중복(); // when & then assertThatThrownBy(() -> Survey.from(request)) @@ -148,11 +141,7 @@ static Stream invalidSurveyAnswerRequests() { @Test void 연애고사_답변_번호는_자연수여야_한다() { // given - SurveyCreateRequest request = new SurveyCreateRequest("설문 제목", true, List.of( - new SurveyQuestionCreateRequest("질문1", List.of( - SurveyAnswerCreateRequest.of(-1, "답변 1") - )) - )); + SurveyCreateRequest request = 연애고사_필수_과목_질문_번호_음수(); // when & then assertThatThrownBy(() -> Survey.from(request)) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index c7139b4d..8fd0f098 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -8,7 +8,7 @@ public class SurveyCreateRequestFixture { - public static SurveyCreateRequest 연애고사_필수_질문_과목_두개씩_생성_요청() { + public static SurveyCreateRequest 연애고사_필수_과목_질문_두개씩_생성_요청() { return new SurveyCreateRequest("과목 제목", true, List.of( new SurveyQuestionCreateRequest("질문 내용1", List.of( SurveyAnswerCreateRequest.of(1, "답변1"), @@ -21,7 +21,7 @@ public class SurveyCreateRequestFixture { )); } - public static SurveyCreateRequest 연애고사_선택_질문_과목_두개씩_생성_요청() { + public static SurveyCreateRequest 연애고사_선택_과목_질문_두개씩_생성_요청() { return new SurveyCreateRequest("선택 과목 제목", false, List.of( new SurveyQuestionCreateRequest("질문 내용1", List.of( SurveyAnswerCreateRequest.of(1, "답변1"), @@ -33,4 +33,25 @@ public class SurveyCreateRequestFixture { )) )); } + + public static SurveyCreateRequest 연애고사_필수_과목_질문_중복() { + return new SurveyCreateRequest("설문 제목", true, List.of( + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(1, "답1"), + SurveyAnswerCreateRequest.of(2, "답2") + )), + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(1, "답1"), + SurveyAnswerCreateRequest.of(2, "답2") + )) + )); + } + + public static SurveyCreateRequest 연애고사_필수_과목_질문_번호_음수() { + return new SurveyCreateRequest("설문 제목", true, List.of( + new SurveyQuestionCreateRequest("질문1", List.of( + SurveyAnswerCreateRequest.of(-1, "답변 1") + )) + )); + } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 8b71b70f..43f4e997 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -3,18 +3,18 @@ import com.atwoz.survey.domain.survey.Survey; import java.util.List; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_질문_과목_두개씩_생성_요청; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id있음; public class SurveyFixture { public static Survey 연애고사_필수_질문_과목_두개씩() { - return Survey.from(연애고사_필수_질문_과목_두개씩_생성_요청()); + return Survey.from(연애고사_필수_과목_질문_두개씩_생성_요청()); } public static Survey 연애고사_선택_질문_과목_두개씩() { - return Survey.from(연애고사_선택_질문_과목_두개씩_생성_요청()); + return Survey.from(연애고사_선택_과목_질문_두개씩_생성_요청()); } public static Survey 연애고사_필수_질문_과목_한개씩_전부_id_있음() { diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index dcb6f417..668b5a6b 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -14,7 +14,7 @@ import org.springframework.test.web.servlet.MockMvc; import static com.atwoz.helper.RestDocsHelper.customDocument; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_질문_과목_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static org.mockito.Mockito.when; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; @@ -41,7 +41,7 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { @Test void 연애고사_과목을_생성한다() throws Exception { // given - SurveyCreateRequest request = 연애고사_필수_질문_과목_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); when(surveyService.addSurvey(request)).thenReturn(1L); // when From 9faf66e90437bb94ec73bf0984dd71fb0e670d83 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 14:40:24 +0900 Subject: [PATCH 35/65] =?UTF-8?q?test:=20=EB=8B=B5=EB=B3=80=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EB=93=B1=EB=A1=9D=20=EC=98=88=EC=99=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyServiceTest에서의 답변 중복 등록 예외 테스트 작성 --- .../application/survey/SurveyServiceTest.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index a2f2ba9e..e1e3cc73 100644 --- a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -1,7 +1,10 @@ package com.atwoz.survey.application.survey; +import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; @@ -11,10 +14,15 @@ import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; +import java.util.List; +import java.util.stream.Stream; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -68,6 +76,30 @@ class 연애고사_과목_등록_예외 { .isInstanceOf(SurveyQuestionDuplicatedException.class); } + @MethodSource("invalidSurveyAnswerRequests") + @ParameterizedTest + void 번호나_내용이_같은_답변은_생성할_수_없다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { + // given + SurveyCreateRequest request = new SurveyCreateRequest("과목", true, List.of( + new SurveyQuestionCreateRequest("질문", List.of( + SurveyAnswerCreateRequest.of(answerNumber1, answer1), + SurveyAnswerCreateRequest.of(answerNumber2, answer2) + )) + )); + + // when & then + assertThatThrownBy(() -> surveyService.addSurvey(request)) + .isInstanceOf(SurveyAnswerDuplicatedException.class); + } + + static Stream invalidSurveyAnswerRequests() { + return Stream.of( + Arguments.arguments(1, "답1", 1, "답2"), + Arguments.arguments(1, "답1", 2, "답1"), + Arguments.arguments(1, "답1", 1, "답1") + ); + } + @Test void 연애고사_과목_답변_번호는_자연수여야_한다() { // given From 07b176a7b86ef2ecfbe3587b15db31c8a0325ed8 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Tue, 7 May 2024 15:14:49 +0900 Subject: [PATCH 36/65] =?UTF-8?q?test:=20=EC=97=B0=EC=95=A0=EA=B3=A0?= =?UTF-8?q?=EC=82=AC=20=EA=B3=BC=EB=AA=A9=20=EB=93=B1=EB=A1=9D=20=EC=9D=B8?= =?UTF-8?q?=EC=88=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애고사 과목 등록 인수 테스트 작성 --- .../SurveyControllerAcceptanceFixture.java | 57 +++++++++++++++++++ .../SurveyControllerAcceptanceTest.java | 34 +++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java create mode 100644 src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceTest.java diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java new file mode 100644 index 00000000..6d9f6586 --- /dev/null +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java @@ -0,0 +1,57 @@ +package com.atwoz.survey.ui.survey; + +import com.atwoz.helper.IntegrationHelper; +import com.atwoz.member.domain.member.Member; +import com.atwoz.member.domain.member.MemberRepository; +import com.atwoz.member.infrastructure.auth.JwtTokenProvider; +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.survey.SurveyRepository; +import io.restassured.RestAssured; +import io.restassured.response.ExtractableResponse; +import io.restassured.response.Response; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; + +import static com.atwoz.member.fixture.MemberFixture.일반_유저_생성; +import static io.restassured.http.ContentType.JSON; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class SurveyControllerAcceptanceFixture extends IntegrationHelper { + + @Autowired + private JwtTokenProvider jwtTokenProvider; + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private SurveyRepository surveyRepository; + + protected Member 회원_생성() { + return memberRepository.save(일반_유저_생성()); + } + + protected String 토큰_생성(final Member member) { + return jwtTokenProvider.createTokenWithId(member.getId()); + } + + protected ExtractableResponse 연애고사_과목_생성_요청(final String url, final String token, final SurveyCreateRequest request) { + return RestAssured.given().log().all() + .header(AUTHORIZATION, "Bearer " + token) + .contentType(JSON) + .body(request) + .when() + .post(url) + .then() + .extract(); + } + + protected void 연애고사_과목_생성_검증(final ExtractableResponse response) { + assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); + } +} diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceTest.java new file mode 100644 index 00000000..35ea9626 --- /dev/null +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceTest.java @@ -0,0 +1,34 @@ +package com.atwoz.survey.ui.survey; + +import com.atwoz.member.domain.member.Member; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class SurveyControllerAcceptanceTest extends SurveyControllerAcceptanceFixture { + + private static final String 연애고사_url = "/api/surveys"; + + private Member 관리자; + private String 토큰; + + @BeforeEach + void setup() { + 관리자 = 회원_생성(); + 토큰 = 토큰_생성(관리자); + } + + @Test + void 연애고사_과목을_생성한다() { + // when + var 연애고사_과목_생성_결과 = 연애고사_과목_생성_요청(연애고사_url, 토큰, 연애고사_필수_과목_질문_두개씩_생성_요청()); + + // then + 연애고사_과목_생성_검증(연애고사_과목_생성_결과); + } +} From f12f378d843e9c7fb09e0ea1208c9fb6fa3092be Mon Sep 17 00:00:00 2001 From: devholic22 Date: Wed, 8 May 2024 15:14:34 +0900 Subject: [PATCH 37/65] =?UTF-8?q?docs:=20survey.adoc=20=EB=A7=81=ED=81=AC?= =?UTF-8?q?=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - survey.adoc 링크 경로 수정 --- src/docs/asciidoc/survey.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/docs/asciidoc/survey.adoc b/src/docs/asciidoc/survey.adoc index 04faad14..51a624af 100644 --- a/src/docs/asciidoc/survey.adoc +++ b/src/docs/asciidoc/survey.adoc @@ -10,9 +10,9 @@ === 설문 생성 (POST /api/surveys) ==== 요청 -include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/request-fields.adoc[] -include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/http-request.adoc[] +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_과목_생성/request-fields.adoc[] +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_과목_생성/http-request.adoc[] ==== 응답 -include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/response-headers.adoc[] -include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_설문_생성/http-response.adoc[] +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_과목_생성/response-headers.adoc[] +include::{snippets}/survey-controller-web-mvc-test/연애_모의고사_과목_생성/http-response.adoc[] From 73ab3e5275d6718ddabf8d0f7e8182c84499fb9e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Wed, 8 May 2024 15:27:40 +0900 Subject: [PATCH 38/65] =?UTF-8?q?refactor:=20=EC=97=B0=EC=95=A0=EA=B3=BC?= =?UTF-8?q?=EB=AA=A9=20=EC=83=9D=EC=84=B1=20=EC=9D=91=EB=8B=B5=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애과목 생성 응답 시 SurveyCreateResponse를 반환하도록 수정 - 통합 테스트에서 동일한 표현이 나올 수 있도록 수정 --- .../application/survey/SurveyService.java | 5 ++- .../survey/ui/survey/SurveyController.java | 10 +++--- .../ui/survey/dto/SurveyCreateResponse.java | 19 +++++++++++ .../dto/SurveyQuestionCreateResponse.java | 20 +++++++++++ .../application/survey/SurveyServiceTest.java | 11 +++++-- .../domain/survey/SurveyQuestionTest.java | 10 +++--- .../survey/fixture/SurveyAnswerFixture.java | 32 ++++++++++++++++++ .../fixture/SurveyCreateRequestFixture.java | 10 +++++- .../atwoz/survey/fixture/SurveyFixture.java | 14 ++++++-- .../survey/fixture/SurveyQuestionFixture.java | 19 ++++++++++- .../survey/SurveyFakeRepository.java | 33 ++++++++++++++++++- .../SurveyControllerAcceptanceFixture.java | 10 ++++-- .../ui/survey/SurveyControllerWebMvcTest.java | 12 ++++++- 13 files changed, 182 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/ui/survey/dto/SurveyCreateResponse.java create mode 100644 src/main/java/com/atwoz/survey/ui/survey/dto/SurveyQuestionCreateResponse.java diff --git a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java index 06b34b02..998ab34b 100644 --- a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java @@ -15,11 +15,10 @@ public class SurveyService { private final SurveyRepository surveyRepository; - public Long addSurvey(final SurveyCreateRequest request) { + public Survey addSurvey(final SurveyCreateRequest request) { validateIsAlreadyUsedName(request.name()); - Survey survey = surveyRepository.save(Survey.from(request)); - return survey.getId(); + return surveyRepository.save(Survey.from(request)); } private void validateIsAlreadyUsedName(final String name) { diff --git a/src/main/java/com/atwoz/survey/ui/survey/SurveyController.java b/src/main/java/com/atwoz/survey/ui/survey/SurveyController.java index 2c13fdd9..65a6909a 100644 --- a/src/main/java/com/atwoz/survey/ui/survey/SurveyController.java +++ b/src/main/java/com/atwoz/survey/ui/survey/SurveyController.java @@ -2,6 +2,8 @@ import com.atwoz.survey.application.survey.SurveyService; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.ui.survey.dto.SurveyCreateResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -20,9 +22,9 @@ public class SurveyController { private final SurveyService surveyService; @PostMapping - public ResponseEntity addSurvey(@RequestBody @Valid final SurveyCreateRequest request) { - Long id = surveyService.addSurvey(request); - return ResponseEntity.created(URI.create("/api/surveys/" + id)) - .build(); + public ResponseEntity addSurvey(@RequestBody @Valid final SurveyCreateRequest request) { + Survey survey = surveyService.addSurvey(request); + return ResponseEntity.created(URI.create("/api/surveys/" + survey.getId())) + .body(SurveyCreateResponse.from(survey)); } } diff --git a/src/main/java/com/atwoz/survey/ui/survey/dto/SurveyCreateResponse.java b/src/main/java/com/atwoz/survey/ui/survey/dto/SurveyCreateResponse.java new file mode 100644 index 00000000..b77a06f8 --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/survey/dto/SurveyCreateResponse.java @@ -0,0 +1,19 @@ +package com.atwoz.survey.ui.survey.dto; + +import com.atwoz.survey.domain.survey.Survey; + +import java.util.List; + +public record SurveyCreateResponse( + Long surveyId, + List questions +) { + + public static SurveyCreateResponse from(final Survey survey) { + List questions = survey.getQuestions() + .stream() + .map(SurveyQuestionCreateResponse::from) + .toList(); + return new SurveyCreateResponse(survey.getId(), questions); + } +} diff --git a/src/main/java/com/atwoz/survey/ui/survey/dto/SurveyQuestionCreateResponse.java b/src/main/java/com/atwoz/survey/ui/survey/dto/SurveyQuestionCreateResponse.java new file mode 100644 index 00000000..064fcf22 --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/survey/dto/SurveyQuestionCreateResponse.java @@ -0,0 +1,20 @@ +package com.atwoz.survey.ui.survey.dto; + +import com.atwoz.survey.domain.survey.SurveyAnswer; +import com.atwoz.survey.domain.survey.SurveyQuestion; + +import java.util.List; + +public record SurveyQuestionCreateResponse( + Long questionId, + List answerNumbers +) { + + public static SurveyQuestionCreateResponse from(final SurveyQuestion question) { + List answerNumbers = question.getAnswers() + .stream() + .map(SurveyAnswer::getNumber) + .toList(); + return new SurveyQuestionCreateResponse(question.getId(), answerNumbers); + } +} diff --git a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index e1e3cc73..b33d2368 100644 --- a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -3,6 +3,7 @@ import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.domain.survey.SurveyRepository; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerDuplicatedException; import com.atwoz.survey.exception.survey.exceptions.SurveyAnswerNumberRangeException; @@ -23,6 +24,8 @@ import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_하나_생성; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -42,13 +45,15 @@ void init() { @Test void 연애고사_과목_등록() { // given - SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); + SurveyCreateRequest request = 연애고사_필수_과목_하나_생성(); + Survey expectedSurvey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); // when - Long id = surveyService.addSurvey(request); + Survey survey = surveyService.addSurvey(request); // then - assertThat(id).isEqualTo(1L); + assertThat(survey).usingRecursiveComparison() + .isEqualTo(expectedSurvey); } @Nested diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 9165101c..6177c500 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.stream.Stream; -import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id있음; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -54,7 +54,7 @@ class SurveyQuestionTest { @Test void 연애고사_질문_응시() { // given - SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id_있음(); List requests = List.of( new SurveyQuestionComparisonRequest(1L, 1) ); @@ -66,7 +66,7 @@ class SurveyQuestionTest { @Test void 동등성_비교() { // given - SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id_있음(); SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of( new SurveyAnswerCreateRequest(1, "답변 1")) ); @@ -121,7 +121,7 @@ static Stream invalidSurveyAnswerRequests() { @Test void 연애고사_질문을_응시할_때는_관련_질문이_있어야_한다() { // given - SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id_있음(); List requests = List.of( new SurveyQuestionComparisonRequest(2L, 1), new SurveyQuestionComparisonRequest(3L, 1) @@ -135,7 +135,7 @@ static Stream invalidSurveyAnswerRequests() { @Test void 연애고사_질문을_응시할_때는_있는_답변으로만_작성해야_한다() { // given - SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id있음(); + SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id_있음(); List requests = List.of( new SurveyQuestionComparisonRequest(1L, 5) ); diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java index 4863ac44..7c492eaa 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyAnswerFixture.java @@ -2,6 +2,8 @@ import com.atwoz.survey.domain.survey.SurveyAnswer; +import java.util.List; + public class SurveyAnswerFixture { public static SurveyAnswer 연애고사_답변_id있음() { @@ -11,4 +13,34 @@ public class SurveyAnswerFixture { .description("답변 1") .build(); } + + public static List 연애고사_답변_두개_id_있음_첫번째() { + return List.of( + SurveyAnswer.builder() + .id(1L) + .number(1) + .description("답변 1") + .build(), + SurveyAnswer.builder() + .id(2L) + .number(2) + .description("답변 2") + .build() + ); + } + + public static List 연애고사_답변_두개_id_있음_두번째() { + return List.of( + SurveyAnswer.builder() + .id(3L) + .number(1) + .description("답변 1") + .build(), + SurveyAnswer.builder() + .id(4L) + .number(2) + .description("답변 2") + .build() + ); + } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index 8fd0f098..8062d630 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -48,10 +48,18 @@ public class SurveyCreateRequestFixture { } public static SurveyCreateRequest 연애고사_필수_과목_질문_번호_음수() { - return new SurveyCreateRequest("설문 제목", true, List.of( + return new SurveyCreateRequest("과목 제목", true, List.of( new SurveyQuestionCreateRequest("질문1", List.of( SurveyAnswerCreateRequest.of(-1, "답변 1") )) )); } + + public static SurveyCreateRequest 연애고사_필수_과목_하나_생성() { + return new SurveyCreateRequest("과목 1", true, List.of( + new SurveyQuestionCreateRequest("질문 1", List.of( + SurveyAnswerCreateRequest.of(1, "답변 1") + )) + )); + } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 43f4e997..3402a619 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -5,7 +5,8 @@ import java.util.List; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; -import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id있음; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_두개_id_있음; +import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id_있음; public class SurveyFixture { @@ -22,7 +23,16 @@ public class SurveyFixture { .id(1L) .required(true) .name("과목 1") - .questions(List.of(연애고사_질문_답변_한개_id있음())) + .questions(List.of(연애고사_질문_답변_한개_id_있음())) + .build(); + } + + public static Survey 연애고사_필수_질문_과목_두개씩_전부_id_있음() { + return Survey.builder() + .id(1L) + .required(true) + .name("과목 1") + .questions(연애고사_질문_답변_두개_id_있음()) .build(); } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java index 7b84cf05..60cc2dd6 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyQuestionFixture.java @@ -4,14 +4,31 @@ import java.util.List; import static com.atwoz.survey.fixture.SurveyAnswerFixture.연애고사_답변_id있음; +import static com.atwoz.survey.fixture.SurveyAnswerFixture.연애고사_답변_두개_id_있음_두번째; +import static com.atwoz.survey.fixture.SurveyAnswerFixture.연애고사_답변_두개_id_있음_첫번째; public class SurveyQuestionFixture { - public static SurveyQuestion 연애고사_질문_답변_한개_id있음() { + public static SurveyQuestion 연애고사_질문_답변_한개_id_있음() { return SurveyQuestion.builder() .id(1L) .description("질문 1") .answers(List.of(연애고사_답변_id있음())) .build(); } + + public static List 연애고사_질문_답변_두개_id_있음() { + return List.of( + SurveyQuestion.builder() + .id(1L) + .description("질문 내용1") + .answers(연애고사_답변_두개_id_있음_첫번째()) + .build(), + SurveyQuestion.builder() + .id(2L) + .description("질문 내용2") + .answers(연애고사_답변_두개_id_있음_두번째()) + .build() + ); + } } diff --git a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java index 6f708dce..f5b266ee 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java @@ -1,8 +1,11 @@ package com.atwoz.survey.infrastructure.survey; import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.SurveyAnswer; +import com.atwoz.survey.domain.survey.SurveyQuestion; import com.atwoz.survey.domain.survey.SurveyRepository; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -13,6 +16,8 @@ public class SurveyFakeRepository implements SurveyRepository { private final Map map = new HashMap<>(); private Long id = 1L; + private Long surveyQuestionId = 1L; + private Long surveyAnswerId = 1L; @Override public Survey save(final Survey survey) { @@ -20,13 +25,39 @@ public Survey save(final Survey survey) { .id(id++) .name(survey.getName()) .required(survey.getRequired()) - .questions(survey.getQuestions()) + .questions(injectSurveyQuestionIds(survey.getQuestions())) .build(); map.put(newSurvey.getId(), newSurvey); return newSurvey; } + private List injectSurveyQuestionIds(final List questions) { + List copySurveyQuestions = new ArrayList<>(); + for (SurveyQuestion question : questions) { + SurveyQuestion copySurveyQuestion = SurveyQuestion.builder() + .id(surveyQuestionId++) + .description(question.getDescription()) + .answers(injectSurveyAnswersIds(question.getAnswers())) + .build(); + copySurveyQuestions.add(copySurveyQuestion); + } + return copySurveyQuestions; + } + + private List injectSurveyAnswersIds(final List answers) { + List copySurveyAnswers = new ArrayList<>(); + for (SurveyAnswer answer : answers) { + SurveyAnswer copySurveyAnswer = SurveyAnswer.builder() + .id(surveyAnswerId++) + .number(answer.getNumber()) + .description(answer.getDescription()) + .build(); + copySurveyAnswers.add(copySurveyAnswer); + } + return copySurveyAnswers; + } + @Override public boolean isExistedByName(final String name) { return map.values() diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java index 6d9f6586..e507a106 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java @@ -6,6 +6,7 @@ import com.atwoz.member.infrastructure.auth.JwtTokenProvider; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.ui.survey.dto.SurveyCreateResponse; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; @@ -16,7 +17,7 @@ import static com.atwoz.member.fixture.MemberFixture.일반_유저_생성; import static io.restassured.http.ContentType.JSON; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; import static org.springframework.http.HttpHeaders.AUTHORIZATION; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -52,6 +53,11 @@ class SurveyControllerAcceptanceFixture extends IntegrationHelper { } protected void 연애고사_과목_생성_검증(final ExtractableResponse response) { - assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); + SurveyCreateResponse result = response.as(SurveyCreateResponse.class); + + assertSoftly(softly -> { + softly.assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); + softly.assertThat(result.questions()).isNotEmpty(); + }); } } diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index 668b5a6b..58f6f70c 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -3,6 +3,7 @@ import com.atwoz.helper.MockBeanInjection; import com.atwoz.survey.application.survey.SurveyService; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; +import com.atwoz.survey.domain.survey.Survey; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHeaders; import org.junit.jupiter.api.DisplayNameGeneration; @@ -15,12 +16,14 @@ import static com.atwoz.helper.RestDocsHelper.customDocument; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_두개씩_전부_id_있음; import static org.mockito.Mockito.when; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -42,7 +45,8 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { void 연애고사_과목을_생성한다() throws Exception { // given SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); - when(surveyService.addSurvey(request)).thenReturn(1L); + Survey survey = 연애고사_필수_질문_과목_두개씩_전부_id_있음(); + when(surveyService.addSurvey(request)).thenReturn(survey); // when mockMvc.perform(post("/api/surveys") @@ -63,6 +67,12 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { ), responseHeaders( headerWithName("location").description("생성된 과목 경로") + ), + responseFields( + fieldWithPath("surveyId").description("연애고사 과목 id"), + fieldWithPath("questions").description("연애고사 과목의 질문"), + fieldWithPath("questions[].questionId").description("연애고사 질문의 id"), + fieldWithPath("questions[].answerNumbers").description("연애고사 질문에서 가능한 답변 선택지 번호") ) )); } From fb794f3db06aea5d82e8c1fdd6595844f2cb9629 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Wed, 8 May 2024 15:29:34 +0900 Subject: [PATCH 39/65] =?UTF-8?q?docs:=20index.adoc=20=EC=97=B0=EC=95=A0?= =?UTF-8?q?=EA=B3=A0=EC=82=AC=20API=20=EB=A7=81=ED=81=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.adoc에 연애고사 API 링크 추가 작성 --- src/docs/asciidoc/index.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index a84f99be..4418eacf 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -9,3 +9,4 @@ * link:member.adoc[회원 정보 API] * link:mission.adoc[미션 API] * link:membermissions.adoc[회원 미션 API] +* link:survey.adoc[연애고사 API] From 1d8437b4ca1b4884286d004c2a77a3fbdc3381ce Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 10:38:23 +0900 Subject: [PATCH 40/65] =?UTF-8?q?test:=20MemberSurveyServiceTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurveyService 테스트 작성 - 필수 연애고사 과목 id만 조회되도록 수정 --- .../membersurvey/MemberSurveyService.java | 23 +-- .../domain/membersurvey/MemberSurvey.java | 4 + .../domain/survey/SurveyRepository.java | 2 +- .../MemberSurveyExceptionHandler.java | 6 +- .../RequiredSurveyNotSubmittedException.java | 8 ++ ...urveyQuestionSubmitDuplicateException.java | 8 -- .../SurveySubmitDuplicateException.java | 8 ++ .../survey/SurveyJpaRepository.java | 4 +- .../survey/SurveyRepositoryImpl.java | 4 +- .../membersurvey/MemberSurveyServiceTest.java | 133 ++++++++++++++++++ .../application/survey/SurveyServiceTest.java | 4 +- .../survey/domain/survey/SurveyTest.java | 10 +- .../fixture/SurveyCreateRequestFixture.java | 8 ++ .../atwoz/survey/fixture/SurveyFixture.java | 13 +- .../fixture/SurveySubmitRequestFixture.java | 129 +++++++++++++++++ .../MemberSurveyFakeRepository.java | 38 +++++ .../survey/SurveyFakeRepository.java | 5 +- .../survey/SurveyJpaRepositoryTest.java | 25 ++-- .../ui/survey/SurveyControllerWebMvcTest.java | 5 +- 19 files changed, 384 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/RequiredSurveyNotSubmittedException.java delete mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveySubmitDuplicateException.java create mode 100644 src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java create mode 100644 src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java create mode 100644 src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java index 0fd4f1c9..92c82589 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java @@ -8,9 +8,10 @@ import com.atwoz.survey.domain.survey.SurveyQuestion; import com.atwoz.survey.domain.survey.SurveyRepository; import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.RequiredSurveyNotSubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAlreadySubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitDuplicateException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -34,23 +35,27 @@ public void submitSurvey(final Long memberId, final List re } private void validateIsContainsAllRequiredSurveys(final List requests) { - List requiredSurveyIds = surveyRepository.findAllRequiredSurveys() - .stream() - .map(Survey::getId) - .toList(); + List requiredSurveyIds = surveyRepository.findAllRequiredSurveyIds(); + Set submittedSurveyIds = extractSubmittedSurveyIds(requests); + + if (!submittedSurveyIds.containsAll(requiredSurveyIds)) { + throw new RequiredSurveyNotSubmittedException(); + } + } + + private Set extractSubmittedSurveyIds(final List requests) { List submittedSurveyIds = requests.stream() .map(SurveySubmitRequest::surveyId) .toList(); validateIsNotDuplicateSurveyIds(submittedSurveyIds); - if (!submittedSurveyIds.containsAll(requiredSurveyIds)) { - throw new SurveyNotFoundException(); - } + + return new HashSet<>(submittedSurveyIds); } private void validateIsNotDuplicateSurveyIds(final List surveyIds) { Set set = new HashSet<>(surveyIds); if (surveyIds.size() != set.size()) { - throw new SurveyQuestionSubmitDuplicateException(); + throw new SurveySubmitDuplicateException(); } } diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java index 7aac66db..c6734ffc 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java @@ -6,11 +6,15 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Builder @Entity public class MemberSurvey { diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java index fd67a200..cbf850f9 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyRepository.java @@ -8,5 +8,5 @@ public interface SurveyRepository { Survey save(Survey survey); boolean isExistedByName(String name); Optional findById(Long id); - List findAllRequiredSurveys(); + List findAllRequiredSurveyIds(); } diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java b/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java index 6c5f904e..235fb76f 100644 --- a/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java @@ -3,7 +3,7 @@ import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAlreadySubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitDuplicateException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -28,8 +28,8 @@ public ResponseEntity handleSurveyQuestionNotSubmittedException(final Su return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); } - @ExceptionHandler(SurveyQuestionSubmitDuplicateException.class) - public ResponseEntity handleSurveyQuestionSubmitDuplicateException(final SurveyQuestionSubmitDuplicateException exception) { + @ExceptionHandler(SurveySubmitDuplicateException.class) + public ResponseEntity handleSurveyQuestionSubmitDuplicateException(final SurveySubmitDuplicateException exception) { return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); } diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/RequiredSurveyNotSubmittedException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/RequiredSurveyNotSubmittedException.java new file mode 100644 index 00000000..c6d29259 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/RequiredSurveyNotSubmittedException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class RequiredSurveyNotSubmittedException extends RuntimeException { + + public RequiredSurveyNotSubmittedException() { + super("필수 연애고사 과목을 제출하지 않았습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java deleted file mode 100644 index 49d59d46..00000000 --- a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveyQuestionSubmitDuplicateException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.atwoz.survey.exception.membersurvey.exceptions; - -public class SurveyQuestionSubmitDuplicateException extends RuntimeException { - - public SurveyQuestionSubmitDuplicateException() { - super("같은 id의 질문을 제출할 수 없습니다."); - } -} diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveySubmitDuplicateException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveySubmitDuplicateException.java new file mode 100644 index 00000000..6f560971 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/SurveySubmitDuplicateException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class SurveySubmitDuplicateException extends RuntimeException { + + public SurveySubmitDuplicateException() { + super("같은 id의 연애고사 과목을 제출할 수 없습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java index 1e9d777d..dab9d5f9 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java +++ b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepository.java @@ -13,6 +13,6 @@ public interface SurveyJpaRepository extends JpaRepository { boolean existsByName(String name); Optional findById(Long id); - @Query("SELECT s FROM Survey s WHERE s.required = true") - List findAllRequiredSurveys(); + @Query("SELECT s.id FROM Survey s WHERE s.required = true") + List findAllRequiredSurveyIds(); } diff --git a/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java index 3dba90ef..7fd2e838 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java +++ b/src/main/java/com/atwoz/survey/infrastructure/survey/SurveyRepositoryImpl.java @@ -30,7 +30,7 @@ public Optional findById(final Long id) { } @Override - public List findAllRequiredSurveys() { - return surveyJpaRepository.findAllRequiredSurveys(); + public List findAllRequiredSurveyIds() { + return surveyJpaRepository.findAllRequiredSurveyIds(); } } diff --git a/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java new file mode 100644 index 00000000..b26ef40a --- /dev/null +++ b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java @@ -0,0 +1,133 @@ +package com.atwoz.survey.application.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.membersurvey.exceptions.RequiredSurveyNotSubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; +import com.atwoz.survey.infrastructure.membersurvey.MemberSurveyFakeRepository; +import com.atwoz.survey.infrastructure.survey.SurveyFakeRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_두개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_하나; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_두개씩; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.같은_필수_과목_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_같은_질문_답변_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_없는_답변_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_없는_질문_답변_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_질문_답변_일부분만_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_질문_두개_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.없는_과목_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class MemberSurveyServiceTest { + + private MemberSurveyService memberSurveyService; + private MemberSurveyRepository memberSurveyRepository; + private SurveyRepository surveyRepository; + private Long memberId = 1L; + + @BeforeEach + void init() { + surveyRepository = new SurveyFakeRepository(); + memberSurveyRepository = new MemberSurveyFakeRepository(); + memberSurveyService = new MemberSurveyService(memberSurveyRepository, surveyRepository); + } + + @Test + void 회원이_연애고사_과목을_응시한다() { + // given + List requests = 필수_과목_질문_두개_제출_요청(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + + // when & then + assertDoesNotThrow(() -> memberSurveyService.submitSurvey(memberId, requests)); + } + + @Nested + class 연애고사_과목_응시_예외 { + + @Test + void 필수_과목을_응시하지_않으면_예외가_발생한다() { + // given + List requests = 선택_과목_질문_두개_제출_요청(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + + // when & then + assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) + .isInstanceOf(RequiredSurveyNotSubmittedException.class); + } + + @Test + void 같은_과목을_응시하면_예외가_발생한다() { + // given + List requests = 같은_필수_과목_제출_요청(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + + // when & then + assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveySubmitDuplicateException.class); + } + + @Test + void 없는_과목을_응시하면_예외가_발생한다() { + // given + List requests = 없는_과목_제출_요청(); + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + + // when & then + assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveyNotFoundException.class); + } + + @MethodSource("invalidQuestionSizeInputs") + @ParameterizedTest + void 과목이_가진_질문_수와_요청한_질문_수가_다르면_예외가_발생한다(final List requests) { + // given + surveyRepository.save(연애고사_선택_과목_질문_하나()); + + // when & then + assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveyQuestionSubmitSizeNotMatchException.class); + } + + // 없는 질문에 답하거나, 같은 질문에 답하거나, 과목의 일부분 질문만 답하는 경우 + static Stream invalidQuestionSizeInputs() { + return Stream.of( + Arguments.arguments(선택_과목_같은_질문_답변_제출_요청()), + Arguments.arguments(선택_과목_없는_질문_답변_제출_요청()), + Arguments.arguments(선택_과목_질문_답변_일부분만_제출_요청()) + ); + } + + @Test + void 없는_번호의_답변_번호를_선택하면_예외가_발생한다() { + // given + List requests = 선택_과목_없는_답변_제출_요청(); + surveyRepository.save(연애고사_선택_과목_질문_하나()); + + // when & then + assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveyAnswerInvalidSubmitException.class); + } + } +} diff --git a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java index b33d2368..2ebc556e 100644 --- a/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java +++ b/src/test/java/com/atwoz/survey/application/survey/SurveyServiceTest.java @@ -25,7 +25,7 @@ import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_하나_생성; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_한개씩_전부_id_있음; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -46,7 +46,7 @@ void init() { void 연애고사_과목_등록() { // given SurveyCreateRequest request = 연애고사_필수_과목_하나_생성(); - Survey expectedSurvey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); + Survey expectedSurvey = 연애고사_필수_과목_질문_한개씩_전부_id_있음(); // when Survey survey = surveyService.addSurvey(request); diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 9b9c173e..89e3e4fa 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -25,7 +25,7 @@ import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_한개씩_전부_id_있음; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_한개씩_전부_id_있음; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -90,7 +90,7 @@ class SurveyTest { @Test void 설문_응시_조건_검사_통과() { // given - Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_과목_질문_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(1L, 1) @@ -152,7 +152,7 @@ static Stream invalidSurveyAnswerRequests() { @ParameterizedTest void 연애고사_응시_질문_id_갯수가_다르거나_id가_중복되면_예외가_발생한다(final Long questionId1, final Long questionId2) { // given - Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_과목_질문_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(questionId1, 1), @@ -175,7 +175,7 @@ static Stream invalidSurveyQuestionRequests() { @Test void 연애고사_응시_질문_id가_없으면_예외가_발생한다() { // given - Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_과목_질문_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(5L, 1) @@ -190,7 +190,7 @@ static Stream invalidSurveyQuestionRequests() { @Test void 연애고사에_있는_질문의_답변이_아닌_답변을_내면_예외가_발생한다() { // given - Survey survey = 연애고사_필수_질문_과목_한개씩_전부_id_있음(); + Survey survey = 연애고사_필수_과목_질문_한개씩_전부_id_있음(); SurveyComparisonRequest request = SurveyComparisonRequest.from( new SurveySubmitRequest(1L, List.of( new SurveyQuestionSubmitRequest(1L, 5) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index 8062d630..3cae0675 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -62,4 +62,12 @@ public class SurveyCreateRequestFixture { )) )); } + + public static SurveyCreateRequest 연애고사_선택_과목_질문_하나_생성_요청() { + return new SurveyCreateRequest("과목 1", false, List.of( + new SurveyQuestionCreateRequest("질문 1", List.of( + SurveyAnswerCreateRequest.of(1, "답변 1") + )) + )); + } } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index 3402a619..fa5f8b3d 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -4,21 +4,26 @@ import java.util.List; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_두개씩_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_하나_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_두개_id_있음; import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id_있음; public class SurveyFixture { - public static Survey 연애고사_필수_질문_과목_두개씩() { + public static Survey 연애고사_필수_과목_질문_두개씩() { return Survey.from(연애고사_필수_과목_질문_두개씩_생성_요청()); } - public static Survey 연애고사_선택_질문_과목_두개씩() { + public static Survey 연애고사_선택_과목_질문_두개씩() { return Survey.from(연애고사_선택_과목_질문_두개씩_생성_요청()); } - public static Survey 연애고사_필수_질문_과목_한개씩_전부_id_있음() { + public static Survey 연애고사_선택_과목_질문_하나() { + return Survey.from(연애고사_선택_과목_질문_하나_생성_요청()); + } + + public static Survey 연애고사_필수_과목_질문_한개씩_전부_id_있음() { return Survey.builder() .id(1L) .required(true) @@ -27,7 +32,7 @@ public class SurveyFixture { .build(); } - public static Survey 연애고사_필수_질문_과목_두개씩_전부_id_있음() { + public static Survey 연애고사_필수_과목_질문_두개씩_전부_id_있음() { return Survey.builder() .id(1L) .required(true) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java new file mode 100644 index 00000000..5915f2af --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java @@ -0,0 +1,129 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; + +import java.util.List; + +public class SurveySubmitRequestFixture { + + public static List 필수_과목_질문_두개_제출_요청() { + Long surveyId = 1L; + Long questionOneId = 1L; + Integer answerOneNumber = 1; + Long questionTwoId = 2L; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )) + ); + } + + public static List 선택_과목_질문_두개_제출_요청() { + Long surveyId = 2L; + Long questionOneId = 1L; + Integer answerOneNumber = 1; + Long questionTwoId = 2L; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )) + ); + } + + public static List 같은_필수_과목_제출_요청() { + Long surveyId = 1L; + Long questionOneId = 1L; + Integer answerOneNumber = 1; + Long questionTwoId = 2L; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )), + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )) + ); + } + + public static List 없는_과목_제출_요청() { + Long surveyId = -1L; + Long questionOneId = 1L; + Integer answerOneNumber = 1; + Long questionTwoId = 2L; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )) + ); + } + + public static List 선택_과목_없는_답변_제출_요청() { + Long surveyId = 1L; + Long questionOneId = 1L; + Integer answerNumber = -1; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerNumber) + )) + ); + } + + public static List 선택_과목_같은_질문_답변_제출_요청() { + Long surveyId = 1L; + Long questionOneId = 1L; + Integer answerOneNumber = 1; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionOneId, answerTwoNumber) + )) + ); + } + + public static List 선택_과목_없는_질문_답변_제출_요청() { + Long surveyId = 1L; + Long questionOneId = 1L; + Long questionTwoId = -1L; + Integer answerOneNumber = 1; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )) + ); + } + + public static List 선택_과목_질문_답변_일부분만_제출_요청() { + Long surveyId = 1L; + Long questionOneId = 1L; + Long questionTwoId = -1L; + Integer answerOneNumber = 1; + Integer answerTwoNumber = 2; + + return List.of( + new SurveySubmitRequest(surveyId, List.of( + new SurveyQuestionSubmitRequest(questionOneId, answerOneNumber), + new SurveyQuestionSubmitRequest(questionTwoId, answerTwoNumber) + )) + ); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java new file mode 100644 index 00000000..b6f53f0b --- /dev/null +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java @@ -0,0 +1,38 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurvey; +import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; + +import java.util.HashMap; +import java.util.Map; + +public class MemberSurveyFakeRepository implements MemberSurveyRepository { + + private final Map map = new HashMap<>(); + + private Long id = 1L; + + @Override + public MemberSurvey save(final MemberSurvey memberSurvey) { + MemberSurvey newMemberSurvey = MemberSurvey.builder() + .id(id++) + .memberId(memberSurvey.getMemberId()) + .questionId(memberSurvey.getQuestionId()) + .answerNumber(memberSurvey.getAnswerNumber()) + .build(); + map.put(newMemberSurvey.getId(), newMemberSurvey); + + return newMemberSurvey; + } + + @Override + public boolean existsByMemberIdAndQuestionId(final Long memberId, final Long questionId) { + return map.values() + .stream() + .anyMatch(memberSurvey -> isSameMemberSurvey(memberSurvey, memberId, questionId)); + } + + private boolean isSameMemberSurvey(final MemberSurvey memberSurvey, final Long memberId, final Long questionId) { + return memberId.equals(memberSurvey.getMemberId()) && questionId.equals(memberSurvey.getQuestionId()); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java index f5b266ee..7099244b 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyFakeRepository.java @@ -67,14 +67,15 @@ public boolean isExistedByName(final String name) { @Override public Optional findById(final Long id) { - return Optional.of(map.get(id)); + return Optional.ofNullable(map.get(id)); } @Override - public List findAllRequiredSurveys() { + public List findAllRequiredSurveyIds() { return map.values() .stream() .filter(Survey::isRequired) + .map(Survey::getId) .toList(); } } diff --git a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java index ed0c3f66..3cbe1776 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/survey/SurveyJpaRepositoryTest.java @@ -9,8 +9,8 @@ import java.util.List; import java.util.Optional; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_질문_과목_두개씩; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_두개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_두개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_두개씩; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -25,7 +25,7 @@ public class SurveyJpaRepositoryTest { @Test void 연애고사_과목_등록() { // given - Survey survey = 연애고사_필수_질문_과목_두개씩(); + Survey survey = 연애고사_필수_과목_질문_두개씩(); // when Survey saveSurvey = surveyJpaRepository.save(survey); @@ -39,7 +39,7 @@ public class SurveyJpaRepositoryTest { @Test void 연애고사_과목_존재여부_검사() { // given - Survey survey = 연애고사_필수_질문_과목_두개씩(); + Survey survey = 연애고사_필수_과목_질문_두개씩(); surveyJpaRepository.save(survey); // when @@ -52,7 +52,7 @@ public class SurveyJpaRepositoryTest { @Test void 연애고사_id로_과목_조회() { // given - Survey survey = 연애고사_필수_질문_과목_두개씩(); + Survey survey = 연애고사_필수_과목_질문_두개씩(); Survey savedSurvey = surveyJpaRepository.save(survey); // when @@ -68,19 +68,18 @@ public class SurveyJpaRepositoryTest { @Test void 필수_연애고사_조회() { // given - Survey survey = 연애고사_필수_질문_과목_두개씩(); - Survey notRequiredSurvey = 연애고사_선택_질문_과목_두개씩(); - surveyJpaRepository.save(survey); - surveyJpaRepository.save(notRequiredSurvey); + Survey survey = 연애고사_필수_과목_질문_두개씩(); + Survey notRequiredSurvey = 연애고사_선택_과목_질문_두개씩(); + Survey savedRequiredSurvey = surveyJpaRepository.save(survey); + Survey savedNotRequiredSurvey = surveyJpaRepository.save(notRequiredSurvey); // when - List requiredSurveys = surveyJpaRepository.findAllRequiredSurveys(); + List requiredSurveyIds = surveyJpaRepository.findAllRequiredSurveyIds(); // then assertSoftly(softly -> { - softly.assertThat(requiredSurveys.size()).isEqualTo(1); - softly.assertThat(requiredSurveys.contains(survey)).isTrue(); - softly.assertThat(requiredSurveys.contains(notRequiredSurvey)).isFalse(); + softly.assertThat(requiredSurveyIds.contains(savedRequiredSurvey.getId())).isTrue(); + softly.assertThat(requiredSurveyIds.contains(savedNotRequiredSurvey.getId())).isFalse(); }); } } diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index 58f6f70c..e33e8099 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -16,7 +16,7 @@ import static com.atwoz.helper.RestDocsHelper.customDocument; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_질문_과목_두개씩_전부_id_있음; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_두개씩_전부_id_있음; import static org.mockito.Mockito.when; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; @@ -38,6 +38,7 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { @Autowired private MockMvc mockMvc; + @Autowired private SurveyService surveyService; @@ -45,7 +46,7 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { void 연애고사_과목을_생성한다() throws Exception { // given SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); - Survey survey = 연애고사_필수_질문_과목_두개씩_전부_id_있음(); + Survey survey = 연애고사_필수_과목_질문_두개씩_전부_id_있음(); when(surveyService.addSurvey(request)).thenReturn(survey); // when From 5a9dbc3b7b739fde41ce99217ae936c39eab828e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 12:23:29 +0900 Subject: [PATCH 41/65] =?UTF-8?q?refactor:=20MemberSurveys=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurveys 일급 컬렉션 추가 - MemberSurveyService 관련 코드 삭제 --- .../membersurvey/MemberSurveyService.java | 95 ------------- .../membersurvey/MemberSurveysService.java | 73 ++++++++++ .../domain/membersurvey/MemberSurvey.java | 10 +- .../membersurvey/MemberSurveyRepository.java | 7 - .../domain/membersurvey/MemberSurveys.java | 61 ++++++++ .../membersurvey/MemberSurveysRepository.java | 9 ++ .../MemberSurveyJpaRepository.java | 10 -- .../MemberSurveyRepositoryImpl.java | 23 --- .../MemberSurveysJpaRepository.java | 12 ++ .../MemberSurveysRepositoryImpl.java | 25 ++++ .../membersurvey/MemberSurveyController.java | 30 ---- .../membersurvey/MemberSurveyServiceTest.java | 133 ------------------ .../domain/membersurvey/MemberSurveyTest.java | 6 +- .../MemberSurveyFakeRepository.java | 38 ----- 14 files changed, 188 insertions(+), 344 deletions(-) delete mode 100644 src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java create mode 100644 src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java delete mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java create mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java create mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java delete mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java delete mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepository.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java delete mode 100644 src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java delete mode 100644 src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java delete mode 100644 src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java deleted file mode 100644 index 92c82589..00000000 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveyService.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.atwoz.survey.application.membersurvey; - -import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; -import com.atwoz.survey.domain.membersurvey.MemberSurvey; -import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; -import com.atwoz.survey.domain.survey.Survey; -import com.atwoz.survey.domain.survey.SurveyQuestion; -import com.atwoz.survey.domain.survey.SurveyRepository; -import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; -import com.atwoz.survey.exception.membersurvey.exceptions.RequiredSurveyNotSubmittedException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAlreadySubmittedException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; -import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -@RequiredArgsConstructor -@Transactional -@Service -public class MemberSurveyService { - - private final MemberSurveyRepository memberSurveyRepository; - private final SurveyRepository surveyRepository; - - public void submitSurvey(final Long memberId, final List requests) { - validateIsContainsAllRequiredSurveys(requests); - requests.forEach(request -> submitEachSurvey(memberId, request)); - } - - private void validateIsContainsAllRequiredSurveys(final List requests) { - List requiredSurveyIds = surveyRepository.findAllRequiredSurveyIds(); - Set submittedSurveyIds = extractSubmittedSurveyIds(requests); - - if (!submittedSurveyIds.containsAll(requiredSurveyIds)) { - throw new RequiredSurveyNotSubmittedException(); - } - } - - private Set extractSubmittedSurveyIds(final List requests) { - List submittedSurveyIds = requests.stream() - .map(SurveySubmitRequest::surveyId) - .toList(); - validateIsNotDuplicateSurveyIds(submittedSurveyIds); - - return new HashSet<>(submittedSurveyIds); - } - - private void validateIsNotDuplicateSurveyIds(final List surveyIds) { - Set set = new HashSet<>(surveyIds); - if (surveyIds.size() != set.size()) { - throw new SurveySubmitDuplicateException(); - } - } - - private void submitEachSurvey(final Long memberId, final SurveySubmitRequest request) { - Survey survey = findSurveyById(request.surveyId()); - survey.validateIsValidSubmitSurveyRequest(SurveyComparisonRequest.from(request)); - - survey.getQuestions() - .forEach(question -> saveQuestionAnswer(memberId, request, question)); - } - - private Survey findSurveyById(final Long surveyId) { - return surveyRepository.findById(surveyId) - .orElseThrow(SurveyNotFoundException::new); - } - - private void saveQuestionAnswer(final Long memberId, final SurveySubmitRequest request, final SurveyQuestion question) { - validateIsAlreadySubmittedQuestion(memberId, question.getId()); - SurveyQuestionSubmitRequest questionRequest = findQuestionSubmitRequest(question.getId(), request); - MemberSurvey memberSurvey = MemberSurvey.of(memberId, question.getId(), questionRequest.answerNumber()); - memberSurveyRepository.save(memberSurvey); - } - - private void validateIsAlreadySubmittedQuestion(final Long memberId, final Long questionId) { - if (memberSurveyRepository.existsByMemberIdAndQuestionId(memberId, questionId)) { - throw new SurveyAlreadySubmittedException(); - } - } - - private SurveyQuestionSubmitRequest findQuestionSubmitRequest(final Long questionId, final SurveySubmitRequest request) { - return request.questions() - .stream() - .filter(question -> questionId.equals(question.questionId())) - .findAny() - .orElseThrow(SurveyQuestionNotSubmittedException::new); - } -} diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java new file mode 100644 index 00000000..8193ef12 --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java @@ -0,0 +1,73 @@ +package com.atwoz.survey.application.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.MemberSurveys; +import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.exception.membersurvey.exceptions.RequiredSurveyNotSubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@RequiredArgsConstructor +@Transactional +@Service +public class MemberSurveysService { + + private final MemberSurveysRepository memberSurveysRepository; + private final SurveyRepository surveyRepository; + + public void submitSurvey(final Long memberId, final List requests) { + validateIsAllSubmittedRequiredSurveys(requests); + + MemberSurveys memberSurveys = memberSurveysRepository.findByMemberId(memberId) + .orElseGet(() -> createNewMemberSurveysWithMemberId(memberId)); + validateEachSurveyRequestIsValid(requests); + memberSurveys.submitSurveys(requests); + } + + private void validateIsAllSubmittedRequiredSurveys(final List requests) { + List requiredSurveyIds = surveyRepository.findAllRequiredSurveyIds(); + Set submittedSurveyIds = extractSubmittedSurveyIds(requests); + + if (!submittedSurveyIds.containsAll(requiredSurveyIds)) { + throw new RequiredSurveyNotSubmittedException(); + } + } + + private Set extractSubmittedSurveyIds(final List requests) { + List submittedSurveyIds = requests.stream() + .map(SurveySubmitRequest::surveyId) + .toList(); + HashSet surveyIds = new HashSet<>(submittedSurveyIds); + + if (surveyIds.size() != submittedSurveyIds.size()) { + throw new SurveySubmitDuplicateException(); + } + + return surveyIds; + } + + private MemberSurveys createNewMemberSurveysWithMemberId(final Long memberId) { + MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); + memberSurveysRepository.save(memberSurveys); + return memberSurveys; + } + + private void validateEachSurveyRequestIsValid(final List requests) { + requests.forEach(request -> { + Survey survey = surveyRepository.findById(request.surveyId()) + .orElseThrow(SurveyNotFoundException::new); + SurveyComparisonRequest comparisonRequest = SurveyComparisonRequest.from(request); + survey.validateIsValidSubmitSurveyRequest(comparisonRequest); + }); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java index c6734ffc..5138036c 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java @@ -23,7 +23,7 @@ public class MemberSurvey { private Long id; @Column(nullable = false) - private Long memberId; + private Long surveyId; @Column(nullable = false) private Long questionId; @@ -31,13 +31,13 @@ public class MemberSurvey { @Column(nullable = false) private Integer answerNumber; - private MemberSurvey(final Long memberId, final Long questionId, final Integer answerNumber) { - this.memberId = memberId; + private MemberSurvey(final Long surveyId, final Long questionId, final Integer answerNumber) { + this.surveyId = surveyId; this.questionId = questionId; this.answerNumber = answerNumber; } - public static MemberSurvey of(final Long memberId, final Long questionId, final Integer answerNumber) { - return new MemberSurvey(memberId, questionId, answerNumber); + public static MemberSurvey of(final Long surveyId, final Long questionId, final Integer answerNumber) { + return new MemberSurvey(surveyId, questionId, answerNumber); } } diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java deleted file mode 100644 index e112d213..00000000 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveyRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.atwoz.survey.domain.membersurvey; - -public interface MemberSurveyRepository { - - MemberSurvey save(MemberSurvey memberSurvey); - boolean existsByMemberIdAndQuestionId(Long memberId, Long questionId); -} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java new file mode 100644 index 00000000..051db27a --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java @@ -0,0 +1,61 @@ +package com.atwoz.survey.domain.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class MemberSurveys { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private Long memberId; + + @JoinColumn(name = "member_surveys_id") + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true, fetch = FetchType.LAZY) + private List memberSurveys = new ArrayList<>(); + + public static MemberSurveys createWithMemberId(final Long memberId) { + return MemberSurveys.builder() + .memberId(memberId) + .memberSurveys(new ArrayList<>()) + .build(); + } + + public void submitSurveys(final List requests) { + // 각 request에는 id와 questions이 있다. + List memberSurveys = new ArrayList<>(); + requests.forEach(request -> { + List convertedMemberSurveys = convertMemberSurveys(request.surveyId(), request.questions()); + memberSurveys.addAll(convertedMemberSurveys); + }); + this.memberSurveys.addAll(memberSurveys); + } + + private List convertMemberSurveys(final Long surveyId, final List questions) { + return questions.stream() + .map(question -> MemberSurvey.of(surveyId, question.questionId(), question.answerNumber())) + .toList(); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java new file mode 100644 index 00000000..a2288900 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java @@ -0,0 +1,9 @@ +package com.atwoz.survey.domain.membersurvey; + +import java.util.Optional; + +public interface MemberSurveysRepository { + + MemberSurveys save(MemberSurveys memberSurveys); + Optional findByMemberId(Long memberId); +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java deleted file mode 100644 index 4321903e..00000000 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyJpaRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.atwoz.survey.infrastructure.membersurvey; - -import com.atwoz.survey.domain.membersurvey.MemberSurvey; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MemberSurveyJpaRepository extends JpaRepository { - - MemberSurvey save(MemberSurvey memberSurvey); - boolean existsByMemberIdAndQuestionId(Long memberId, Long questionId); -} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java deleted file mode 100644 index 055cf486..00000000 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyRepositoryImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.atwoz.survey.infrastructure.membersurvey; - -import com.atwoz.survey.domain.membersurvey.MemberSurvey; -import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@RequiredArgsConstructor -@Repository -public class MemberSurveyRepositoryImpl implements MemberSurveyRepository { - - private final MemberSurveyJpaRepository memberSurveyJpaRepository; - - @Override - public MemberSurvey save(final MemberSurvey memberSurvey) { - return memberSurveyJpaRepository.save(memberSurvey); - } - - @Override - public boolean existsByMemberIdAndQuestionId(final Long memberId, final Long questionId) { - return memberSurveyJpaRepository.existsByMemberIdAndQuestionId(memberId, questionId); - } -} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepository.java new file mode 100644 index 00000000..13990f33 --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepository.java @@ -0,0 +1,12 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurveys; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface MemberSurveysJpaRepository extends JpaRepository { + + MemberSurveys save(MemberSurveys memberSurveys); + Optional findByMemberId(Long memberId); +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java new file mode 100644 index 00000000..26c72a7e --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java @@ -0,0 +1,25 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurveys; +import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@RequiredArgsConstructor +@Repository +public class MemberSurveysRepositoryImpl implements MemberSurveysRepository { + + private final MemberSurveysJpaRepository memberSurveysJpaRepository; + + @Override + public MemberSurveys save(final MemberSurveys memberSurveys) { + return memberSurveysJpaRepository.save(memberSurveys); + } + + @Override + public Optional findByMemberId(final Long memberId) { + return memberSurveysJpaRepository.findByMemberId(memberId); + } +} diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java deleted file mode 100644 index 4875cba8..00000000 --- a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveyController.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.atwoz.survey.ui.membersurvey; - -import com.atwoz.member.ui.auth.support.auth.AuthMember; -import com.atwoz.survey.application.membersurvey.MemberSurveyService; -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RequiredArgsConstructor -@RequestMapping("/api/members/me/surveys") -@RestController -public class MemberSurveyController { - - private final MemberSurveyService memberSurveyService; - - @PostMapping("/submit") - public ResponseEntity submitSurvey(@AuthMember final Long memberId, - @RequestBody @Valid final List request) { - memberSurveyService.submitSurvey(memberId, request); - return ResponseEntity.ok() - .build(); - } -} diff --git a/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java deleted file mode 100644 index b26ef40a..00000000 --- a/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveyServiceTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.atwoz.survey.application.membersurvey; - -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; -import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; -import com.atwoz.survey.domain.survey.SurveyRepository; -import com.atwoz.survey.exception.membersurvey.exceptions.RequiredSurveyNotSubmittedException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; -import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; -import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; -import com.atwoz.survey.infrastructure.membersurvey.MemberSurveyFakeRepository; -import com.atwoz.survey.infrastructure.survey.SurveyFakeRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.List; -import java.util.stream.Stream; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_두개씩; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_하나; -import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_두개씩; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.같은_필수_과목_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_같은_질문_답변_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_없는_답변_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_없는_질문_답변_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_질문_답변_일부분만_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_질문_두개_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.없는_과목_제출_요청; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -@SuppressWarnings("NonAsciiCharacters") -class MemberSurveyServiceTest { - - private MemberSurveyService memberSurveyService; - private MemberSurveyRepository memberSurveyRepository; - private SurveyRepository surveyRepository; - private Long memberId = 1L; - - @BeforeEach - void init() { - surveyRepository = new SurveyFakeRepository(); - memberSurveyRepository = new MemberSurveyFakeRepository(); - memberSurveyService = new MemberSurveyService(memberSurveyRepository, surveyRepository); - } - - @Test - void 회원이_연애고사_과목을_응시한다() { - // given - List requests = 필수_과목_질문_두개_제출_요청(); - surveyRepository.save(연애고사_필수_과목_질문_두개씩()); - - // when & then - assertDoesNotThrow(() -> memberSurveyService.submitSurvey(memberId, requests)); - } - - @Nested - class 연애고사_과목_응시_예외 { - - @Test - void 필수_과목을_응시하지_않으면_예외가_발생한다() { - // given - List requests = 선택_과목_질문_두개_제출_요청(); - surveyRepository.save(연애고사_필수_과목_질문_두개씩()); - surveyRepository.save(연애고사_선택_과목_질문_두개씩()); - - // when & then - assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) - .isInstanceOf(RequiredSurveyNotSubmittedException.class); - } - - @Test - void 같은_과목을_응시하면_예외가_발생한다() { - // given - List requests = 같은_필수_과목_제출_요청(); - surveyRepository.save(연애고사_필수_과목_질문_두개씩()); - surveyRepository.save(연애고사_선택_과목_질문_두개씩()); - - // when & then - assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) - .isInstanceOf(SurveySubmitDuplicateException.class); - } - - @Test - void 없는_과목을_응시하면_예외가_발생한다() { - // given - List requests = 없는_과목_제출_요청(); - surveyRepository.save(연애고사_선택_과목_질문_두개씩()); - - // when & then - assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) - .isInstanceOf(SurveyNotFoundException.class); - } - - @MethodSource("invalidQuestionSizeInputs") - @ParameterizedTest - void 과목이_가진_질문_수와_요청한_질문_수가_다르면_예외가_발생한다(final List requests) { - // given - surveyRepository.save(연애고사_선택_과목_질문_하나()); - - // when & then - assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) - .isInstanceOf(SurveyQuestionSubmitSizeNotMatchException.class); - } - - // 없는 질문에 답하거나, 같은 질문에 답하거나, 과목의 일부분 질문만 답하는 경우 - static Stream invalidQuestionSizeInputs() { - return Stream.of( - Arguments.arguments(선택_과목_같은_질문_답변_제출_요청()), - Arguments.arguments(선택_과목_없는_질문_답변_제출_요청()), - Arguments.arguments(선택_과목_질문_답변_일부분만_제출_요청()) - ); - } - - @Test - void 없는_번호의_답변_번호를_선택하면_예외가_발생한다() { - // given - List requests = 선택_과목_없는_답변_제출_요청(); - surveyRepository.save(연애고사_선택_과목_질문_하나()); - - // when & then - assertThatThrownBy(() -> memberSurveyService.submitSurvey(memberId, requests)) - .isInstanceOf(SurveyAnswerInvalidSubmitException.class); - } - } -} diff --git a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java index 6a9ab33b..7ab6b78b 100644 --- a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveyTest.java @@ -13,16 +13,16 @@ class MemberSurveyTest { @Test void 회원_연애고사_생성() { // given - Long memberId = 1L; + Long surveyId = 1L; Long questionId = 1L; Integer answerNumber = 1; // when - MemberSurvey memberSurvey = MemberSurvey.of(memberId, questionId, answerNumber); + MemberSurvey memberSurvey = MemberSurvey.of(surveyId, questionId, answerNumber); // then assertSoftly(softly -> { - softly.assertThat(memberSurvey.getMemberId()).isEqualTo(memberId); + softly.assertThat(memberSurvey.getSurveyId()).isEqualTo(surveyId); softly.assertThat(memberSurvey.getQuestionId()).isEqualTo(questionId); softly.assertThat(memberSurvey.getAnswerNumber()).isEqualTo(answerNumber); }); diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java deleted file mode 100644 index b6f53f0b..00000000 --- a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveyFakeRepository.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.atwoz.survey.infrastructure.membersurvey; - -import com.atwoz.survey.domain.membersurvey.MemberSurvey; -import com.atwoz.survey.domain.membersurvey.MemberSurveyRepository; - -import java.util.HashMap; -import java.util.Map; - -public class MemberSurveyFakeRepository implements MemberSurveyRepository { - - private final Map map = new HashMap<>(); - - private Long id = 1L; - - @Override - public MemberSurvey save(final MemberSurvey memberSurvey) { - MemberSurvey newMemberSurvey = MemberSurvey.builder() - .id(id++) - .memberId(memberSurvey.getMemberId()) - .questionId(memberSurvey.getQuestionId()) - .answerNumber(memberSurvey.getAnswerNumber()) - .build(); - map.put(newMemberSurvey.getId(), newMemberSurvey); - - return newMemberSurvey; - } - - @Override - public boolean existsByMemberIdAndQuestionId(final Long memberId, final Long questionId) { - return map.values() - .stream() - .anyMatch(memberSurvey -> isSameMemberSurvey(memberSurvey, memberId, questionId)); - } - - private boolean isSameMemberSurvey(final MemberSurvey memberSurvey, final Long memberId, final Long questionId) { - return memberId.equals(memberSurvey.getMemberId()) && questionId.equals(memberSurvey.getQuestionId()); - } -} From 017a24374875aa9dfb40877a242d7e6a06c9c382 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 13:05:07 +0900 Subject: [PATCH 42/65] =?UTF-8?q?test:=20MemberSurveysServiceTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurveysService 테스트 작성 - 관련 fake repository 생성 - 테스트를 위해 getter 추가 --- .../domain/membersurvey/MemberSurveys.java | 2 + .../MemberSurveysServiceTest.java | 133 ++++++++++++++++++ .../MemberSurveysFakeRepository.java | 33 +++++ 3 files changed, 168 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysServiceTest.java create mode 100644 src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java index 051db27a..4a192285 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java @@ -14,11 +14,13 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.Getter; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; +@Getter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysServiceTest.java b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysServiceTest.java new file mode 100644 index 00000000..bb970ac7 --- /dev/null +++ b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysServiceTest.java @@ -0,0 +1,133 @@ +package com.atwoz.survey.application.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.membersurvey.exceptions.RequiredSurveyNotSubmittedException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; +import com.atwoz.survey.exception.membersurvey.exceptions.SurveySubmitDuplicateException; +import com.atwoz.survey.exception.survey.exceptions.SurveyNotFoundException; +import com.atwoz.survey.infrastructure.membersurvey.MemberSurveysFakeRepository; +import com.atwoz.survey.infrastructure.survey.SurveyFakeRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_두개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_하나; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_두개씩; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.같은_필수_과목_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_같은_질문_답변_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_없는_답변_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_없는_질문_답변_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_질문_답변_일부분만_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.선택_과목_질문_두개_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.없는_과목_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class MemberSurveysServiceTest { + + private MemberSurveysService memberSurveysService; + private MemberSurveysRepository memberSurveysRepository; + private SurveyRepository surveyRepository; + private Long memberId = 1L; + + @BeforeEach + void init() { + memberSurveysRepository = new MemberSurveysFakeRepository(); + surveyRepository = new SurveyFakeRepository(); + memberSurveysService = new MemberSurveysService(memberSurveysRepository, surveyRepository); + } + + @Test + void 회원이_연애고사_과목을_응시한다() { + // given + List requests = 필수_과목_질문_두개_제출_요청(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + + // when & then + assertDoesNotThrow(() -> memberSurveysService.submitSurvey(memberId, requests)); + } + + @Nested + class 연애고사_과목_응시_예외 { + + @Test + void 필수_과목을_응시하지_않으면_예외가_발생한다() { + // given + List requests = 선택_과목_질문_두개_제출_요청(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + + // when & then + assertThatThrownBy(() -> memberSurveysService.submitSurvey(memberId, requests)) + .isInstanceOf(RequiredSurveyNotSubmittedException.class); + } + + @Test + void 같은_과목을_응시하면_예외가_발생한다() { + // given + List requests = 같은_필수_과목_제출_요청(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + + // when & then + assertThatThrownBy(() -> memberSurveysService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveySubmitDuplicateException.class); + } + + @Test + void 없는_과목을_응시하면_예외가_발생한다() { + // given + List requests = 없는_과목_제출_요청(); + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + + // when & then + assertThatThrownBy(() -> memberSurveysService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveyNotFoundException.class); + } + + @MethodSource("invalidQuestionSizeInputs") + @ParameterizedTest + void 과목이_가진_질문_수와_요청한_질문_수가_다르면_예외가_발생한다(final List requests) { + // given + surveyRepository.save(연애고사_선택_과목_질문_하나()); + + // when & then + assertThatThrownBy(() -> memberSurveysService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveyQuestionSubmitSizeNotMatchException.class); + } + + // 없는 질문에 답하거나, 같은 질문에 답하거나, 과목의 일부분 질문만 답하는 경우 + static Stream invalidQuestionSizeInputs() { + return Stream.of( + Arguments.arguments(선택_과목_같은_질문_답변_제출_요청()), + Arguments.arguments(선택_과목_없는_질문_답변_제출_요청()), + Arguments.arguments(선택_과목_질문_답변_일부분만_제출_요청()) + ); + } + + @Test + void 없는_번호의_답변_번호를_선택하면_예외가_발생한다() { + // given + List requests = 선택_과목_없는_답변_제출_요청(); + surveyRepository.save(연애고사_선택_과목_질문_하나()); + + // when & then + assertThatThrownBy(() -> memberSurveysService.submitSurvey(memberId, requests)) + .isInstanceOf(SurveyAnswerInvalidSubmitException.class); + } + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java new file mode 100644 index 00000000..19d92a44 --- /dev/null +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java @@ -0,0 +1,33 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurveys; +import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class MemberSurveysFakeRepository implements MemberSurveysRepository { + + private final Map map = new HashMap<>(); + + private Long id = 1L; + + @Override + public MemberSurveys save(final MemberSurveys memberSurveys) { + MemberSurveys newMemberSurveys = MemberSurveys.builder() + .id(id++) + .memberId(memberSurveys.getMemberId()) + .memberSurveys(memberSurveys.getMemberSurveys()) + .build(); + + map.put(id, newMemberSurveys); + + return newMemberSurveys; + } + + @Override + public Optional findByMemberId(final Long memberId) { + return Optional.ofNullable(map.get(memberId)); + } +} From 03c3474a75be9047dc0d050ec4e34ed35e48d1d1 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 13:19:42 +0900 Subject: [PATCH 43/65] =?UTF-8?q?refactor:=20submitSurveys=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - submitSurveys 주석 삭제 --- .../java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java index 4a192285..66d545bd 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java @@ -46,7 +46,6 @@ public static MemberSurveys createWithMemberId(final Long memberId) { } public void submitSurveys(final List requests) { - // 각 request에는 id와 questions이 있다. List memberSurveys = new ArrayList<>(); requests.forEach(request -> { List convertedMemberSurveys = convertMemberSurveys(request.surveyId(), request.questions()); From 619104bce9d297ef555f30d7108c0c3634475e8b Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 13:20:18 +0900 Subject: [PATCH 44/65] =?UTF-8?q?test:=20MemberSurveysTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurveys 테스트 작성 - equals&hashcode 재정의 - 관련 fixture 등록 --- .../domain/membersurvey/MemberSurvey.java | 2 + .../membersurvey/MemberSurveysTest.java | 47 +++++++++++++++++++ .../survey/fixture/MemberSurveyFixture.java | 21 +++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java create mode 100644 src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java index 5138036c..bf6bcf71 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurvey.java @@ -8,10 +8,12 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @Getter +@EqualsAndHashCode(exclude = "id") @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder diff --git a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java new file mode 100644 index 00000000..a28a6844 --- /dev/null +++ b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java @@ -0,0 +1,47 @@ +package com.atwoz.survey.domain.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; +import static com.atwoz.survey.fixture.MemberSurveyFixture.회원_연애고사_응시_필수_과목_두개; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class MemberSurveysTest { + + @Test + void 회원_id로_기본_생성() { + // given + Long memberId = 1L; + + // when + MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); + + // then + assertSoftly(softly -> { + softly.assertThat(memberSurveys.getMemberId()).isEqualTo(memberId); + softly.assertThat(memberSurveys.getMemberSurveys()).isEmpty(); + }); + } + + @Test + void 회원_연애고사_응시() { + // given + Long memberId = 1L; + List requests = 필수_과목_질문_두개_제출_요청(); + MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); + List expectMemberSurveys = 회원_연애고사_응시_필수_과목_두개(); + + // when + memberSurveys.submitSurveys(requests); + + // then + assertThat(memberSurveys.getMemberSurveys()).isEqualTo(expectMemberSurveys); + } +} diff --git a/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java new file mode 100644 index 00000000..256619c0 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java @@ -0,0 +1,21 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.domain.membersurvey.MemberSurvey; + +import java.util.List; + +public class MemberSurveyFixture { + + public static List 회원_연애고사_응시_필수_과목_두개() { + Long surveyId = 1L; + Long questionOneId = 1L; + Integer answerOneNumber = 1; + Long questionTwoId = 2L; + Integer answerTwoNumber = 2; + + return List.of( + MemberSurvey.of(surveyId, questionOneId, answerOneNumber), + MemberSurvey.of(surveyId, questionTwoId, answerTwoNumber) + ); + } +} From bcfe8d2008fddc73622f968e774b1ad82a86233c Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 13:37:24 +0900 Subject: [PATCH 45/65] =?UTF-8?q?test:=20MemberSurveysJpaRepositoryTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurveysJpaRepository 테스트 작성 --- .../MemberSurveysJpaRepositoryTest.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java new file mode 100644 index 00000000..7a45dd0d --- /dev/null +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java @@ -0,0 +1,58 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.MemberSurveys; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; +import java.util.Optional; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +@DataJpaTest +class MemberSurveysJpaRepositoryTest { + + @Autowired + private MemberSurveysJpaRepository memberSurveysJpaRepository; + + @Test + void 회원_연애고사_응시() { + // given + Long memberId = 1L; + MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); + List requests = 필수_과목_질문_두개_제출_요청(); + memberSurveys.submitSurveys(requests); + + // when + MemberSurveys savedMemberSurveys = memberSurveysJpaRepository.save(memberSurveys); + + // then + assertThat(memberSurveys).usingRecursiveComparison() + .isEqualTo(savedMemberSurveys); + } + + @Test + void 회원_연애고사_조회() { + // given + Long memberId = 1L; + MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); + MemberSurveys savedMemberSurveys = memberSurveysJpaRepository.save(memberSurveys); + + // when + Optional foundMemberSurveys = memberSurveysJpaRepository.findByMemberId(memberId); + + // then + assertSoftly(softly -> { + softly.assertThat(foundMemberSurveys).isPresent(); + softly.assertThat(foundMemberSurveys.get()).usingRecursiveComparison() + .isEqualTo(savedMemberSurveys); + }); + } +} From 2c7897a6aa55020395065cf99033942fadcbf49e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 13:46:05 +0900 Subject: [PATCH 46/65] =?UTF-8?q?refactor:=20then=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - then절 추가 --- .../com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java index e33e8099..f3ed8703 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerWebMvcTest.java @@ -49,7 +49,7 @@ class SurveyControllerWebMvcTest extends MockBeanInjection { Survey survey = 연애고사_필수_과목_질문_두개씩_전부_id_있음(); when(surveyService.addSurvey(request)).thenReturn(survey); - // when + // when & then mockMvc.perform(post("/api/surveys") .header(HttpHeaders.AUTHORIZATION, "bearer tokenInfo...") .contentType("application/json") From e2f6d37e70e7a429d16ae9b3d36e4312ed7900b0 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 14:19:32 +0900 Subject: [PATCH 47/65] =?UTF-8?q?refactor:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20SurveyRepository=20=EC=9D=98=EC=A1=B4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SurveyControllerAcceptanceFixture 의존성 삭제 --- .../survey/ui/survey/SurveyControllerAcceptanceFixture.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java index e507a106..ef6eeec6 100644 --- a/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java +++ b/src/test/java/com/atwoz/survey/ui/survey/SurveyControllerAcceptanceFixture.java @@ -5,7 +5,6 @@ import com.atwoz.member.domain.member.MemberRepository; import com.atwoz.member.infrastructure.auth.JwtTokenProvider; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; -import com.atwoz.survey.domain.survey.SurveyRepository; import com.atwoz.survey.ui.survey.dto.SurveyCreateResponse; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; @@ -30,9 +29,6 @@ class SurveyControllerAcceptanceFixture extends IntegrationHelper { @Autowired private MemberRepository memberRepository; - @Autowired - private SurveyRepository surveyRepository; - protected Member 회원_생성() { return memberRepository.save(일반_유저_생성()); } From 6e7cfcee89e7d59b929d6865998b4c29f75c2b17 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 14:30:51 +0900 Subject: [PATCH 48/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=97=B0?= =?UTF-8?q?=EC=95=A0=EA=B3=A0=EC=82=AC=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberSurveysController 구현 - 관련 통합 테스트 작성 - 관련 인수 테스트 작성 - 관련 API 문서 작성 --- src/docs/asciidoc/index.adoc | 1 + src/docs/asciidoc/membersurveys.adoc | 17 +++++ .../membersurvey/MemberSurveysController.java | 32 +++++++++ .../com/atwoz/helper/MockBeanInjection.java | 4 ++ ...berSurveysControllerAcceptanceFixture.java | 63 +++++++++++++++++ ...MemberSurveysControllerAcceptanceTest.java | 33 +++++++++ .../MemberSurveysControllerWebMvcTest.java | 68 +++++++++++++++++++ 7 files changed, 218 insertions(+) create mode 100644 src/docs/asciidoc/membersurveys.adoc create mode 100644 src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java create mode 100644 src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java create mode 100644 src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java create mode 100644 src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 4418eacf..88d5360e 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -10,3 +10,4 @@ * link:mission.adoc[미션 API] * link:membermissions.adoc[회원 미션 API] * link:survey.adoc[연애고사 API] +* link:membersurveys.adoc[회원 연애고사 API] diff --git a/src/docs/asciidoc/membersurveys.adoc b/src/docs/asciidoc/membersurveys.adoc new file mode 100644 index 00000000..c16af679 --- /dev/null +++ b/src/docs/asciidoc/membersurveys.adoc @@ -0,0 +1,17 @@ +:toc: left +:source-highlighter: highlightjs +:sectlinks: +:toclevels: 2 +:sectlinks: +:sectnums: + +== MemberSurveys + +=== 연애고사 응시 (POST /api/members/me/surveys/submit) + +==== 요청 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/request-fields.adoc[] +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/http-request.adoc[] + +==== 응답 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/http-response.adoc[] diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java new file mode 100644 index 00000000..1c981f55 --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java @@ -0,0 +1,32 @@ +package com.atwoz.survey.ui.membersurvey; + +import com.atwoz.member.ui.auth.support.auth.AuthMember; +import com.atwoz.survey.application.membersurvey.MemberSurveysService; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RequiredArgsConstructor +@RequestMapping("/api/members/me/surveys") +@RestController +public class MemberSurveysController { + + private final MemberSurveysService memberSurveysService; + + @PostMapping("/submit") + public ResponseEntity submitSurveys(@AuthMember final Long memberId, + @RequestBody @Valid final List requests) { + memberSurveysService.submitSurvey(memberId, requests); + + return ResponseEntity.status(HttpStatus.CREATED) + .build(); + } +} diff --git a/src/test/java/com/atwoz/helper/MockBeanInjection.java b/src/test/java/com/atwoz/helper/MockBeanInjection.java index 384bfadb..d6388896 100644 --- a/src/test/java/com/atwoz/helper/MockBeanInjection.java +++ b/src/test/java/com/atwoz/helper/MockBeanInjection.java @@ -14,6 +14,7 @@ import com.atwoz.mission.application.membermission.MemberMissionsService; import com.atwoz.mission.application.mission.MissionQueryService; import com.atwoz.mission.application.mission.MissionService; +import com.atwoz.survey.application.membersurvey.MemberSurveysService; import com.atwoz.survey.application.survey.SurveyService; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext; @@ -65,4 +66,7 @@ public class MockBeanInjection { @MockBean protected SurveyService surveyService; + + @MockBean + protected MemberSurveysService memberSurveysService; } diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java new file mode 100644 index 00000000..df92fbdc --- /dev/null +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java @@ -0,0 +1,63 @@ +package com.atwoz.survey.ui.membersurvey; + +import com.atwoz.helper.IntegrationHelper; +import com.atwoz.member.domain.member.Member; +import com.atwoz.member.domain.member.MemberRepository; +import com.atwoz.member.infrastructure.auth.JwtTokenProvider; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.survey.SurveyRepository; +import io.restassured.RestAssured; +import io.restassured.response.ExtractableResponse; +import io.restassured.response.Response; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; + +import java.util.List; +import static com.atwoz.member.fixture.MemberFixture.일반_유저_생성; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_두개씩; +import static io.restassured.http.ContentType.JSON; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class MemberSurveysControllerAcceptanceFixture extends IntegrationHelper { + + @Autowired + private JwtTokenProvider jwtTokenProvider; + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private SurveyRepository surveyRepository; + + protected Member 회원_생성() { + return memberRepository.save(일반_유저_생성()); + } + + protected String 토큰_생성(final Member member) { + return jwtTokenProvider.createTokenWithId(member.getId()); + } + + protected void 연애고사_필수_과목_질문_두개씩_생성() { + surveyRepository.save(연애고사_선택_과목_질문_두개씩()); + } + + protected ExtractableResponse 연애고사_응시_요청(final String url, final String token, final List requests) { + return RestAssured.given().log().all() + .header(AUTHORIZATION, "Bearer " + token) + .contentType(JSON) + .body(requests) + .when() + .post(url) + .then() + .extract(); + } + + protected void 연애고사_응시_검증(final ExtractableResponse response) { + assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); + } +} diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java new file mode 100644 index 00000000..5f872d7f --- /dev/null +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java @@ -0,0 +1,33 @@ +package com.atwoz.survey.ui.membersurvey; + +import com.atwoz.member.domain.member.Member; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; + +public class MemberSurveysControllerAcceptanceTest extends MemberSurveysControllerAcceptanceFixture { + + private static final String 연애고사_응시_url = "/api/members/me/surveys/submit"; + + private Member 회원; + private String 토큰; + + @BeforeEach + void setup() { + 회원 = 회원_생성(); + 토큰 = 토큰_생성(회원); + } + + @Test + void 연애고사를_응시한다() { + // given + 연애고사_필수_과목_질문_두개씩_생성(); + + // when + var 연애고사_응시_결과 = 연애고사_응시_요청(연애고사_응시_url, 토큰, 필수_과목_질문_두개_제출_요청()); + + // then + 연애고사_응시_검증(연애고사_응시_결과); + } +} diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java new file mode 100644 index 00000000..02a009b7 --- /dev/null +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java @@ -0,0 +1,68 @@ +package com.atwoz.survey.ui.membersurvey; + +import com.atwoz.helper.MockBeanInjection; +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.List; +import static com.atwoz.helper.RestDocsHelper.customDocument; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +@AutoConfigureRestDocs +@WebMvcTest(MemberSurveysController.class) +class MemberSurveysControllerWebMvcTest extends MockBeanInjection { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc; + + @Test + void 회원이_연애고사_과목을_응시한다() throws Exception { + // given + String bearerToken = "Bearer token"; + List requests = 필수_과목_질문_두개_제출_요청(); + + // when & then + mockMvc.perform(post("/api/members/me/surveys/submit") + .contentType("application/json") + .content(objectMapper.writeValueAsString(requests)) + .header(AUTHORIZATION, bearerToken)) + .andExpect(status().isCreated()) + .andDo(print()) + .andDo(customDocument("회원_연애고사_응시", + requestHeaders( + headerWithName(AUTHORIZATION) + .description("유저 토큰 정보") + ), + requestFields( + fieldWithPath("[].surveyId") + .description("연애고사 과목 id"), + fieldWithPath("[].questions") + .description("연애고사 과목 별 질문"), + fieldWithPath("[].questions.[].questionId") + .description("각 질문 별 id"), + fieldWithPath("[].questions.[].answerNumber") + .description("각 질문에 대한 답변 번호") + ) + )); + } +} From 81d8368b7c568b344bc956f39f6c8c884ca4fccf Mon Sep 17 00:00:00 2001 From: devholic22 Date: Mon, 13 May 2024 14:48:25 +0900 Subject: [PATCH 49/65] =?UTF-8?q?refactor:=20valid=20message=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애고사 응시 제출 dto valid message 추가 --- .../membersurvey/dto/SurveyQuestionSubmitRequest.java | 4 ++++ .../application/membersurvey/dto/SurveySubmitRequest.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java index f27460c1..33cdde4a 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveyQuestionSubmitRequest.java @@ -1,7 +1,11 @@ package com.atwoz.survey.application.membersurvey.dto; +import jakarta.validation.constraints.NotNull; + public record SurveyQuestionSubmitRequest( + @NotNull(message = "응시할 연애고사 질문 id가 작성되어야 합니다.") Long questionId, + @NotNull(message = "응시할 연애고사 답변 번호가 작성되어야 합니다.") Integer answerNumber ) { } diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java index d7bb6961..e8a20e82 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/dto/SurveySubmitRequest.java @@ -1,9 +1,13 @@ package com.atwoz.survey.application.membersurvey.dto; +import jakarta.validation.constraints.NotNull; + import java.util.List; public record SurveySubmitRequest( + @NotNull(message = "응시할 연애고사 과목 id가 작성되어야 합니다.") Long surveyId, + @NotNull(message = "응시할 연애고사 질문이 작성되어야 합니다.") List questions ) { } From 7e50bef76cc5d38c0aad1d87f3bbe615a24e78cb Mon Sep 17 00:00:00 2001 From: devholic22 Date: Wed, 15 May 2024 23:33:49 +0900 Subject: [PATCH 50/65] =?UTF-8?q?feat:=20=EC=97=B0=EC=95=A0=EA=B3=A0?= =?UTF-8?q?=EC=82=AC=20=EB=A7=A4=EC=B9=AD=20=ED=9A=8C=EC=9B=90=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 연애고사 매칭 회원 목록 조회 기능 구현 - 관련 인수 테스트 작성 --- .../MemberSurveysQueryService.java | 20 ++++++ .../membersurvey/MemberSurveysRepository.java | 2 + .../MemberSurveysQueryRepository.java | 71 +++++++++++++++++++ .../MemberSurveysRepositoryImpl.java | 7 ++ .../dto/MemberSurveyResponse.java | 8 +++ .../membersurvey/MemberSurveysController.java | 12 ++++ .../dto/MatchMemberSearchResponse.java | 8 +++ .../com/atwoz/helper/MockBeanInjection.java | 4 ++ .../fixture/SurveyCreateRequestFixture.java | 14 ++++ .../atwoz/survey/fixture/SurveyFixture.java | 5 ++ .../fixture/SurveySubmitRequestFixture.java | 19 +++++ .../MemberSurveysFakeRepository.java | 6 ++ ...berSurveysControllerAcceptanceFixture.java | 30 ++++++++ ...MemberSurveysControllerAcceptanceTest.java | 28 ++++++++ 14 files changed, 234 insertions(+) create mode 100644 src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java create mode 100644 src/main/java/com/atwoz/survey/ui/membersurvey/dto/MatchMemberSearchResponse.java diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java new file mode 100644 index 00000000..c128e10d --- /dev/null +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java @@ -0,0 +1,20 @@ +package com.atwoz.survey.application.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Service +public class MemberSurveysQueryService { + + private final MemberSurveysRepository memberSurveysRepository; + + public List findMatchMembers(final Long memberId) { + return memberSurveysRepository.findMatchMembers(memberId); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java index a2288900..579e3e41 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java @@ -1,9 +1,11 @@ package com.atwoz.survey.domain.membersurvey; +import java.util.List; import java.util.Optional; public interface MemberSurveysRepository { MemberSurveys save(MemberSurveys memberSurveys); Optional findByMemberId(Long memberId); + List findMatchMembers(Long memberId); } diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java new file mode 100644 index 00000000..970218dd --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java @@ -0,0 +1,71 @@ +package com.atwoz.survey.infrastructure.membersurvey; + +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor +@Repository +public class MemberSurveysQueryRepository { + + private static final int MINIMUM_MATCH_SIZE = 30; + + private final JdbcTemplate jdbcTemplate; + + public List findMatchMembers(final Long memberId) { + List memberSurveyResponses = convertMemberSurveyResponses(memberId); + List result = new ArrayList<>(); + + List otherMembers = collectMembersExceptCurrentMember(memberId); + otherMembers.forEach(id -> { + List otherMemberSurveyResponses = convertMemberSurveyResponses(id); + if (isMatched(memberSurveyResponses, otherMemberSurveyResponses)) { + result.add(id); + } + }); + return result; + } + + private List convertMemberSurveyResponses(final Long memberId) { + String sql = "SELECT mss.member_id, ms.survey_id, ms.question_id, ms.answer_number " + + "FROM member_surveys mss " + + "INNER JOIN member_survey ms " + + "ON mss.id = ms.member_surveys_id " + + "WHERE mss.member_id = ?"; + return jdbcTemplate.query(sql, new Object[]{memberId}, + (rs, rowNum) -> new MemberSurveyResponse( + rs.getLong("member_id"), + rs.getLong("survey_id"), + rs.getLong("question_id"), + rs.getInt("answer_number") + ) + ); + } + + private List collectMembersExceptCurrentMember(final Long memberId) { + String sql = "SELECT DISTINCT member_id FROM member_surveys WHERE member_id != ?"; + return jdbcTemplate.queryForList(sql, new Object[]{memberId}, Long.class); + } + + private boolean isMatched(final List memberResponse, final List otherResponse) { + int matchedSurveyAnswer = 0; + for (MemberSurveyResponse member : memberResponse) { + for (MemberSurveyResponse other : otherResponse) { + if (isSameAnswer(member, other)) { + matchedSurveyAnswer++; + } + } + } + return matchedSurveyAnswer >= MINIMUM_MATCH_SIZE; + } + + private static boolean isSameAnswer(final MemberSurveyResponse member, final MemberSurveyResponse other) { + return member.surveyId().equals(other.surveyId()) && + member.questionId().equals(other.questionId()) && + member.answerNumber().equals(other.answerNumber()); + } +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java index 26c72a7e..aa7d40fb 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @RequiredArgsConstructor @@ -12,6 +13,7 @@ public class MemberSurveysRepositoryImpl implements MemberSurveysRepository { private final MemberSurveysJpaRepository memberSurveysJpaRepository; + private final MemberSurveysQueryRepository memberSurveysQueryRepository; @Override public MemberSurveys save(final MemberSurveys memberSurveys) { @@ -22,4 +24,9 @@ public MemberSurveys save(final MemberSurveys memberSurveys) { public Optional findByMemberId(final Long memberId) { return memberSurveysJpaRepository.findByMemberId(memberId); } + + @Override + public List findMatchMembers(final Long memberId) { + return memberSurveysQueryRepository.findMatchMembers(memberId); + } } diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java new file mode 100644 index 00000000..15f7e833 --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.infrastructure.membersurvey.dto; + +public record MemberSurveyResponse( + Long memberId, + Long surveyId, + Long questionId, + Integer answerNumber) { +} diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java index 1c981f55..c74e2e0d 100644 --- a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java +++ b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java @@ -1,12 +1,15 @@ package com.atwoz.survey.ui.membersurvey; import com.atwoz.member.ui.auth.support.auth.AuthMember; +import com.atwoz.survey.application.membersurvey.MemberSurveysQueryService; import com.atwoz.survey.application.membersurvey.MemberSurveysService; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.ui.membersurvey.dto.MatchMemberSearchResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,6 +23,7 @@ public class MemberSurveysController { private final MemberSurveysService memberSurveysService; + private final MemberSurveysQueryService memberSurveysQueryService; @PostMapping("/submit") public ResponseEntity submitSurveys(@AuthMember final Long memberId, @@ -29,4 +33,12 @@ public ResponseEntity submitSurveys(@AuthMember final Long memberId, return ResponseEntity.status(HttpStatus.CREATED) .build(); } + + @GetMapping("/match") + public ResponseEntity findMatchMembers(@AuthMember final Long memberId) { + List members = memberSurveysQueryService.findMatchMembers(memberId); + + return ResponseEntity.ok() + .body(new MatchMemberSearchResponse(members)); + } } diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/dto/MatchMemberSearchResponse.java b/src/main/java/com/atwoz/survey/ui/membersurvey/dto/MatchMemberSearchResponse.java new file mode 100644 index 00000000..9711290b --- /dev/null +++ b/src/main/java/com/atwoz/survey/ui/membersurvey/dto/MatchMemberSearchResponse.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.ui.membersurvey.dto; + +import java.util.List; + +public record MatchMemberSearchResponse( + List members +) { +} diff --git a/src/test/java/com/atwoz/helper/MockBeanInjection.java b/src/test/java/com/atwoz/helper/MockBeanInjection.java index d6388896..ad834518 100644 --- a/src/test/java/com/atwoz/helper/MockBeanInjection.java +++ b/src/test/java/com/atwoz/helper/MockBeanInjection.java @@ -14,6 +14,7 @@ import com.atwoz.mission.application.membermission.MemberMissionsService; import com.atwoz.mission.application.mission.MissionQueryService; import com.atwoz.mission.application.mission.MissionService; +import com.atwoz.survey.application.membersurvey.MemberSurveysQueryService; import com.atwoz.survey.application.membersurvey.MemberSurveysService; import com.atwoz.survey.application.survey.SurveyService; import org.springframework.boot.test.mock.mockito.MockBean; @@ -69,4 +70,7 @@ public class MockBeanInjection { @MockBean protected MemberSurveysService memberSurveysService; + + @MockBean + protected MemberSurveysQueryService memberSurveysQueryService; } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java index 3cae0675..d33e6564 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyCreateRequestFixture.java @@ -4,6 +4,7 @@ import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; +import java.util.ArrayList; import java.util.List; public class SurveyCreateRequestFixture { @@ -21,6 +22,19 @@ public class SurveyCreateRequestFixture { )); } + public static SurveyCreateRequest 연애고사_필수_과목_질문_30개씩_생성_요청() { + List questions = new ArrayList<>(); + for (int i = 1; i <= 30; i++) { + questions.add(new SurveyQuestionCreateRequest("질문 내용" + i, List.of( + SurveyAnswerCreateRequest.of(1, "답변1"), + SurveyAnswerCreateRequest.of(2, "답변2"), + SurveyAnswerCreateRequest.of(3, "답변3"), + SurveyAnswerCreateRequest.of(4, "답변4") + ))); + } + return new SurveyCreateRequest("과목 제목", true, questions); + } + public static SurveyCreateRequest 연애고사_선택_과목_질문_두개씩_생성_요청() { return new SurveyCreateRequest("선택 과목 제목", false, List.of( new SurveyQuestionCreateRequest("질문 내용1", List.of( diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index fa5f8b3d..e094448b 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -5,6 +5,7 @@ import java.util.List; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_하나_생성_요청; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_30개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_두개_id_있음; import static com.atwoz.survey.fixture.SurveyQuestionFixture.연애고사_질문_답변_한개_id_있음; @@ -15,6 +16,10 @@ public class SurveyFixture { return Survey.from(연애고사_필수_과목_질문_두개씩_생성_요청()); } + public static Survey 연애고사_필수_과목_질문_30개씩() { + return Survey.from(연애고사_필수_과목_질문_30개씩_생성_요청()); + } + public static Survey 연애고사_선택_과목_질문_두개씩() { return Survey.from(연애고사_선택_과목_질문_두개씩_생성_요청()); } diff --git a/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java index 5915f2af..16fd9ad7 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveySubmitRequestFixture.java @@ -3,6 +3,7 @@ import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import java.util.ArrayList; import java.util.List; public class SurveySubmitRequestFixture { @@ -22,6 +23,24 @@ public class SurveySubmitRequestFixture { ); } + public static List 필수_과목_질문_30개_제출_요청_전부_1번() { + Long surveyId = 1L; + List questions = new ArrayList<>(); + for (int i = 1; i <= 30; i++) { + questions.add(new SurveyQuestionSubmitRequest((long) i, 1)); + } + return List.of(new SurveySubmitRequest(surveyId, questions)); + } + + public static List 필수_과목_질문_30개_제출_요청_전부_2번() { + Long surveyId = 1L; + List questions = new ArrayList<>(); + for (int i = 1; i <= 30; i++) { + questions.add(new SurveyQuestionSubmitRequest((long) i, 2)); + } + return List.of(new SurveySubmitRequest(surveyId, questions)); + } + public static List 선택_과목_질문_두개_제출_요청() { Long surveyId = 2L; Long questionOneId = 1L; diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java index 19d92a44..fc3e4b29 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java @@ -4,6 +4,7 @@ import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -30,4 +31,9 @@ public MemberSurveys save(final MemberSurveys memberSurveys) { public Optional findByMemberId(final Long memberId) { return Optional.ofNullable(map.get(memberId)); } + + @Override + public List findMatchMembers(final Long memberId) { + return List.of(); + } } diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java index df92fbdc..7d54f89c 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java @@ -6,6 +6,7 @@ import com.atwoz.member.infrastructure.auth.JwtTokenProvider; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.ui.membersurvey.dto.MatchMemberSearchResponse; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; @@ -17,8 +18,10 @@ import java.util.List; import static com.atwoz.member.fixture.MemberFixture.일반_유저_생성; import static com.atwoz.survey.fixture.SurveyFixture.연애고사_선택_과목_질문_두개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_30개씩; import static io.restassured.http.ContentType.JSON; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; import static org.springframework.http.HttpHeaders.AUTHORIZATION; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @@ -38,6 +41,10 @@ class MemberSurveysControllerAcceptanceFixture extends IntegrationHelper { return memberRepository.save(일반_유저_생성()); } + protected Member 회원_생성(final String nickname, final String phoneNumber) { + return memberRepository.save(일반_유저_생성(nickname, phoneNumber)); + } + protected String 토큰_생성(final Member member) { return jwtTokenProvider.createTokenWithId(member.getId()); } @@ -46,6 +53,10 @@ class MemberSurveysControllerAcceptanceFixture extends IntegrationHelper { surveyRepository.save(연애고사_선택_과목_질문_두개씩()); } + protected void 연애고사_필수_과목_질문_30개씩_생성() { + surveyRepository.save(연애고사_필수_과목_질문_30개씩()); + } + protected ExtractableResponse 연애고사_응시_요청(final String url, final String token, final List requests) { return RestAssured.given().log().all() .header(AUTHORIZATION, "Bearer " + token) @@ -60,4 +71,23 @@ class MemberSurveysControllerAcceptanceFixture extends IntegrationHelper { protected void 연애고사_응시_검증(final ExtractableResponse response) { assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); } + + protected ExtractableResponse 연애고사_매칭(final String url, final String token) { + return RestAssured.given().log().all() + .header(AUTHORIZATION, "Bearer " + token) + .contentType(JSON) + .when() + .get(url) + .then() + .extract(); + } + + protected void 연애고사_매칭_검증(final ExtractableResponse response, final Long memberOneId, final Long memberTwoId) { + MatchMemberSearchResponse match = response.as(MatchMemberSearchResponse.class); + assertSoftly(softly -> { + softly.assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()); + softly.assertThat(match.members()).contains(memberOneId); + softly.assertThat(match.members()).doesNotContain(memberTwoId); + }); + } } diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java index 5f872d7f..71da7425 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java @@ -2,13 +2,20 @@ import com.atwoz.member.domain.member.Member; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_30개_제출_요청_전부_1번; +import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_30개_제출_요청_전부_2번; import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") public class MemberSurveysControllerAcceptanceTest extends MemberSurveysControllerAcceptanceFixture { private static final String 연애고사_응시_url = "/api/members/me/surveys/submit"; + private static final String 연애고사_매칭_url = "/api/members/me/surveys/match"; private Member 회원; private String 토큰; @@ -30,4 +37,25 @@ void setup() { // then 연애고사_응시_검증(연애고사_응시_결과); } + + @Test + void 서로_응시_결과가_같은_회원을_매칭한다() { + // given + 연애고사_필수_과목_질문_30개씩_생성(); + 연애고사_응시_요청(연애고사_응시_url, 토큰, 필수_과목_질문_30개_제출_요청_전부_1번()); + + Member 다른_회원_1 = 회원_생성("hello1", "010-000-0000"); + String 회원_1_토큰 = 토큰_생성(다른_회원_1); + 연애고사_응시_요청(연애고사_응시_url, 회원_1_토큰, 필수_과목_질문_30개_제출_요청_전부_1번()); + + Member 다른_회원_2 = 회원_생성("hello2", "010-111-1111"); + String 회원_2_토큰 = 토큰_생성(다른_회원_2); + 연애고사_응시_요청(연애고사_응시_url, 회원_2_토큰, 필수_과목_질문_30개_제출_요청_전부_2번()); + + // when + var 연애고사_매칭_결과 = 연애고사_매칭(연애고사_매칭_url, 토큰); + + // then + 연애고사_매칭_검증(연애고사_매칭_결과, 다른_회원_1.getId(), 다른_회원_2.getId()); + } } From 9bbf8e7735ba254573749e0e97fb6307bb24f13a Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 01:38:08 +0900 Subject: [PATCH 51/65] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 함수명 문법 표현 통일을 위한 수정 --- .../java/com/atwoz/survey/domain/survey/Survey.java | 4 ++-- .../atwoz/survey/domain/survey/SurveyQuestion.java | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index d48e0037..9c8e3c80 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -51,7 +51,7 @@ private Survey(final String name, final Boolean required) { } public static Survey from(final SurveyCreateRequest request) { - validateQuestionsIsNotDuplicated(request.questions()); + validateIsQuestionsNotDuplicated(request.questions()); Survey survey = new Survey(request.name(), request.required()); survey.addSurveyQuestions(request.questions()); @@ -59,7 +59,7 @@ public static Survey from(final SurveyCreateRequest request) { return survey; } - private static void validateQuestionsIsNotDuplicated(final List questionRequests) { + private static void validateIsQuestionsNotDuplicated(final List questionRequests) { List questions = questionRequests.stream() .map(SurveyQuestionCreateRequest::description) .toList(); diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 86780bf8..50a24387 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -49,7 +49,7 @@ private SurveyQuestion(final String description) { } public static SurveyQuestion of(final String description, final List answers) { - validateAnswersAreNotDuplicated(answers); + validateIsAnswersNotDuplicated(answers); SurveyQuestion surveyQuestion = new SurveyQuestion(description); surveyQuestion.addSurveyAnswers(answers); @@ -57,12 +57,12 @@ public static SurveyQuestion of(final String description, final List answers) { - validateAnswerNumbersAreNotDuplicated(answers); - validateAnswerDescriptionsAreNotDuplicated(answers); + private static void validateIsAnswersNotDuplicated(final List answers) { + validateIsAnswerNumbersNotDuplicated(answers); + validateIsAnswerDescriptionsNotDuplicated(answers); } - private static void validateAnswerNumbersAreNotDuplicated(final List answers) { + private static void validateIsAnswerNumbersNotDuplicated(final List answers) { List answerNumbers = answers.stream() .map(SurveyAnswerCreateRequest::number) .toList(); @@ -72,7 +72,7 @@ private static void validateAnswerNumbersAreNotDuplicated(final List answers) { + private static void validateIsAnswerDescriptionsNotDuplicated(final List answers) { List answerDescriptions = answers.stream() .map(SurveyAnswerCreateRequest::answer) .toList(); From 2b9b007c44a4ea6b7b3d8c346548c6746c409963 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 01:39:00 +0900 Subject: [PATCH 52/65] =?UTF-8?q?refactor:=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MVP 단계를 고려하여 수정 기능은 아예 개발해두지 않도록 수정 --- .../atwoz/survey/domain/survey/Survey.java | 8 ----- .../survey/domain/survey/SurveyTest.java | 29 +------------------ 2 files changed, 1 insertion(+), 36 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index 9c8e3c80..d5e810ae 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -84,14 +84,6 @@ public void validateIsValidSubmitSurveyRequest(final SurveyComparisonRequest req questions.forEach(question -> question.validateIsValidSubmitAnswer(request.questions())); } - public void updateName(final String name) { - this.name = name; - } - - public void updateRequired(final Boolean required) { - this.required = required; - } - public boolean isSameName(final String name) { return name.equals(this.name); } diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index 89e3e4fa..e0fdb0ec 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -22,11 +22,10 @@ import java.util.List; import java.util.stream.Stream; -import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_두개씩_생성_요청; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_번호_음수; +import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_필수_과목_질문_중복; import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_한개씩_전부_id_있음; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.SoftAssertions.assertSoftly; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -61,32 +60,6 @@ class SurveyTest { }); } - @Test - void 연애고사_과목_이름_수정() { - // given - SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); - Survey survey = Survey.from(request); - - // when - survey.updateName("설문 제목 수정"); - - // then - assertThat(survey.getName()).isEqualTo("설문 제목 수정"); - } - - @Test - void 연애고사_과목_필수_여부_수정() { - // given - SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); - Survey survey = Survey.from(request); - - // when - survey.updateRequired(false); - - // then - assertThat(survey.getRequired()).isEqualTo(false); - } - @Test void 설문_응시_조건_검사_통과() { // given From 974ac87d4583b700ce89e7051d23c0c187d0cf25 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 17:27:33 +0900 Subject: [PATCH 53/65] =?UTF-8?q?refactor:=20=EB=A6=AC=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=84=B0=EB=A6=AC=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JDBC 기반을 사용하므로 리포지터리 이름 변경 --- ...ryRepository.java => MemberSurveysJdbcRepository.java} | 8 ++++---- .../membersurvey/MemberSurveysRepositoryImpl.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/com/atwoz/survey/infrastructure/membersurvey/{MemberSurveysQueryRepository.java => MemberSurveysJdbcRepository.java} (92%) diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java similarity index 92% rename from src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java rename to src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java index 970218dd..c2fb7d41 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysQueryRepository.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java @@ -10,19 +10,19 @@ @RequiredArgsConstructor @Repository -public class MemberSurveysQueryRepository { +public class MemberSurveysJdbcRepository { private static final int MINIMUM_MATCH_SIZE = 30; private final JdbcTemplate jdbcTemplate; public List findMatchMembers(final Long memberId) { - List memberSurveyResponses = convertMemberSurveyResponses(memberId); + List memberSurveyResponses = convertMemberSurveys(memberId); List result = new ArrayList<>(); List otherMembers = collectMembersExceptCurrentMember(memberId); otherMembers.forEach(id -> { - List otherMemberSurveyResponses = convertMemberSurveyResponses(id); + List otherMemberSurveyResponses = convertMemberSurveys(id); if (isMatched(memberSurveyResponses, otherMemberSurveyResponses)) { result.add(id); } @@ -30,7 +30,7 @@ public List findMatchMembers(final Long memberId) { return result; } - private List convertMemberSurveyResponses(final Long memberId) { + private List convertMemberSurveys(final Long memberId) { String sql = "SELECT mss.member_id, ms.survey_id, ms.question_id, ms.answer_number " + "FROM member_surveys mss " + "INNER JOIN member_survey ms " + diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java index aa7d40fb..249bfcc7 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java @@ -13,7 +13,7 @@ public class MemberSurveysRepositoryImpl implements MemberSurveysRepository { private final MemberSurveysJpaRepository memberSurveysJpaRepository; - private final MemberSurveysQueryRepository memberSurveysQueryRepository; + private final MemberSurveysJdbcRepository memberSurveysJdbcRepository; @Override public MemberSurveys save(final MemberSurveys memberSurveys) { @@ -27,6 +27,6 @@ public Optional findByMemberId(final Long memberId) { @Override public List findMatchMembers(final Long memberId) { - return memberSurveysQueryRepository.findMatchMembers(memberId); + return memberSurveysJdbcRepository.findMatchMembers(memberId); } } From a72295239ed5d61ad5d9f5f2d28941f030203b4e Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 17:32:22 +0900 Subject: [PATCH 54/65] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=97=B0=EC=95=A0=EA=B3=A0=EC=82=AC=20=EC=9D=91=EC=8B=9C=20URL?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RESTful을 위해 회원 연애고사 응시 URL 변경 --- .../atwoz/survey/ui/membersurvey/MemberSurveysController.java | 2 +- .../ui/membersurvey/MemberSurveysControllerAcceptanceTest.java | 2 +- .../ui/membersurvey/MemberSurveysControllerWebMvcTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java index c74e2e0d..cdfd7772 100644 --- a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java +++ b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java @@ -25,7 +25,7 @@ public class MemberSurveysController { private final MemberSurveysService memberSurveysService; private final MemberSurveysQueryService memberSurveysQueryService; - @PostMapping("/submit") + @PostMapping public ResponseEntity submitSurveys(@AuthMember final Long memberId, @RequestBody @Valid final List requests) { memberSurveysService.submitSurvey(memberId, requests); diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java index 71da7425..0ac21545 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java @@ -14,7 +14,7 @@ @SuppressWarnings("NonAsciiCharacters") public class MemberSurveysControllerAcceptanceTest extends MemberSurveysControllerAcceptanceFixture { - private static final String 연애고사_응시_url = "/api/members/me/surveys/submit"; + private static final String 연애고사_응시_url = "/api/members/me/surveys"; private static final String 연애고사_매칭_url = "/api/members/me/surveys/match"; private Member 회원; diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java index 02a009b7..d58d55d2 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java @@ -42,7 +42,7 @@ class MemberSurveysControllerWebMvcTest extends MockBeanInjection { List requests = 필수_과목_질문_두개_제출_요청(); // when & then - mockMvc.perform(post("/api/members/me/surveys/submit") + mockMvc.perform(post("/api/members/me/surveys") .contentType("application/json") .content(objectMapper.writeValueAsString(requests)) .header(AUTHORIZATION, bearerToken)) From c07576d142204568ae25e40e64c29dffe0b7317b Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 18:30:41 +0900 Subject: [PATCH 55/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EC=9D=B4=20?= =?UTF-8?q?=EC=9D=91=EC=8B=9C=ED=95=9C=20=EA=B3=BC=EB=AA=A9=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회원 응시 과목 조회 기능 개발 - 관련 테스트 및 문서 작성 --- src/docs/asciidoc/membersurveys.adoc | 13 ++++++- .../MemberSurveysQueryService.java | 5 +++ .../membersurvey/MemberSurveysRepository.java | 3 ++ .../MemberSurveysJdbcRepository.java | 37 ++++++++++++++----- .../MemberSurveysRepositoryImpl.java | 6 +++ .../dto/MemberSurveyAnswerResponse.java | 8 ++++ .../dto/MemberSurveyQuestionResponse.java | 7 ++++ .../dto/MemberSurveyResponse.java | 7 ++-- .../membersurvey/MemberSurveysController.java | 9 +++++ .../fixture/MemberSurveyResponseFixture.java | 18 +++++++++ .../MemberSurveysFakeRepository.java | 6 +++ ...berSurveysControllerAcceptanceFixture.java | 20 ++++++++++ ...MemberSurveysControllerAcceptanceTest.java | 15 ++++++++ .../MemberSurveysControllerWebMvcTest.java | 37 +++++++++++++++++++ 14 files changed, 178 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyAnswerResponse.java create mode 100644 src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyQuestionResponse.java create mode 100644 src/test/java/com/atwoz/survey/fixture/MemberSurveyResponseFixture.java diff --git a/src/docs/asciidoc/membersurveys.adoc b/src/docs/asciidoc/membersurveys.adoc index c16af679..6d4835d7 100644 --- a/src/docs/asciidoc/membersurveys.adoc +++ b/src/docs/asciidoc/membersurveys.adoc @@ -7,11 +7,22 @@ == MemberSurveys -=== 연애고사 응시 (POST /api/members/me/surveys/submit) +=== 연애고사 응시 (POST /api/members/me/surveys) ==== 요청 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/request-headers.adoc[] include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/request-fields.adoc[] include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/http-request.adoc[] ==== 응답 include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_응시/http-response.adoc[] + +=== 연애고사 조회 (GET /api/members/me/surveys/{surveyId}) + +=== 요청 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/request-headers.adoc[] +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/http-request.adoc[] + +=== 응답 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/response-fields.adoc[] +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/http-response.adoc[] diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java index c128e10d..166f295b 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java @@ -1,6 +1,7 @@ package com.atwoz.survey.application.membersurvey; import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +15,10 @@ public class MemberSurveysQueryService { private final MemberSurveysRepository memberSurveysRepository; + public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { + return memberSurveysRepository.findMemberSurvey(memberId, surveyId); + } + public List findMatchMembers(final Long memberId) { return memberSurveysRepository.findMatchMembers(memberId); } diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java index 579e3e41..efbd8660 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java @@ -1,5 +1,7 @@ package com.atwoz.survey.domain.membersurvey; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; + import java.util.List; import java.util.Optional; @@ -8,4 +10,5 @@ public interface MemberSurveysRepository { MemberSurveys save(MemberSurveys memberSurveys); Optional findByMemberId(Long memberId); List findMatchMembers(Long memberId); + MemberSurveyResponse findMemberSurvey(Long memberId, Long surveyId); } diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java index c2fb7d41..28359348 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java @@ -1,5 +1,7 @@ package com.atwoz.survey.infrastructure.membersurvey; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyAnswerResponse; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyQuestionResponse; import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; @@ -17,27 +19,27 @@ public class MemberSurveysJdbcRepository { private final JdbcTemplate jdbcTemplate; public List findMatchMembers(final Long memberId) { - List memberSurveyResponses = convertMemberSurveys(memberId); + List memberSurveyAnswerResponse = convertMemberSurveys(memberId); List result = new ArrayList<>(); List otherMembers = collectMembersExceptCurrentMember(memberId); otherMembers.forEach(id -> { - List otherMemberSurveyResponses = convertMemberSurveys(id); - if (isMatched(memberSurveyResponses, otherMemberSurveyResponses)) { + List otherMemberSurveyAnswerResponse = convertMemberSurveys(id); + if (isMatched(memberSurveyAnswerResponse, otherMemberSurveyAnswerResponse)) { result.add(id); } }); return result; } - private List convertMemberSurveys(final Long memberId) { + private List convertMemberSurveys(final Long memberId) { String sql = "SELECT mss.member_id, ms.survey_id, ms.question_id, ms.answer_number " + "FROM member_surveys mss " + "INNER JOIN member_survey ms " + "ON mss.id = ms.member_surveys_id " + "WHERE mss.member_id = ?"; return jdbcTemplate.query(sql, new Object[]{memberId}, - (rs, rowNum) -> new MemberSurveyResponse( + (rs, rowNum) -> new MemberSurveyAnswerResponse( rs.getLong("member_id"), rs.getLong("survey_id"), rs.getLong("question_id"), @@ -51,10 +53,10 @@ private List collectMembersExceptCurrentMember(final Long memberId) { return jdbcTemplate.queryForList(sql, new Object[]{memberId}, Long.class); } - private boolean isMatched(final List memberResponse, final List otherResponse) { + private boolean isMatched(final List memberResponse, final List otherResponse) { int matchedSurveyAnswer = 0; - for (MemberSurveyResponse member : memberResponse) { - for (MemberSurveyResponse other : otherResponse) { + for (MemberSurveyAnswerResponse member : memberResponse) { + for (MemberSurveyAnswerResponse other : otherResponse) { if (isSameAnswer(member, other)) { matchedSurveyAnswer++; } @@ -63,9 +65,26 @@ private boolean isMatched(final List memberResponse, final return matchedSurveyAnswer >= MINIMUM_MATCH_SIZE; } - private static boolean isSameAnswer(final MemberSurveyResponse member, final MemberSurveyResponse other) { + private static boolean isSameAnswer(final MemberSurveyAnswerResponse member, final MemberSurveyAnswerResponse other) { return member.surveyId().equals(other.surveyId()) && member.questionId().equals(other.questionId()) && member.answerNumber().equals(other.answerNumber()); } + + public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { + String sql = "SELECT ms.survey_id, ms.question_id, ms.answer_number FROM member_surveys mss " + + "INNER JOIN member_survey ms " + + "ON mss.id = ms.member_surveys_id " + + "WHERE mss.member_id = ? " + + "AND ms.survey_id = ?"; + + List questions = jdbcTemplate.query(sql, new Object[]{memberId, surveyId}, + (rs, rowNum) -> new MemberSurveyQuestionResponse( + rs.getLong("question_id"), + rs.getInt("answer_number") + ) + ); + + return new MemberSurveyResponse(surveyId, questions); + } } diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java index 249bfcc7..614f2fb0 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java @@ -2,6 +2,7 @@ import com.atwoz.survey.domain.membersurvey.MemberSurveys; import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -29,4 +30,9 @@ public Optional findByMemberId(final Long memberId) { public List findMatchMembers(final Long memberId) { return memberSurveysJdbcRepository.findMatchMembers(memberId); } + + @Override + public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { + return memberSurveysJdbcRepository.findMemberSurvey(memberId, surveyId); + } } diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyAnswerResponse.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyAnswerResponse.java new file mode 100644 index 00000000..5266700c --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyAnswerResponse.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.infrastructure.membersurvey.dto; + +public record MemberSurveyAnswerResponse( + Long memberId, + Long surveyId, + Long questionId, + Integer answerNumber) { +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyQuestionResponse.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyQuestionResponse.java new file mode 100644 index 00000000..b957d519 --- /dev/null +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyQuestionResponse.java @@ -0,0 +1,7 @@ +package com.atwoz.survey.infrastructure.membersurvey.dto; + +public record MemberSurveyQuestionResponse( + Long questionId, + Integer answerNumber +) { +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java index 15f7e833..cf92ca1e 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/dto/MemberSurveyResponse.java @@ -1,8 +1,9 @@ package com.atwoz.survey.infrastructure.membersurvey.dto; +import java.util.List; + public record MemberSurveyResponse( - Long memberId, Long surveyId, - Long questionId, - Integer answerNumber) { + List questions +) { } diff --git a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java index cdfd7772..46ec5e9a 100644 --- a/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java +++ b/src/main/java/com/atwoz/survey/ui/membersurvey/MemberSurveysController.java @@ -4,12 +4,14 @@ import com.atwoz.survey.application.membersurvey.MemberSurveysQueryService; import com.atwoz.survey.application.membersurvey.MemberSurveysService; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import com.atwoz.survey.ui.membersurvey.dto.MatchMemberSearchResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -34,6 +36,13 @@ public ResponseEntity submitSurveys(@AuthMember final Long memberId, .build(); } + @GetMapping("/{surveyId}") + public ResponseEntity findMemberSurvey(@AuthMember final Long memberId, + @PathVariable final Long surveyId) { + return ResponseEntity.ok() + .body(memberSurveysQueryService.findMemberSurvey(memberId, surveyId)); + } + @GetMapping("/match") public ResponseEntity findMatchMembers(@AuthMember final Long memberId) { List members = memberSurveysQueryService.findMatchMembers(memberId); diff --git a/src/test/java/com/atwoz/survey/fixture/MemberSurveyResponseFixture.java b/src/test/java/com/atwoz/survey/fixture/MemberSurveyResponseFixture.java new file mode 100644 index 00000000..37713ef8 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/MemberSurveyResponseFixture.java @@ -0,0 +1,18 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyQuestionResponse; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; + +import java.util.List; + +public class MemberSurveyResponseFixture { + + public static MemberSurveyResponse 회원_연애고사_응시_조회() { + Long memberId = 1L; + + return new MemberSurveyResponse(memberId, List.of( + new MemberSurveyQuestionResponse(1L, 1), + new MemberSurveyQuestionResponse(2L, 2) + )); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java index fc3e4b29..499d6fd2 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java @@ -2,6 +2,7 @@ import com.atwoz.survey.domain.membersurvey.MemberSurveys; import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import java.util.HashMap; import java.util.List; @@ -36,4 +37,9 @@ public Optional findByMemberId(final Long memberId) { public List findMatchMembers(final Long memberId) { return List.of(); } + + @Override + public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { + return null; + } } diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java index 7d54f89c..de7becb0 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceFixture.java @@ -6,6 +6,7 @@ import com.atwoz.member.infrastructure.auth.JwtTokenProvider; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import com.atwoz.survey.ui.membersurvey.dto.MatchMemberSearchResponse; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; @@ -72,6 +73,25 @@ class MemberSurveysControllerAcceptanceFixture extends IntegrationHelper { assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); } + protected ExtractableResponse 연애고사_응시_조회(final String url, final String token, final Long surveyId) { + return RestAssured.given().log().all() + .header(AUTHORIZATION, "Bearer " + token) + .contentType(JSON) + .when() + .get(url + "/" + surveyId) + .then() + .extract(); + } + + protected void 연애고사_조회_검증(final ExtractableResponse response) { + MemberSurveyResponse surveyResponse = response.as(MemberSurveyResponse.class); + assertSoftly(softly -> { + softly.assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()); + softly.assertThat(surveyResponse.surveyId()).isEqualTo(1L); + softly.assertThat(surveyResponse.questions().size()).isEqualTo(2); + }); + } + protected ExtractableResponse 연애고사_매칭(final String url, final String token) { return RestAssured.given().log().all() .header(AUTHORIZATION, "Bearer " + token) diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java index 0ac21545..745f71f5 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerAcceptanceTest.java @@ -15,6 +15,7 @@ public class MemberSurveysControllerAcceptanceTest extends MemberSurveysControllerAcceptanceFixture { private static final String 연애고사_응시_url = "/api/members/me/surveys"; + private static final String 연애고사_응시_조회_url = "/api/members/me/surveys"; private static final String 연애고사_매칭_url = "/api/members/me/surveys/match"; private Member 회원; @@ -38,6 +39,20 @@ void setup() { 연애고사_응시_검증(연애고사_응시_결과); } + @Test + void 응시한_연애고사를_과목별로_조회한다() { + // given + var 연애고사_과목_id = 1L; + 연애고사_필수_과목_질문_두개씩_생성(); + 연애고사_응시_요청(연애고사_응시_url, 토큰, 필수_과목_질문_두개_제출_요청()); + + // when + var 연애고사_조회_결과 = 연애고사_응시_조회(연애고사_응시_조회_url, 토큰, 연애고사_과목_id); + + // then + 연애고사_조회_검증(연애고사_조회_결과); + } + @Test void 서로_응시_결과가_같은_회원을_매칭한다() { // given diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java index d58d55d2..4ef46a8d 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java @@ -1,6 +1,7 @@ package com.atwoz.survey.ui.membersurvey; import com.atwoz.helper.MockBeanInjection; +import com.atwoz.survey.application.membersurvey.MemberSurveysQueryService; import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.DisplayNameGeneration; @@ -13,13 +14,18 @@ import java.util.List; import static com.atwoz.helper.RestDocsHelper.customDocument; +import static com.atwoz.survey.fixture.MemberSurveyResponseFixture.회원_연애고사_응시_조회; import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; import static org.springframework.http.HttpHeaders.AUTHORIZATION; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -34,6 +40,8 @@ class MemberSurveysControllerWebMvcTest extends MockBeanInjection { @Autowired private MockMvc mockMvc; + @Autowired + private MemberSurveysQueryService memberSurveysQueryService; @Test void 회원이_연애고사_과목을_응시한다() throws Exception { @@ -65,4 +73,33 @@ class MemberSurveysControllerWebMvcTest extends MockBeanInjection { ) )); } + + @Test + void 회원이_응시한_연애고사를_과목으로_조회한다() throws Exception { + // given + Long surveyId = 1L; + String bearerToken = "Bearer token"; + + when(memberSurveysQueryService.findMemberSurvey(any(), any())) + .thenReturn(회원_연애고사_응시_조회()); + + // when & then + mockMvc.perform(get("/api/members/me/surveys/" + surveyId) + .contentType("application/json") + .header(AUTHORIZATION, bearerToken)) + .andExpect(status().isOk()) + .andDo(print()) + .andDo(customDocument("회원_연애고사_조회", + requestHeaders( + headerWithName(AUTHORIZATION) + .description("유저 토큰 정보") + ), + responseFields( + fieldWithPath("surveyId").description("응시한 과목 id"), + fieldWithPath("questions").description("응시한 각 질문"), + fieldWithPath("questions[].questionId").description("응시한 각 질문의 id"), + fieldWithPath("questions[].answerNumber").description("응시한 각 질문의 답변 번호") + ) + )); + } } From d328f5eae8e2941f7c6c065f138fda344db5c48a Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 18:41:46 +0900 Subject: [PATCH 56/65] =?UTF-8?q?test:=20=ED=9A=8C=EC=9B=90=20=EC=97=B0?= =?UTF-8?q?=EC=95=A0=EA=B3=A0=EC=82=AC=20=EB=A7=A4=EC=B9=AD=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회원 연애고사 매칭 통합 테스트 작성 - 관련 문서 작성 --- src/docs/asciidoc/membersurveys.adoc | 14 +++++++++-- .../MemberSurveysControllerWebMvcTest.java | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/docs/asciidoc/membersurveys.adoc b/src/docs/asciidoc/membersurveys.adoc index 6d4835d7..862c923c 100644 --- a/src/docs/asciidoc/membersurveys.adoc +++ b/src/docs/asciidoc/membersurveys.adoc @@ -19,10 +19,20 @@ include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_ === 연애고사 조회 (GET /api/members/me/surveys/{surveyId}) -=== 요청 +==== 요청 include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/request-headers.adoc[] include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/http-request.adoc[] -=== 응답 +==== 응답 include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/response-fields.adoc[] include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_조회/http-response.adoc[] + +=== 연애고사 매칭 조회 (GET /api/members/me/surveys/match) + +==== 요청 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_매칭_조회/request-headers.adoc[] +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_매칭_조회/http-request.adoc[] + +==== 응답 +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_매칭_조회/response-fields.adoc[] +include::{snippets}/member-surveys-controller-web-mvc-test/회원_연애고사_매칭_조회/http-response.adoc[] diff --git a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java index 4ef46a8d..147600ae 100644 --- a/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java +++ b/src/test/java/com/atwoz/survey/ui/membersurvey/MemberSurveysControllerWebMvcTest.java @@ -102,4 +102,29 @@ class MemberSurveysControllerWebMvcTest extends MockBeanInjection { ) )); } + + @Test + void 회원과_답변이_30개_이상_같은_다른_회원을_조회한다() throws Exception { + // given + String bearerToken = "Bearer token"; + + when(memberSurveysQueryService.findMatchMembers(any())) + .thenReturn(List.of(2L)); + + // when & then + mockMvc.perform(get("/api/members/me/surveys/match") + .contentType("application/json") + .header(AUTHORIZATION, bearerToken)) + .andExpect(status().isOk()) + .andDo(print()) + .andDo(customDocument("회원_연애고사_매칭_조회", + requestHeaders( + headerWithName(AUTHORIZATION) + .description("유저 토큰 정보") + ), + responseFields( + fieldWithPath("members").description("매칭된 회원들의 id") + ) + )); + } } From f67c7555e8748f7876707725541a3ee9806e2d9a Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 20:19:18 +0900 Subject: [PATCH 57/65] =?UTF-8?q?test:=20=ED=9A=8C=EC=9B=90=20=EC=97=B0?= =?UTF-8?q?=EC=95=A0=EA=B3=A0=EC=82=AC=20=EC=A1=B0=ED=9A=8C=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회원 연애고사 조회 서비스 테스트 작성 - 관련 fake 리포지터리 메서드 구현 변경 --- .../MemberSurveysQueryService.java | 4 +- .../membersurvey/MemberSurveysRepository.java | 2 +- .../MemberSurveyExceptionHandler.java | 6 + .../MemberSurveysNotFoundException.java | 8 ++ .../MemberSurveysJdbcRepository.java | 5 +- .../MemberSurveysRepositoryImpl.java | 2 +- .../MemberSurveysQueryServiceTest.java | 120 ++++++++++++++++++ .../survey/fixture/MemberSurveyFixture.java | 9 ++ .../MemberSurveyQuestionResponseFixture.java | 20 +++ .../survey/fixture/MemberSurveysFixture.java | 24 ++++ .../MemberSurveysFakeRepository.java | 65 +++++++++- 11 files changed, 254 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/MemberSurveysNotFoundException.java create mode 100644 src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryServiceTest.java create mode 100644 src/test/java/com/atwoz/survey/fixture/MemberSurveyQuestionResponseFixture.java create mode 100644 src/test/java/com/atwoz/survey/fixture/MemberSurveysFixture.java diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java index 166f295b..1725067a 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryService.java @@ -1,6 +1,7 @@ package com.atwoz.survey.application.membersurvey; import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.exception.membersurvey.exceptions.MemberSurveysNotFoundException; import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -16,7 +17,8 @@ public class MemberSurveysQueryService { private final MemberSurveysRepository memberSurveysRepository; public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { - return memberSurveysRepository.findMemberSurvey(memberId, surveyId); + return memberSurveysRepository.findMemberSurvey(memberId, surveyId) + .orElseThrow(MemberSurveysNotFoundException::new); } public List findMatchMembers(final Long memberId) { diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java index efbd8660..9ca624d1 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveysRepository.java @@ -10,5 +10,5 @@ public interface MemberSurveysRepository { MemberSurveys save(MemberSurveys memberSurveys); Optional findByMemberId(Long memberId); List findMatchMembers(Long memberId); - MemberSurveyResponse findMemberSurvey(Long memberId, Long surveyId); + Optional findMemberSurvey(Long memberId, Long surveyId); } diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java b/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java index 235fb76f..31ed6ca0 100644 --- a/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/MemberSurveyExceptionHandler.java @@ -1,5 +1,6 @@ package com.atwoz.survey.exception.membersurvey; +import com.atwoz.survey.exception.membersurvey.exceptions.MemberSurveysNotFoundException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAlreadySubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; @@ -38,6 +39,11 @@ public ResponseEntity handleSurveyQuestionSubmitSizeNotMatchException(fi return getExceptionWithStatus(exception, HttpStatus.BAD_REQUEST); } + @ExceptionHandler(MemberSurveysNotFoundException.class) + public ResponseEntity handleMemberSurveysNotFoundException(final MemberSurveysNotFoundException exception) { + return getExceptionWithStatus(exception, HttpStatus.NOT_FOUND); + } + private ResponseEntity getExceptionWithStatus(final Exception exception, final HttpStatus status) { return ResponseEntity.status(status) .body(exception.getMessage()); diff --git a/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/MemberSurveysNotFoundException.java b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/MemberSurveysNotFoundException.java new file mode 100644 index 00000000..44aeefb7 --- /dev/null +++ b/src/main/java/com/atwoz/survey/exception/membersurvey/exceptions/MemberSurveysNotFoundException.java @@ -0,0 +1,8 @@ +package com.atwoz.survey.exception.membersurvey.exceptions; + +public class MemberSurveysNotFoundException extends RuntimeException { + + public MemberSurveysNotFoundException() { + super("회원에 대한 연애고사 내역이 아예 없습니다."); + } +} diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java index 28359348..572288dc 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJdbcRepository.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; @RequiredArgsConstructor @Repository @@ -71,7 +72,7 @@ private static boolean isSameAnswer(final MemberSurveyAnswerResponse member, fin member.answerNumber().equals(other.answerNumber()); } - public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { + public Optional findMemberSurvey(final Long memberId, final Long surveyId) { String sql = "SELECT ms.survey_id, ms.question_id, ms.answer_number FROM member_surveys mss " + "INNER JOIN member_survey ms " + "ON mss.id = ms.member_surveys_id " + @@ -85,6 +86,6 @@ public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long sur ) ); - return new MemberSurveyResponse(surveyId, questions); + return Optional.of(new MemberSurveyResponse(surveyId, questions)); } } diff --git a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java index 614f2fb0..ab01aa76 100644 --- a/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java +++ b/src/main/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysRepositoryImpl.java @@ -32,7 +32,7 @@ public List findMatchMembers(final Long memberId) { } @Override - public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { + public Optional findMemberSurvey(final Long memberId, final Long surveyId) { return memberSurveysJdbcRepository.findMemberSurvey(memberId, surveyId); } } diff --git a/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryServiceTest.java b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryServiceTest.java new file mode 100644 index 00000000..50dc65c8 --- /dev/null +++ b/src/test/java/com/atwoz/survey/application/membersurvey/MemberSurveysQueryServiceTest.java @@ -0,0 +1,120 @@ +package com.atwoz.survey.application.membersurvey; + +import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.exception.membersurvey.exceptions.MemberSurveysNotFoundException; +import com.atwoz.survey.infrastructure.membersurvey.MemberSurveysFakeRepository; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyQuestionResponse; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; +import com.atwoz.survey.infrastructure.survey.SurveyFakeRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; +import static com.atwoz.survey.fixture.MemberSurveyQuestionResponseFixture.회원_연애고사_과목_조회_응답; +import static com.atwoz.survey.fixture.MemberSurveysFixture.회원_연애고사_필수_과목_질문_30개_응시_저장_id; +import static com.atwoz.survey.fixture.MemberSurveysFixture.회원_연애고사_필수_과목_질문_두개_응시_저장; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_30개씩; +import static com.atwoz.survey.fixture.SurveyFixture.연애고사_필수_과목_질문_두개씩; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class MemberSurveysQueryServiceTest { + + private MemberSurveysQueryService memberSurveysQueryService; + private MemberSurveysRepository memberSurveysRepository; + private SurveyRepository surveyRepository; + + @BeforeEach + void init() { + surveyRepository = new SurveyFakeRepository(); + memberSurveysRepository = new MemberSurveysFakeRepository(); + memberSurveysQueryService = new MemberSurveysQueryService(memberSurveysRepository); + } + + @Test + void 회원이_응시한_연애고사를_과목으로_조회한다() { + // given + Long memberId = 1L; + Long surveyId = 1L; + List questions = 회원_연애고사_과목_조회_응답(); + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + memberSurveysRepository.save(회원_연애고사_필수_과목_질문_두개_응시_저장()); + + // when + MemberSurveyResponse search = memberSurveysQueryService.findMemberSurvey(memberId, surveyId); + + // then + assertSoftly(softly -> { + softly.assertThat(search.surveyId()).isEqualTo(surveyId); + softly.assertThat(search.questions()).isEqualTo(questions); + }); + } + + @Test + void 없는_연애고사_과목이거나_작성하지_않은_과목을_조회하면_질문_목록이_비어있다() { + // given + Long memberId = 1L; + Long surveyId = -1L; + surveyRepository.save(연애고사_필수_과목_질문_두개씩()); + memberSurveysRepository.save(회원_연애고사_필수_과목_질문_두개_응시_저장()); + + // when + MemberSurveyResponse response = memberSurveysQueryService.findMemberSurvey(memberId, surveyId); + + // then + assertThat(response.questions()).isEmpty(); + } + + @Test + void 회원과_결과가_30개_이상_같은_다른_회원을_조회한다() { + // given + Long memberId = 1L; + Long otherMemberId = 2L; + + surveyRepository.save(연애고사_필수_과목_질문_30개씩()); + memberSurveysRepository.save(회원_연애고사_필수_과목_질문_30개_응시_저장_id(memberId)); + memberSurveysRepository.save(회원_연애고사_필수_과목_질문_30개_응시_저장_id(otherMemberId)); + + // when + List matchMembers = memberSurveysQueryService.findMatchMembers(memberId); + + // then + assertThat(matchMembers.contains(otherMemberId)).isTrue(); + } + + @Nested + class 연애고사_조회_예외 { + + @Test + void 아예_연애고사를_작성하지_않았으면_내역_조회_시_예외가_발생한다() { + // given + Long memberId = 1L; + Long surveyId = 1L; + + // when & then + assertThatThrownBy(() -> memberSurveysQueryService.findMemberSurvey(memberId, surveyId)) + .isInstanceOf(MemberSurveysNotFoundException.class); + } + + @Test + void 아예_연애고사를_작성하지_않았으면_매칭_시_예외가_발생한다() { + // given + Long memberId = 1L; + Long otherMemberId = 2L; + + surveyRepository.save(연애고사_필수_과목_질문_30개씩()); + memberSurveysRepository.save(회원_연애고사_필수_과목_질문_30개_응시_저장_id(otherMemberId)); + + // when & then + assertThatThrownBy(() -> memberSurveysQueryService.findMatchMembers(memberId)) + .isInstanceOf(MemberSurveysNotFoundException.class); + } + } +} diff --git a/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java index 256619c0..2a84a4ac 100644 --- a/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/MemberSurveyFixture.java @@ -2,6 +2,7 @@ import com.atwoz.survey.domain.membersurvey.MemberSurvey; +import java.util.ArrayList; import java.util.List; public class MemberSurveyFixture { @@ -18,4 +19,12 @@ public class MemberSurveyFixture { MemberSurvey.of(surveyId, questionTwoId, answerTwoNumber) ); } + + public static List 회원_연애고사_응시_필수_과목_30개() { + List memberSurveys = new ArrayList<>(); + for (long id = 1; id <= 30; id++) { + memberSurveys.add(MemberSurvey.of(id, id, 1)); + } + return memberSurveys; + } } diff --git a/src/test/java/com/atwoz/survey/fixture/MemberSurveyQuestionResponseFixture.java b/src/test/java/com/atwoz/survey/fixture/MemberSurveyQuestionResponseFixture.java new file mode 100644 index 00000000..9fcaa6d4 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/MemberSurveyQuestionResponseFixture.java @@ -0,0 +1,20 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyQuestionResponse; + +import java.util.List; + +public class MemberSurveyQuestionResponseFixture { + + public static List 회원_연애고사_과목_조회_응답() { + Long questionOneId = 1L; + Integer answerOne = 1; + Long questionTwoId = 2L; + Integer answerTwo = 2; + + return List.of( + new MemberSurveyQuestionResponse(questionOneId, answerOne), + new MemberSurveyQuestionResponse(questionTwoId, answerTwo) + ); + } +} diff --git a/src/test/java/com/atwoz/survey/fixture/MemberSurveysFixture.java b/src/test/java/com/atwoz/survey/fixture/MemberSurveysFixture.java new file mode 100644 index 00000000..25586e0c --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/MemberSurveysFixture.java @@ -0,0 +1,24 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.domain.membersurvey.MemberSurveys; + +import static com.atwoz.survey.fixture.MemberSurveyFixture.회원_연애고사_응시_필수_과목_30개; +import static com.atwoz.survey.fixture.MemberSurveyFixture.회원_연애고사_응시_필수_과목_두개; + +public class MemberSurveysFixture { + + public static MemberSurveys 회원_연애고사_필수_과목_질문_두개_응시_저장() { + Long memberId = 1L; + return MemberSurveys.builder() + .memberId(memberId) + .memberSurveys(회원_연애고사_응시_필수_과목_두개()) + .build(); + } + + public static MemberSurveys 회원_연애고사_필수_과목_질문_30개_응시_저장_id(final Long memberId) { + return MemberSurveys.builder() + .memberId(memberId) + .memberSurveys(회원_연애고사_응시_필수_과목_30개()) + .build(); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java index 499d6fd2..e096c8f6 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysFakeRepository.java @@ -1,9 +1,13 @@ package com.atwoz.survey.infrastructure.membersurvey; +import com.atwoz.survey.domain.membersurvey.MemberSurvey; import com.atwoz.survey.domain.membersurvey.MemberSurveys; import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.exception.membersurvey.exceptions.MemberSurveysNotFoundException; +import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyQuestionResponse; import com.atwoz.survey.infrastructure.membersurvey.dto.MemberSurveyResponse; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -11,6 +15,8 @@ public class MemberSurveysFakeRepository implements MemberSurveysRepository { + private static final int MINIMUM_MATCH_SIZE = 30; + private final Map map = new HashMap<>(); private Long id = 1L; @@ -18,28 +24,75 @@ public class MemberSurveysFakeRepository implements MemberSurveysRepository { @Override public MemberSurveys save(final MemberSurveys memberSurveys) { MemberSurveys newMemberSurveys = MemberSurveys.builder() - .id(id++) + .id(id) .memberId(memberSurveys.getMemberId()) .memberSurveys(memberSurveys.getMemberSurveys()) .build(); - map.put(id, newMemberSurveys); + map.put(id++, newMemberSurveys); return newMemberSurveys; } @Override public Optional findByMemberId(final Long memberId) { - return Optional.ofNullable(map.get(memberId)); + return map.values() + .stream() + .filter(memberSurveys -> memberId.equals(memberSurveys.getMemberId())) + .findAny(); } @Override public List findMatchMembers(final Long memberId) { - return List.of(); + List result = new ArrayList<>(); + MemberSurveys memberSurveys = getMemberSurveys(memberId); + List otherMembers = map.values() + .stream() + .filter(otherMemberSurveys -> !memberId.equals(otherMemberSurveys.getMemberId())) + .toList(); + + for (MemberSurveys otherMemberSurveys : otherMembers) { + if (isSameAnswer(memberSurveys, otherMemberSurveys)) { + result.add(otherMemberSurveys.getMemberId()); + } + } + + return result; + } + + private boolean isSameAnswer(final MemberSurveys memberSurveys, final MemberSurveys otherMemberSurveys) { + int same = 0; + for (MemberSurvey memberSurvey : memberSurveys.getMemberSurveys()) { + for (MemberSurvey otherSurvey : otherMemberSurveys.getMemberSurveys()) { + if (memberSurvey.getSurveyId().equals(otherSurvey.getSurveyId()) && + memberSurvey.getQuestionId().equals(otherSurvey.getQuestionId()) && + memberSurvey.getAnswerNumber().equals(otherSurvey.getAnswerNumber())) { + same++; + } + } + } + return same >= MINIMUM_MATCH_SIZE; } @Override - public MemberSurveyResponse findMemberSurvey(final Long memberId, final Long surveyId) { - return null; + public Optional findMemberSurvey(final Long memberId, final Long surveyId) { + MemberSurveys memberSurveys = getMemberSurveys(memberId); + List questions = new ArrayList<>(); + memberSurveys.getMemberSurveys() + .stream() + .filter(memberSurvey -> surveyId.equals(memberSurvey.getSurveyId())) + .forEach(memberSurvey -> questions.add( + new MemberSurveyQuestionResponse(memberSurvey.getQuestionId(), memberSurvey.getAnswerNumber()) + )); + + return Optional.of(new MemberSurveyResponse(surveyId, questions)); + } + + private MemberSurveys getMemberSurveys(final Long memberId) { + return map.values() + .stream() + .filter(memberSurveys -> memberId.equals(memberSurveys.getMemberId())) + .findAny() + .orElseThrow(MemberSurveysNotFoundException::new); } } From d34bebd2101845b465943485ca5e60eb3f03b022 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Thu, 16 May 2024 20:26:08 +0900 Subject: [PATCH 58/65] =?UTF-8?q?refactor:=20AuthMember=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=EC=85=89=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인터셉터 경로 등록 --- src/main/java/com/atwoz/member/config/AuthConfig.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/atwoz/member/config/AuthConfig.java b/src/main/java/com/atwoz/member/config/AuthConfig.java index 57ee1756..7597d342 100644 --- a/src/main/java/com/atwoz/member/config/AuthConfig.java +++ b/src/main/java/com/atwoz/member/config/AuthConfig.java @@ -5,7 +5,6 @@ import com.atwoz.member.ui.auth.interceptor.PathMatcherInterceptor; import com.atwoz.member.ui.auth.interceptor.TokenRegenerateInterceptor; import com.atwoz.member.ui.auth.support.resolver.AuthArgumentResolver; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -13,6 +12,7 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.List; import static com.atwoz.member.ui.auth.interceptor.HttpMethod.DELETE; import static com.atwoz.member.ui.auth.interceptor.HttpMethod.GET; import static com.atwoz.member.ui.auth.interceptor.HttpMethod.OPTIONS; @@ -39,7 +39,9 @@ private HandlerInterceptor parseMemberIdFromTokenInterceptor() { return new PathMatcherInterceptor(parseMemberIdFromTokenInterceptor) .excludePathPattern("/**", OPTIONS) .addPathPatterns("/api/info/**", GET, POST, PATCH) - .addPathPatterns("/api/members/me/missions/**", GET, POST, PATCH); + .addPathPatterns("/api/surveys/**", GET, POST) + .addPathPatterns("/api/members/me/missions/**", GET, POST, PATCH) + .addPathPatterns("/api/members/me/surveys/**", GET, POST); } /** @@ -49,6 +51,7 @@ private HandlerInterceptor loginValidCheckerInterceptor() { return new PathMatcherInterceptor(loginValidCheckerInterceptor) .excludePathPattern("/**", OPTIONS) .excludePathPattern("/api/missions/**", GET, POST, PATCH, DELETE) + .excludePathPattern("/api/surveys/**", GET, POST) .addPathPatterns("/api/members/**", GET, POST, PATCH, DELETE); } From 0e4bc9c9a71901b573981d4086938bf1739cd2c0 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 00:47:11 +0900 Subject: [PATCH 59/65] =?UTF-8?q?refactor:=20=EB=A6=AC=ED=84=B4=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=9D=B8=EB=9D=BC=EC=9D=B8=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 리턴 변수 인라인화 적용 --- .../survey/application/membersurvey/MemberSurveysService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java index 8193ef12..46963367 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java @@ -58,8 +58,7 @@ private Set extractSubmittedSurveyIds(final List requ private MemberSurveys createNewMemberSurveysWithMemberId(final Long memberId) { MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); - memberSurveysRepository.save(memberSurveys); - return memberSurveys; + return memberSurveysRepository.save(memberSurveys); } private void validateEachSurveyRequestIsValid(final List requests) { From 52e1155a12dad4b1ff6fdffbcde2e811b6ae676c Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 00:48:22 +0900 Subject: [PATCH 60/65] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EB=AC=B8=EB=B2=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 함수명 문법에 맞게 수정 --- .../java/com/atwoz/survey/domain/survey/SurveyQuestion.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 50a24387..986225de 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -91,7 +91,7 @@ private void addSurveyAnswers(final List answers) { public void validateIsValidSubmitAnswer(final List requests) { SurveyQuestionComparisonRequest questionRequest = findSurveyQuestionById(requests); - if (!isContainsSameAnswer(questionRequest.answerNumber())) { + if (!hasSameAnswer(questionRequest.answerNumber())) { throw new SurveyAnswerInvalidSubmitException(); } } @@ -104,7 +104,7 @@ private SurveyQuestionComparisonRequest findSurveyQuestionById(final List answer.isSame(answerNumber)); } From 598fea8f0c808cb188d805cc8b7dfe9fd59642a7 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 22:15:41 +0900 Subject: [PATCH 61/65] =?UTF-8?q?refactor:=20SurveyCreateRequest=20ui=20DT?= =?UTF-8?q?O=20=EC=9D=98=EC=A1=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - survey에 ui적 DTO 의존 제거하고 도메인 DTO를 의존하도록 수정 --- .../application/survey/SurveyService.java | 4 +++- .../atwoz/survey/domain/survey/Survey.java | 12 +++++----- .../survey/domain/survey/SurveyQuestion.java | 16 ++++++------- .../survey/dto/SurveyAnswerCreateDto.java | 13 +++++++++++ .../domain/survey/dto/SurveyCreateDto.java | 21 +++++++++++++++++ .../survey/dto/SurveyQuestionCreateDto.java | 20 ++++++++++++++++ .../domain/survey/SurveyQuestionTest.java | 23 ++++++++++--------- .../survey/domain/survey/SurveyTest.java | 18 ++++++++------- .../atwoz/survey/fixture/SurveyFixture.java | 9 ++++---- 9 files changed, 98 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/domain/survey/dto/SurveyAnswerCreateDto.java create mode 100644 src/main/java/com/atwoz/survey/domain/survey/dto/SurveyCreateDto.java create mode 100644 src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionCreateDto.java diff --git a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java index 998ab34b..7adcf599 100644 --- a/src/main/java/com/atwoz/survey/application/survey/SurveyService.java +++ b/src/main/java/com/atwoz/survey/application/survey/SurveyService.java @@ -3,6 +3,7 @@ import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.domain.survey.SurveyRepository; +import com.atwoz.survey.domain.survey.dto.SurveyCreateDto; import com.atwoz.survey.exception.survey.exceptions.SurveyNameAlreadyExistException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -17,8 +18,9 @@ public class SurveyService { public Survey addSurvey(final SurveyCreateRequest request) { validateIsAlreadyUsedName(request.name()); + SurveyCreateDto surveyRequest = SurveyCreateDto.from(request); - return surveyRepository.save(Survey.from(request)); + return surveyRepository.save(Survey.from(surveyRequest)); } private void validateIsAlreadyUsedName(final String name) { diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index d5e810ae..3f13b4cc 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -1,8 +1,8 @@ package com.atwoz.survey.domain.survey; -import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; -import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.domain.survey.dto.SurveyCreateDto; +import com.atwoz.survey.domain.survey.dto.SurveyQuestionCreateDto; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; import com.atwoz.survey.exception.survey.exceptions.SurveyQuestionDuplicatedException; import jakarta.persistence.CascadeType; @@ -50,7 +50,7 @@ private Survey(final String name, final Boolean required) { this.required = required; } - public static Survey from(final SurveyCreateRequest request) { + public static Survey from(final SurveyCreateDto request) { validateIsQuestionsNotDuplicated(request.questions()); Survey survey = new Survey(request.name(), request.required()); @@ -59,9 +59,9 @@ public static Survey from(final SurveyCreateRequest request) { return survey; } - private static void validateIsQuestionsNotDuplicated(final List questionRequests) { + private static void validateIsQuestionsNotDuplicated(final List questionRequests) { List questions = questionRequests.stream() - .map(SurveyQuestionCreateRequest::description) + .map(SurveyQuestionCreateDto::description) .toList(); Set questionsSet = new HashSet<>(questions); @@ -70,7 +70,7 @@ private static void validateIsQuestionsNotDuplicated(final List questionRequests) { + private void addSurveyQuestions(final List questionRequests) { List questions = questionRequests.stream() .map(request -> SurveyQuestion.of(request.description(), request.answers())) .toList(); diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 986225de..2050a84d 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -1,6 +1,6 @@ package com.atwoz.survey.domain.survey; -import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; +import com.atwoz.survey.domain.survey.dto.SurveyAnswerCreateDto; import com.atwoz.survey.domain.survey.dto.SurveyQuestionComparisonRequest; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; @@ -48,7 +48,7 @@ private SurveyQuestion(final String description) { this.description = description; } - public static SurveyQuestion of(final String description, final List answers) { + public static SurveyQuestion of(final String description, final List answers) { validateIsAnswersNotDuplicated(answers); SurveyQuestion surveyQuestion = new SurveyQuestion(description); @@ -57,14 +57,14 @@ public static SurveyQuestion of(final String description, final List answers) { + private static void validateIsAnswersNotDuplicated(final List answers) { validateIsAnswerNumbersNotDuplicated(answers); validateIsAnswerDescriptionsNotDuplicated(answers); } - private static void validateIsAnswerNumbersNotDuplicated(final List answers) { + private static void validateIsAnswerNumbersNotDuplicated(final List answers) { List answerNumbers = answers.stream() - .map(SurveyAnswerCreateRequest::number) + .map(SurveyAnswerCreateDto::number) .toList(); Set answersSet = new HashSet<>(answerNumbers); if (answersSet.size() != answers.size()) { @@ -72,9 +72,9 @@ private static void validateIsAnswerNumbersNotDuplicated(final List answers) { + private static void validateIsAnswerDescriptionsNotDuplicated(final List answers) { List answerDescriptions = answers.stream() - .map(SurveyAnswerCreateRequest::answer) + .map(SurveyAnswerCreateDto::answer) .toList(); Set answersSet = new HashSet<>(answerDescriptions); if (answersSet.size() != answers.size()) { @@ -82,7 +82,7 @@ private static void validateIsAnswerDescriptionsNotDuplicated(final List answers) { + private void addSurveyAnswers(final List answers) { List surveyAnswers = answers.stream() .map(answer -> SurveyAnswer.of(answer.number(), answer.answer())) .toList(); diff --git a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyAnswerCreateDto.java b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyAnswerCreateDto.java new file mode 100644 index 00000000..7c420a73 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyAnswerCreateDto.java @@ -0,0 +1,13 @@ +package com.atwoz.survey.domain.survey.dto; + +import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; + +public record SurveyAnswerCreateDto( + Integer number, + String answer +) { + + public static SurveyAnswerCreateDto from(final SurveyAnswerCreateRequest request) { + return new SurveyAnswerCreateDto(request.number(), request.answer()); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyCreateDto.java b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyCreateDto.java new file mode 100644 index 00000000..906aad76 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyCreateDto.java @@ -0,0 +1,21 @@ +package com.atwoz.survey.domain.survey.dto; + +import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; + +import java.util.List; + +public record SurveyCreateDto( + String name, + Boolean required, + List questions +) { + + public static SurveyCreateDto from(final SurveyCreateRequest request) { + List questions = request.questions() + .stream() + .map(SurveyQuestionCreateDto::from) + .toList(); + + return new SurveyCreateDto(request.name(), request.required(), questions); + } +} diff --git a/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionCreateDto.java b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionCreateDto.java new file mode 100644 index 00000000..949e3455 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/survey/dto/SurveyQuestionCreateDto.java @@ -0,0 +1,20 @@ +package com.atwoz.survey.domain.survey.dto; + +import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; + +import java.util.List; + +public record SurveyQuestionCreateDto( + String description, + List answers +) { + + public static SurveyQuestionCreateDto from(final SurveyQuestionCreateRequest request) { + List answers = request.answers() + .stream() + .map(SurveyAnswerCreateDto::from) + .toList(); + + return new SurveyQuestionCreateDto(request.description(), answers); + } +} diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 6177c500..6bdfd649 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -1,6 +1,7 @@ package com.atwoz.survey.domain.survey; import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; +import com.atwoz.survey.domain.survey.dto.SurveyAnswerCreateDto; import com.atwoz.survey.domain.survey.dto.SurveyQuestionComparisonRequest; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; @@ -30,10 +31,10 @@ class SurveyQuestionTest { void 연애고사_질문_생성() { // given String description = "질문"; - List surveyAnswers = List.of( - SurveyAnswerCreateRequest.of(1, "답변1"), - SurveyAnswerCreateRequest.of(2, "답변2"), - SurveyAnswerCreateRequest.of(3, "답변3") + List surveyAnswers = List.of( + SurveyAnswerCreateDto.from(new SurveyAnswerCreateRequest(1, "답변1")), + SurveyAnswerCreateDto.from(new SurveyAnswerCreateRequest(2, "답변2")), + SurveyAnswerCreateDto.from(new SurveyAnswerCreateRequest(3, "답변3")) ); List answers = List.of( SurveyAnswer.of(1, "답변1"), @@ -68,7 +69,7 @@ class SurveyQuestionTest { // given SurveyQuestion surveyQuestion = 연애고사_질문_답변_한개_id_있음(); SurveyQuestion anotherSurveyQuestion = SurveyQuestion.of("질문 1", List.of( - new SurveyAnswerCreateRequest(1, "답변 1")) + new SurveyAnswerCreateDto(1, "답변 1")) ); // when @@ -86,10 +87,10 @@ class 연애고사_질문_예외 { void 번호나_내용이_같은_답변은_생성할_수_없다(final int answerNumber1, final String answer1, final int answerNumber2, final String answer2) { // given String description = "질문"; - List answers = List.of( - new SurveyAnswerCreateRequest(answerNumber1, answer1), - new SurveyAnswerCreateRequest(answerNumber2, answer2), - new SurveyAnswerCreateRequest(3, "답변 3") + List answers = List.of( + new SurveyAnswerCreateDto(answerNumber1, answer1), + new SurveyAnswerCreateDto(answerNumber2, answer2), + new SurveyAnswerCreateDto(3, "답변 3") ); // when & then @@ -109,8 +110,8 @@ static Stream invalidSurveyAnswerRequests() { void 답변_번호가_자연수가_아니면_예외가_발생한다() { // given String description = "질문"; - List answers = List.of( - new SurveyAnswerCreateRequest(-1, "답변 1") + List answers = List.of( + new SurveyAnswerCreateDto(-1, "답변 1") ); // when & then diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java index e0fdb0ec..ab2b5150 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyTest.java @@ -5,7 +5,9 @@ import com.atwoz.survey.application.survey.dto.SurveyAnswerCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyCreateRequest; import com.atwoz.survey.application.survey.dto.SurveyQuestionCreateRequest; +import com.atwoz.survey.domain.survey.dto.SurveyAnswerCreateDto; import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; +import com.atwoz.survey.domain.survey.dto.SurveyCreateDto; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyAnswerInvalidSubmitException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionNotSubmittedException; import com.atwoz.survey.exception.membersurvey.exceptions.SurveyQuestionSubmitSizeNotMatchException; @@ -40,17 +42,17 @@ class SurveyTest { SurveyCreateRequest request = 연애고사_필수_과목_질문_두개씩_생성_요청(); List questions = List.of( SurveyQuestion.of("질문 내용1", List.of( - SurveyAnswerCreateRequest.of(1, "답변1"), - SurveyAnswerCreateRequest.of(2, "답변2")) + new SurveyAnswerCreateDto(1, "답변1"), + new SurveyAnswerCreateDto(2, "답변2")) ), SurveyQuestion.of("질문 내용2", List.of( - SurveyAnswerCreateRequest.of(1, "답변1"), - SurveyAnswerCreateRequest.of(2, "답변2")) + new SurveyAnswerCreateDto(1, "답변1"), + new SurveyAnswerCreateDto(2, "답변2")) ) ); // when - Survey survey = Survey.from(request); + Survey survey = Survey.from(SurveyCreateDto.from(request)); // then assertSoftly(softly -> { @@ -83,7 +85,7 @@ class 연애고사_예외 { SurveyCreateRequest request = 연애고사_필수_과목_질문_중복(); // when & then - assertThatThrownBy(() -> Survey.from(request)) + assertThatThrownBy(() -> Survey.from(SurveyCreateDto.from(request))) .isInstanceOf(SurveyQuestionDuplicatedException.class); } @@ -99,7 +101,7 @@ class 연애고사_예외 { )); // when & then - assertThatThrownBy(() -> Survey.from(request)) + assertThatThrownBy(() -> Survey.from(SurveyCreateDto.from(request))) .isInstanceOf(SurveyAnswerDuplicatedException.class); } @@ -114,7 +116,7 @@ static Stream invalidSurveyAnswerRequests() { @Test void 연애고사_답변_번호는_자연수여야_한다() { // given - SurveyCreateRequest request = 연애고사_필수_과목_질문_번호_음수(); + SurveyCreateDto request = SurveyCreateDto.from(연애고사_필수_과목_질문_번호_음수()); // when & then assertThatThrownBy(() -> Survey.from(request)) diff --git a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java index e094448b..ecb8a79a 100644 --- a/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java +++ b/src/test/java/com/atwoz/survey/fixture/SurveyFixture.java @@ -1,6 +1,7 @@ package com.atwoz.survey.fixture; import com.atwoz.survey.domain.survey.Survey; +import com.atwoz.survey.domain.survey.dto.SurveyCreateDto; import java.util.List; import static com.atwoz.survey.fixture.SurveyCreateRequestFixture.연애고사_선택_과목_질문_두개씩_생성_요청; @@ -13,19 +14,19 @@ public class SurveyFixture { public static Survey 연애고사_필수_과목_질문_두개씩() { - return Survey.from(연애고사_필수_과목_질문_두개씩_생성_요청()); + return Survey.from(SurveyCreateDto.from(연애고사_필수_과목_질문_두개씩_생성_요청())); } public static Survey 연애고사_필수_과목_질문_30개씩() { - return Survey.from(연애고사_필수_과목_질문_30개씩_생성_요청()); + return Survey.from(SurveyCreateDto.from(연애고사_필수_과목_질문_30개씩_생성_요청())); } public static Survey 연애고사_선택_과목_질문_두개씩() { - return Survey.from(연애고사_선택_과목_질문_두개씩_생성_요청()); + return Survey.from(SurveyCreateDto.from(연애고사_선택_과목_질문_두개씩_생성_요청())); } public static Survey 연애고사_선택_과목_질문_하나() { - return Survey.from(연애고사_선택_과목_질문_하나_생성_요청()); + return Survey.from(SurveyCreateDto.from(연애고사_선택_과목_질문_하나_생성_요청())); } public static Survey 연애고사_필수_과목_질문_한개씩_전부_id_있음() { From b613460e205347dce5a47f17663d0f98d7a87784 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 22:29:01 +0900 Subject: [PATCH 62/65] =?UTF-8?q?refactor:=20SurveySubmitRequest=20ui=20DT?= =?UTF-8?q?O=20=EC=9D=98=EC=A1=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - memberSurveys에 ui적 DTO 의존 제거하고 도메인 DTO를 의존하도록 수정 --- .../membersurvey/MemberSurveysService.java | 9 ++++++++- .../domain/membersurvey/MemberSurveys.java | 8 ++++---- .../dto/SurveyQuestionSubmitCreateDto.java | 7 +++++++ .../dto/SurveySubmitCreateDto.java | 20 +++++++++++++++++++ .../membersurvey/MemberSurveysTest.java | 6 +++--- .../fixture/SurveySubmitCreateDtoFixture.java | 16 +++++++++++++++ .../MemberSurveysJpaRepositoryTest.java | 6 +++--- 7 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveyQuestionSubmitCreateDto.java create mode 100644 src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveySubmitCreateDto.java create mode 100644 src/test/java/com/atwoz/survey/fixture/SurveySubmitCreateDtoFixture.java diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java index 46963367..78a1a76b 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java @@ -3,6 +3,7 @@ import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.atwoz.survey.domain.membersurvey.MemberSurveys; import com.atwoz.survey.domain.membersurvey.MemberSurveysRepository; +import com.atwoz.survey.domain.membersurvey.dto.SurveySubmitCreateDto; import com.atwoz.survey.domain.survey.Survey; import com.atwoz.survey.domain.survey.SurveyRepository; import com.atwoz.survey.domain.survey.dto.SurveyComparisonRequest; @@ -31,7 +32,7 @@ public void submitSurvey(final Long memberId, final List re MemberSurveys memberSurveys = memberSurveysRepository.findByMemberId(memberId) .orElseGet(() -> createNewMemberSurveysWithMemberId(memberId)); validateEachSurveyRequestIsValid(requests); - memberSurveys.submitSurveys(requests); + memberSurveys.submitSurveys(convertSurveySubmits(requests)); } private void validateIsAllSubmittedRequiredSurveys(final List requests) { @@ -69,4 +70,10 @@ private void validateEachSurveyRequestIsValid(final List re survey.validateIsValidSubmitSurveyRequest(comparisonRequest); }); } + + private List convertSurveySubmits(final List requests) { + return requests.stream() + .map(SurveySubmitCreateDto::from) + .toList(); + } } diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java index 66d545bd..722adf6a 100644 --- a/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/MemberSurveys.java @@ -1,7 +1,7 @@ package com.atwoz.survey.domain.membersurvey; -import com.atwoz.survey.application.membersurvey.dto.SurveyQuestionSubmitRequest; -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.dto.SurveyQuestionSubmitCreateDto; +import com.atwoz.survey.domain.membersurvey.dto.SurveySubmitCreateDto; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -45,7 +45,7 @@ public static MemberSurveys createWithMemberId(final Long memberId) { .build(); } - public void submitSurveys(final List requests) { + public void submitSurveys(final List requests) { List memberSurveys = new ArrayList<>(); requests.forEach(request -> { List convertedMemberSurveys = convertMemberSurveys(request.surveyId(), request.questions()); @@ -54,7 +54,7 @@ public void submitSurveys(final List requests) { this.memberSurveys.addAll(memberSurveys); } - private List convertMemberSurveys(final Long surveyId, final List questions) { + private List convertMemberSurveys(final Long surveyId, final List questions) { return questions.stream() .map(question -> MemberSurvey.of(surveyId, question.questionId(), question.answerNumber())) .toList(); diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveyQuestionSubmitCreateDto.java b/src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveyQuestionSubmitCreateDto.java new file mode 100644 index 00000000..79e7b599 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveyQuestionSubmitCreateDto.java @@ -0,0 +1,7 @@ +package com.atwoz.survey.domain.membersurvey.dto; + +public record SurveyQuestionSubmitCreateDto( + Long questionId, + Integer answerNumber +) { +} diff --git a/src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveySubmitCreateDto.java b/src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveySubmitCreateDto.java new file mode 100644 index 00000000..1f6ddaa3 --- /dev/null +++ b/src/main/java/com/atwoz/survey/domain/membersurvey/dto/SurveySubmitCreateDto.java @@ -0,0 +1,20 @@ +package com.atwoz.survey.domain.membersurvey.dto; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; + +import java.util.List; + +public record SurveySubmitCreateDto( + Long surveyId, + List questions +) { + + public static SurveySubmitCreateDto from(final SurveySubmitRequest request) { + List questions = request.questions() + .stream() + .map(question -> new SurveyQuestionSubmitCreateDto(question.questionId(), question.answerNumber())) + .toList(); + + return new SurveySubmitCreateDto(request.surveyId(), questions); + } +} diff --git a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java index a28a6844..e7c4d2b5 100644 --- a/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java +++ b/src/test/java/com/atwoz/survey/domain/membersurvey/MemberSurveysTest.java @@ -1,13 +1,13 @@ package com.atwoz.survey.domain.membersurvey; -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.dto.SurveySubmitCreateDto; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; import java.util.List; import static com.atwoz.survey.fixture.MemberSurveyFixture.회원_연애고사_응시_필수_과목_두개; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitCreateDtoFixture.필수_과목_질문_두개_제출_요청; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -34,7 +34,7 @@ class MemberSurveysTest { void 회원_연애고사_응시() { // given Long memberId = 1L; - List requests = 필수_과목_질문_두개_제출_요청(); + List requests = 필수_과목_질문_두개_제출_요청(); MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); List expectMemberSurveys = 회원_연애고사_응시_필수_과목_두개(); diff --git a/src/test/java/com/atwoz/survey/fixture/SurveySubmitCreateDtoFixture.java b/src/test/java/com/atwoz/survey/fixture/SurveySubmitCreateDtoFixture.java new file mode 100644 index 00000000..a60e5e45 --- /dev/null +++ b/src/test/java/com/atwoz/survey/fixture/SurveySubmitCreateDtoFixture.java @@ -0,0 +1,16 @@ +package com.atwoz.survey.fixture; + +import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; +import com.atwoz.survey.domain.membersurvey.dto.SurveySubmitCreateDto; + +import java.util.List; + +public class SurveySubmitCreateDtoFixture { + + public static List 필수_과목_질문_두개_제출_요청() { + List requests = SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청(); + return requests.stream() + .map(SurveySubmitCreateDto::from) + .toList(); + } +} diff --git a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java index 7a45dd0d..7ca549fa 100644 --- a/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java +++ b/src/test/java/com/atwoz/survey/infrastructure/membersurvey/MemberSurveysJpaRepositoryTest.java @@ -1,7 +1,7 @@ package com.atwoz.survey.infrastructure.membersurvey; -import com.atwoz.survey.application.membersurvey.dto.SurveySubmitRequest; import com.atwoz.survey.domain.membersurvey.MemberSurveys; +import com.atwoz.survey.domain.membersurvey.dto.SurveySubmitCreateDto; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; @@ -10,7 +10,7 @@ import java.util.List; import java.util.Optional; -import static com.atwoz.survey.fixture.SurveySubmitRequestFixture.필수_과목_질문_두개_제출_요청; +import static com.atwoz.survey.fixture.SurveySubmitCreateDtoFixture.필수_과목_질문_두개_제출_요청; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -27,7 +27,7 @@ class MemberSurveysJpaRepositoryTest { // given Long memberId = 1L; MemberSurveys memberSurveys = MemberSurveys.createWithMemberId(memberId); - List requests = 필수_과목_질문_두개_제출_요청(); + List requests = 필수_과목_질문_두개_제출_요청(); memberSurveys.submitSurveys(requests); // when From 4d2c5d5f58695100fb6e86f3f50049e33cdaee34 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 22:31:21 +0900 Subject: [PATCH 63/65] =?UTF-8?q?refactor:=20=EB=8F=99=EC=82=AC=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=82=AC=EC=9A=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 문법에 맞게 동사 중복 사용되지 않도록 수정 --- src/main/java/com/atwoz/survey/domain/survey/Survey.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index 3f13b4cc..81015fa5 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -51,7 +51,7 @@ private Survey(final String name, final Boolean required) { } public static Survey from(final SurveyCreateDto request) { - validateIsQuestionsNotDuplicated(request.questions()); + validateQuestionsNotDuplicated(request.questions()); Survey survey = new Survey(request.name(), request.required()); survey.addSurveyQuestions(request.questions()); @@ -59,7 +59,7 @@ public static Survey from(final SurveyCreateDto request) { return survey; } - private static void validateIsQuestionsNotDuplicated(final List questionRequests) { + private static void validateQuestionsNotDuplicated(final List questionRequests) { List questions = questionRequests.stream() .map(SurveyQuestionCreateDto::description) .toList(); From e653c88623b7644d1e20bb3dcbfa0f6e6e6851c4 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 22:52:02 +0900 Subject: [PATCH 64/65] =?UTF-8?q?refactor:=20=EB=8F=99=EC=82=AC=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=82=AC=EC=9A=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 문법에 맞게 동사 중복 사용되지 않도록 수정 --- .../java/com/atwoz/survey/domain/survey/Survey.java | 2 +- .../com/atwoz/survey/domain/survey/SurveyQuestion.java | 10 +++++----- .../atwoz/survey/domain/survey/SurveyQuestionTest.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/atwoz/survey/domain/survey/Survey.java b/src/main/java/com/atwoz/survey/domain/survey/Survey.java index 81015fa5..74e61deb 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/Survey.java +++ b/src/main/java/com/atwoz/survey/domain/survey/Survey.java @@ -81,7 +81,7 @@ public void validateIsValidSubmitSurveyRequest(final SurveyComparisonRequest req if (request.questions().size() != questions.size()) { throw new SurveyQuestionSubmitSizeNotMatchException(); } - questions.forEach(question -> question.validateIsValidSubmitAnswer(request.questions())); + questions.forEach(question -> question.validateSubmitAnswer(request.questions())); } public boolean isSameName(final String name) { diff --git a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java index 2050a84d..e83d1023 100644 --- a/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java +++ b/src/main/java/com/atwoz/survey/domain/survey/SurveyQuestion.java @@ -58,11 +58,11 @@ public static SurveyQuestion of(final String description, final List answers) { - validateIsAnswerNumbersNotDuplicated(answers); - validateIsAnswerDescriptionsNotDuplicated(answers); + validateAnswerNumbersNotDuplicated(answers); + validateAnswerDescriptionsNotDuplicated(answers); } - private static void validateIsAnswerNumbersNotDuplicated(final List answers) { + private static void validateAnswerNumbersNotDuplicated(final List answers) { List answerNumbers = answers.stream() .map(SurveyAnswerCreateDto::number) .toList(); @@ -72,7 +72,7 @@ private static void validateIsAnswerNumbersNotDuplicated(final List answers) { + private static void validateAnswerDescriptionsNotDuplicated(final List answers) { List answerDescriptions = answers.stream() .map(SurveyAnswerCreateDto::answer) .toList(); @@ -89,7 +89,7 @@ private void addSurveyAnswers(final List answers) { this.answers.addAll(surveyAnswers); } - public void validateIsValidSubmitAnswer(final List requests) { + public void validateSubmitAnswer(final List requests) { SurveyQuestionComparisonRequest questionRequest = findSurveyQuestionById(requests); if (!hasSameAnswer(questionRequest.answerNumber())) { throw new SurveyAnswerInvalidSubmitException(); diff --git a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java index 6bdfd649..103b52fb 100644 --- a/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java +++ b/src/test/java/com/atwoz/survey/domain/survey/SurveyQuestionTest.java @@ -61,7 +61,7 @@ class SurveyQuestionTest { ); // when & then - assertDoesNotThrow(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)); + assertDoesNotThrow(() -> surveyQuestion.validateSubmitAnswer(requests)); } @Test @@ -129,7 +129,7 @@ static Stream invalidSurveyAnswerRequests() { ); // when & then - assertThatThrownBy(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)) + assertThatThrownBy(() -> surveyQuestion.validateSubmitAnswer(requests)) .isInstanceOf(SurveyQuestionNotSubmittedException.class); } @@ -142,7 +142,7 @@ static Stream invalidSurveyAnswerRequests() { ); // when & then - assertThatThrownBy(() -> surveyQuestion.validateIsValidSubmitAnswer(requests)) + assertThatThrownBy(() -> surveyQuestion.validateSubmitAnswer(requests)) .isInstanceOf(SurveyAnswerInvalidSubmitException.class); } } From 6768ae98409040654a95bea9f7f3ad3f56e56aa0 Mon Sep 17 00:00:00 2001 From: devholic22 Date: Sun, 19 May 2024 22:56:06 +0900 Subject: [PATCH 65/65] =?UTF-8?q?refactor:=20surveyId=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - surveyId 중복 예외 메서드 분할 처리 --- .../application/membersurvey/MemberSurveysService.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java index 78a1a76b..2fc4e88b 100644 --- a/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java +++ b/src/main/java/com/atwoz/survey/application/membersurvey/MemberSurveysService.java @@ -50,11 +50,15 @@ private Set extractSubmittedSurveyIds(final List requ .toList(); HashSet surveyIds = new HashSet<>(submittedSurveyIds); + validateSurveyIdNotDuplicated(surveyIds, submittedSurveyIds); + + return surveyIds; + } + + private void validateSurveyIdNotDuplicated(final HashSet surveyIds, final List submittedSurveyIds) { if (surveyIds.size() != submittedSurveyIds.size()) { throw new SurveySubmitDuplicateException(); } - - return surveyIds; } private MemberSurveys createNewMemberSurveysWithMemberId(final Long memberId) {