Skip to content

Commit

Permalink
test: exam repository test
Browse files Browse the repository at this point in the history
  • Loading branch information
alstn113 committed Dec 26, 2024
1 parent 60a20e9 commit 5f32c33
Show file tree
Hide file tree
Showing 28 changed files with 231 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, Long> {

Member save(Member member);

Optional<Member> findById(Long id);
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findBySocialIdAndProvider(String socialId, OAuth2Provider provider);

default Member getById(Long id) {
default Member findByIdOrThrow(Long id) {
return findById(id)
.orElseThrow(() -> new NotFoundException("존재하지 않는 사용자입니다. 사용자 식별자: " + id));
}
Expand Down
18 changes: 8 additions & 10 deletions server/src/main/java/com/fluffy/exam/api/ExamController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -52,13 +50,13 @@ public ResponseEntity<PageResponse<ExamSummaryDto>> getPublishedExamSummaries(

@GetMapping("/api/v1/exams/mine")
public ResponseEntity<PageResponse<ExamSummaryDto>> 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<ExamSummaryDto> response = examQueryService.getMyExamSummaries(status, pageable, accessor);
PageResponse<ExamSummaryDto> response = examQueryService.getMyExamSummaries(pageable, status, accessor);

return ResponseEntity.ok(response);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -26,28 +24,28 @@ public class ExamQueryService {

@Transactional(readOnly = true)
public PageResponse<ExamSummaryDto> getPublishedExamSummaries(Pageable pageable) {
Page<ExamSummaryDto> examSummaries = examRepository.findPublishedSummaries(pageable);
Page<ExamSummaryDto> examSummaries = examRepository.findPublishedExamSummaries(pageable);

return PageResponse.of(examSummaries);
}

@Transactional(readOnly = true)
public PageResponse<ExamSummaryDto> getMyExamSummaries(ExamStatus status, Pageable pageable, Accessor accessor) {
Page<ExamSummaryDto> examSummaries = examRepository.findMySummaries(status, pageable, accessor.id());
public PageResponse<ExamSummaryDto> getMyExamSummaries(Pageable pageable, ExamStatus status, Accessor accessor) {
Page<ExamSummaryDto> 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("해당 시험에 접근할 수 없습니다.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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(
Expand Down
14 changes: 3 additions & 11 deletions server/src/main/java/com/fluffy/exam/domain/ExamRepository.java
Original file line number Diff line number Diff line change
@@ -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<Exam, Long>, ExamRepositoryCustom {
public interface ExamRepository extends JpaRepository<Exam, Long>, ExamRepositoryCustom {

List<Exam> findAll();

Exam save(Exam exam);

Optional<Exam> findById(Long id);

default Exam getById(Long id) {
default Exam findByIdOrThrow(Long id) {
return findById(id)
.orElseThrow(() -> new NotFoundException("존재하지 않는 시험입니다. 시험 식별자: " + id));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public interface ExamRepositoryCustom {

Page<ExamSummaryDto> findPublishedSummaries(Pageable pageable);
Page<ExamSummaryDto> findPublishedExamSummaries(Pageable pageable);

Page<ExamSummaryDto> findMySummaries(ExamStatus status, Pageable pageable, Long memberId);
Page<ExamSummaryDto> findMyExamSummaries(Pageable pageable, ExamStatus status, Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class ExamRepositoryImpl implements ExamRepositoryCustom {
private final JPAQueryFactory queryFactory;

@Override
public Page<ExamSummaryDto> findPublishedSummaries(Pageable pageable) {
public Page<ExamSummaryDto> findPublishedExamSummaries(Pageable pageable) {
List<ExamSummaryDto> content = queryFactory
.selectDistinct(new QExamSummaryDto(
exam.id,
Expand Down Expand Up @@ -73,7 +73,7 @@ public Page<ExamSummaryDto> findPublishedSummaries(Pageable pageable) {
}

@Override
public Page<ExamSummaryDto> findMySummaries(ExamStatus status, Pageable pageable, Long memberId) {
public Page<ExamSummaryDto> findMyExamSummaries(Pageable pageable, ExamStatus status, Long memberId) {
List<ExamSummaryDto> content = queryFactory
.selectDistinct(new QExamSummaryDto(
exam.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class SubmissionQueryService {

@Transactional(readOnly = true)
public List<SubmissionSummaryDto> getSummariesByExamId(Long examId, Accessor accessor) {
Exam exam = examRepository.getById(examId);
Exam exam = examRepository.findByIdOrThrow(examId);

if (exam.isNotWrittenBy(accessor.id())) {
throw new ForbiddenException("해당 시험 제출 목록을 조회할 권한이 없습니다.");
Expand All @@ -37,15 +37,15 @@ public List<SubmissionSummaryDto> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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("시험이 공개되지 않았습니다.");
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Submission, Long>, SubmissionRepositoryCustom {

List<Submission> findAll();

void save(Submission submission);
public interface SubmissionRepository extends JpaRepository<Submission, Long>, SubmissionRepositoryCustom {

boolean existsByExamIdAndMemberId(Long examId, Long memberId);

Optional<Submission> findById(Long submissionId);

default Submission getById(Long submissionId) {
default Submission findByIdOrThrow(Long submissionId) {
return findById(submissionId)
.orElseThrow(() -> new NotFoundException("존재하지 않는 제출입니다. 제출 식별자: " + submissionId));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,34 @@
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;
import static org.junit.jupiter.api.Assertions.assertAll;

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;
import com.fluffy.exam.application.request.question.QuestionOptionRequest;
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Loading

0 comments on commit 5f32c33

Please sign in to comment.