From 4a850017512cead8fac044b711d1e50681211e5d Mon Sep 17 00:00:00 2001 From: jwooo Date: Sun, 7 Apr 2024 15:55:01 +0900 Subject: [PATCH] =?UTF-8?q?test:=20=EC=B1=85=20=EA=B4=80=EB=A0=A8=EB=90=9C?= =?UTF-8?q?=20=ED=86=A0=ED=81=AC=EB=A3=B8=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jisungin/api/book/BookControllerTest.java | 20 +++ .../service/book/BookServiceTest.java | 136 +++++++++++++++++- 2 files changed, 153 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/jisungin/api/book/BookControllerTest.java b/src/test/java/com/jisungin/api/book/BookControllerTest.java index d0b9828..13dee87 100644 --- a/src/test/java/com/jisungin/api/book/BookControllerTest.java +++ b/src/test/java/com/jisungin/api/book/BookControllerTest.java @@ -1,6 +1,8 @@ package com.jisungin.api.book; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -11,11 +13,16 @@ import com.jisungin.ControllerTestSupport; import com.jisungin.api.book.request.BookCreateRequest; +import com.jisungin.application.PageResponse; +import com.jisungin.application.book.request.BookServicePageRequest; import com.jisungin.application.book.response.BestSellerResponse; +import com.jisungin.application.book.response.BookRelatedTalkRoomPageResponse; +import com.jisungin.application.book.response.BookRelatedTalkRoomResponse; import com.jisungin.application.book.response.BookResponse; import java.time.LocalDateTime; import java.util.List; import java.util.stream.IntStream; +import java.util.stream.LongStream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -50,6 +57,19 @@ public void getBestSellers() throws Exception { .andExpect(jsonPath("$.message").value("OK")); } + @Test + @DisplayName("책과 연관된 토크룸을 조회한다.") + public void getTalkRoomsRelatedBook() throws Exception { + // when // then + mockMvc.perform(get("/v1/books/00001/talk-rooms?page=1&size=10") + .accept(APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value("200")) + .andExpect(jsonPath("$.status").value("OK")) + .andExpect(jsonPath("$.message").value("OK")) + .andDo(print()); + } + @Test @DisplayName("신규 도서를 등록한다.") public void createBook() throws Exception { diff --git a/src/test/java/com/jisungin/application/service/book/BookServiceTest.java b/src/test/java/com/jisungin/application/service/book/BookServiceTest.java index f30d8f2..c195ec8 100644 --- a/src/test/java/com/jisungin/application/service/book/BookServiceTest.java +++ b/src/test/java/com/jisungin/application/service/book/BookServiceTest.java @@ -7,14 +7,30 @@ import com.jisungin.ServiceTestSupport; import com.jisungin.application.book.BookService; import com.jisungin.application.book.request.BookCreateServiceRequest; +import com.jisungin.application.book.request.BookServicePageRequest; +import com.jisungin.application.book.response.BookRelatedTalkRoomPageResponse; import com.jisungin.application.book.response.BookResponse; +import com.jisungin.domain.ReadingStatus; import com.jisungin.domain.book.Book; -import com.jisungin.domain.book.repository.BestSellerRepository; import com.jisungin.domain.book.repository.BookRepository; +import com.jisungin.domain.oauth.OauthId; +import com.jisungin.domain.oauth.OauthType; +import com.jisungin.domain.talkroom.TalkRoom; +import com.jisungin.domain.talkroom.TalkRoomRole; +import com.jisungin.domain.talkroom.repository.TalkRoomRepository; +import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; +import com.jisungin.domain.talkroomlike.TalkRoomLike; +import com.jisungin.domain.talkroomlike.repository.TalkRoomLikeRepository; +import com.jisungin.domain.user.User; +import com.jisungin.domain.user.repository.UserRepository; import com.jisungin.exception.BusinessException; import com.jisungin.infra.crawler.Crawler; import com.jisungin.infra.crawler.CrawlingBook; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,14 +45,27 @@ public class BookServiceTest extends ServiceTestSupport { @Autowired private BookRepository bookRepository; - @MockBean - private BestSellerRepository bestSellerRepository; + @Autowired + private TalkRoomRepository talkRoomRepository; + + @Autowired + private TalkRoomRoleRepository talkRoomRoleRepository; + + @Autowired + private TalkRoomLikeRepository talkRoomLikeRepository; + + @Autowired + private UserRepository userRepository; @MockBean private Crawler crawler; @AfterEach void tearDown() { + talkRoomLikeRepository.deleteAllInBatch(); + talkRoomRoleRepository.deleteAllInBatch(); + talkRoomRepository.deleteAllInBatch(); + userRepository.deleteAllInBatch(); bookRepository.deleteAllInBatch(); } @@ -70,6 +99,82 @@ public void getBookWithInvalidIsbn() { .hasMessage("책을 찾을 수 없습니다."); } + @Test + @DisplayName("책과 관련된 토크룸 정보를 가져온다.") + public void getTalkRoomRelatedBook() { + // given + List users = userRepository.saveAll(createUsers()); + + Book book = bookRepository.save(createBookWithIsbn("00001")); + Book anotherBook = bookRepository.save(createBookWithIsbn("00002")); + + List talkRoomsWithBook = talkRoomRepository.saveAll(createTalkRooms(users.get(0), book)); + List talkRoomsWithAnotherBook = talkRoomRepository.saveAll( + createTalkRooms(users.get(0), anotherBook)); + + talkRoomsWithBook.forEach(this::createTalkRoomRole); + talkRoomsWithAnotherBook.forEach(this::createTalkRoomRole); + + List likes1 = talkRoomLikeRepository.saveAll( + createTalkRoomLikes(users, talkRoomsWithBook.get(0), 10)); + List likes2 = talkRoomLikeRepository.saveAll( + createTalkRoomLikes(users, talkRoomsWithAnotherBook.get(0), 9)); + + BookServicePageRequest request = BookServicePageRequest.builder() + .page(1) + .size(5) + .build(); + + // when + BookRelatedTalkRoomPageResponse responses = bookService.getBookRelatedTalkRooms(book.getIsbn(), + request, users.get(0).getId()); + + // then + assertThat(responses.getResponse().getSize()).isEqualTo(5); + assertThat(responses.getResponse().getTotalCount()).isEqualTo(10); + assertThat(responses.getResponse().getQueryResponse().size()).isEqualTo(5); + assertThat(responses.getResponse().getQueryResponse().get(0).getLikeCount()).isEqualTo(10); + assertThat(responses.getResponse().getQueryResponse().get(1).getLikeCount()).isEqualTo(0); + assertThat(responses.getUserLikeTalkRoomIds().size()).isEqualTo(1); + assertThat(responses.getUserLikeTalkRoomIds().get(0)).isEqualTo(1); + } + + @NotNull + private static List createTalkRoomLikes(List users, TalkRoom talkRoom, Integer endIndex) { + return IntStream.range(0, endIndex).mapToObj(i -> TalkRoomLike.builder() + .user(users.get(i)) + .talkRoom(talkRoom) + .build()) + .toList(); + } + + @NotNull + private static List createTalkRooms(User user, Book book) { + return IntStream.range(0, 10) + .mapToObj(i -> TalkRoom.builder() + .user(user) + .book(book) + .title("토론방" + i) + .content("내용" + i) + .build()) + .toList(); + } + + @NotNull + private static List createUsers() { + return IntStream.range(0, 10) + .mapToObj(i -> User.builder() + .name("user@gmail.com " + i) + .profileImage("image") + .oauthId( + OauthId.builder() + .oauthId("oauthId " + i) + .oauthType(OauthType.KAKAO) + .build() + ) + .build()).toList(); + } + @Test @DisplayName("도서 정보에 대한 책을 생성한다.") public void createBook() { @@ -140,4 +245,29 @@ private static Book create() { .build(); } + private static Book createBookWithIsbn(String isbn) { + return Book.builder() + .title("제목" + isbn) + .content("내용" + isbn) + .authors("작가") + .isbn(isbn) + .publisher("publisher") + .dateTime(LocalDateTime.now()) + .imageUrl("www.image.com/" + isbn) + .thumbnail("www.thumbnail.com/" + isbn) + .build(); + } + + private void createTalkRoomRole(TalkRoom talkRoom) { + List request = new ArrayList<>(); + request.add("읽는 중"); + request.add("읽음"); + + List readingStatuses = List.of(ReadingStatus.READING, ReadingStatus.READ); + + readingStatuses.stream() + .map(status -> TalkRoomRole.roleCreate(talkRoom, status)) + .forEach(talkRoomRoleRepository::save); + } + }