From 978e3342af8636b30b11c2aa3bee4c53c1d6180e Mon Sep 17 00:00:00 2001 From: rladmstn Date: Sat, 17 Aug 2024 23:55:33 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20=EB=AC=B8=EC=A0=9C=20=ED=92=80?= =?UTF-8?q?=EC=9D=B4=20=EA=B2=B0=EA=B3=BC=20=ED=95=84=EB=93=9C=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 풀이 결과 boolean isCorrect -> String result로 수정 --- .../algohub/feature/solution/domain/Solution.java | 10 +++------- .../feature/solution/dto/GetSolutionResponse.java | 4 ++-- .../feature/solution/service/SolutionService.java | 3 ++- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gamzabat/algohub/feature/solution/domain/Solution.java b/src/main/java/com/gamzabat/algohub/feature/solution/domain/Solution.java index 1d425c2b..dabfaeca 100644 --- a/src/main/java/com/gamzabat/algohub/feature/solution/domain/Solution.java +++ b/src/main/java/com/gamzabat/algohub/feature/solution/domain/Solution.java @@ -33,27 +33,23 @@ public class Solution { private LocalDateTime solvedDateTime; private String content; - private boolean isCorrect; + private String result; private Integer memoryUsage; private Integer executionTime; private String language; private Integer codeLength; @Builder - public Solution(Problem problem, User user, LocalDateTime solvedDateTime, String content, boolean isCorrect, + public Solution(Problem problem, User user, LocalDateTime solvedDateTime, String content, String result, Integer memoryUsage, Integer executionTime, String language, Integer codeLength) { this.problem = problem; this.user = user; this.solvedDateTime = solvedDateTime; this.content = content; - this.isCorrect = isCorrect; + this.result = result; this.memoryUsage = memoryUsage; this.executionTime = executionTime; this.language = language; this.codeLength = codeLength; } - - public LocalDateTime getSolvedDateTime() { - return solvedDateTime; - } } diff --git a/src/main/java/com/gamzabat/algohub/feature/solution/dto/GetSolutionResponse.java b/src/main/java/com/gamzabat/algohub/feature/solution/dto/GetSolutionResponse.java index 286b8f8d..4de6abd9 100644 --- a/src/main/java/com/gamzabat/algohub/feature/solution/dto/GetSolutionResponse.java +++ b/src/main/java/com/gamzabat/algohub/feature/solution/dto/GetSolutionResponse.java @@ -12,7 +12,7 @@ public record GetSolutionResponse(Long solutionId, String profileImage, String solvedDateTime, String content, - boolean isCorrect, + String result, Integer memoryUsage, Integer executionTime, String language, @@ -28,7 +28,7 @@ public static GetSolutionResponse toDTO(Solution solution, Long commentCount){ .profileImage(solution.getUser().getProfileImage()) .solvedDateTime(solvedDateTime) .content(solution.getContent()) - .isCorrect(solution.isCorrect()) + .result(solution.getResult()) .memoryUsage(solution.getMemoryUsage()) .executionTime(solution.getExecutionTime()) .language(solution.getLanguage()) diff --git a/src/main/java/com/gamzabat/algohub/feature/solution/service/SolutionService.java b/src/main/java/com/gamzabat/algohub/feature/solution/service/SolutionService.java index 85346f2e..322d7c26 100644 --- a/src/main/java/com/gamzabat/algohub/feature/solution/service/SolutionService.java +++ b/src/main/java/com/gamzabat/algohub/feature/solution/service/SolutionService.java @@ -85,6 +85,7 @@ public GetSolutionResponse getSolution(User user, Long solutionId){ throw new UserValidationException("해당 풀이를 확인 할 권한이 없습니다."); } } + public void createSolution(CreateSolutionRequest request) { List problems = problemRepository.findAllByNumber(request.problemNumber()); @@ -117,7 +118,7 @@ public void createSolution(CreateSolutionRequest request) { .executionTime(request.executionTime()) .language(request.codeType()) .codeLength(request.codeLength()) - .isCorrect(request.result().equals("맞았습니다!!")) + .result(request.result()) .solvedDateTime(LocalDateTime.now()) .build() ); From b1de86b4e16765345a8d67547bb70ca072d8fe1b Mon Sep 17 00:00:00 2001 From: rladmstn Date: Sun, 18 Aug 2024 00:26:58 +0900 Subject: [PATCH 2/3] =?UTF-8?q?test=20:=20=EB=AC=B8=EC=A0=9C=20=ED=92=80?= =?UTF-8?q?=EC=9D=B4=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=92=80?= =?UTF-8?q?=EC=9D=B4=20=ED=95=98=EB=82=98=20=EC=A1=B0=ED=9A=8C=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 --- .../algohub/service/SolutionServiceTest.java | 270 +++++++++++++----- 1 file changed, 192 insertions(+), 78 deletions(-) diff --git a/src/test/java/com/gamzabat/algohub/service/SolutionServiceTest.java b/src/test/java/com/gamzabat/algohub/service/SolutionServiceTest.java index f68bf675..4298be89 100644 --- a/src/test/java/com/gamzabat/algohub/service/SolutionServiceTest.java +++ b/src/test/java/com/gamzabat/algohub/service/SolutionServiceTest.java @@ -5,12 +5,17 @@ import java.lang.reflect.Field; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Optional; import com.gamzabat.algohub.exception.StudyGroupValidationException; +import com.gamzabat.algohub.exception.UserValidationException; +import com.gamzabat.algohub.feature.comment.repository.CommentRepository; +import com.gamzabat.algohub.feature.solution.exception.CannotFoundSolutionException; import com.gamzabat.algohub.feature.solution.service.SolutionService; import org.junit.jupiter.api.BeforeEach; @@ -51,11 +56,15 @@ class SolutionServiceTest { private StudyGroupRepository studyGroupRepository; @Mock private GroupMemberRepository groupMemberRepository; + @Mock + private CommentRepository commentRepository; private User user,user2; private Problem problem; private StudyGroup group; + DateTimeFormatter formatter; @BeforeEach void setUp() throws NoSuchFieldException, IllegalAccessException { + formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); user = User.builder().email("email1").password("password").nickname("nickname") .role(Role.USER).profileImage("profileImage").build(); user2 = User.builder().email("email2").password("password").nickname("nickname") @@ -77,84 +86,92 @@ void setUp() throws NoSuchFieldException, IllegalAccessException { groupField.set(group,30L); } - // @Test - // @DisplayName("풀이 목록 조회 성공 (주인)") - // void getSolutionList() { - // // given - // Pageable pageable = PageRequest.of(0,20); - // List list = new ArrayList<>(); - // for(int i=0; i<30; i++) { - // list.add(Solution.builder() - // .problem(problem) - // .content("content"+i) - // .user(user) - // .memoryUsage(i) - // .executionTime(i) - // .isCorrect(true) - // .language("Java"+i) - // .codeLength(i) - // .build()); - // } - // Page solutionPage = new PageImpl<>(list.subList(0,20), pageable, list.size()); - // - // when(studyGroupRepository.findById(30L)).thenReturn(Optional.ofNullable(group)); - // when(problemRepository.findById(10L)).thenReturn(Optional.ofNullable(problem)); - // // when(solutionRepository.findAllByProblem(eq(problem), any(Pageable.class))).thenReturn(solutionPage); - // // when - // Page result = solutionService.getSolutionList(user,10L,pageable); - // // then - // assertThat(result.getContent().size()).isEqualTo(20); - // assertThat(result.getTotalElements()).isEqualTo(30); - // for(int i=0; i list = new ArrayList<>(); - // for(int i=0; i<30; i++) { - // list.add(Solution.builder() - // .problem(problem) - // .content("content"+i) - // .user(user) - // .memoryUsage(i) - // .executionTime(i) - // .isCorrect(true) - // .language("Java"+i) - // .codeLength(i) - // .build()); - // } - // Page solutionPage = new PageImpl<>(list.subList(0,20), pageable, list.size()); - // - // when(studyGroupRepository.findById(30L)).thenReturn(Optional.ofNullable(group)); - // when(problemRepository.findById(10L)).thenReturn(Optional.ofNullable(problem)); - // // when(solutionRepository.findAllByProblem(eq(problem), any(Pageable.class))).thenReturn(solutionPage); - // when(groupMemberRepository.existsByUserAndStudyGroup(user2,group)).thenReturn(true); - // // when - // Page result = solutionService.getSolutionList(user2,10L,pageable); - // // then - // assertThat(result.getContent().size()).isEqualTo(20); - // assertThat(result.getTotalElements()).isEqualTo(30); - // for(int i=0; i list = new ArrayList<>(); + for(int i=0; i<30; i++) { + list.add(Solution.builder() + .problem(problem) + .content("content"+i) + .user(user) + .memoryUsage(i) + .executionTime(i) + .result("컴파일 에러") + .language("Java"+i) + .codeLength(i) + .solvedDateTime(LocalDateTime.now()) + .build()); + } + Page solutionPage = new PageImpl<>(list.subList(0,20), pageable, list.size()); + + when(studyGroupRepository.findById(30L)).thenReturn(Optional.ofNullable(group)); + when(problemRepository.findById(10L)).thenReturn(Optional.ofNullable(problem)); + when(solutionRepository.findAllByProblemOrderBySolvedDateTimeDesc(eq(problem), any(Pageable.class))).thenReturn(solutionPage); + // when + Page result = solutionService.getSolutionList(user,10L,pageable); + // then + assertThat(result.getContent().size()).isEqualTo(20); + assertThat(result.getTotalElements()).isEqualTo(30); + for(int i=0; i list = new ArrayList<>(); + for(int i=0; i<30; i++) { + list.add(Solution.builder() + .problem(problem) + .content("content"+i) + .user(user) + .memoryUsage(i) + .executionTime(i) + .result("맞았습니다!!") + .language("Java"+i) + .codeLength(i) + .solvedDateTime(LocalDateTime.now()) + .build()); + } + Page solutionPage = new PageImpl<>(list.subList(0,20), pageable, list.size()); + + when(studyGroupRepository.findById(30L)).thenReturn(Optional.ofNullable(group)); + when(problemRepository.findById(10L)).thenReturn(Optional.ofNullable(problem)); + when(groupMemberRepository.existsByUserAndStudyGroup(user2,group)).thenReturn(true); + when(solutionRepository.findAllByProblemOrderBySolvedDateTimeDesc(eq(problem), any(Pageable.class))).thenReturn(solutionPage); + // when + Page result = solutionService.getSolutionList(user2,10L,pageable); + // then + assertThat(result.getContent().size()).isEqualTo(20); + assertThat(result.getTotalElements()).isEqualTo(30); + for(int i=0; i solutionService.getSolution(user,10L)) + .isInstanceOf(CannotFoundSolutionException.class) + .hasFieldOrPropertyWithValue("errors","존재하지 않는 풀이 입니다."); + } + + @Test + @DisplayName("풀이 히나 조회 실패 : 참여하지 않은 그룹") + void getSolutionFailed_2(){ + // given + Solution solution = Solution.builder() + .problem(problem) + .content("content") + .user(user) + .memoryUsage(10) + .executionTime(10) + .result("맞았습니다!!") + .language("Java") + .codeLength(10) + .solvedDateTime(LocalDateTime.now()) + .build(); + when(solutionRepository.findById(anyLong())).thenReturn(Optional.ofNullable(solution)); + when(groupMemberRepository.existsByUserAndStudyGroup(user2,group)).thenReturn(false); + // when, then + assertThatThrownBy(() -> solutionService.getSolution(user2,10L)) + .isInstanceOf(UserValidationException.class) + .hasFieldOrPropertyWithValue("errors","해당 풀이를 확인 할 권한이 없습니다."); + } } \ No newline at end of file From 71993183328ce3c8e6204749bda3a09d3298c0c4 Mon Sep 17 00:00:00 2001 From: rladmstn Date: Sun, 18 Aug 2024 16:27:13 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat=20:=20solution=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20result=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 --- .../algohub/feature/problem/service/ProblemService.java | 4 ++-- .../feature/solution/repository/SolutionRepository.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gamzabat/algohub/feature/problem/service/ProblemService.java b/src/main/java/com/gamzabat/algohub/feature/problem/service/ProblemService.java index 415d22e6..74baa856 100644 --- a/src/main/java/com/gamzabat/algohub/feature/problem/service/ProblemService.java +++ b/src/main/java/com/gamzabat/algohub/feature/problem/service/ProblemService.java @@ -103,7 +103,7 @@ public GetProblemListsResponse getProblemList(User user, Long groupId, Pageable LocalDate startDate = problem.getStartDate(); LocalDate endDate = problem.getEndDate(); Integer level = problem.getLevel(); - boolean solved = solutionRepository.existsByUserAndProblemAndIsCorrect(user, problem, true); + boolean solved = solutionRepository.existsByUserAndProblemAndResult(user, problem, "맞았습니다!!"); Integer correctCount = solutionRepository.countDistinctUsersWithCorrectSolutionsByProblemId(problemId); Integer submitMemberCount = solutionRepository.countDistinctUsersByProblemId(problemId); Integer groupMemberCount = groupMemberRepository.countMembersByStudyGroupId(groupId) + 1; @@ -180,7 +180,7 @@ public List getDeadlineReachedProblemList(User user, Long gr problem.getStartDate(), problem.getEndDate(), problem.getLevel(), - solutionRepository.existsByUserAndProblemAndIsCorrect(user, problem, true), + solutionRepository.existsByUserAndProblemAndResult(user, problem, "맞았습니다!!"), submitMemberCount, groupMemberCount, accuracy, diff --git a/src/main/java/com/gamzabat/algohub/feature/solution/repository/SolutionRepository.java b/src/main/java/com/gamzabat/algohub/feature/solution/repository/SolutionRepository.java index c4ccc3ba..41d3fa69 100644 --- a/src/main/java/com/gamzabat/algohub/feature/solution/repository/SolutionRepository.java +++ b/src/main/java/com/gamzabat/algohub/feature/solution/repository/SolutionRepository.java @@ -22,14 +22,14 @@ public interface SolutionRepository extends JpaRepository { @Query("SELECT COUNT(DISTINCT s.user) FROM Solution s WHERE s.problem.id = :problemId") Integer countDistinctUsersByProblemId(@Param("problemId") Long problemId); - @Query("SELECT COUNT(DISTINCT s.user) FROM Solution s WHERE s.problem.id = :problemId AND s.isCorrect = true") + @Query("SELECT COUNT(DISTINCT s.user) FROM Solution s WHERE s.problem.id = :problemId AND s.result = '맞았습니다!!'") Integer countDistinctUsersWithCorrectSolutionsByProblemId(@Param("problemId") Long problemId); @Query("SELECT COUNT(DISTINCT s.problem.id) FROM Solution s " + "JOIN s.problem p " + "WHERE s.user = :user " + "AND p.studyGroup.id = :groupId " + - "AND s.isCorrect = true") + "AND s.result = '맞았습니다!!'") Long countDistinctCorrectSolutionsByUserAndGroup(@Param("user") User user, @Param("groupId") Long groupId); @Query("SELECT new com.gamzabat.algohub.feature.studygroup.dto.GetRankingResponse(u.nickname, u.profileImage, 0, COUNT(DISTINCT s.problem.id)) " + @@ -37,11 +37,11 @@ public interface SolutionRepository extends JpaRepository { "JOIN s.user u " + "JOIN s.problem p " + "JOIN p.studyGroup g " + - "WHERE s.isCorrect = true AND g = :group " + + "WHERE s.result = '맞았습니다!!' AND g = :group " + "GROUP BY u.id, u.nickname, u.profileImage " + "ORDER BY COUNT(DISTINCT s.problem.id) DESC, MAX(s.solvedDateTime) ASC") List findTopUsersByGroup(@Param("group") StudyGroup group); - boolean existsByUserAndProblemAndIsCorrect(User user, Problem problem, boolean isCorrect); + boolean existsByUserAndProblemAndResult(User user, Problem problem, String result); }