From 40f90495fee01aae30a52bb9b9ee1107559073c2 Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Mon, 25 Mar 2024 19:07:12 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20TalkRoom=20Comment=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20API=20=EA=B5=AC=ED=98=84=20(#38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/comment/CommentController.java | 9 +++++++ .../comment/request/CommentEditRequest.java | 25 +++++++++++++++++++ .../application/comment/CommentService.java | 19 ++++++++++++++ .../request/CommentEditServiceRequest.java | 18 +++++++++++++ .../application/talkroom/TalkRoomService.java | 2 +- .../com/jisungin/domain/comment/Comment.java | 18 ++++++++++++- .../jisungin/domain/talkroom/TalkRoom.java | 7 +++--- .../com/jisungin/exception/ErrorCode.java | 3 ++- 8 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java create mode 100644 src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java diff --git a/src/main/java/com/jisungin/api/comment/CommentController.java b/src/main/java/com/jisungin/api/comment/CommentController.java index 39f8e67..a6061cf 100644 --- a/src/main/java/com/jisungin/api/comment/CommentController.java +++ b/src/main/java/com/jisungin/api/comment/CommentController.java @@ -2,12 +2,14 @@ import com.jisungin.api.ApiResponse; import com.jisungin.api.comment.request.CommentCreateRequest; +import com.jisungin.api.comment.request.CommentEditRequest; import com.jisungin.api.oauth.Auth; import com.jisungin.api.oauth.AuthContext; import com.jisungin.application.comment.CommentService; import com.jisungin.application.comment.response.CommentResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +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; @@ -28,4 +30,11 @@ public ApiResponse writeComment(@PathVariable Long talkRoomId, return ApiResponse.ok(commentService.writeComment(request.toService(), talkRoomId, authContext.getUserId())); } + @PatchMapping("/talk-rooms/comments/{commentId}") + public ApiResponse editComment(@PathVariable Long commentId, + @Valid @RequestBody CommentEditRequest request, + @Auth AuthContext authContext) { + return ApiResponse.ok(commentService.editComment(commentId, request.toService(), authContext.getUserId())); + } + } diff --git a/src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java b/src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java new file mode 100644 index 0000000..f6c816f --- /dev/null +++ b/src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java @@ -0,0 +1,25 @@ +package com.jisungin.api.comment.request; + +import com.jisungin.application.comment.request.CommentEditServiceRequest; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CommentEditRequest { + + private String content; + + @Builder + private CommentEditRequest(String content) { + this.content = content; + } + + public CommentEditServiceRequest toService() { + return CommentEditServiceRequest.builder() + .content(content) + .build(); + } + +} diff --git a/src/main/java/com/jisungin/application/comment/CommentService.java b/src/main/java/com/jisungin/application/comment/CommentService.java index cb4e1b8..124230f 100644 --- a/src/main/java/com/jisungin/application/comment/CommentService.java +++ b/src/main/java/com/jisungin/application/comment/CommentService.java @@ -1,6 +1,7 @@ package com.jisungin.application.comment; import com.jisungin.application.comment.request.CommentCreateServiceRequest; +import com.jisungin.application.comment.request.CommentEditServiceRequest; import com.jisungin.application.comment.response.CommentResponse; import com.jisungin.domain.comment.Comment; import com.jisungin.domain.comment.repository.CommentRepository; @@ -12,7 +13,9 @@ import com.jisungin.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +@Transactional(readOnly = true) @RequiredArgsConstructor @Service public class CommentService { @@ -21,6 +24,7 @@ public class CommentService { private final TalkRoomRepository talkRoomRepository; private final UserRepository userRepository; + @Transactional public CommentResponse writeComment(CommentCreateServiceRequest request, Long talkRoomId, Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); @@ -35,4 +39,19 @@ public CommentResponse writeComment(CommentCreateServiceRequest request, Long ta return CommentResponse.of(comment.getContent(), user.getName()); } + @Transactional + public CommentResponse editComment(Long commentId, CommentEditServiceRequest request, Long userId) { + Comment comment = commentRepository.findById(commentId) + .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_NOT_FOUND)); + + User user = userRepository.findById(userId).orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + + if (!comment.isCommentOwner(user.getId())) { + throw new BusinessException(ErrorCode.UNAUTHORIZED_REQUEST); + } + + comment.edit(request.getContent()); + + return CommentResponse.of(comment.getContent(), user.getName()); + } } diff --git a/src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java b/src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java new file mode 100644 index 0000000..827a044 --- /dev/null +++ b/src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java @@ -0,0 +1,18 @@ +package com.jisungin.application.comment.request; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CommentEditServiceRequest { + + private String content; + + @Builder + private CommentEditServiceRequest(String content) { + this.content = content; + } + +} diff --git a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java index 19261ac..1d2780c 100644 --- a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java +++ b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java @@ -77,7 +77,7 @@ public TalkRoomResponse editTalkRoom(TalkRoomEditServiceRequest request, Long us throw new BusinessException(ErrorCode.UNAUTHORIZED_REQUEST); } - talkRoom.edit(request); + talkRoom.edit(request.getTitle(), request.getContent()); talkRoomRoleRepository.deleteAllByTalkRoom(talkRoom); diff --git a/src/main/java/com/jisungin/domain/comment/Comment.java b/src/main/java/com/jisungin/domain/comment/Comment.java index 54b3a70..14fed2a 100644 --- a/src/main/java/com/jisungin/domain/comment/Comment.java +++ b/src/main/java/com/jisungin/domain/comment/Comment.java @@ -4,7 +4,15 @@ import com.jisungin.domain.BaseEntity; import com.jisungin.domain.talkroom.TalkRoom; import com.jisungin.domain.user.User; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -47,4 +55,12 @@ public static Comment create(CommentCreateServiceRequest request, User user, Tal .build(); } + public boolean isCommentOwner(Long userId) { + return user.isMe(userId); + } + + public void edit(String requestContent) { + this.content = requestContent != null ? requestContent : content; + } + } diff --git a/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java b/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java index 54392ba..e05b69e 100644 --- a/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java +++ b/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java @@ -1,6 +1,5 @@ package com.jisungin.domain.talkroom; -import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest; import com.jisungin.domain.BaseEntity; import com.jisungin.domain.book.Book; import com.jisungin.domain.user.User; @@ -60,9 +59,9 @@ public static TalkRoom create(String title, String content, Book book, User user .build(); } - public void edit(TalkRoomEditServiceRequest request) { - this.title = request.getTitle() != null ? request.getTitle() : title; - this.content = request.getContent() != null ? request.getContent() : content; + public void edit(String requestTitle, String requestContent) { + this.title = requestTitle != null ? requestTitle : title; + this.content = requestContent != null ? requestContent : content; } public boolean isTalkRoomOwner(Long userId) { diff --git a/src/main/java/com/jisungin/exception/ErrorCode.java b/src/main/java/com/jisungin/exception/ErrorCode.java index c76938d..35b14b8 100644 --- a/src/main/java/com/jisungin/exception/ErrorCode.java +++ b/src/main/java/com/jisungin/exception/ErrorCode.java @@ -14,7 +14,8 @@ public enum ErrorCode { PARTICIPATION_CONDITION_ERROR(400, "참가 조건은 1개 이상이어야 합니다."), OAUTH_TYPE_NOT_FOUND(404, "지원하지 않는 소셜 로그인입니다."), TALK_ROOM_NOT_FOUND(400, "토크방을 찾을 수 없습니다."), - UNAUTHORIZED_REQUEST(400, "권한이 없는 사용자입니다."); + UNAUTHORIZED_REQUEST(400, "권한이 없는 사용자입니다."), + COMMENT_NOT_FOUND(404, "의견을 찾을 수 없습니다."); private final int code; From 7dff0208bd4cdd160a883d7b558c2eb73fdc85c2 Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Mon, 25 Mar 2024 19:07:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?test:=20TalkRoom=20Comment=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20API=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1=20(#38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/comment/CommentControllerTest.java | 22 ++++ .../comment/CommentServiceTest.java | 113 ++++++++++++++++++ 2 files changed, 135 insertions(+) diff --git a/src/test/java/com/jisungin/api/comment/CommentControllerTest.java b/src/test/java/com/jisungin/api/comment/CommentControllerTest.java index f7d0252..2961fb2 100644 --- a/src/test/java/com/jisungin/api/comment/CommentControllerTest.java +++ b/src/test/java/com/jisungin/api/comment/CommentControllerTest.java @@ -1,6 +1,7 @@ package com.jisungin.api.comment; import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -8,6 +9,7 @@ import com.jisungin.ControllerTestSupport; import com.jisungin.api.comment.request.CommentCreateRequest; +import com.jisungin.api.comment.request.CommentEditRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -51,4 +53,24 @@ void writeCommentWithEmptyContent() throws Exception { .andExpect(jsonPath("$.message").value("내용은 필수 입니다.")); } + @Test + @DisplayName("의견을 작성한 유저가 자신의 의견을 수정할 수 있다.") + void editComment() throws Exception { + // given + CommentEditRequest request = CommentEditRequest.builder() + .content("의견 수정") + .build(); + + // when // then + mockMvc.perform(patch("/v1/talk-rooms/comments/1") + .content(objectMapper.writeValueAsString(request)) + .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/comment/CommentServiceTest.java b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java index 8a938b2..8bba8dd 100644 --- a/src/test/java/com/jisungin/application/comment/CommentServiceTest.java +++ b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java @@ -1,13 +1,16 @@ package com.jisungin.application.comment; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.jisungin.ServiceTestSupport; import com.jisungin.application.comment.request.CommentCreateServiceRequest; +import com.jisungin.application.comment.request.CommentEditServiceRequest; import com.jisungin.application.comment.response.CommentResponse; 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; @@ -17,6 +20,7 @@ import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; 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.ArrayList; import java.util.List; @@ -81,6 +85,115 @@ void writeComment() { .contains("의견 남기기", "user@gmail.com"); } + @Test + @DisplayName("의견을 작성한 유저가 의견을 수정한다.") + void editComment() { + // 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(user, talkRoom); + commentRepository.save(comment); + + CommentEditServiceRequest request = CommentEditServiceRequest.builder() + .content("의견 수정") + .build(); + + // when + CommentResponse response = commentService.editComment(talkRoom.getId(), request, user.getId()); + + // then + assertThat(response) + .extracting("content", "userName") + .contains("의견 수정", "user@gmail.com"); + } + + @Test + @DisplayName("의견을 작성한 유저가 의견을 NULL로 보내면 원래 작성 했던 의견이 반영된다.") + void editCommentWithNullContent() { + // 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(user, talkRoom); + commentRepository.save(comment); + + CommentEditServiceRequest request = CommentEditServiceRequest.builder() + .build(); + + // when + CommentResponse response = commentService.editComment(talkRoom.getId(), request, user.getId()); + + // then + assertThat(response) + .extracting("content", "userName") + .contains("의견", "user@gmail.com"); + } + + @Test + @DisplayName("의견을 작성한 유저(userA)가 아닌 다른 유저(userB)가 의견에 대해 수정을 할 수 없다.") + void editCommentWithUserB() { + // given + User userA = createUser(); + userRepository.save(userA); + + User userB = User.builder() + .name("userB@gmail.com") + .profileImage("image") + .oauthId( + OauthId.builder() + .oauthId("oauthId2") + .oauthType(OauthType.KAKAO) + .build() + ) + .build(); + userRepository.save(userB); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, userA); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + Comment comment = createComment(userA, talkRoom); + commentRepository.save(comment); + + CommentEditServiceRequest request = CommentEditServiceRequest.builder() + .content("의견 수정") + .build(); + + // when // then + assertThatThrownBy(() -> commentService.editComment(talkRoom.getId(), request, userB.getId())) + .isInstanceOf(BusinessException.class) + .hasMessage("권한이 없는 사용자입니다."); + } + + private static Comment createComment(User user, TalkRoom talkRoom) { + return Comment.builder() + .content("의견") + .user(user) + .talkRoom(talkRoom) + .build(); + } + private void createTalkRoomRole(TalkRoom talkRoom) { List request = new ArrayList<>(); request.add("읽는 중"); From d3c1444dad1e61d39b42977b873e6cb23f52d03e Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Mon, 25 Mar 2024 19:20:44 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20TalkRoom=20Comment=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=EA=B5=AC=ED=98=84=20(#38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jisungin/api/comment/CommentController.java | 13 +++++++++++++ .../application/comment/CommentService.java | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/com/jisungin/api/comment/CommentController.java b/src/main/java/com/jisungin/api/comment/CommentController.java index a6061cf..62858b2 100644 --- a/src/main/java/com/jisungin/api/comment/CommentController.java +++ b/src/main/java/com/jisungin/api/comment/CommentController.java @@ -9,6 +9,8 @@ import com.jisungin.application.comment.response.CommentResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -37,4 +39,15 @@ public ApiResponse editComment(@PathVariable Long commentId, return ApiResponse.ok(commentService.editComment(commentId, request.toService(), authContext.getUserId())); } + @DeleteMapping("/talk-rooms/comments/{commentId}") + public ApiResponse deleteComment(@PathVariable Long commentId, + @Auth AuthContext authContext) { + commentService.deleteComment(commentId, authContext.getUserId()); + + return ApiResponse.builder() + .message("OK") + .status(HttpStatus.OK) + .build(); + } + } diff --git a/src/main/java/com/jisungin/application/comment/CommentService.java b/src/main/java/com/jisungin/application/comment/CommentService.java index 124230f..9197a80 100644 --- a/src/main/java/com/jisungin/application/comment/CommentService.java +++ b/src/main/java/com/jisungin/application/comment/CommentService.java @@ -54,4 +54,19 @@ public CommentResponse editComment(Long commentId, CommentEditServiceRequest req return CommentResponse.of(comment.getContent(), user.getName()); } + + @Transactional + public void deleteComment(Long commentId, Long userId) { + Comment comment = commentRepository.findById(commentId) + .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_NOT_FOUND)); + + User user = userRepository.findById(userId).orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + + if (!comment.isCommentOwner(user.getId())) { + throw new BusinessException(ErrorCode.UNAUTHORIZED_REQUEST); + } + + commentRepository.delete(comment); + } + } From 2cf58a6a4a188802bd652e972fea9bc92b930c5f Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Mon, 25 Mar 2024 19:20:58 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20TalkRoom=20Comment=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1=20(#38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/comment/CommentControllerTest.java | 17 ++++- .../comment/CommentServiceTest.java | 62 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/jisungin/api/comment/CommentControllerTest.java b/src/test/java/com/jisungin/api/comment/CommentControllerTest.java index 2961fb2..04543d0 100644 --- a/src/test/java/com/jisungin/api/comment/CommentControllerTest.java +++ b/src/test/java/com/jisungin/api/comment/CommentControllerTest.java @@ -1,6 +1,7 @@ package com.jisungin.api.comment; import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -54,7 +55,7 @@ void writeCommentWithEmptyContent() throws Exception { } @Test - @DisplayName("의견을 작성한 유저가 자신의 의견을 수정할 수 있다.") + @DisplayName("의견을 작성한 유저가 자신의 의견을 수정한다.") void editComment() throws Exception { // given CommentEditRequest request = CommentEditRequest.builder() @@ -73,4 +74,18 @@ void editComment() throws Exception { .andExpect(jsonPath("$.message").value("OK")); } + @Test + @DisplayName("의견을 작성한 유저가 자신의 의견을 삭제한다.") + void deleteComment() throws Exception { + // when // then + mockMvc.perform(delete("/v1/talk-rooms/comments/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/comment/CommentServiceTest.java b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java index 8bba8dd..0faa79c 100644 --- a/src/test/java/com/jisungin/application/comment/CommentServiceTest.java +++ b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java @@ -186,6 +186,68 @@ void editCommentWithUserB() { .hasMessage("권한이 없는 사용자입니다."); } + @Test + @DisplayName("의견을 작성한 유저가 의견을 삭제한다.") + void deleteComment() { + // 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(user, talkRoom); + commentRepository.save(comment); + + // when + commentService.deleteComment(comment.getId(), user.getId()); + + // then + List comments = commentRepository.findAll(); + assertThat(0).isEqualTo(comments.size()); + } + + @Test + @DisplayName("의견을 작성한 유저(userA)가 아닌 다른 유저(userB)가 의견을 삭제할 수 없다.") + void deleteCommentWithUserB() { + // given + User userA = createUser(); + userRepository.save(userA); + + User userB = User.builder() + .name("userB@gmail.com") + .profileImage("image") + .oauthId( + OauthId.builder() + .oauthId("oauthId2") + .oauthType(OauthType.KAKAO) + .build() + ) + .build(); + userRepository.save(userB); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, userA); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + Comment comment = createComment(userA, talkRoom); + commentRepository.save(comment); + + // when // then + assertThatThrownBy(() -> commentService.deleteComment(comment.getId(), userB.getId())) + .isInstanceOf(BusinessException.class) + .hasMessage("권한이 없는 사용자입니다."); + } + private static Comment createComment(User user, TalkRoom talkRoom) { return Comment.builder() .content("의견")