From 5d38c3a4672607c7caffcfcc8287df35b7e36e95 Mon Sep 17 00:00:00 2001 From: jwooo Date: Mon, 3 Jun 2024 17:04:12 +0900 Subject: [PATCH] =?UTF-8?q?test:=20=EB=8F=84=EC=84=9C=EC=99=80=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=EB=90=9C=20=EB=A6=AC=EB=B7=B0=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/review/ReviewControllerTest.java | 24 ++++++++++- .../application/review/ReviewServiceTest.java | 42 +++++++++++++++---- .../docs/review/ReviewControllerDocsTest.java | 33 +++++++++++++++ .../repository/ReviewRepositoryTest.java | 29 +++++++++++++ 4 files changed, 120 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/jisungin/api/review/ReviewControllerTest.java b/src/test/java/com/jisungin/api/review/ReviewControllerTest.java index 9a3c33c..66b4b60 100644 --- a/src/test/java/com/jisungin/api/review/ReviewControllerTest.java +++ b/src/test/java/com/jisungin/api/review/ReviewControllerTest.java @@ -16,6 +16,7 @@ class ReviewControllerTest extends ControllerTestSupport { @DisplayName("도서와 연관된 리뷰를 조회한다.") + @Test void findBookReviews() throws Exception { // given String isbn = "000000000000"; @@ -26,9 +27,30 @@ void findBookReviews() throws Exception { .param("size", "5") .param("order", "like") .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andExpect(jsonPath("code").value("200")) + .andExpect(jsonPath("status").value("OK")) + .andExpect(jsonPath("message").value("OK")) + .andDo(print()); + } + + @DisplayName("도서와 연관된 리뷰의 개수를 조회한다.") + @Test + void findBookReviewsCount() throws Exception { + // given + String isbn = "000000000000"; + + // when // then + mockMvc.perform(get("/v1/books/{isbn}/reviews/count", isbn) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("code").value("200")) + .andExpect(jsonPath("status").value("OK")) + .andExpect(jsonPath("message").value("OK")) + .andDo(print()); } + @DisplayName("유저가 리뷰를 등록한다.") @Test void createReview() throws Exception { diff --git a/src/test/java/com/jisungin/application/review/ReviewServiceTest.java b/src/test/java/com/jisungin/application/review/ReviewServiceTest.java index b266184..9695b09 100644 --- a/src/test/java/com/jisungin/application/review/ReviewServiceTest.java +++ b/src/test/java/com/jisungin/application/review/ReviewServiceTest.java @@ -1,5 +1,8 @@ package com.jisungin.application.review; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import com.jisungin.ServiceTestSupport; import com.jisungin.application.OffsetLimit; import com.jisungin.application.SliceResponse; @@ -7,26 +10,23 @@ import com.jisungin.application.review.response.ReviewWithRatingResponse; import com.jisungin.domain.book.Book; import com.jisungin.domain.book.repository.BookRepository; +import com.jisungin.domain.review.Review; +import com.jisungin.domain.review.repository.ReviewRepository; import com.jisungin.domain.reviewlike.ReviewLike; import com.jisungin.domain.reviewlike.repository.ReviewLikeRepository; import com.jisungin.domain.user.OauthId; import com.jisungin.domain.user.OauthType; -import com.jisungin.domain.review.Review; -import com.jisungin.domain.review.repository.ReviewRepository; import com.jisungin.domain.user.User; import com.jisungin.domain.user.repository.UserRepository; import com.jisungin.exception.BusinessException; +import java.time.LocalDateTime; +import java.util.List; import java.util.stream.IntStream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.time.LocalDateTime; -import java.util.List; - -import static org.assertj.core.api.Assertions.*; - class ReviewServiceTest extends ServiceTestSupport { @Autowired @@ -92,6 +92,34 @@ void findBookReviewsWithoutBook() { .hasMessage("책을 찾을 수 없습니다."); } + @DisplayName("도서와 연관된 리뷰 개수를 조회한다.") + @Test + void findBookReviewsCount() { + // given + Book book = bookRepository.save(createBook()); + + List users = userRepository.saveAll(createUsers()); + List reviews = reviewRepository.saveAll(createReviews(users, book)); + + // when + Long result = reviewService.findBookReviewsCount(book.getIsbn()); + + // then + assertThat(result).isEqualTo(20L); + } + + @DisplayName("도서와 연관된 리뷰 개수 조회시 도서가 존재해야 한다.") + @Test + void findBookReviewsCountWithoutBook() { + // given + String invalidIsbn = "0000X"; + + // when // then + assertThatThrownBy(() -> reviewService.findBookReviewsCount(invalidIsbn)) + .hasMessage("책을 찾을 수 없습니다.") + .isInstanceOf(BusinessException.class); + } + @DisplayName("유저가 리뷰를 등록한다.") @Test void createReview() { diff --git a/src/test/java/com/jisungin/docs/review/ReviewControllerDocsTest.java b/src/test/java/com/jisungin/docs/review/ReviewControllerDocsTest.java index e4d2b09..3924912 100644 --- a/src/test/java/com/jisungin/docs/review/ReviewControllerDocsTest.java +++ b/src/test/java/com/jisungin/docs/review/ReviewControllerDocsTest.java @@ -131,6 +131,39 @@ void findBookReviews() throws Exception { ); } + @DisplayName("도서와 연관된 리뷰 개수 조회 API") + @Test + void findBookReviewsCount() throws Exception { + // given + String isbn = "000000000001"; + + given(reviewService.findBookReviewsCount(anyString())) + .willReturn(20L); + + // when // then + mockMvc.perform(get("/v1/books/{isbn}/reviews/count", isbn) + .accept(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andDo(document("review/get-related-book-count", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("isbn").description("도서 ISBN") + ), + responseFields( + fieldWithPath("code").type(JsonFieldType.NUMBER) + .description("코드"), + fieldWithPath("status").type(JsonFieldType.STRING) + .description("상태"), + fieldWithPath("message").type(JsonFieldType.STRING) + .description("메세지"), + fieldWithPath("data").type(JsonFieldType.NUMBER) + .description("도서와 연관된 리뷰 총 개수") + ) + )); + } + @DisplayName("한줄평을 생성하는 API") @Test void createReview() throws Exception { diff --git a/src/test/java/com/jisungin/domain/review/repository/ReviewRepositoryTest.java b/src/test/java/com/jisungin/domain/review/repository/ReviewRepositoryTest.java index 3b1c409..d7cc878 100644 --- a/src/test/java/com/jisungin/domain/review/repository/ReviewRepositoryTest.java +++ b/src/test/java/com/jisungin/domain/review/repository/ReviewRepositoryTest.java @@ -242,6 +242,35 @@ public void findAllBookIdOrderByRatingAscWithoutRating() { assertThat(result.getContent()).hasSize(0); } + @DisplayName("도서와 연관된 리뷰의 개수를 조회한다.") + @Test + public void findBookReviewsCount() { + // given + Book book = bookRepository.save(createBook("도서 제목", "도서 내용", "00001")); + + List users = userRepository.saveAll(createUsers()); + List reviews = reviewRepository.saveAll(createReviewsForBook(users, book)); + + // when + Long result = reviewRepository.countByBookId(book.getIsbn()); + + // then + assertThat(result).isEqualTo(20L); + } + + @DisplayName("도서와 연관된 리뷰가 없는 경우 0을 리턴한다.") + @Test + public void findBookReviewsCountWithoutReview() { + // given + Book book = bookRepository.save(createBook("도서 제목", "도서 내용", "00001")); + + // when + Long result = reviewRepository.countByBookId(book.getIsbn()); + + // then + assertThat(result).isEqualTo(0L); + } + private static List createBooks() { return IntStream.rangeClosed(1, 20) .mapToObj(i -> createBook(