From 5f32c3318cf43339bf3d2dac4f288d0cd4f9e627 Mon Sep 17 00:00:00 2001 From: alstn113 Date: Thu, 26 Dec 2024 16:15:42 +0900 Subject: [PATCH] test: exam repository test --- .../fluffy/auth/application/AuthService.java | 2 +- .../fluffy/auth/domain/MemberRepository.java | 11 +- .../com/fluffy/exam/api/ExamController.java | 18 ++- .../exam/application/ExamQueryService.java | 12 +- .../fluffy/exam/application/ExamService.java | 6 +- .../fluffy/exam/domain/ExamRepository.java | 14 +- .../exam/domain/ExamRepositoryCustom.java | 4 +- .../infra/persistence/ExamRepositoryImpl.java | 4 +- .../application/SubmissionQueryService.java | 10 +- .../application/SubmissionService.java | 4 +- .../domain/SubmissionRepository.java | 14 +- .../application/ExamServiceTest.java} | 11 +- .../exam/domain/ExamDescriptionTest.java | 3 +- .../exam/domain/ExamPeriodTest.java | 3 +- .../exam/domain/ExamRepositoryTest.java | 135 ++++++++++++++++++ .../{unit => }/exam/domain/ExamTest.java | 6 +- .../{unit => }/exam/domain/ExamTitleTest.java | 3 +- .../exam/domain/QuestionGroupTest.java | 4 +- .../exam/domain/QuestionOptionGroupTest.java | 4 +- .../exam/domain/QuestionOptionTest.java | 3 +- .../{unit => }/exam/domain/QuestionTest.java | 5 +- .../exam/domain/QuestionTypeTest.java | 3 +- .../application/SubmissionServiceTest.java} | 7 +- .../domain/SubmissionRepositoryTest.java | 6 + .../AbstractAcceptanceTest.java | 2 +- .../AbstractControllerTest.java | 2 +- .../fluffy/support/AbstractDatabaseTest.java | 29 ++++ .../AbstractIntegrationTest.java | 7 +- 28 files changed, 231 insertions(+), 101 deletions(-) rename server/src/test/java/com/fluffy/{integration/exam/ExamServiceIntegrationTest.java => exam/application/ExamServiceTest.java} (94%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/ExamDescriptionTest.java (94%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/ExamPeriodTest.java (97%) create mode 100644 server/src/test/java/com/fluffy/exam/domain/ExamRepositoryTest.java rename server/src/test/java/com/fluffy/{unit => }/exam/domain/ExamTest.java (97%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/ExamTitleTest.java (94%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/QuestionGroupTest.java (88%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/QuestionOptionGroupTest.java (91%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/QuestionOptionTest.java (94%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/QuestionTest.java (95%) rename server/src/test/java/com/fluffy/{unit => }/exam/domain/QuestionTypeTest.java (93%) rename server/src/test/java/com/fluffy/{integration/submission/SubmissionServiceIntegrationTest.java => submission/application/SubmissionServiceTest.java} (92%) create mode 100644 server/src/test/java/com/fluffy/submission/domain/SubmissionRepositoryTest.java rename server/src/test/java/com/fluffy/{acceptance => support}/AbstractAcceptanceTest.java (97%) rename server/src/test/java/com/fluffy/{unit => support}/AbstractControllerTest.java (98%) create mode 100644 server/src/test/java/com/fluffy/support/AbstractDatabaseTest.java rename server/src/test/java/com/fluffy/{integration => support}/AbstractIntegrationTest.java (80%) diff --git a/server/src/main/java/com/fluffy/auth/application/AuthService.java b/server/src/main/java/com/fluffy/auth/application/AuthService.java index a54abc0..adc1898 100644 --- a/server/src/main/java/com/fluffy/auth/application/AuthService.java +++ b/server/src/main/java/com/fluffy/auth/application/AuthService.java @@ -24,7 +24,7 @@ public Long getMemberIdByToken(String token) { @Transactional(readOnly = true) public MyInfoResponse getMyInfo(Long memberId) { - Member member = memberRepository.getById(memberId); + Member member = memberRepository.findByIdOrThrow(memberId); return memberMapper.toMyInfoResponse(member); } diff --git a/server/src/main/java/com/fluffy/auth/domain/MemberRepository.java b/server/src/main/java/com/fluffy/auth/domain/MemberRepository.java index f1ff7c3..8d5e16b 100644 --- a/server/src/main/java/com/fluffy/auth/domain/MemberRepository.java +++ b/server/src/main/java/com/fluffy/auth/domain/MemberRepository.java @@ -2,17 +2,12 @@ import com.fluffy.global.exception.NotFoundException; import java.util.Optional; -import org.springframework.data.repository.Repository; - -public interface MemberRepository extends Repository { - - Member save(Member member); - - Optional findById(Long id); +import org.springframework.data.jpa.repository.JpaRepository; +public interface MemberRepository extends JpaRepository { Optional findBySocialIdAndProvider(String socialId, OAuth2Provider provider); - default Member getById(Long id) { + default Member findByIdOrThrow(Long id) { return findById(id) .orElseThrow(() -> new NotFoundException("존재하지 않는 사용자입니다. 사용자 식별자: " + id)); } diff --git a/server/src/main/java/com/fluffy/exam/api/ExamController.java b/server/src/main/java/com/fluffy/exam/api/ExamController.java index 0b75858..fe1a45f 100644 --- a/server/src/main/java/com/fluffy/exam/api/ExamController.java +++ b/server/src/main/java/com/fluffy/exam/api/ExamController.java @@ -1,25 +1,23 @@ package com.fluffy.exam.api; +import com.fluffy.exam.api.request.CreateExamWebRequest; +import com.fluffy.exam.api.request.PublishExamWebRequest; +import com.fluffy.exam.api.request.UpdateExamDescriptionWebRequest; +import com.fluffy.exam.api.request.UpdateExamQuestionsWebRequest; +import com.fluffy.exam.api.request.UpdateExamTitleWebRequest; import com.fluffy.exam.application.ExamQueryService; import com.fluffy.exam.application.ExamService; +import com.fluffy.exam.application.response.CreateExamResponse; import com.fluffy.exam.application.response.ExamResponse; import com.fluffy.exam.application.response.ExamWithAnswersResponse; -import com.fluffy.exam.application.response.CreateExamResponse; import com.fluffy.exam.domain.ExamStatus; import com.fluffy.exam.domain.dto.ExamSummaryDto; -import com.fluffy.exam.api.request.CreateExamWebRequest; -import com.fluffy.exam.api.request.PublishExamWebRequest; -import com.fluffy.exam.api.request.UpdateExamDescriptionWebRequest; -import com.fluffy.exam.api.request.UpdateExamQuestionsWebRequest; -import com.fluffy.exam.api.request.UpdateExamTitleWebRequest; import com.fluffy.global.response.PageResponse; import com.fluffy.global.web.Accessor; import com.fluffy.global.web.Auth; import jakarta.validation.Valid; import java.net.URI; -import java.util.List; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; @@ -52,13 +50,13 @@ public ResponseEntity> getPublishedExamSummaries( @GetMapping("/api/v1/exams/mine") public ResponseEntity> getMyExamSummaries( - @RequestParam(value = "status", defaultValue = "draft") ExamStatus status, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, + @RequestParam(value = "status", defaultValue = "draft") ExamStatus status, @Auth Accessor accessor ) { Pageable pageable = PageRequest.of(page, size); - PageResponse response = examQueryService.getMyExamSummaries(status, pageable, accessor); + PageResponse response = examQueryService.getMyExamSummaries(pageable, status, accessor); return ResponseEntity.ok(response); } diff --git a/server/src/main/java/com/fluffy/exam/application/ExamQueryService.java b/server/src/main/java/com/fluffy/exam/application/ExamQueryService.java index 4858bab..13b54c6 100644 --- a/server/src/main/java/com/fluffy/exam/application/ExamQueryService.java +++ b/server/src/main/java/com/fluffy/exam/application/ExamQueryService.java @@ -9,10 +9,8 @@ import com.fluffy.global.exception.ForbiddenException; import com.fluffy.global.response.PageResponse; import com.fluffy.global.web.Accessor; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,28 +24,28 @@ public class ExamQueryService { @Transactional(readOnly = true) public PageResponse getPublishedExamSummaries(Pageable pageable) { - Page examSummaries = examRepository.findPublishedSummaries(pageable); + Page examSummaries = examRepository.findPublishedExamSummaries(pageable); return PageResponse.of(examSummaries); } @Transactional(readOnly = true) - public PageResponse getMyExamSummaries(ExamStatus status, Pageable pageable, Accessor accessor) { - Page examSummaries = examRepository.findMySummaries(status, pageable, accessor.id()); + public PageResponse getMyExamSummaries(Pageable pageable, ExamStatus status, Accessor accessor) { + Page examSummaries = examRepository.findMyExamSummaries(pageable, status, accessor.id()); return PageResponse.of(examSummaries); } @Transactional(readOnly = true) public ExamResponse getExam(Long examId) { - Exam exam = examRepository.getById(examId); + Exam exam = examRepository.findByIdOrThrow(examId); return examMapper.toResponse(exam); } @Transactional(readOnly = true) public ExamWithAnswersResponse getExamWithAnswers(Long examId, Accessor accessor) { - Exam exam = examRepository.getById(examId); + Exam exam = examRepository.findByIdOrThrow(examId); if (exam.isNotWrittenBy(accessor.id())) { throw new ForbiddenException("해당 시험에 접근할 수 없습니다."); diff --git a/server/src/main/java/com/fluffy/exam/application/ExamService.java b/server/src/main/java/com/fluffy/exam/application/ExamService.java index 2277c2d..baf0ae7 100644 --- a/server/src/main/java/com/fluffy/exam/application/ExamService.java +++ b/server/src/main/java/com/fluffy/exam/application/ExamService.java @@ -30,7 +30,7 @@ public class ExamService { @Transactional public CreateExamResponse create(CreateExamAppRequest request) { Accessor accessor = request.accessor(); - Member member = memberRepository.getById(accessor.id()); + Member member = memberRepository.findByIdOrThrow(accessor.id()); Exam exam = Exam.create(request.title(), member.getId()); Exam savedExam = examRepository.save(exam); @@ -57,8 +57,8 @@ public void publish(PublishExamAppRequest request) { } private Exam validateExamAuthor(Long examId, Accessor accessor) { - Exam exam = examRepository.getById(examId); - Member member = memberRepository.getById(accessor.id()); + Exam exam = examRepository.findByIdOrThrow(examId); + Member member = memberRepository.findByIdOrThrow(accessor.id()); if (exam.isNotWrittenBy(member.getId())) { throw new ForbiddenException( diff --git a/server/src/main/java/com/fluffy/exam/domain/ExamRepository.java b/server/src/main/java/com/fluffy/exam/domain/ExamRepository.java index 7d56c3d..cce5426 100644 --- a/server/src/main/java/com/fluffy/exam/domain/ExamRepository.java +++ b/server/src/main/java/com/fluffy/exam/domain/ExamRepository.java @@ -1,19 +1,11 @@ package com.fluffy.exam.domain; import com.fluffy.global.exception.NotFoundException; -import java.util.List; -import java.util.Optional; -import org.springframework.data.repository.Repository; +import org.springframework.data.jpa.repository.JpaRepository; -public interface ExamRepository extends Repository, ExamRepositoryCustom { +public interface ExamRepository extends JpaRepository, ExamRepositoryCustom { - List findAll(); - - Exam save(Exam exam); - - Optional findById(Long id); - - default Exam getById(Long id) { + default Exam findByIdOrThrow(Long id) { return findById(id) .orElseThrow(() -> new NotFoundException("존재하지 않는 시험입니다. 시험 식별자: " + id)); } diff --git a/server/src/main/java/com/fluffy/exam/domain/ExamRepositoryCustom.java b/server/src/main/java/com/fluffy/exam/domain/ExamRepositoryCustom.java index 1139d1e..c9a8563 100644 --- a/server/src/main/java/com/fluffy/exam/domain/ExamRepositoryCustom.java +++ b/server/src/main/java/com/fluffy/exam/domain/ExamRepositoryCustom.java @@ -6,7 +6,7 @@ public interface ExamRepositoryCustom { - Page findPublishedSummaries(Pageable pageable); + Page findPublishedExamSummaries(Pageable pageable); - Page findMySummaries(ExamStatus status, Pageable pageable, Long memberId); + Page findMyExamSummaries(Pageable pageable, ExamStatus status, Long memberId); } diff --git a/server/src/main/java/com/fluffy/exam/infra/persistence/ExamRepositoryImpl.java b/server/src/main/java/com/fluffy/exam/infra/persistence/ExamRepositoryImpl.java index 496157f..232e741 100644 --- a/server/src/main/java/com/fluffy/exam/infra/persistence/ExamRepositoryImpl.java +++ b/server/src/main/java/com/fluffy/exam/infra/persistence/ExamRepositoryImpl.java @@ -33,7 +33,7 @@ public class ExamRepositoryImpl implements ExamRepositoryCustom { private final JPAQueryFactory queryFactory; @Override - public Page findPublishedSummaries(Pageable pageable) { + public Page findPublishedExamSummaries(Pageable pageable) { List content = queryFactory .selectDistinct(new QExamSummaryDto( exam.id, @@ -73,7 +73,7 @@ public Page findPublishedSummaries(Pageable pageable) { } @Override - public Page findMySummaries(ExamStatus status, Pageable pageable, Long memberId) { + public Page findMyExamSummaries(Pageable pageable, ExamStatus status, Long memberId) { List content = queryFactory .selectDistinct(new QExamSummaryDto( exam.id, diff --git a/server/src/main/java/com/fluffy/submission/application/SubmissionQueryService.java b/server/src/main/java/com/fluffy/submission/application/SubmissionQueryService.java index c6a2fb3..f3c8572 100644 --- a/server/src/main/java/com/fluffy/submission/application/SubmissionQueryService.java +++ b/server/src/main/java/com/fluffy/submission/application/SubmissionQueryService.java @@ -26,7 +26,7 @@ public class SubmissionQueryService { @Transactional(readOnly = true) public List getSummariesByExamId(Long examId, Accessor accessor) { - Exam exam = examRepository.getById(examId); + Exam exam = examRepository.findByIdOrThrow(examId); if (exam.isNotWrittenBy(accessor.id())) { throw new ForbiddenException("해당 시험 제출 목록을 조회할 권한이 없습니다."); @@ -37,15 +37,15 @@ public List getSummariesByExamId(Long examId, Accessor acc @Transactional(readOnly = true) public SubmissionDetailResponse getDetail(Long examId, Long submissionId, Accessor accessor) { - Exam exam = examRepository.getById(examId); - Member member = memberRepository.getById(accessor.id()); + Exam exam = examRepository.findByIdOrThrow(examId); + Member member = memberRepository.findByIdOrThrow(accessor.id()); if (exam.isNotWrittenBy(member.getId())) { throw new ForbiddenException("해당 시험 제출을 조회할 권한이 없습니다."); } - Submission submission = submissionRepository.getById(submissionId); - Member submitter = memberRepository.getById(submission.getMemberId()); + Submission submission = submissionRepository.findByIdOrThrow(submissionId); + Member submitter = memberRepository.findByIdOrThrow(submission.getMemberId()); return submissionMapper.toDetailResponse(exam, submission, submitter); } diff --git a/server/src/main/java/com/fluffy/submission/application/SubmissionService.java b/server/src/main/java/com/fluffy/submission/application/SubmissionService.java index 41c3747..60a46d5 100644 --- a/server/src/main/java/com/fluffy/submission/application/SubmissionService.java +++ b/server/src/main/java/com/fluffy/submission/application/SubmissionService.java @@ -23,8 +23,8 @@ public class SubmissionService { @DistributedLock(key = "#lockName") public void submit(SubmissionAppRequest request, String lockName) { - Member member = memberRepository.getById(request.accessor().id()); - Exam exam = examRepository.getById(request.examId()); + Member member = memberRepository.findByIdOrThrow(request.accessor().id()); + Exam exam = examRepository.findByIdOrThrow(request.examId()); if (exam.isNotPublished()) { throw new BadRequestException("시험이 공개되지 않았습니다."); diff --git a/server/src/main/java/com/fluffy/submission/domain/SubmissionRepository.java b/server/src/main/java/com/fluffy/submission/domain/SubmissionRepository.java index 57c47f8..9dc5ef3 100644 --- a/server/src/main/java/com/fluffy/submission/domain/SubmissionRepository.java +++ b/server/src/main/java/com/fluffy/submission/domain/SubmissionRepository.java @@ -1,21 +1,13 @@ package com.fluffy.submission.domain; import com.fluffy.global.exception.NotFoundException; -import java.util.List; -import java.util.Optional; -import org.springframework.data.repository.Repository; +import org.springframework.data.jpa.repository.JpaRepository; -public interface SubmissionRepository extends Repository, SubmissionRepositoryCustom { - - List findAll(); - - void save(Submission submission); +public interface SubmissionRepository extends JpaRepository, SubmissionRepositoryCustom { boolean existsByExamIdAndMemberId(Long examId, Long memberId); - Optional findById(Long submissionId); - - default Submission getById(Long submissionId) { + default Submission findByIdOrThrow(Long submissionId) { return findById(submissionId) .orElseThrow(() -> new NotFoundException("존재하지 않는 제출입니다. 제출 식별자: " + submissionId)); } diff --git a/server/src/test/java/com/fluffy/integration/exam/ExamServiceIntegrationTest.java b/server/src/test/java/com/fluffy/exam/application/ExamServiceTest.java similarity index 94% rename from server/src/test/java/com/fluffy/integration/exam/ExamServiceIntegrationTest.java rename to server/src/test/java/com/fluffy/exam/application/ExamServiceTest.java index 67ea7a6..e9af7d1 100644 --- a/server/src/test/java/com/fluffy/integration/exam/ExamServiceIntegrationTest.java +++ b/server/src/test/java/com/fluffy/exam/application/ExamServiceTest.java @@ -1,4 +1,4 @@ -package com.fluffy.integration.exam; +package com.fluffy.exam.application; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -6,10 +6,8 @@ import com.fluffy.auth.domain.Member; import com.fluffy.auth.domain.MemberRepository; -import com.fluffy.exam.application.ExamService; import com.fluffy.exam.application.request.CreateExamAppRequest; import com.fluffy.exam.application.request.UpdateExamQuestionsAppRequest; -import com.fluffy.exam.application.response.CreateExamResponse; import com.fluffy.exam.application.request.question.LongAnswerQuestionAppRequest; import com.fluffy.exam.application.request.question.MultipleChoiceAppRequest; import com.fluffy.exam.application.request.question.QuestionAppRequest; @@ -17,21 +15,20 @@ import com.fluffy.exam.application.request.question.ShortAnswerQuestionAppRequest; import com.fluffy.exam.application.request.question.SingleChoiceQuestionAppRequest; import com.fluffy.exam.application.request.question.TrueOrFalseQuestionAppRequest; +import com.fluffy.exam.application.response.CreateExamResponse; import com.fluffy.exam.domain.Exam; import com.fluffy.exam.domain.ExamRepository; import com.fluffy.exam.domain.QuestionRepository; import com.fluffy.global.exception.ForbiddenException; import com.fluffy.global.web.Accessor; -import com.fluffy.integration.AbstractIntegrationTest; +import com.fluffy.support.AbstractIntegrationTest; import com.fluffy.support.data.MemberTestData; import java.util.List; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -@Disabled("동시성 문제 해결 방법 미정으로 테스트 비활성화합니다.") -class ExamServiceIntegrationTest extends AbstractIntegrationTest { +class ExamServiceTest extends AbstractIntegrationTest { @Autowired private ExamService examService; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/ExamDescriptionTest.java b/server/src/test/java/com/fluffy/exam/domain/ExamDescriptionTest.java similarity index 94% rename from server/src/test/java/com/fluffy/unit/exam/domain/ExamDescriptionTest.java rename to server/src/test/java/com/fluffy/exam/domain/ExamDescriptionTest.java index c2c8442..4eac53e 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/ExamDescriptionTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/ExamDescriptionTest.java @@ -1,9 +1,8 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.fluffy.exam.domain.ExamDescription; import com.fluffy.global.exception.BadRequestException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/ExamPeriodTest.java b/server/src/test/java/com/fluffy/exam/domain/ExamPeriodTest.java similarity index 97% rename from server/src/test/java/com/fluffy/unit/exam/domain/ExamPeriodTest.java rename to server/src/test/java/com/fluffy/exam/domain/ExamPeriodTest.java index 40c29db..9d3be26 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/ExamPeriodTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/ExamPeriodTest.java @@ -1,10 +1,9 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; -import com.fluffy.exam.domain.ExamPeriod; import com.fluffy.global.exception.BadRequestException; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; diff --git a/server/src/test/java/com/fluffy/exam/domain/ExamRepositoryTest.java b/server/src/test/java/com/fluffy/exam/domain/ExamRepositoryTest.java new file mode 100644 index 0000000..56e0f0f --- /dev/null +++ b/server/src/test/java/com/fluffy/exam/domain/ExamRepositoryTest.java @@ -0,0 +1,135 @@ +package com.fluffy.exam.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.fluffy.auth.domain.Member; +import com.fluffy.auth.domain.MemberRepository; +import com.fluffy.exam.domain.dto.ExamSummaryDto; +import com.fluffy.support.AbstractDatabaseTest; +import com.fluffy.support.data.MemberTestData; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; + +class ExamRepositoryTest extends AbstractDatabaseTest { + + @Autowired + private ExamRepository examRepository; + + @Autowired + private MemberRepository memberRepository; + + @Test + @DisplayName("출제된 시험 요약 목록을 조회할 수 있다.") + void findPublishedExamSummaries() { + // given + Member member1 = MemberTestData.defaultMember().build(); + memberRepository.save(member1); + + Member member2 = MemberTestData.defaultMember().build(); + memberRepository.save(member2); + + Exam publishedExam1 = Exam.create("publishedExam1", member1.getId()); + publishedExam1.updateQuestions(List.of(Question.shortAnswer("질문1", "답1"))); + publishedExam1.publish(null, null); + examRepository.save(publishedExam1); + + Exam publishedExam2 = Exam.create("publishedExam2", member1.getId()); + publishedExam2.updateQuestions(List.of( + Question.shortAnswer("질문3", "답3"), + Question.shortAnswer("질문5", "답5") + )); + publishedExam2.publish(null, null); + examRepository.save(publishedExam2); + + Exam draftExam1 = Exam.create("draftExam1", member1.getId()); + draftExam1.updateQuestions(List.of(Question.shortAnswer("질문2", "답2"))); + examRepository.save(draftExam1); + + Exam publishedExam3 = Exam.create("publishedExam3", member2.getId()); + publishedExam3.updateQuestions(List.of( + Question.shortAnswer("질문4", "답4"), + Question.shortAnswer("질문6", "답6"), + Question.shortAnswer("질문7", "답7") + )); + publishedExam3.publish(null, null); + examRepository.save(publishedExam3); + + // when + PageRequest pageable = PageRequest.of(0, 2); + Page publishedExamSummaries = examRepository.findPublishedExamSummaries(pageable); + + // then + assertAll( + () -> assertThat(publishedExamSummaries.getTotalElements()).isEqualTo(3), + () -> assertThat(publishedExamSummaries.getTotalPages()).isEqualTo(2), + () -> assertThat(publishedExamSummaries.getNumber()).isZero(), + () -> assertThat(publishedExamSummaries.getSize()).isEqualTo(2), + () -> assertThat(publishedExamSummaries.getContent().stream().map(ExamSummaryDto::getId)) + .containsExactlyElementsOf(List.of(publishedExam3.getId(), publishedExam2.getId())), + () -> assertThat(publishedExamSummaries.getContent().stream().map(ExamSummaryDto::getQuestionCount)) + .containsExactlyElementsOf(List.of(3L, 2L)) + ); + } + + @Test + @DisplayName("내가 출제 중인 시험 요약 목록을 조회할 수 있다.") + void findMyExamSummaries() { + // given + Member member1 = MemberTestData.defaultMember().build(); + memberRepository.save(member1); + + Member member2 = MemberTestData.defaultMember().build(); + memberRepository.save(member2); + + Exam publishedExam1 = Exam.create("publishedExam1", member1.getId()); + publishedExam1.updateQuestions(List.of(Question.shortAnswer("질문1", "답1"))); + publishedExam1.publish(null, null); + examRepository.save(publishedExam1); + + Exam publishedExam2 = Exam.create("publishedExam2", member2.getId()); + publishedExam2.updateQuestions(List.of( + Question.shortAnswer("질문3", "답3"), + Question.shortAnswer("질문5", "답5") + )); + publishedExam2.publish(null, null); + examRepository.save(publishedExam2); + + Exam draftExam1 = Exam.create("draftExam1", member1.getId()); + draftExam1.updateQuestions(List.of(Question.shortAnswer("질문2", "답2"))); + examRepository.save(draftExam1); + + Exam publishedExam3 = Exam.create("publishedExam3", member1.getId()); + publishedExam3.updateQuestions(List.of( + Question.shortAnswer("질문4", "답4"), + Question.shortAnswer("질문6", "답6"), + Question.shortAnswer("질문7", "답7") + )); + publishedExam3.publish(null, null); + examRepository.save(publishedExam3); + + // when + PageRequest pageable = PageRequest.of(0, 2); + Page myExamSummaries = examRepository.findMyExamSummaries( + pageable, + ExamStatus.PUBLISHED, + member1.getId() + ); + + // then + assertAll( + () -> assertThat(myExamSummaries.getTotalElements()).isEqualTo(2), + () -> assertThat(myExamSummaries.getTotalPages()).isEqualTo(1), + () -> assertThat(myExamSummaries.getNumber()).isZero(), + () -> assertThat(myExamSummaries.getSize()).isEqualTo(2), + () -> assertThat(myExamSummaries.getContent().stream().map(ExamSummaryDto::getId)) + .containsExactlyElementsOf(List.of(publishedExam3.getId(), publishedExam1.getId())), + () -> assertThat(myExamSummaries.getContent().stream().map(ExamSummaryDto::getQuestionCount)) + .containsExactlyElementsOf(List.of(3L, 1L)) + ); + } +} diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/ExamTest.java b/server/src/test/java/com/fluffy/exam/domain/ExamTest.java similarity index 97% rename from server/src/test/java/com/fluffy/unit/exam/domain/ExamTest.java rename to server/src/test/java/com/fluffy/exam/domain/ExamTest.java index 33ecaf4..8f01b04 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/ExamTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/ExamTest.java @@ -1,13 +1,9 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; -import com.fluffy.exam.domain.Exam; -import com.fluffy.exam.domain.ExamStatus; -import com.fluffy.exam.domain.Question; -import com.fluffy.exam.domain.QuestionOption; import com.fluffy.global.exception.BadRequestException; import java.util.List; import org.junit.jupiter.api.DisplayName; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/ExamTitleTest.java b/server/src/test/java/com/fluffy/exam/domain/ExamTitleTest.java similarity index 94% rename from server/src/test/java/com/fluffy/unit/exam/domain/ExamTitleTest.java rename to server/src/test/java/com/fluffy/exam/domain/ExamTitleTest.java index 2fc6414..b3a5ce5 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/ExamTitleTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/ExamTitleTest.java @@ -1,9 +1,8 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.fluffy.exam.domain.ExamTitle; import com.fluffy.global.exception.BadRequestException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionGroupTest.java b/server/src/test/java/com/fluffy/exam/domain/QuestionGroupTest.java similarity index 88% rename from server/src/test/java/com/fluffy/unit/exam/domain/QuestionGroupTest.java rename to server/src/test/java/com/fluffy/exam/domain/QuestionGroupTest.java index 980b8fa..7087976 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionGroupTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/QuestionGroupTest.java @@ -1,9 +1,7 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.fluffy.exam.domain.Question; -import com.fluffy.exam.domain.QuestionGroup; import com.fluffy.global.exception.BadRequestException; import java.util.List; import java.util.stream.IntStream; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionOptionGroupTest.java b/server/src/test/java/com/fluffy/exam/domain/QuestionOptionGroupTest.java similarity index 91% rename from server/src/test/java/com/fluffy/unit/exam/domain/QuestionOptionGroupTest.java rename to server/src/test/java/com/fluffy/exam/domain/QuestionOptionGroupTest.java index 2955971..5bad11f 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionOptionGroupTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/QuestionOptionGroupTest.java @@ -1,9 +1,7 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.fluffy.exam.domain.QuestionOption; -import com.fluffy.exam.domain.QuestionOptionGroup; import com.fluffy.global.exception.BadRequestException; import java.util.List; import java.util.stream.IntStream; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionOptionTest.java b/server/src/test/java/com/fluffy/exam/domain/QuestionOptionTest.java similarity index 94% rename from server/src/test/java/com/fluffy/unit/exam/domain/QuestionOptionTest.java rename to server/src/test/java/com/fluffy/exam/domain/QuestionOptionTest.java index b6fa0d2..152bc74 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionOptionTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/QuestionOptionTest.java @@ -1,9 +1,8 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.fluffy.exam.domain.QuestionOption; import com.fluffy.global.exception.BadRequestException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionTest.java b/server/src/test/java/com/fluffy/exam/domain/QuestionTest.java similarity index 95% rename from server/src/test/java/com/fluffy/unit/exam/domain/QuestionTest.java rename to server/src/test/java/com/fluffy/exam/domain/QuestionTest.java index 7d63826..c64deba 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/QuestionTest.java @@ -1,13 +1,10 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.tuple; import static org.junit.jupiter.api.Assertions.assertAll; -import com.fluffy.exam.domain.Question; -import com.fluffy.exam.domain.QuestionOption; -import com.fluffy.exam.domain.QuestionType; import com.fluffy.global.exception.BadRequestException; import java.util.List; import org.junit.jupiter.api.DisplayName; diff --git a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionTypeTest.java b/server/src/test/java/com/fluffy/exam/domain/QuestionTypeTest.java similarity index 93% rename from server/src/test/java/com/fluffy/unit/exam/domain/QuestionTypeTest.java rename to server/src/test/java/com/fluffy/exam/domain/QuestionTypeTest.java index 34637d8..5e9d5c1 100644 --- a/server/src/test/java/com/fluffy/unit/exam/domain/QuestionTypeTest.java +++ b/server/src/test/java/com/fluffy/exam/domain/QuestionTypeTest.java @@ -1,9 +1,8 @@ -package com.fluffy.unit.exam.domain; +package com.fluffy.exam.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.fluffy.exam.domain.QuestionType; import com.fluffy.global.exception.NotFoundException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/server/src/test/java/com/fluffy/integration/submission/SubmissionServiceIntegrationTest.java b/server/src/test/java/com/fluffy/submission/application/SubmissionServiceTest.java similarity index 92% rename from server/src/test/java/com/fluffy/integration/submission/SubmissionServiceIntegrationTest.java rename to server/src/test/java/com/fluffy/submission/application/SubmissionServiceTest.java index 14ef40e..229e7ec 100644 --- a/server/src/test/java/com/fluffy/integration/submission/SubmissionServiceIntegrationTest.java +++ b/server/src/test/java/com/fluffy/submission/application/SubmissionServiceTest.java @@ -1,4 +1,4 @@ -package com.fluffy.integration.submission; +package com.fluffy.submission.application; import static com.fluffy.auth.domain.OAuth2Provider.GOOGLE; import static java.util.concurrent.Executors.newFixedThreadPool; @@ -10,8 +10,7 @@ import com.fluffy.exam.domain.ExamRepository; import com.fluffy.exam.domain.Question; import com.fluffy.global.web.Accessor; -import com.fluffy.integration.AbstractIntegrationTest; -import com.fluffy.submission.application.SubmissionService; +import com.fluffy.support.AbstractIntegrationTest; import com.fluffy.submission.application.request.QuestionResponseAppRequest; import com.fluffy.submission.application.request.SubmissionAppRequest; import com.fluffy.submission.domain.Submission; @@ -25,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; @Disabled("동시성 문제 해결 방법 미정으로 테스트 비활성화합니다.") -class SubmissionServiceIntegrationTest extends AbstractIntegrationTest { +class SubmissionServiceTest extends AbstractIntegrationTest { @Autowired private SubmissionService submissionService; diff --git a/server/src/test/java/com/fluffy/submission/domain/SubmissionRepositoryTest.java b/server/src/test/java/com/fluffy/submission/domain/SubmissionRepositoryTest.java new file mode 100644 index 0000000..9e6ce3a --- /dev/null +++ b/server/src/test/java/com/fluffy/submission/domain/SubmissionRepositoryTest.java @@ -0,0 +1,6 @@ +package com.fluffy.submission.domain; + +import com.fluffy.support.AbstractDatabaseTest; + +class SubmissionRepositoryTest extends AbstractDatabaseTest { +} diff --git a/server/src/test/java/com/fluffy/acceptance/AbstractAcceptanceTest.java b/server/src/test/java/com/fluffy/support/AbstractAcceptanceTest.java similarity index 97% rename from server/src/test/java/com/fluffy/acceptance/AbstractAcceptanceTest.java rename to server/src/test/java/com/fluffy/support/AbstractAcceptanceTest.java index a62db1e..e888e7b 100644 --- a/server/src/test/java/com/fluffy/acceptance/AbstractAcceptanceTest.java +++ b/server/src/test/java/com/fluffy/support/AbstractAcceptanceTest.java @@ -1,4 +1,4 @@ -package com.fluffy.acceptance; +package com.fluffy.support; import com.fluffy.support.cleaner.DatabaseCleaner; import com.fluffy.support.cleaner.DatabaseClearExtension; diff --git a/server/src/test/java/com/fluffy/unit/AbstractControllerTest.java b/server/src/test/java/com/fluffy/support/AbstractControllerTest.java similarity index 98% rename from server/src/test/java/com/fluffy/unit/AbstractControllerTest.java rename to server/src/test/java/com/fluffy/support/AbstractControllerTest.java index a347219..9443783 100644 --- a/server/src/test/java/com/fluffy/unit/AbstractControllerTest.java +++ b/server/src/test/java/com/fluffy/support/AbstractControllerTest.java @@ -1,4 +1,4 @@ -package com.fluffy.unit; +package com.fluffy.support; import com.fluffy.auth.application.AuthService; import com.fluffy.auth.api.AuthController; diff --git a/server/src/test/java/com/fluffy/support/AbstractDatabaseTest.java b/server/src/test/java/com/fluffy/support/AbstractDatabaseTest.java new file mode 100644 index 0000000..12f2337 --- /dev/null +++ b/server/src/test/java/com/fluffy/support/AbstractDatabaseTest.java @@ -0,0 +1,29 @@ +package com.fluffy.support; + +import com.fluffy.support.cleaner.DatabaseCleaner; +import com.fluffy.support.cleaner.DatabaseClearExtension; +import org.junit.jupiter.api.extension.ExtendWith; +import org.redisson.api.RedissonClient; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(classes = {AbstractDatabaseTest.TestConfig.class}) +@ExtendWith(DatabaseClearExtension.class) +@ActiveProfiles("test") +public abstract class AbstractDatabaseTest { + + @MockBean + protected RedissonClient redissonClient; + + @TestConfiguration + public static class TestConfig { + + @Bean + public DatabaseCleaner databaseCleaner() { + return new DatabaseCleaner(); + } + } +} diff --git a/server/src/test/java/com/fluffy/integration/AbstractIntegrationTest.java b/server/src/test/java/com/fluffy/support/AbstractIntegrationTest.java similarity index 80% rename from server/src/test/java/com/fluffy/integration/AbstractIntegrationTest.java rename to server/src/test/java/com/fluffy/support/AbstractIntegrationTest.java index 709fd9d..3141da5 100644 --- a/server/src/test/java/com/fluffy/integration/AbstractIntegrationTest.java +++ b/server/src/test/java/com/fluffy/support/AbstractIntegrationTest.java @@ -1,10 +1,12 @@ -package com.fluffy.integration; +package com.fluffy.support; import com.fluffy.support.cleaner.DatabaseCleaner; import com.fluffy.support.cleaner.DatabaseClearExtension; import org.junit.jupiter.api.extension.ExtendWith; +import org.redisson.api.RedissonClient; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.springframework.test.context.ActiveProfiles; @@ -13,6 +15,9 @@ @ActiveProfiles("test") public abstract class AbstractIntegrationTest { + @MockBean + protected RedissonClient redissonClient; + @TestConfiguration public static class TestConfig {