From c3adcad9ebb6fc7da32b677f87b7aa67f41212f7 Mon Sep 17 00:00:00 2001 From: donghoony Date: Sat, 12 Oct 2024 21:36:33 +0900 Subject: [PATCH 1/9] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/reviewme/config/WebConfig.java | 3 +- .../java/reviewme/global/HeaderProperty.java | 18 ------ .../HeaderPropertyArgumentResolver.java | 32 ----------- .../MissingHeaderPropertyException.java | 12 ---- .../HeaderPropertyArgumentResolverTest.java | 56 ------------------- 5 files changed, 2 insertions(+), 119 deletions(-) delete mode 100644 backend/src/main/java/reviewme/global/HeaderProperty.java delete mode 100644 backend/src/main/java/reviewme/global/HeaderPropertyArgumentResolver.java delete mode 100644 backend/src/main/java/reviewme/global/exception/MissingHeaderPropertyException.java delete mode 100644 backend/src/test/java/reviewme/global/HeaderPropertyArgumentResolverTest.java diff --git a/backend/src/main/java/reviewme/config/WebConfig.java b/backend/src/main/java/reviewme/config/WebConfig.java index 423c8f0e5..27edb955e 100644 --- a/backend/src/main/java/reviewme/config/WebConfig.java +++ b/backend/src/main/java/reviewme/config/WebConfig.java @@ -11,6 +11,7 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List resolvers) { - resolvers.add(new HeaderPropertyArgumentResolver()); + + resolvers.add(new ReviewGroupSessionResolver(reviewGroupRepository)); } } diff --git a/backend/src/main/java/reviewme/global/HeaderProperty.java b/backend/src/main/java/reviewme/global/HeaderProperty.java deleted file mode 100644 index 86462c596..000000000 --- a/backend/src/main/java/reviewme/global/HeaderProperty.java +++ /dev/null @@ -1,18 +0,0 @@ -package reviewme.global; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import org.springframework.core.annotation.AliasFor; - -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface HeaderProperty { - - @AliasFor("headerName") - String value() default ""; - - @AliasFor("value") - String headerName() default ""; -} diff --git a/backend/src/main/java/reviewme/global/HeaderPropertyArgumentResolver.java b/backend/src/main/java/reviewme/global/HeaderPropertyArgumentResolver.java deleted file mode 100644 index 5c825e3de..000000000 --- a/backend/src/main/java/reviewme/global/HeaderPropertyArgumentResolver.java +++ /dev/null @@ -1,32 +0,0 @@ -package reviewme.global; - -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.core.MethodParameter; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; -import reviewme.global.exception.MissingHeaderPropertyException; - -public class HeaderPropertyArgumentResolver implements HandlerMethodArgumentResolver { - - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.hasParameterAnnotation(HeaderProperty.class); - } - - @Override - public String resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { - HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); - - HeaderProperty parameterAnnotation = parameter.getParameterAnnotation(HeaderProperty.class); - String headerName = parameterAnnotation.headerName(); - String headerProperty = request.getHeader(headerName); - - if (headerProperty == null) { - throw new MissingHeaderPropertyException(headerName); - } - return headerProperty; - } -} diff --git a/backend/src/main/java/reviewme/global/exception/MissingHeaderPropertyException.java b/backend/src/main/java/reviewme/global/exception/MissingHeaderPropertyException.java deleted file mode 100644 index 8fc4dd76f..000000000 --- a/backend/src/main/java/reviewme/global/exception/MissingHeaderPropertyException.java +++ /dev/null @@ -1,12 +0,0 @@ -package reviewme.global.exception; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class MissingHeaderPropertyException extends BadRequestException { - - public MissingHeaderPropertyException(String headerName) { - super("요청에 %s이(가) 존재하지 않아요.".formatted(headerName)); - log.info("Missing header property: {}", headerName); - } -} diff --git a/backend/src/test/java/reviewme/global/HeaderPropertyArgumentResolverTest.java b/backend/src/test/java/reviewme/global/HeaderPropertyArgumentResolverTest.java deleted file mode 100644 index fdaae95df..000000000 --- a/backend/src/test/java/reviewme/global/HeaderPropertyArgumentResolverTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package reviewme.global; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.core.MethodParameter; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.web.context.request.NativeWebRequest; -import reviewme.global.exception.MissingHeaderPropertyException; - -class HeaderPropertyArgumentResolverTest { - - private final HeaderPropertyArgumentResolver resolver = new HeaderPropertyArgumentResolver(); - private final MethodParameter parameter = mock(MethodParameter.class); - private final HeaderProperty headerProperty = mock(HeaderProperty.class); - - @BeforeEach - void setUp() { - given(parameter.hasParameterAnnotation(HeaderProperty.class)).willReturn(true); - given(parameter.getParameterAnnotation(HeaderProperty.class)).willReturn(headerProperty); - } - - @Test - void 검증값이_헤더에_존재하지_않으면_검증에_실패한다() { - // given - NativeWebRequest request = mock(NativeWebRequest.class); - given(request.getNativeRequest()).willReturn(new MockHttpServletRequest()); - given(headerProperty.headerName()).willReturn("test"); - - // when, then - assertThatThrownBy(() -> resolver.resolveArgument(parameter, null, request, null)) - .isInstanceOf(MissingHeaderPropertyException.class); - } - - @Test - void 검증값이_헤더에_존재하면_값을_반환한다() { - // given - String headerName = "test"; - String headerValue = "1234"; - NativeWebRequest request = mock(NativeWebRequest.class); - MockHttpServletRequest mockRequest = (new MockHttpServletRequest()); - mockRequest.addHeader(headerName, headerValue); - given(request.getNativeRequest()).willReturn(mockRequest); - given(headerProperty.headerName()).willReturn(headerName); - - // when - String actual = resolver.resolveArgument(parameter, null, request, null); - - // then - assertThat(actual).isEqualTo(headerValue); - } -} From ae1edbf7f6892db35d7f8372fe899772e512d210 Mon Sep 17 00:00:00 2001 From: donghoony Date: Sat, 12 Oct 2024 21:50:35 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=EC=84=B8=EC=85=98=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=A6=AC=EB=B7=B0=20=EA=B7=B8=EB=A3=B9=20resolve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/reviewme/config/WebConfig.java | 9 ++- .../controller/ReviewGroupSession.java | 11 +++ .../ReviewGroupSessionNotFoundException.java | 12 +++ .../ReviewGroupSessionResolver.java | 46 +++++++++++ .../reviewgroup/domain/ReviewGroup.java | 2 + .../ReviewGroupSessionResolverTest.java | 78 +++++++++++++++++++ 6 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSession.java create mode 100644 backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java create mode 100644 backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java create mode 100644 backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java diff --git a/backend/src/main/java/reviewme/config/WebConfig.java b/backend/src/main/java/reviewme/config/WebConfig.java index 27edb955e..8e9f11c1e 100644 --- a/backend/src/main/java/reviewme/config/WebConfig.java +++ b/backend/src/main/java/reviewme/config/WebConfig.java @@ -1,17 +1,20 @@ package reviewme.config; import java.util.List; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import reviewme.global.HeaderPropertyArgumentResolver; +import reviewme.reviewgroup.controller.ReviewGroupSessionResolver; @Configuration +@RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { + private final ReviewGroupSessionResolver reviewGroupSessionResolver; + @Override public void addArgumentResolvers(List resolvers) { - - resolvers.add(new ReviewGroupSessionResolver(reviewGroupRepository)); + resolvers.add(reviewGroupSessionResolver); } } diff --git a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSession.java b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSession.java new file mode 100644 index 000000000..1024de058 --- /dev/null +++ b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSession.java @@ -0,0 +1,11 @@ +package reviewme.reviewgroup.controller; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface ReviewGroupSession { +} diff --git a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java new file mode 100644 index 000000000..622e59043 --- /dev/null +++ b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java @@ -0,0 +1,12 @@ +package reviewme.reviewgroup.controller; + +import lombok.extern.slf4j.Slf4j; +import reviewme.global.exception.BadRequestException; + +@Slf4j +public class ReviewGroupSessionNotFoundException extends BadRequestException { + + public ReviewGroupSessionNotFoundException() { + super("리뷰 그룹 세션이 존재하지 않습니다."); + } +} diff --git a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java new file mode 100644 index 000000000..310a15978 --- /dev/null +++ b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java @@ -0,0 +1,46 @@ +package reviewme.reviewgroup.controller; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; +import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; +import reviewme.reviewgroup.domain.ReviewGroup; +import reviewme.reviewgroup.repository.ReviewGroupRepository; + +@Component +@RequiredArgsConstructor +public class ReviewGroupSessionResolver implements HandlerMethodArgumentResolver { + + private static final String SESSION_KEY = "reviewRequestCode"; + + private final ReviewGroupRepository reviewGroupRepository; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(ReviewGroupSession.class); + } + + @Override + public ReviewGroup resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + HttpSession session = request.getSession(false); + + // 세션이 없거나, 세션 안에 reviewRequestCode가 존재하지 않는 경우 + if (session == null) { + throw new ReviewGroupSessionNotFoundException(); + } + String reviewRequestCode = (String) session.getAttribute(SESSION_KEY); + if (reviewRequestCode == null) { + throw new ReviewGroupSessionNotFoundException(); + } + return reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) + .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); + } +} diff --git a/backend/src/main/java/reviewme/reviewgroup/domain/ReviewGroup.java b/backend/src/main/java/reviewme/reviewgroup/domain/ReviewGroup.java index dedd25b60..dcc97fefe 100644 --- a/backend/src/main/java/reviewme/reviewgroup/domain/ReviewGroup.java +++ b/backend/src/main/java/reviewme/reviewgroup/domain/ReviewGroup.java @@ -8,6 +8,7 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.AccessLevel; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import reviewme.review.domain.exception.InvalidProjectNameLengthException; @@ -16,6 +17,7 @@ @Entity @Table(name = "review_group") @NoArgsConstructor(access = AccessLevel.PROTECTED) +@EqualsAndHashCode(of = "id") @Getter public class ReviewGroup { diff --git a/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java b/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java new file mode 100644 index 000000000..01bf0b130 --- /dev/null +++ b/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java @@ -0,0 +1,78 @@ +package reviewme.reviewgroup.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹; + +import jakarta.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.web.context.request.NativeWebRequest; +import reviewme.reviewgroup.domain.ReviewGroup; +import reviewme.reviewgroup.repository.ReviewGroupRepository; +import reviewme.support.ServiceTest; + +@ServiceTest +class ReviewGroupSessionResolverTest { + + @Autowired + private ReviewGroupRepository reviewGroupRepository; + + @Autowired + private ReviewGroupSessionResolver reviewGroupSessionResolver; + + @Test + void 세션에서_코드를_가져와_리뷰그룹으로_변환한다() { + // given + ReviewGroup reviewGroup = reviewGroupRepository.save( + 리뷰_그룹("abcd", "1234") + ); + MockHttpServletRequest request = new MockHttpServletRequest(); + MockHttpSession session = new MockHttpSession(); + session.setAttribute("reviewRequestCode", "abcd"); + request.setSession(session); + + NativeWebRequest nativeWebRequest = mock(NativeWebRequest.class); + given(nativeWebRequest.getNativeRequest(HttpServletRequest.class)).willReturn(request); + + // when + ReviewGroup resolvedReviewGroup = reviewGroupSessionResolver.resolveArgument( + null, null, nativeWebRequest, null + ); + + // then + assertThat(resolvedReviewGroup).isEqualTo(reviewGroup); + } + + @Test + void 세션이_존재하지_않는_경우_예외를_발생한다() { + // given + MockHttpServletRequest request = new MockHttpServletRequest(); + NativeWebRequest nativeWebRequest = mock(NativeWebRequest.class); + given(nativeWebRequest.getNativeRequest(HttpServletRequest.class)).willReturn(request); + + // when, then + assertThatThrownBy(() -> reviewGroupSessionResolver.resolveArgument( + null, null, nativeWebRequest, null + )).isInstanceOf(ReviewGroupSessionNotFoundException.class); + } + + @Test + void 세션에_코드가_없는_경우_예외를_발생한다() { + // given + MockHttpServletRequest request = new MockHttpServletRequest(); + MockHttpSession session = new MockHttpSession(); + request.setSession(session); + NativeWebRequest nativeWebRequest = mock(NativeWebRequest.class); + given(nativeWebRequest.getNativeRequest(HttpServletRequest.class)).willReturn(request); + + // when, then + assertThatThrownBy(() -> reviewGroupSessionResolver.resolveArgument( + null, null, nativeWebRequest, null + )).isInstanceOf(ReviewGroupSessionNotFoundException.class); + } +} From ee36397a1014dd8659f47cb79009d7a29fc2075b Mon Sep 17 00:00:00 2001 From: donghoony Date: Sat, 12 Oct 2024 22:01:50 +0900 Subject: [PATCH 3/9] =?UTF-8?q?refactor:=20`Resolver`=20`@MockBean`=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 내부에 Repository가 존재하여 자체를 Mocking합니다. 이에 대한 테스트는 따로 진행했어요. --- backend/src/test/java/reviewme/api/ApiTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/test/java/reviewme/api/ApiTest.java b/backend/src/test/java/reviewme/api/ApiTest.java index 463e5f08e..72eb11e02 100644 --- a/backend/src/test/java/reviewme/api/ApiTest.java +++ b/backend/src/test/java/reviewme/api/ApiTest.java @@ -35,6 +35,7 @@ import reviewme.review.service.ReviewRegisterService; import reviewme.review.service.ReviewSummaryService; import reviewme.reviewgroup.controller.ReviewGroupController; +import reviewme.reviewgroup.controller.ReviewGroupSessionResolver; import reviewme.reviewgroup.service.ReviewGroupLookupService; import reviewme.reviewgroup.service.ReviewGroupService; import reviewme.template.controller.SectionController; @@ -84,6 +85,9 @@ public abstract class ApiTest { @MockBean protected HighlightService highlightService; + @MockBean + private ReviewGroupSessionResolver reviewGroupSessionResolver; + Filter sessionCookieFilter = (request, response, chain) -> { chain.doFilter(request, response); HttpSession session = ((HttpServletRequest) request).getSession(false); From f06edf69b8d15ae9f362968e93bba0ca83ffc803 Mon Sep 17 00:00:00 2001 From: donghoony Date: Sat, 12 Oct 2024 22:02:17 +0900 Subject: [PATCH 4/9] =?UTF-8?q?refactor:=20`CorsConfig`=20Disable=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 두 테스트 때문에 컨텍스트가 두 개나 뜹니다.. --- .../src/test/java/reviewme/config/ExternalCorsConfigTest.java | 2 ++ backend/src/test/java/reviewme/config/LocalCorsConfigTest.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/backend/src/test/java/reviewme/config/ExternalCorsConfigTest.java b/backend/src/test/java/reviewme/config/ExternalCorsConfigTest.java index 81c04c76e..095bb1bc7 100644 --- a/backend/src/test/java/reviewme/config/ExternalCorsConfigTest.java +++ b/backend/src/test/java/reviewme/config/ExternalCorsConfigTest.java @@ -5,11 +5,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.test.context.ActiveProfiles; +@Disabled @ActiveProfiles("dev") class ExternalCorsConfigTest extends CorsConfigTest { diff --git a/backend/src/test/java/reviewme/config/LocalCorsConfigTest.java b/backend/src/test/java/reviewme/config/LocalCorsConfigTest.java index f04698d3f..cd050b988 100644 --- a/backend/src/test/java/reviewme/config/LocalCorsConfigTest.java +++ b/backend/src/test/java/reviewme/config/LocalCorsConfigTest.java @@ -5,10 +5,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; import org.springframework.test.context.ActiveProfiles; +@Disabled @ActiveProfiles("local") class LocalCorsConfigTest extends CorsConfigTest { From 04a459b14eb8c372ced521d5e6285ee3fb4ad5db Mon Sep 17 00:00:00 2001 From: donghoony Date: Sat, 12 Oct 2024 22:03:56 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20`Resolver`=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=B4=20=EB=A6=AC=EB=B7=B0=20=EA=B7=B8=EB=A3=B9?= =?UTF-8?q?=EC=9D=84=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HighlightController.java | 7 ++-- .../highlight/service/HighlightService.java | 9 ++--- .../review/controller/ReviewController.java | 26 ++++++------- .../service/ReviewDetailLookupService.java | 6 +-- .../service/ReviewGatheredLookupService.java | 9 +---- .../service/ReviewListLookupService.java | 6 +-- .../review/service/ReviewSummaryService.java | 6 +-- .../controller/SectionController.java | 7 ++-- .../template/service/SectionService.java | 9 ++--- .../test/java/reviewme/api/ReviewApiTest.java | 8 ++-- .../java/reviewme/api/TemplateApiTest.java | 3 +- .../service/HighlightServiceTest.java | 24 ++++++------ .../ReviewDetailLookupServiceTest.java | 37 ++++--------------- .../ReviewGatheredLookupServiceTest.java | 29 ++++++++++----- .../service/ReviewListLookupServiceTest.java | 13 ++----- .../service/ReviewSummaryServiceTest.java | 16 +------- .../template/service/SectionServiceTest.java | 15 +------- 17 files changed, 80 insertions(+), 150 deletions(-) diff --git a/backend/src/main/java/reviewme/highlight/controller/HighlightController.java b/backend/src/main/java/reviewme/highlight/controller/HighlightController.java index 286d82a85..a76c6c298 100644 --- a/backend/src/main/java/reviewme/highlight/controller/HighlightController.java +++ b/backend/src/main/java/reviewme/highlight/controller/HighlightController.java @@ -6,9 +6,10 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.SessionAttribute; import reviewme.highlight.service.HighlightService; import reviewme.highlight.service.dto.HighlightsRequest; +import reviewme.reviewgroup.controller.ReviewGroupSession; +import reviewme.reviewgroup.domain.ReviewGroup; @RestController @RequiredArgsConstructor @@ -19,9 +20,9 @@ public class HighlightController { @PostMapping("/v2/highlight") public ResponseEntity highlight( @Valid @RequestBody HighlightsRequest request, - @SessionAttribute("reviewRequestCode") String reviewRequestCode + @ReviewGroupSession ReviewGroup reviewGroup ) { - highlightService.highlight(request, reviewRequestCode); + highlightService.highlight(request, reviewGroup); return ResponseEntity.ok().build(); } } diff --git a/backend/src/main/java/reviewme/highlight/service/HighlightService.java b/backend/src/main/java/reviewme/highlight/service/HighlightService.java index d123cff8a..38b90b84f 100644 --- a/backend/src/main/java/reviewme/highlight/service/HighlightService.java +++ b/backend/src/main/java/reviewme/highlight/service/HighlightService.java @@ -15,7 +15,7 @@ import reviewme.highlight.service.validator.HighlightValidator; import reviewme.review.domain.Answer; import reviewme.review.repository.AnswerRepository; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; +import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; @Service @@ -29,11 +29,8 @@ public class HighlightService { private final HighlightValidator highlightValidator; @Transactional - public void highlight(HighlightsRequest request, String reviewRequestCode) { - long reviewGroupId = reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)) - .getId(); - + public void highlight(HighlightsRequest request, ReviewGroup reviewGroup) { + long reviewGroupId = reviewGroup.getId(); highlightValidator.validate(request, reviewGroupId); deleteOldHighlight(request.questionId(), reviewGroupId); saveNewHighlight(request); diff --git a/backend/src/main/java/reviewme/review/controller/ReviewController.java b/backend/src/main/java/reviewme/review/controller/ReviewController.java index 01e091756..1b31af214 100644 --- a/backend/src/main/java/reviewme/review/controller/ReviewController.java +++ b/backend/src/main/java/reviewme/review/controller/ReviewController.java @@ -10,17 +10,18 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.SessionAttribute; -import reviewme.review.service.ReviewGatheredLookupService; import reviewme.review.service.ReviewDetailLookupService; +import reviewme.review.service.ReviewGatheredLookupService; import reviewme.review.service.ReviewListLookupService; import reviewme.review.service.ReviewRegisterService; import reviewme.review.service.ReviewSummaryService; import reviewme.review.service.dto.request.ReviewRegisterRequest; import reviewme.review.service.dto.response.detail.ReviewDetailResponse; import reviewme.review.service.dto.response.gathered.ReviewsGatheredBySectionResponse; -import reviewme.review.service.dto.response.list.ReceivedReviewsSummaryResponse; import reviewme.review.service.dto.response.list.ReceivedReviewsResponse; +import reviewme.review.service.dto.response.list.ReceivedReviewsSummaryResponse; +import reviewme.reviewgroup.controller.ReviewGroupSession; +import reviewme.reviewgroup.domain.ReviewGroup; @RestController @RequiredArgsConstructor @@ -42,37 +43,36 @@ public ResponseEntity createReview(@Valid @RequestBody ReviewRegisterReque public ResponseEntity findReceivedReviews( @RequestParam(required = false) Long lastReviewId, @RequestParam(required = false) Integer size, - @SessionAttribute("reviewRequestCode") String reviewRequestCode + @ReviewGroupSession ReviewGroup reviewGroup ) { - ReceivedReviewsResponse response = reviewListLookupService.getReceivedReviews( - lastReviewId, size, reviewRequestCode); + ReceivedReviewsResponse response = reviewListLookupService.getReceivedReviews(lastReviewId, size, reviewGroup); return ResponseEntity.ok(response); } @GetMapping("/v2/reviews/{id}") public ResponseEntity findReceivedReviewDetail( @PathVariable long id, - @SessionAttribute("reviewRequestCode") String reviewRequestCode + @ReviewGroupSession ReviewGroup reviewGroup ) { - ReviewDetailResponse response = reviewDetailLookupService.getReviewDetail(id, reviewRequestCode); + ReviewDetailResponse response = reviewDetailLookupService.getReviewDetail(id, reviewGroup); return ResponseEntity.ok(response); } @GetMapping("/v2/reviews/summary") public ResponseEntity findReceivedReviewOverview( - @SessionAttribute("reviewRequestCode") String reviewRequestCode + @ReviewGroupSession ReviewGroup reviewGroup ) { - ReceivedReviewsSummaryResponse response = reviewSummaryService.getReviewSummary(reviewRequestCode); + ReceivedReviewsSummaryResponse response = reviewSummaryService.getReviewSummary(reviewGroup); return ResponseEntity.ok(response); } @GetMapping("/v2/reviews/gather") public ResponseEntity getReceivedReviewsBySectionId( @RequestParam("sectionId") long sectionId, - @SessionAttribute("reviewRequestCode") String reviewRequestCode + @ReviewGroupSession ReviewGroup reviewGroup ) { - ReviewsGatheredBySectionResponse response = reviewGatheredLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, sectionId); + ReviewsGatheredBySectionResponse response = + reviewGatheredLookupService.getReceivedReviewsBySectionId(reviewGroup, sectionId); return ResponseEntity.ok(response); } } diff --git a/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java index 7356e7bd8..a6210596e 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java @@ -6,7 +6,6 @@ import reviewme.review.domain.Review; import reviewme.review.repository.ReviewRepository; import reviewme.review.service.dto.response.detail.ReviewDetailResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.review.service.exception.ReviewNotFoundByIdAndGroupException; import reviewme.review.service.mapper.ReviewDetailMapper; import reviewme.reviewgroup.domain.ReviewGroup; @@ -23,10 +22,7 @@ public class ReviewDetailLookupService { private final ReviewDetailMapper reviewDetailMapper; @Transactional(readOnly = true) - public ReviewDetailResponse getReviewDetail(long reviewId, String reviewRequestCode) { - ReviewGroup reviewGroup = reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); - + public ReviewDetailResponse getReviewDetail(long reviewId, ReviewGroup reviewGroup) { Review review = reviewRepository.findByIdAndReviewGroupId(reviewId, reviewGroup.getId()) .orElseThrow(() -> new ReviewNotFoundByIdAndGroupException(reviewId, reviewGroup.getId())); diff --git a/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java index 86bb7d728..ac5eede58 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java @@ -12,7 +12,6 @@ import reviewme.review.domain.Answer; import reviewme.review.repository.AnswerRepository; import reviewme.review.service.dto.response.gathered.ReviewsGatheredBySectionResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.review.service.exception.SectionNotFoundInTemplateException; import reviewme.review.service.mapper.ReviewGatherMapper; import reviewme.reviewgroup.domain.ReviewGroup; @@ -34,19 +33,13 @@ public class ReviewGatheredLookupService { private final ReviewGatherMapper reviewGatherMapper; @Transactional(readOnly = true) - public ReviewsGatheredBySectionResponse getReceivedReviewsBySectionId(String reviewRequestCode, long sectionId) { - ReviewGroup reviewGroup = getReviewGroupOrThrow(reviewRequestCode); + public ReviewsGatheredBySectionResponse getReceivedReviewsBySectionId(ReviewGroup reviewGroup, long sectionId) { Section section = getSectionOrThrow(sectionId, reviewGroup); Map> questionAnswers = getQuestionAnswers(section, reviewGroup); return reviewGatherMapper.mapToReviewsGatheredBySection(questionAnswers); } - private ReviewGroup getReviewGroupOrThrow(String reviewRequestCode) { - return reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); - } - private Section getSectionOrThrow(long sectionId, ReviewGroup reviewGroup) { return sectionRepository.findByIdAndTemplateId(sectionId, reviewGroup.getTemplateId()) .orElseThrow(() -> new SectionNotFoundInTemplateException(sectionId, reviewGroup.getTemplateId())); diff --git a/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java index 39a4fdfb1..a04a8ca26 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java @@ -7,7 +7,6 @@ import reviewme.review.repository.ReviewRepository; import reviewme.review.service.dto.response.list.ReceivedReviewsResponse; import reviewme.review.service.dto.response.list.ReviewListElementResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.review.service.mapper.ReviewListMapper; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; @@ -21,10 +20,7 @@ public class ReviewListLookupService { private final ReviewListMapper reviewListMapper; @Transactional(readOnly = true) - public ReceivedReviewsResponse getReceivedReviews(Long lastReviewId, Integer size, String reviewRequestCode) { - ReviewGroup reviewGroup = reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); - + public ReceivedReviewsResponse getReceivedReviews(Long lastReviewId, Integer size, ReviewGroup reviewGroup) { PageSize pageSize = new PageSize(size); List reviewListResponse = reviewListMapper.mapToReviewList(reviewGroup, lastReviewId, pageSize.getSize()); diff --git a/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java b/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java index 50cc80354..835cbb69b 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java @@ -5,7 +5,6 @@ import org.springframework.transaction.annotation.Transactional; import reviewme.review.repository.ReviewRepository; import reviewme.review.service.dto.response.list.ReceivedReviewsSummaryResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; @@ -17,10 +16,7 @@ public class ReviewSummaryService { private final ReviewRepository reviewRepository; @Transactional(readOnly = true) - public ReceivedReviewsSummaryResponse getReviewSummary(String reviewRequestCode) { - ReviewGroup reviewGroup = reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); - + public ReceivedReviewsSummaryResponse getReviewSummary(ReviewGroup reviewGroup) { int totalReviewCount = reviewRepository.countByReviewGroupId(reviewGroup.getId()); return new ReceivedReviewsSummaryResponse( diff --git a/backend/src/main/java/reviewme/template/controller/SectionController.java b/backend/src/main/java/reviewme/template/controller/SectionController.java index dccd61468..23826d87f 100644 --- a/backend/src/main/java/reviewme/template/controller/SectionController.java +++ b/backend/src/main/java/reviewme/template/controller/SectionController.java @@ -4,7 +4,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.SessionAttribute; +import reviewme.reviewgroup.controller.ReviewGroupSession; +import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.template.service.SectionService; import reviewme.template.service.dto.response.SectionNamesResponse; @@ -16,9 +17,9 @@ public class SectionController { @GetMapping("/v2/sections") public ResponseEntity getSectionNames( - @SessionAttribute("reviewRequestCode") String reviewRequestCode + @ReviewGroupSession ReviewGroup reviewGroup ) { - SectionNamesResponse sectionNames = sectionService.getSectionNames(reviewRequestCode); + SectionNamesResponse sectionNames = sectionService.getSectionNames(reviewGroup); return ResponseEntity.ok(sectionNames); } } diff --git a/backend/src/main/java/reviewme/template/service/SectionService.java b/backend/src/main/java/reviewme/template/service/SectionService.java index 90bc7d1f7..845f5dc2c 100644 --- a/backend/src/main/java/reviewme/template/service/SectionService.java +++ b/backend/src/main/java/reviewme/template/service/SectionService.java @@ -4,7 +4,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.template.repository.SectionRepository; @@ -19,11 +18,9 @@ public class SectionService { private final SectionRepository sectionRepository; @Transactional(readOnly = true) - public SectionNamesResponse getSectionNames(String reviewRequestCode) { - ReviewGroup reviewGroup = reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); - - List sectionNameResponses = sectionRepository.findAllByTemplateId(reviewGroup.getTemplateId()) + public SectionNamesResponse getSectionNames(ReviewGroup reviewGroup) { + List sectionNameResponses = sectionRepository.findAllByTemplateId( + reviewGroup.getTemplateId()) .stream() .map(section -> new SectionNameResponse(section.getId(), section.getSectionName())) .toList(); diff --git a/backend/src/test/java/reviewme/api/ReviewApiTest.java b/backend/src/test/java/reviewme/api/ReviewApiTest.java index 06a39f63b..8df8fa70e 100644 --- a/backend/src/test/java/reviewme/api/ReviewApiTest.java +++ b/backend/src/test/java/reviewme/api/ReviewApiTest.java @@ -111,7 +111,7 @@ class ReviewApiTest extends ApiTest { @Test void 자신이_받은_리뷰_한_개를_조회한다() { - BDDMockito.given(reviewDetailLookupService.getReviewDetail(anyLong(), anyString())) + BDDMockito.given(reviewDetailLookupService.getReviewDetail(anyLong(), any())) .willReturn(TemplateFixture.templateAnswerResponse()); ParameterDescriptor[] requestPathDescriptors = { @@ -176,7 +176,7 @@ class ReviewApiTest extends ApiTest { ); ReceivedReviewsResponse response = new ReceivedReviewsResponse( "아루3", "리뷰미", 1L, true, receivedReviews); - BDDMockito.given(reviewListLookupService.getReceivedReviews(anyLong(), anyInt(), anyString())) + BDDMockito.given(reviewListLookupService.getReceivedReviews(anyLong(), anyInt(), any())) .willReturn(response); CookieDescriptor[] cookieDescriptors = { @@ -225,7 +225,7 @@ class ReviewApiTest extends ApiTest { @Test void 자신이_받은_리뷰의_요약를_조회한다() { - BDDMockito.given(reviewSummaryService.getReviewSummary(anyString())) + BDDMockito.given(reviewSummaryService.getReviewSummary(any())) .willReturn(new ReceivedReviewsSummaryResponse("리뷰미", "산초", 5)); CookieDescriptor[] cookieDescriptors = { @@ -271,7 +271,7 @@ class ReviewApiTest extends ApiTest { new VoteResponse("짜장", 3), new VoteResponse("짬뽕", 5)))) ); - BDDMockito.given(reviewGatheredLookupService.getReceivedReviewsBySectionId(anyString(), anyLong())) + BDDMockito.given(reviewGatheredLookupService.getReceivedReviewsBySectionId(any(), anyLong())) .willReturn(response); CookieDescriptor[] cookieDescriptors = { diff --git a/backend/src/test/java/reviewme/api/TemplateApiTest.java b/backend/src/test/java/reviewme/api/TemplateApiTest.java index 2fd462223..932039bac 100644 --- a/backend/src/test/java/reviewme/api/TemplateApiTest.java +++ b/backend/src/test/java/reviewme/api/TemplateApiTest.java @@ -1,5 +1,6 @@ package reviewme.api; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.springframework.restdocs.cookies.CookieDocumentation.cookieWithName; import static org.springframework.restdocs.cookies.CookieDocumentation.requestCookies; @@ -103,7 +104,7 @@ class TemplateApiTest extends ApiTest { new SectionNameResponse(1, "섹션1 이름"), new SectionNameResponse(2, "섹션2 이름") )); - BDDMockito.given(sectionService.getSectionNames(anyString())) + BDDMockito.given(sectionService.getSectionNames(any())) .willReturn(response); CookieDescriptor[] cookieDescriptors = { diff --git a/backend/src/test/java/reviewme/highlight/service/HighlightServiceTest.java b/backend/src/test/java/reviewme/highlight/service/HighlightServiceTest.java index 0128b9d3e..a31403588 100644 --- a/backend/src/test/java/reviewme/highlight/service/HighlightServiceTest.java +++ b/backend/src/test/java/reviewme/highlight/service/HighlightServiceTest.java @@ -2,14 +2,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static reviewme.fixture.QuestionFixture.서술형_필수_질문; +import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹; import static reviewme.fixture.SectionFixture.항상_보이는_섹션; import static reviewme.fixture.TemplateFixture.템플릿; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import reviewme.fixture.QuestionFixture; -import reviewme.fixture.ReviewGroupFixture; import reviewme.highlight.domain.Highlight; import reviewme.highlight.domain.HighlightPosition; import reviewme.highlight.repository.HighlightRepository; @@ -21,6 +21,7 @@ import reviewme.review.domain.Review; import reviewme.review.domain.TextAnswer; import reviewme.review.repository.ReviewRepository; +import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.support.ServiceTest; import reviewme.template.repository.SectionRepository; @@ -53,18 +54,18 @@ class HighlightServiceTest { @Test void 하이라이트_반영을_요청하면_리뷰_그룹과_질문에_해당하는_기존_하이라이트를_모두_삭제한다() { // given - long questionId = questionRepository.save(QuestionFixture.서술형_필수_질문()).getId(); + long questionId = questionRepository.save(서술형_필수_질문()).getId(); long sectionId = sectionRepository.save(항상_보이는_섹션(List.of(questionId))).getId(); long templateId = templateRepository.save(템플릿(List.of(sectionId))).getId(); String reviewRequestCode = "reviewRequestCode"; - long reviewGroupId = reviewGroupRepository.save(ReviewGroupFixture.리뷰_그룹(reviewRequestCode, "groupAccessCode")) - .getId(); + ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹(reviewRequestCode, "groupAccessCode")); Highlight highlight1 = highlightRepository.save(new Highlight(1, 1, 1, 1)); Highlight highlight2 = highlightRepository.save(new Highlight(2, 1, 1, 1)); TextAnswer textAnswer1 = new TextAnswer(questionId, "text answer1"); TextAnswer textAnswer2 = new TextAnswer(questionId, "text answer2"); - Review review = reviewRepository.save(new Review(templateId, reviewGroupId, List.of(textAnswer1, textAnswer2))); + Review review = reviewRepository.save( + new Review(templateId, reviewGroup.getId(), List.of(textAnswer1, textAnswer2))); HighlightIndexRangeRequest indexRangeRequest = new HighlightIndexRangeRequest(1, 1); HighlightedLineRequest lineRequest = new HighlightedLineRequest(0, List.of(indexRangeRequest)); @@ -75,7 +76,7 @@ class HighlightServiceTest { ); // when - highlightService.highlight(highlightsRequest, reviewRequestCode); + highlightService.highlight(highlightsRequest, reviewGroup); // then assertAll( @@ -87,17 +88,16 @@ class HighlightServiceTest { @Test void 하이라이트_반영을_요청하면_새로운_하이라이트가_저장된다() { // given - long questionId = questionRepository.save(QuestionFixture.서술형_필수_질문()).getId(); + long questionId = questionRepository.save(서술형_필수_질문()).getId(); long sectionId = sectionRepository.save(항상_보이는_섹션(List.of(questionId))).getId(); long templateId = templateRepository.save(템플릿(List.of(sectionId))).getId(); String reviewRequestCode = "reviewRequestCode"; - long reviewGroupId = reviewGroupRepository.save(ReviewGroupFixture.리뷰_그룹(reviewRequestCode, "groupAccessCode")) - .getId(); + ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹(reviewRequestCode, "groupAccessCode")); highlightRepository.save(new Highlight(1, 1, 1, 1)); TextAnswer textAnswer1 = new TextAnswer(questionId, "text answer1"); TextAnswer textAnswer2 = new TextAnswer(questionId, "text answer2"); - Review review = reviewRepository.save(new Review(templateId, reviewGroupId, List.of(textAnswer1, textAnswer2))); + Review review = reviewRepository.save(new Review(templateId, reviewGroup.getId(), List.of(textAnswer1, textAnswer2))); int startIndex = 2; int endIndex = 2; @@ -111,7 +111,7 @@ class HighlightServiceTest { List.of(highlightRequest1, highlightRequest2)); // when - highlightService.highlight(highlightsRequest, reviewRequestCode); + highlightService.highlight(highlightsRequest, reviewGroup); // then List highlights = highlightRepository.findAll(); diff --git a/backend/src/test/java/reviewme/review/service/ReviewDetailLookupServiceTest.java b/backend/src/test/java/reviewme/review/service/ReviewDetailLookupServiceTest.java index 94f281594..ab296d796 100644 --- a/backend/src/test/java/reviewme/review/service/ReviewDetailLookupServiceTest.java +++ b/backend/src/test/java/reviewme/review/service/ReviewDetailLookupServiceTest.java @@ -31,7 +31,6 @@ import reviewme.review.service.dto.response.detail.QuestionAnswerResponse; import reviewme.review.service.dto.response.detail.ReviewDetailResponse; import reviewme.review.service.dto.response.detail.SectionAnswerResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.review.service.exception.ReviewNotFoundByIdAndGroupException; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; @@ -68,20 +67,6 @@ class ReviewDetailLookupServiceTest { @Autowired private TemplateRepository templateRepository; - @Test - void 잘못된_리뷰_요청_코드로_리뷰를_조회할_경우_예외가_발생한다() { - // given - String reviewRequestCode = "hello"; - String groupAccessCode = "goodBye"; - ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹(reviewRequestCode, groupAccessCode)); - Review review = reviewRepository.save(new Review(0, reviewGroup.getId(), List.of())); - - // when, then - assertThatThrownBy(() -> reviewDetailLookupService.getReviewDetail( - review.getId(), "wrong" + reviewRequestCode - )).isInstanceOf(ReviewGroupNotFoundByReviewRequestCodeException.class); - } - @Test void 리뷰_그룹에_해당하지_않는_리뷰를_조회할_경우_예외가_발생한다() { // given @@ -97,12 +82,10 @@ class ReviewDetailLookupServiceTest { // when, then assertAll( - () -> assertThatThrownBy(() -> reviewDetailLookupService.getReviewDetail( - review2.getId(), reviewRequestCode1 - )).isInstanceOf(ReviewNotFoundByIdAndGroupException.class), - () -> assertThatThrownBy(() -> reviewDetailLookupService.getReviewDetail( - review1.getId(), reviewRequestCode2 - )).isInstanceOf(ReviewNotFoundByIdAndGroupException.class) + () -> assertThatThrownBy(() -> reviewDetailLookupService.getReviewDetail(review2.getId(), reviewGroup1)) + .isInstanceOf(ReviewNotFoundByIdAndGroupException.class), + () -> assertThatThrownBy(() -> reviewDetailLookupService.getReviewDetail(review1.getId(), reviewGroup2)) + .isInstanceOf(ReviewNotFoundByIdAndGroupException.class) ); } @@ -135,9 +118,7 @@ class ReviewDetailLookupServiceTest { ); // when - ReviewDetailResponse reviewDetail = reviewDetailLookupService.getReviewDetail( - review.getId(), reviewRequestCode - ); + ReviewDetailResponse reviewDetail = reviewDetailLookupService.getReviewDetail(review.getId(), reviewGroup); // then assertThat(reviewDetail.sections()).hasSize(2); @@ -165,9 +146,7 @@ class NotAnsweredOptionalQuestion { ); // when - ReviewDetailResponse reviewDetail = reviewDetailLookupService.getReviewDetail( - review.getId(), reviewRequestCode - ); + ReviewDetailResponse reviewDetail = reviewDetailLookupService.getReviewDetail(review.getId(), reviewGroup); // then assertThat(reviewDetail.sections()) @@ -195,9 +174,7 @@ class NotAnsweredOptionalQuestion { ); // when - ReviewDetailResponse reviewDetail = reviewDetailLookupService.getReviewDetail( - review.getId(), reviewRequestCode - ); + ReviewDetailResponse reviewDetail = reviewDetailLookupService.getReviewDetail(review.getId(), reviewGroup); // then assertAll( diff --git a/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java b/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java index 7a378adb5..409ac1210 100644 --- a/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java +++ b/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java @@ -99,7 +99,8 @@ class GatherAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).answers()).extracting(TextResponse::content) @@ -126,7 +127,8 @@ class GatherAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).answers()) @@ -158,7 +160,8 @@ class GatherAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).answers()) @@ -185,7 +188,8 @@ class GatherAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).answers()) @@ -207,7 +211,8 @@ class GatherAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews()).hasSize(1); @@ -244,7 +249,8 @@ class GatherOptionAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).votes()) @@ -278,7 +284,8 @@ class GatherOptionAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).votes()) @@ -311,7 +318,8 @@ class GatherOptionAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews().get(0).votes()) @@ -344,7 +352,8 @@ class GatherOptionAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCode, section1.getId()); + reviewGroup, section1.getId() + ); // then assertThat(actual.reviews()).hasSize(2); @@ -387,7 +396,7 @@ class GatherOptionAnswerByQuestionTest { // when ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( - reviewRequestCodeBE, section1.getId()); + reviewGroupBE, section1.getId()); // then assertThat(actual.reviews()).hasSize(1); diff --git a/backend/src/test/java/reviewme/review/service/ReviewListLookupServiceTest.java b/backend/src/test/java/reviewme/review/service/ReviewListLookupServiceTest.java index ab55e11ac..d8384afe5 100644 --- a/backend/src/test/java/reviewme/review/service/ReviewListLookupServiceTest.java +++ b/backend/src/test/java/reviewme/review/service/ReviewListLookupServiceTest.java @@ -1,7 +1,6 @@ package reviewme.review.service; 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 static reviewme.fixture.OptionGroupFixture.선택지_그룹; import static reviewme.fixture.OptionItemFixture.선택지; @@ -24,7 +23,6 @@ import reviewme.review.domain.TextAnswer; import reviewme.review.repository.ReviewRepository; import reviewme.review.service.dto.response.list.ReceivedReviewsResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.support.ServiceTest; @@ -60,12 +58,6 @@ class ReviewListLookupServiceTest { @Autowired private ReviewRepository reviewRepository; - @Test - void 리뷰_요청_코드가_존재하지_않는_경우_예외가_발생한다() { - assertThatThrownBy(() -> reviewListLookupService.getReceivedReviews(Long.MAX_VALUE, 5, "abc")) - .isInstanceOf(ReviewGroupNotFoundByReviewRequestCodeException.class); - } - @Test void 확인_코드에_해당하는_그룹이_존재하면_내가_받은_리뷰_목록을_반환한다() { // given - 리뷰 그룹 저장 @@ -91,7 +83,8 @@ class ReviewListLookupServiceTest { // when ReceivedReviewsResponse response = reviewListLookupService.getReceivedReviews( - Long.MAX_VALUE, 5, reviewRequestCode); + Long.MAX_VALUE, 5, reviewGroup + ); // then assertAll( @@ -124,7 +117,7 @@ class ReviewListLookupServiceTest { // when ReceivedReviewsResponse response - = reviewListLookupService.getReceivedReviews(Long.MAX_VALUE, 2, reviewRequestCode); + = reviewListLookupService.getReceivedReviews(Long.MAX_VALUE, 2, reviewGroup); // then assertAll( diff --git a/backend/src/test/java/reviewme/review/service/ReviewSummaryServiceTest.java b/backend/src/test/java/reviewme/review/service/ReviewSummaryServiceTest.java index 2a6e56088..2a2ffa7a5 100644 --- a/backend/src/test/java/reviewme/review/service/ReviewSummaryServiceTest.java +++ b/backend/src/test/java/reviewme/review/service/ReviewSummaryServiceTest.java @@ -1,7 +1,6 @@ package reviewme.review.service; 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 static reviewme.fixture.QuestionFixture.서술형_필수_질문; import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹; @@ -16,7 +15,6 @@ import reviewme.review.domain.Review; import reviewme.review.repository.ReviewRepository; import reviewme.review.service.dto.response.list.ReceivedReviewsSummaryResponse; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.support.ServiceTest; @@ -65,8 +63,7 @@ class ReviewSummaryServiceTest { reviewRepository.save(new Review(template.getId(), reviewGroup2.getId(), List.of())); // when - ReceivedReviewsSummaryResponse actual = reviewSummaryService.getReviewSummary( - reviewGroup1.getReviewRequestCode()); + ReceivedReviewsSummaryResponse actual = reviewSummaryService.getReviewSummary(reviewGroup1); // then assertAll( @@ -75,15 +72,4 @@ class ReviewSummaryServiceTest { () -> assertThat(actual.totalReviewCount()).isEqualTo(reviews.size()) ); } - - @Test - void 리뷰_요약_정보_조회시_리뷰_요청_코드가_존재하지_않는_경우_예외가_발생한다() { - // given - ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹()); - - // when, then - assertThatThrownBy(() -> reviewSummaryService.getReviewSummary( - reviewGroup.getReviewRequestCode() + "wrong")) - .isInstanceOf(ReviewGroupNotFoundByReviewRequestCodeException.class); - } } diff --git a/backend/src/test/java/reviewme/template/service/SectionServiceTest.java b/backend/src/test/java/reviewme/template/service/SectionServiceTest.java index 9ce12b2a5..c7e319d99 100644 --- a/backend/src/test/java/reviewme/template/service/SectionServiceTest.java +++ b/backend/src/test/java/reviewme/template/service/SectionServiceTest.java @@ -1,14 +1,12 @@ package reviewme.template.service; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹; import static reviewme.fixture.TemplateFixture.템플릿; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.support.ServiceTest; @@ -53,21 +51,10 @@ class SectionServiceTest { ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹()); // when - SectionNamesResponse actual = sectionService.getSectionNames(reviewGroup.getReviewRequestCode()); + SectionNamesResponse actual = sectionService.getSectionNames(reviewGroup); // then assertThat(actual.sections()).extracting(SectionNameResponse::name) .containsExactly(sectionName1, sectionName2, sectionName3); } - - @Test - void 템플릿에_있는_섹션_이름_목록_조회시_리뷰_요청_코드가_존재하지_않는_경우_예외가_발생한다() { - // given - ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹()); - - // when, then - assertThatThrownBy(() -> sectionService.getSectionNames( - reviewGroup.getReviewRequestCode() + "wrong")) - .isInstanceOf(ReviewGroupNotFoundByReviewRequestCodeException.class); - } } From b23d810c860f889e01f414c464b154d12914b829 Mon Sep 17 00:00:00 2001 From: donghoony Date: Sat, 12 Oct 2024 22:09:43 +0900 Subject: [PATCH 6/9] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20`ReviewGroupRepository`=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/reviewme/highlight/service/HighlightService.java | 2 -- .../reviewme/review/service/ReviewDetailLookupService.java | 3 --- .../reviewme/review/service/ReviewGatheredLookupService.java | 2 -- .../java/reviewme/review/service/ReviewListLookupService.java | 2 -- .../java/reviewme/review/service/ReviewSummaryService.java | 2 -- .../main/java/reviewme/template/service/SectionService.java | 2 -- 6 files changed, 13 deletions(-) diff --git a/backend/src/main/java/reviewme/highlight/service/HighlightService.java b/backend/src/main/java/reviewme/highlight/service/HighlightService.java index 38b90b84f..8f05d156b 100644 --- a/backend/src/main/java/reviewme/highlight/service/HighlightService.java +++ b/backend/src/main/java/reviewme/highlight/service/HighlightService.java @@ -16,14 +16,12 @@ import reviewme.review.domain.Answer; import reviewme.review.repository.AnswerRepository; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; @Service @RequiredArgsConstructor public class HighlightService { private final HighlightRepository highlightRepository; - private final ReviewGroupRepository reviewGroupRepository; private final AnswerRepository answerRepository; private final HighlightValidator highlightValidator; diff --git a/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java index a6210596e..72f1e7daf 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewDetailLookupService.java @@ -9,7 +9,6 @@ import reviewme.review.service.exception.ReviewNotFoundByIdAndGroupException; import reviewme.review.service.mapper.ReviewDetailMapper; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; @Service @Transactional(readOnly = true) @@ -17,8 +16,6 @@ public class ReviewDetailLookupService { private final ReviewRepository reviewRepository; - private final ReviewGroupRepository reviewGroupRepository; - private final ReviewDetailMapper reviewDetailMapper; @Transactional(readOnly = true) diff --git a/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java index ac5eede58..e8de2aee8 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java @@ -15,7 +15,6 @@ import reviewme.review.service.exception.SectionNotFoundInTemplateException; import reviewme.review.service.mapper.ReviewGatherMapper; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.template.domain.Section; import reviewme.template.repository.SectionRepository; @@ -27,7 +26,6 @@ public class ReviewGatheredLookupService { private final QuestionRepository questionRepository; private final AnswerRepository answerRepository; - private final ReviewGroupRepository reviewGroupRepository; private final SectionRepository sectionRepository; private final ReviewGatherMapper reviewGatherMapper; diff --git a/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java index a04a8ca26..d576e9eeb 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewListLookupService.java @@ -9,13 +9,11 @@ import reviewme.review.service.dto.response.list.ReviewListElementResponse; import reviewme.review.service.mapper.ReviewListMapper; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; @Service @RequiredArgsConstructor public class ReviewListLookupService { - private final ReviewGroupRepository reviewGroupRepository; private final ReviewRepository reviewRepository; private final ReviewListMapper reviewListMapper; diff --git a/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java b/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java index 835cbb69b..cbd6891a7 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewSummaryService.java @@ -6,13 +6,11 @@ import reviewme.review.repository.ReviewRepository; import reviewme.review.service.dto.response.list.ReceivedReviewsSummaryResponse; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; @Service @RequiredArgsConstructor public class ReviewSummaryService { - private final ReviewGroupRepository reviewGroupRepository; private final ReviewRepository reviewRepository; @Transactional(readOnly = true) diff --git a/backend/src/main/java/reviewme/template/service/SectionService.java b/backend/src/main/java/reviewme/template/service/SectionService.java index 845f5dc2c..e52347042 100644 --- a/backend/src/main/java/reviewme/template/service/SectionService.java +++ b/backend/src/main/java/reviewme/template/service/SectionService.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.template.repository.SectionRepository; import reviewme.template.service.dto.response.SectionNameResponse; import reviewme.template.service.dto.response.SectionNamesResponse; @@ -14,7 +13,6 @@ @RequiredArgsConstructor public class SectionService { - private final ReviewGroupRepository reviewGroupRepository; private final SectionRepository sectionRepository; @Transactional(readOnly = true) From dc9797b1d4bc01e4456636c70f0ca45fc089b8be Mon Sep 17 00:00:00 2001 From: donghoony Date: Mon, 14 Oct 2024 14:57:16 +0900 Subject: [PATCH 7/9] =?UTF-8?q?refactor:=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?`ServiceTest`=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/reviewme/config/WebConfig.java | 5 ++-- .../ReviewGroupSessionResolver.java | 10 ++----- .../service/ReviewGroupService.java | 6 ++++ .../ReviewGroupSessionResolverTest.java | 29 +++++++------------ .../service/ReviewGroupServiceTest.java | 25 ++++++++++++++++ 5 files changed, 48 insertions(+), 27 deletions(-) diff --git a/backend/src/main/java/reviewme/config/WebConfig.java b/backend/src/main/java/reviewme/config/WebConfig.java index 8e9f11c1e..d855040f0 100644 --- a/backend/src/main/java/reviewme/config/WebConfig.java +++ b/backend/src/main/java/reviewme/config/WebConfig.java @@ -6,15 +6,16 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import reviewme.reviewgroup.controller.ReviewGroupSessionResolver; +import reviewme.reviewgroup.service.ReviewGroupService; @Configuration @RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { - private final ReviewGroupSessionResolver reviewGroupSessionResolver; + private final ReviewGroupService reviewGroupService; @Override public void addArgumentResolvers(List resolvers) { - resolvers.add(reviewGroupSessionResolver); + resolvers.add(new ReviewGroupSessionResolver(reviewGroupService)); } } diff --git a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java index 310a15978..2cc559407 100644 --- a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java +++ b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolver.java @@ -4,22 +4,19 @@ import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.core.MethodParameter; -import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; -import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; +import reviewme.reviewgroup.service.ReviewGroupService; -@Component @RequiredArgsConstructor public class ReviewGroupSessionResolver implements HandlerMethodArgumentResolver { private static final String SESSION_KEY = "reviewRequestCode"; - private final ReviewGroupRepository reviewGroupRepository; + private final ReviewGroupService reviewGroupService; @Override public boolean supportsParameter(MethodParameter parameter) { @@ -40,7 +37,6 @@ public ReviewGroup resolveArgument(MethodParameter parameter, ModelAndViewContai if (reviewRequestCode == null) { throw new ReviewGroupSessionNotFoundException(); } - return reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) - .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); + return reviewGroupService.getReviewGroupByReviewRequestCode(reviewRequestCode); } } diff --git a/backend/src/main/java/reviewme/reviewgroup/service/ReviewGroupService.java b/backend/src/main/java/reviewme/reviewgroup/service/ReviewGroupService.java index e8e4ac0ba..1ae76f6a0 100644 --- a/backend/src/main/java/reviewme/reviewgroup/service/ReviewGroupService.java +++ b/backend/src/main/java/reviewme/reviewgroup/service/ReviewGroupService.java @@ -52,4 +52,10 @@ public void checkGroupAccessCode(CheckValidAccessRequest request) { throw new ReviewGroupUnauthorizedException(reviewGroup.getId()); } } + + @Transactional(readOnly = true) + public ReviewGroup getReviewGroupByReviewRequestCode(String reviewRequestCode) { + return reviewGroupRepository.findByReviewRequestCode(reviewRequestCode) + .orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode)); + } } diff --git a/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java b/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java index 01bf0b130..d173983bb 100644 --- a/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java +++ b/backend/src/test/java/reviewme/reviewgroup/controller/ReviewGroupSessionResolverTest.java @@ -1,36 +1,32 @@ package reviewme.reviewgroup.controller; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; -import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹; import jakarta.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; import org.springframework.web.context.request.NativeWebRequest; -import reviewme.reviewgroup.domain.ReviewGroup; -import reviewme.reviewgroup.repository.ReviewGroupRepository; -import reviewme.support.ServiceTest; +import reviewme.reviewgroup.service.ReviewGroupService; -@ServiceTest class ReviewGroupSessionResolverTest { - @Autowired - private ReviewGroupRepository reviewGroupRepository; + private final ReviewGroupService reviewGroupService = mock(ReviewGroupService.class); - @Autowired private ReviewGroupSessionResolver reviewGroupSessionResolver; + @BeforeEach + void setUp() { + reviewGroupSessionResolver = new ReviewGroupSessionResolver(reviewGroupService); + } + @Test void 세션에서_코드를_가져와_리뷰그룹으로_변환한다() { // given - ReviewGroup reviewGroup = reviewGroupRepository.save( - 리뷰_그룹("abcd", "1234") - ); MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpSession session = new MockHttpSession(); session.setAttribute("reviewRequestCode", "abcd"); @@ -40,12 +36,9 @@ class ReviewGroupSessionResolverTest { given(nativeWebRequest.getNativeRequest(HttpServletRequest.class)).willReturn(request); // when - ReviewGroup resolvedReviewGroup = reviewGroupSessionResolver.resolveArgument( + assertDoesNotThrow(() -> reviewGroupSessionResolver.resolveArgument( null, null, nativeWebRequest, null - ); - - // then - assertThat(resolvedReviewGroup).isEqualTo(reviewGroup); + )); } @Test diff --git a/backend/src/test/java/reviewme/reviewgroup/service/ReviewGroupServiceTest.java b/backend/src/test/java/reviewme/reviewgroup/service/ReviewGroupServiceTest.java index 2694da49c..6bdc22f44 100644 --- a/backend/src/test/java/reviewme/reviewgroup/service/ReviewGroupServiceTest.java +++ b/backend/src/test/java/reviewme/reviewgroup/service/ReviewGroupServiceTest.java @@ -17,7 +17,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; +import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException; import reviewme.review.service.exception.ReviewGroupUnauthorizedException; +import reviewme.reviewgroup.domain.ReviewGroup; import reviewme.reviewgroup.repository.ReviewGroupRepository; import reviewme.reviewgroup.service.dto.CheckValidAccessRequest; import reviewme.reviewgroup.service.dto.ReviewGroupCreationRequest; @@ -77,4 +79,27 @@ class ReviewGroupServiceTest { .isInstanceOf(ReviewGroupUnauthorizedException.class) ); } + + @Test + void 리뷰_요청_코드로_리뷰_그룹을_반환한다() { + // given + String reviewRequestCode = "reviewRequestCode"; + ReviewGroup savedReviewGroup = reviewGroupRepository.save(리뷰_그룹(reviewRequestCode, "groupAccessCode")); + + // when + ReviewGroup actual = reviewGroupService.getReviewGroupByReviewRequestCode(reviewRequestCode); + + // then + assertThat(actual).isEqualTo(savedReviewGroup); + } + + @Test + void 리뷰_요청_코드로_리뷰_그룹을_찾을_수_없는_경우_예외가_발생한다() { + // given + String reviewRequestCode = "reviewRequestCode"; + + // when, then + assertThatThrownBy(() -> reviewGroupService.getReviewGroupByReviewRequestCode(reviewRequestCode)) + .isInstanceOf(ReviewGroupNotFoundByReviewRequestCodeException.class); + } } From 3ba4822ac137b070700c7712a2dbf507119f54bc Mon Sep 17 00:00:00 2001 From: donghoony Date: Mon, 14 Oct 2024 21:21:35 +0900 Subject: [PATCH 8/9] =?UTF-8?q?fix:=20`ReviewGroupService`=20mockbean=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/test/java/reviewme/config/CorsConfigTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/src/test/java/reviewme/config/CorsConfigTest.java b/backend/src/test/java/reviewme/config/CorsConfigTest.java index c2ce590c1..90af4a342 100644 --- a/backend/src/test/java/reviewme/config/CorsConfigTest.java +++ b/backend/src/test/java/reviewme/config/CorsConfigTest.java @@ -3,11 +3,13 @@ import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.stereotype.Controller; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.WebApplicationContext; +import reviewme.reviewgroup.service.ReviewGroupService; @WebMvcTest(controllers = CorsConfigTest.TestController.class) abstract class CorsConfigTest { @@ -15,6 +17,9 @@ abstract class CorsConfigTest { @Autowired private WebApplicationContext context; + @MockBean + private ReviewGroupService reviewGroupService; + protected MockMvc mockMvc; @BeforeEach From 980649c4ef062cb897123989297baf4d142d593e Mon Sep 17 00:00:00 2001 From: donghoony Date: Mon, 14 Oct 2024 21:21:59 +0900 Subject: [PATCH 9/9] =?UTF-8?q?chore:=20-=EC=9A=94=20=EC=B2=B4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReviewGroupSessionNotFoundException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java index 622e59043..f867c4507 100644 --- a/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java +++ b/backend/src/main/java/reviewme/reviewgroup/controller/ReviewGroupSessionNotFoundException.java @@ -7,6 +7,6 @@ public class ReviewGroupSessionNotFoundException extends BadRequestException { public ReviewGroupSessionNotFoundException() { - super("리뷰 그룹 세션이 존재하지 않습니다."); + super("리뷰 그룹 세션이 존재하지 않아요."); } }