From d8a347e7438bd518b3a75984ec374c7dd7adaa39 Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Mon, 25 Mar 2024 16:37:40 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20TalkRoom=20=EB=8B=A8=EA=B1=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/talkroom/TalkRoomController.java | 14 +++- .../application/talkroom/TalkRoomService.java | 16 +++- ...onse.java => TalkRoomFindAllResponse.java} | 6 +- .../response/TalkRoomFindOneResponse.java | 43 +++++++++++ .../response/TalkRoomQueryComments.java | 24 ++++++ .../repository/TalkRoomRepositoryCustom.java | 6 +- .../repository/TalkRoomRepositoryImpl.java | 75 +++++++++++++++++-- 7 files changed, 164 insertions(+), 20 deletions(-) rename src/main/java/com/jisungin/application/talkroom/response/{TalkRoomQueryResponse.java => TalkRoomFindAllResponse.java} (81%) create mode 100644 src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java create mode 100644 src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java diff --git a/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java b/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java index 7839b81..80e1e3e 100644 --- a/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java +++ b/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java @@ -8,13 +8,15 @@ import com.jisungin.api.talkroom.request.TalkRoomSearchRequest; import com.jisungin.application.response.PageResponse; import com.jisungin.application.talkroom.TalkRoomService; -import com.jisungin.application.talkroom.response.TalkRoomQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; import com.jisungin.application.talkroom.response.TalkRoomResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -35,8 +37,14 @@ public ApiResponse createTalkRoom(@Valid @RequestBody TalkRoom } @GetMapping("/talk-rooms") - public ApiResponse> getTalkRooms(@ModelAttribute TalkRoomSearchRequest search) { - return ApiResponse.ok(talkRoomService.getTalkRooms(search.toService())); + public ApiResponse> findAllTalkRoom( + @ModelAttribute TalkRoomSearchRequest search) { + return ApiResponse.ok(talkRoomService.findAllTalkRoom(search.toService())); + } + + @GetMapping("/talk-room/{talkRoomId}") + public ApiResponse findOneTalkRoom(@PathVariable Long talkRoomId) { + return ApiResponse.ok(talkRoomService.findOneTalkRoom(talkRoomId)); } @PatchMapping("/talk-rooms") diff --git a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java index 2c0d513..5726016 100644 --- a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java +++ b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java @@ -4,7 +4,8 @@ import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest; import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest; import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest; -import com.jisungin.application.talkroom.response.TalkRoomQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; import com.jisungin.application.talkroom.response.TalkRoomResponse; import com.jisungin.domain.ReadingStatus; import com.jisungin.domain.book.Book; @@ -52,15 +53,22 @@ public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, Lon book.getImageUrl(), book.getTitle()); } - public PageResponse getTalkRooms(TalkRoomSearchServiceRequest search) { - return talkRoomRepository.getTalkRooms(search); + public PageResponse findAllTalkRoom(TalkRoomSearchServiceRequest search) { + return talkRoomRepository.findAllTalkRoom(search); + } + + public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { + TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId) + .orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND)); + + return talkRoomRepository.findOneTalkRoom(talkRoom.getId()); } @Transactional public TalkRoomResponse editTalkRoom(TalkRoomEditServiceRequest request, Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); - + TalkRoom talkRoom = talkRoomRepository.findByIdWithUserAndBook(request.getId()); if (!talkRoom.isTalkRoomOwner(user.getId())) { diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java similarity index 81% rename from src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryResponse.java rename to src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java index 839c7da..3601052 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryResponse.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java @@ -9,7 +9,7 @@ @Getter @NoArgsConstructor -public class TalkRoomQueryResponse { +public class TalkRoomFindAllResponse { private Long talkRoomId; private String userName; @@ -21,8 +21,8 @@ public class TalkRoomQueryResponse { @Builder @QueryProjection - public TalkRoomQueryResponse(Long talkRoomId, String userName, String title, String content, String bookName, - String bookImage) { + public TalkRoomFindAllResponse(Long talkRoomId, String userName, String title, String content, String bookName, + String bookImage) { this.talkRoomId = talkRoomId; this.userName = userName; this.title = title; diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java new file mode 100644 index 0000000..a9c3a55 --- /dev/null +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java @@ -0,0 +1,43 @@ +package com.jisungin.application.talkroom.response; + +import com.querydsl.core.annotations.QueryProjection; +import java.util.ArrayList; +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class TalkRoomFindOneResponse { + + private Long talkRoomId; + private String userName; + private String title; + private String content; + private String bookName; + private String bookImage; + private List readingStatuses = new ArrayList<>(); + private List comments = new ArrayList<>(); + + @Builder + @QueryProjection + public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, String content, String bookName, + String bookImage) { + this.talkRoomId = talkRoomId; + this.userName = userName; + this.title = title; + this.content = content; + this.bookName = bookName; + this.bookImage = bookImage; + } + + public void addTalkRoomStatus(List readingStatuses) { + this.readingStatuses = readingStatuses; + } + + public void addTalkRoomComments(List comments) { + this.comments = comments; + } + +} diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java new file mode 100644 index 0000000..d9d5489 --- /dev/null +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryComments.java @@ -0,0 +1,24 @@ +package com.jisungin.application.talkroom.response; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class TalkRoomQueryComments { + + private Long commentId; + private String userName; + private String content; + + @Builder + @QueryProjection + public TalkRoomQueryComments(Long commentId, String userName, String content) { + this.commentId = commentId; + this.userName = userName; + this.content = content; + } + +} diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java index 1f1900a..86dbcf9 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java @@ -2,10 +2,12 @@ import com.jisungin.application.response.PageResponse; import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest; -import com.jisungin.application.talkroom.response.TalkRoomQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; public interface TalkRoomRepositoryCustom { - PageResponse getTalkRooms(TalkRoomSearchServiceRequest search); + PageResponse findAllTalkRoom(TalkRoomSearchServiceRequest search); + TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId); } diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java index ce4ecde..b11458f 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java @@ -1,16 +1,21 @@ package com.jisungin.domain.talkroom.repository; import static com.jisungin.domain.book.QBook.book; +import static com.jisungin.domain.comment.QComment.comment; import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom; import static com.jisungin.domain.talkroom.QTalkRoomRole.talkRoomRole; import static com.jisungin.domain.user.QUser.user; import com.jisungin.application.response.PageResponse; import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest; +import com.jisungin.application.talkroom.response.QTalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.QTalkRoomFindOneResponse; +import com.jisungin.application.talkroom.response.QTalkRoomQueryComments; import com.jisungin.application.talkroom.response.QTalkRoomQueryReadingStatus; -import com.jisungin.application.talkroom.response.QTalkRoomQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; +import com.jisungin.application.talkroom.response.TalkRoomQueryComments; import com.jisungin.application.talkroom.response.TalkRoomQueryReadingStatus; -import com.jisungin.application.talkroom.response.TalkRoomQueryResponse; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; @@ -24,10 +29,10 @@ public class TalkRoomRepositoryImpl implements TalkRoomRepositoryCustom { private final JPAQueryFactory queryFactory; @Override - public PageResponse getTalkRooms(TalkRoomSearchServiceRequest search) { + public PageResponse findAllTalkRoom(TalkRoomSearchServiceRequest search) { //루트 조회(toOne 코드를 모두 한번에 조회) - List findTalkRoom = findTalkRoom(search); + List findTalkRoom = findTalkRoomBySearch(search); //TalkRoomRole 컬렉션을 MAP 한방에 조회 Map> talkRoomRoleMap = findTalkRoomRoleMap(toTalkRoomIds(findTalkRoom)); @@ -37,14 +42,52 @@ public PageResponse getTalkRooms(TalkRoomSearchServiceReq long totalCount = getTotalTalkRoomCount(); - return PageResponse.builder() + return PageResponse.builder() .queryResponse(findTalkRoom) .totalCount(totalCount) .size(search.getSize()) .build(); } - private List toTalkRoomIds(List findTalkRoom) { + @Override + public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { + TalkRoomFindOneResponse findOneTalkRoom = findTalkRoomByTalkRoomId(talkRoomId); + + List talkRoomRoles = findTalkRoomRoleByTalkRoomId(talkRoomId); + findOneTalkRoom.addTalkRoomStatus(talkRoomRoles); + + List talkRoomComments = findCommentsByTalkRoomId(talkRoomId); + findOneTalkRoom.addTalkRoomComments(talkRoomComments); + + return findOneTalkRoom; + + } + + private List findCommentsByTalkRoomId(Long talkRoomId) { + return queryFactory.select(new QTalkRoomQueryComments( + comment.id.as("commentId"), + user.name.as("userName"), + comment.content + )) + .from(comment) + .join(comment.talkRoom, talkRoom) + .join(comment.user, user) + .where(comment.talkRoom.id.eq(talkRoomId)) + .fetch(); + } + + private List findTalkRoomRoleByTalkRoomId(Long talkRoomId) { + return queryFactory.select(new QTalkRoomQueryReadingStatus( + talkRoom.id, + talkRoomRole.readingStatus + )) + .from(talkRoomRole) + .join(talkRoomRole.talkRoom, talkRoom) + .where(talkRoomRole.talkRoom.id.eq(talkRoomId)) + .fetch(); + } + + private List toTalkRoomIds(List findTalkRoom) { return findTalkRoom.stream() .map(t -> t.getTalkRoomId()) .collect(Collectors.toList()); @@ -73,8 +116,8 @@ private long getTotalTalkRoomCount() { .fetchOne(); } - private List findTalkRoom(TalkRoomSearchServiceRequest search) { - return queryFactory.select(new QTalkRoomQueryResponse( + private List findTalkRoomBySearch(TalkRoomSearchServiceRequest search) { + return queryFactory.select(new QTalkRoomFindAllResponse( talkRoom.id.as("talkRoomId"), user.name.as("userName"), talkRoom.title, @@ -91,6 +134,22 @@ private List findTalkRoom(TalkRoomSearchServiceRequest se .fetch(); } + private TalkRoomFindOneResponse findTalkRoomByTalkRoomId(Long talkRoomId) { + return queryFactory.select(new QTalkRoomFindOneResponse( + talkRoom.id.as("talkRoomId"), + user.name.as("userName"), + talkRoom.title, + talkRoom.content, + book.title, + book.imageUrl.as("bookImage") + )) + .from(talkRoom) + .join(talkRoom.user, user) + .join(talkRoom.book, book) + .where(talkRoom.id.eq(talkRoomId)) + .fetchOne(); + } + /** * 아직 좋아요 기능이 구현 되지 않아 최신순으로만 정렬 */ From 86f891e9caf5c8ece58c222c2a9697842c292300 Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Mon, 25 Mar 2024 16:37:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20TalkRoom=20=EB=8B=A8=EA=B1=B4=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=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jisungin/RepositoryTestSupport.java | 11 ++ .../api/talkroom/TalkRoomControllerTest.java | 57 +++------- .../service/talkroom/TalkRoomServiceTest.java | 106 +++++++++++++++++- .../TalkRoomRepositoryImplTest.java | 65 +++++++++-- 4 files changed, 178 insertions(+), 61 deletions(-) create mode 100644 src/test/java/com/jisungin/RepositoryTestSupport.java diff --git a/src/test/java/com/jisungin/RepositoryTestSupport.java b/src/test/java/com/jisungin/RepositoryTestSupport.java new file mode 100644 index 0000000..d4f2c1a --- /dev/null +++ b/src/test/java/com/jisungin/RepositoryTestSupport.java @@ -0,0 +1,11 @@ +package com.jisungin; + +import com.jisungin.config.QueryDslConfig; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + +@DataJpaTest +@Import(QueryDslConfig.class) +public abstract class RepositoryTestSupport { + +} diff --git a/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java b/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java index ed09284..351d274 100644 --- a/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java +++ b/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java @@ -174,49 +174,18 @@ void getTalkRoomsEmpty() throws Exception { .andExpect(jsonPath("$.message").value("OK")); } -// private void createTalkRoomRole(TalkRoom talkRoom) { -// List request = new ArrayList<>(); -// request.add("읽는 중"); -// request.add("읽음"); -// -// List readingStatus = ReadingStatus.createReadingStatus(request); -// -// readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status)) -// .forEach(talkRoomRoleRepository::save); -// } -// -// private static TalkRoom createTalkRoom(Book book, User user) { -// return TalkRoom.builder() -// .book(book) -// .title("토크방") -// .content("내용") -// .user(user) -// .build(); -// } -// -// private static User createUser() { -// return User.builder() -// .name("user@gmail.com") -// .profileImage("image") -// .oauthId( -// OauthId.builder() -// .oauthId("oauthId") -// .oauthType(OauthType.KAKAO) -// .build() -// ) -// .build(); -// } -// -// private static Book createBook() { -// return Book.builder() -// .title("제목") -// .content("내용") -// .authors("작가") -// .isbn("11111") -// .publisher("publisher") -// .dateTime(LocalDateTime.now()) -// .imageUrl("www") -// .build(); -// } + @Test + @DisplayName("토크방 단건 조회를 한다.") + void findOneTalkRoom() throws Exception { + // when // then + mockMvc.perform(get("/v1/talk-room/1") + .contentType(APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value("200")) + .andExpect(jsonPath("$.status").value("OK")) + .andExpect(jsonPath("$.message").value("OK")); + } } \ No newline at end of file diff --git a/src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java b/src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java index c8bcccd..03909fd 100644 --- a/src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java +++ b/src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java @@ -9,11 +9,14 @@ import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest; import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest; import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest; -import com.jisungin.application.talkroom.response.TalkRoomQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; import com.jisungin.application.talkroom.response.TalkRoomResponse; import com.jisungin.domain.ReadingStatus; import com.jisungin.domain.book.Book; import com.jisungin.domain.book.repository.BookRepository; +import com.jisungin.domain.comment.Comment; +import com.jisungin.domain.comment.repository.CommentRepository; import com.jisungin.domain.oauth.OauthId; import com.jisungin.domain.oauth.OauthType; import com.jisungin.domain.talkroom.TalkRoom; @@ -49,8 +52,12 @@ class TalkRoomServiceTest extends ServiceTestSupport { @Autowired UserRepository userRepository; + @Autowired + CommentRepository commentRepository; + @AfterEach void tearDown() { + commentRepository.deleteAllInBatch(); talkRoomRoleRepository.deleteAllInBatch(); talkRoomRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); @@ -309,7 +316,7 @@ void getTalkRooms() { .build(); // when - PageResponse talkRooms = talkRoomRepository.getTalkRooms(search); + PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); // then assertThat(10L).isEqualTo(talkRooms.getQueryResponse().size()); @@ -348,7 +355,7 @@ void getTalkRoomsPageTotalCount() { .build(); // when - PageResponse talkRooms = talkRoomRepository.getTalkRooms(search); + PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); // then assertThat(103).isEqualTo(talkRooms.getTotalCount()); @@ -385,7 +392,7 @@ void getTalkRoomsMiddle() { .build(); // when - PageResponse talkRooms = talkRoomRepository.getTalkRooms(search); + PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); // then assertThat(talkRooms.getQueryResponse().size()).isEqualTo(10L); @@ -424,7 +431,7 @@ void getTalkRoomsLast() { .build(); // when - PageResponse talkRooms = talkRoomRepository.getTalkRooms(search); + PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); // then assertThat(talkRooms.getQueryResponse().size()).isEqualTo(3); @@ -432,6 +439,37 @@ void getTalkRoomsLast() { assertThat(talkRooms.getQueryResponse().get(0).getContent()).isEqualTo("내용 2"); } + @Test + @DisplayName("토크방을 단건 조회 한다.") + void findOneTalkRoom() { + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + Comment comment = Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 남기기") + .build(); + + commentRepository.save(comment); + // when + TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId()); + + // then + assertThat("토크방").isEqualTo(findOneTalkRoomResponse.getTitle()); + assertThat(2).isEqualTo(findOneTalkRoomResponse.getReadingStatuses().size()); + assertThat("의견 남기기").isEqualTo(findOneTalkRoomResponse.getComments().get(0).getContent()); + assertThat("user@gmail.com").isEqualTo(findOneTalkRoomResponse.getComments().get(0).getUserName()); + } + private void createTalkRoomRole(TalkRoom talkRoom) { List request = new ArrayList<>(); request.add("읽는 중"); @@ -443,6 +481,64 @@ private void createTalkRoomRole(TalkRoom talkRoom) { .forEach(talkRoomRoleRepository::save); } + @Test + @DisplayName("토크방을 단건 조회 했을 때 의견이 담기지 않았아도 조회는 정상적으로 되어야 한다.") + void findOneTalkRoomWithCommentNull() { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + // when + TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId()); + + // then + assertThat("토크방").isEqualTo(findOneTalkRoomResponse.getTitle()); + assertThat(2).isEqualTo(findOneTalkRoomResponse.getReadingStatuses().size()); + } + + @Test + @DisplayName("토크방을 단건 조회 했을 때 의견이 여러 개 달려있을 때 의견을 전부 보여줘야 한다.") + void findOneTalkRoomWithFindAllComment() { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + List comments = IntStream.range(0, 20) + .mapToObj(i -> Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 " + i) + .build()) + .toList(); + + commentRepository.saveAll(comments); + // when + TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId()); + + // then + assertThat("토크방").isEqualTo(findOneTalkRoomResponse.getTitle()); + assertThat(2).isEqualTo(findOneTalkRoomResponse.getReadingStatuses().size()); + assertThat(20).isEqualTo(findOneTalkRoomResponse.getComments().size()); + assertThat("의견 0").isEqualTo(findOneTalkRoomResponse.getComments().get(0).getContent()); + assertThat("의견 19").isEqualTo(findOneTalkRoomResponse.getComments().get(19).getContent()); + } + private static TalkRoom createTalkRoom(Book book, User user) { return TalkRoom.builder() .book(book) diff --git a/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImplTest.java b/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImplTest.java index c3e848b..050d3aa 100644 --- a/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImplTest.java +++ b/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImplTest.java @@ -2,13 +2,16 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.jisungin.RepositoryTestSupport; import com.jisungin.application.response.PageResponse; -import com.jisungin.application.talkroom.TalkRoomService; import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest; -import com.jisungin.application.talkroom.response.TalkRoomQueryResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; +import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; import com.jisungin.domain.ReadingStatus; import com.jisungin.domain.book.Book; import com.jisungin.domain.book.repository.BookRepository; +import com.jisungin.domain.comment.Comment; +import com.jisungin.domain.comment.repository.CommentRepository; import com.jisungin.domain.oauth.OauthId; import com.jisungin.domain.oauth.OauthType; import com.jisungin.domain.talkroom.TalkRoom; @@ -23,10 +26,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest -class TalkRoomRepositoryImplTest { +class TalkRoomRepositoryImplTest extends RepositoryTestSupport { @Autowired TalkRoomRepository talkRoomRepository; @@ -34,17 +35,18 @@ class TalkRoomRepositoryImplTest { @Autowired TalkRoomRoleRepository talkRoomRoleRepository; - @Autowired - TalkRoomService talkRoomService; - @Autowired BookRepository bookRepository; @Autowired UserRepository userRepository; + @Autowired + CommentRepository commentRepository; + @AfterEach void tearDown() { + commentRepository.deleteAllInBatch(); talkRoomRoleRepository.deleteAllInBatch(); talkRoomRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); @@ -65,7 +67,8 @@ void pageTest() { .mapToObj(i -> TalkRoom.builder() .user(user) .book(book) - .content("토론방 " + i) + .title("토론방 " + i) + .content("내용 " + i) .build()) .toList(); @@ -82,15 +85,52 @@ void pageTest() { .build(); // when - PageResponse talkRooms = talkRoomRepository.getTalkRooms(search); + PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); // then assertThat(10L).isEqualTo(talkRooms.getQueryResponse().size()); - assertThat("토론방 19").isEqualTo(talkRooms.getQueryResponse().get(0).getContent()); + assertThat("토론방 19").isEqualTo(talkRooms.getQueryResponse().get(0).getTitle()); + assertThat("내용 19").isEqualTo(talkRooms.getQueryResponse().get(0).getContent()); assertThat(2).isEqualTo(talkRooms.getQueryResponse().get(0).getReadingStatuses().size()); assertThat(20).isEqualTo(talkRooms.getTotalCount()); } + @Test + @DisplayName("querydsl 단건 조회 토크방 의견 조회 테스트") + void talkRoomFindOneComment() { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + Comment comment = createComment(talkRoom, user); + + commentRepository.save(comment); + // when + TalkRoomFindOneResponse findOneTalkRoom = talkRoomRepository.findOneTalkRoom(talkRoom.getId()); + + // then + assertThat("토론방").isEqualTo(findOneTalkRoom.getTitle()); + assertThat(2).isEqualTo(findOneTalkRoom.getReadingStatuses().size()); + assertThat("의견 남기기").isEqualTo(findOneTalkRoom.getComments().get(0).getContent()); + assertThat("user@gmail.com").isEqualTo(findOneTalkRoom.getComments().get(0).getUserName()); + } + + private static Comment createComment(TalkRoom talkRoom, User user) { + return Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 남기기") + .build(); + } + private void createTalkRoomRole(TalkRoom talkRoom) { List request = new ArrayList<>(); request.add("읽는 중"); @@ -105,7 +145,8 @@ private void createTalkRoomRole(TalkRoom talkRoom) { private static TalkRoom createTalkRoom(Book book, User user) { return TalkRoom.builder() .book(book) - .content("토크방") + .title("토론방") + .content("내용") .user(user) .build(); }