diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2273a1f..645a82f 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,26 +4,9 @@ - - - - @@ -840,7 +852,11 @@ - @@ -854,6 +870,7 @@ + diff --git a/src/main/java/org/wooriverygood/api/comment/application/CommentCreateService.java b/src/main/java/org/wooriverygood/api/comment/application/CommentCreateService.java index 5214f8e..60c338e 100644 --- a/src/main/java/org/wooriverygood/api/comment/application/CommentCreateService.java +++ b/src/main/java/org/wooriverygood/api/comment/application/CommentCreateService.java @@ -10,6 +10,9 @@ import org.wooriverygood.api.comment.dto.NewReplyRequest; import org.wooriverygood.api.comment.repository.CommentRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.exception.PostNotFoundException; import org.wooriverygood.api.post.repository.PostRepository; @@ -23,15 +26,19 @@ public class CommentCreateService { private final CommentRepository commentRepository; + private final MemberRepository memberRepository; + public void addComment(AuthInfo authInfo, Long postId, NewCommentRequest request) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Post post = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); Comment comment = Comment.builder() .content(request.getContent()) - .author(authInfo.getUsername()) .post(post) + .member(member) .build(); commentRepository.save(comment); @@ -44,13 +51,16 @@ public void addReply(Long commentId, NewReplyRequest request, AuthInfo authInfo) if (!parent.isParent()) throw new ReplyDepthException(); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + Comment child = Comment.builder() .content(request.getContent()) - .author(authInfo.getUsername()) .post(parent.getPost()) .parent(parent) + .member(member) .build(); - parent.addChildren(child); + parent.addReply(child); commentRepository.save(child); } diff --git a/src/main/java/org/wooriverygood/api/comment/application/CommentDeleteService.java b/src/main/java/org/wooriverygood/api/comment/application/CommentDeleteService.java index 9b8f2de..4bab334 100644 --- a/src/main/java/org/wooriverygood/api/comment/application/CommentDeleteService.java +++ b/src/main/java/org/wooriverygood/api/comment/application/CommentDeleteService.java @@ -8,6 +8,9 @@ import org.wooriverygood.api.comment.repository.CommentLikeRepository; import org.wooriverygood.api.comment.repository.CommentRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; @Service @Transactional @@ -18,12 +21,16 @@ public class CommentDeleteService { private final CommentLikeRepository commentLikeRepository; + private final MemberRepository memberRepository; + public void deleteComment(Long commentId, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Comment comment = commentRepository.findById(commentId) .orElseThrow(CommentNotFoundException::new); - comment.validateAuthor(authInfo.getUsername()); + comment.validateAuthor(member); commentLikeRepository.deleteAllByComment(comment); deleteCommentOrReply(comment); @@ -34,7 +41,7 @@ private void deleteCommentOrReply(Comment comment) { deleteParent(comment); return; } - deleteChild(comment); + deleteReply(comment); } private void deleteParent(Comment parent) { @@ -45,9 +52,9 @@ private void deleteParent(Comment parent) { parent.willBeDeleted(); } - private void deleteChild(Comment reply) { + private void deleteReply(Comment reply) { Comment parent = reply.getParent(); - parent.deleteChild(reply); + parent.deleteReply(reply); commentRepository.delete(reply); if (parent.canDelete()) diff --git a/src/main/java/org/wooriverygood/api/comment/application/CommentFindService.java b/src/main/java/org/wooriverygood/api/comment/application/CommentFindService.java index a9c2a51..599a19a 100644 --- a/src/main/java/org/wooriverygood/api/comment/application/CommentFindService.java +++ b/src/main/java/org/wooriverygood/api/comment/application/CommentFindService.java @@ -10,45 +10,52 @@ import org.wooriverygood.api.comment.repository.CommentLikeRepository; import org.wooriverygood.api.comment.repository.CommentRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import java.util.List; import java.util.Objects; @Service -@Transactional(readOnly = true) @RequiredArgsConstructor +@Transactional(readOnly = true) public class CommentFindService { private final CommentRepository commentRepository; private final CommentLikeRepository commentLikeRepository; + private final MemberRepository memberRepository; + public CommentsResponse findAllCommentsByPostId(Long postId, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); List comments = commentRepository.findAllByPostId(postId); List responses = comments.stream() - .map(comment -> convertToCommentResponse(comment, authInfo)) + .map(comment -> convertToCommentResponse(comment, member)) .filter(response -> !Objects.isNull(response)) .toList(); return new CommentsResponse(responses); } - private CommentResponse convertToCommentResponse(Comment comment, AuthInfo authInfo) { + private CommentResponse convertToCommentResponse(Comment comment, Member member) { if (comment.isReply()) return null; if (comment.isSoftRemoved()) - return CommentResponse.softRemovedOf(comment, convertToReplyResponses(comment, authInfo)); + return CommentResponse.softRemovedOf(comment, convertToReplyResponses(comment, member), comment.sameAuthor(member)); - boolean liked = commentLikeRepository.existsByCommentAndUsername(comment, authInfo.getUsername()); - return CommentResponse.of(comment, convertToReplyResponses(comment, authInfo), liked); + boolean liked = commentLikeRepository.existsByCommentAndMember(comment, member); + return CommentResponse.of(comment, convertToReplyResponses(comment, member), liked, comment.sameAuthor(member)); } - private List convertToReplyResponses(Comment parent, AuthInfo authInfo) { - return parent.getChildren() + private List convertToReplyResponses(Comment parent, Member member) { + return parent.getReplies() .stream() .map(reply -> { - boolean liked = commentLikeRepository.existsByCommentAndUsername(reply, authInfo.getUsername()); - return ReplyResponse.from(reply, liked); + boolean liked = commentLikeRepository.existsByCommentAndMember(reply, member); + return ReplyResponse.of(reply, liked, reply.sameAuthor(member)); }) .toList(); } diff --git a/src/main/java/org/wooriverygood/api/comment/application/CommentLikeToggleService.java b/src/main/java/org/wooriverygood/api/comment/application/CommentLikeToggleService.java index 9abd67d..e05aef3 100644 --- a/src/main/java/org/wooriverygood/api/comment/application/CommentLikeToggleService.java +++ b/src/main/java/org/wooriverygood/api/comment/application/CommentLikeToggleService.java @@ -10,6 +10,9 @@ import org.wooriverygood.api.comment.repository.CommentRepository; import org.wooriverygood.api.comment.exception.CommentNotFoundException; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import java.util.Optional; @@ -22,15 +25,19 @@ public class CommentLikeToggleService { private final CommentLikeRepository commentLikeRepository; + private final MemberRepository memberRepository; + public CommentLikeResponse likeComment(Long commentId, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Comment comment = commentRepository.findById(commentId) .orElseThrow(CommentNotFoundException::new); - Optional commentLike = commentLikeRepository.findByCommentAndUsername(comment, authInfo.getUsername()); + Optional commentLike = commentLikeRepository.findByCommentAndMember(comment, member); if (commentLike.isEmpty()) { - addCommentLike(comment, authInfo.getUsername()); + addCommentLike(comment, member); return createCommentLikeResponse(comment, true); } @@ -38,10 +45,10 @@ public CommentLikeResponse likeComment(Long commentId, AuthInfo authInfo) { return createCommentLikeResponse(comment, false); } - private void addCommentLike(Comment comment, String username) { + private void addCommentLike(Comment comment, Member member) { CommentLike commentLike = CommentLike.builder() .comment(comment) - .username(username) + .member(member) .build(); comment.addCommentLike(commentLike); diff --git a/src/main/java/org/wooriverygood/api/comment/application/CommentUpdateService.java b/src/main/java/org/wooriverygood/api/comment/application/CommentUpdateService.java index 6ddca9e..20e8e4a 100644 --- a/src/main/java/org/wooriverygood/api/comment/application/CommentUpdateService.java +++ b/src/main/java/org/wooriverygood/api/comment/application/CommentUpdateService.java @@ -8,6 +8,9 @@ import org.wooriverygood.api.comment.dto.CommentUpdateRequest; import org.wooriverygood.api.comment.repository.CommentRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; @Service @Transactional @@ -16,12 +19,16 @@ public class CommentUpdateService { private final CommentRepository commentRepository; + private final MemberRepository memberRepository; + public void updateComment(Long commentId, CommentUpdateRequest request, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Comment comment = commentRepository.findById(commentId) .orElseThrow(CommentNotFoundException::new); - comment.validateAuthor(authInfo.getUsername()); + comment.validateAuthor(member); comment.updateContent(request.getContent()); } diff --git a/src/main/java/org/wooriverygood/api/comment/domain/Comment.java b/src/main/java/org/wooriverygood/api/comment/domain/Comment.java index 6c9d0c2..d5a4b0f 100644 --- a/src/main/java/org/wooriverygood/api/comment/domain/Comment.java +++ b/src/main/java/org/wooriverygood/api/comment/domain/Comment.java @@ -6,6 +6,7 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.wooriverygood.api.global.error.exception.AuthorizationException; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.report.domain.CommentReport; @@ -15,8 +16,8 @@ import java.util.Objects; @Entity -@Table(name = "comments") @Getter +@Table(name = "comments") @EntityListeners(AuditingEntityListener.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Comment { @@ -31,13 +32,13 @@ public class Comment { private Comment parent; @OneToMany(mappedBy = "parent") - private List children = new ArrayList<>(); + private List replies = new ArrayList<>(); @Column(name = "comment_content", length = 200, nullable = false) private String content; - @Column(name = "comment_author", length = 1000) - private String author; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id", referencedColumnName = "post_id") @@ -69,16 +70,18 @@ public class Comment { private boolean updated; @Builder - public Comment(Long id, String content, String author, Post post, Comment parent, List commentLikes, List reports, boolean softRemoved, boolean updated) { + public Comment(Long id, String content, Post post, Member member, + Comment parent, List commentLikes, + List reports, boolean softRemoved, boolean updated) { this.id = id; this.content = content; - this.author = author; this.post = post; this.parent = parent; this.commentLikes = commentLikes; this.reports = reports; this.softRemoved = softRemoved; this.updated = updated; + this.member = member; } public void addCommentLike(CommentLike commentLike) { @@ -94,15 +97,19 @@ public void addReport(CommentReport report) { reports.add(report); } - public boolean hasReportByUser(String username) { + public boolean hasReportByMember(Member member) { for (CommentReport report: reports) - if (report.isOwner(username)) + if (report.isOwner(member)) return true; return false; } - public void validateAuthor(String author) { - if (!this.author.equals(author)) throw new AuthorizationException(); + public boolean sameAuthor(Member member) { + return this.member.equals(member); + } + + public void validateAuthor(Member member) { + if (!sameAuthor(member)) throw new AuthorizationException(); } public void updateContent(String content) { @@ -110,12 +117,12 @@ public void updateContent(String content) { updated = true; } - public void addChildren(Comment reply) { - children.add(reply); + public void addReply(Comment reply) { + replies.add(reply); } - public void deleteChild(Comment reply) { - children.remove(reply); + public void deleteReply(Comment reply) { + replies.remove(reply); reply.delete(); } @@ -132,7 +139,7 @@ public boolean isReply() { } public boolean hasNoReply() { - return children.isEmpty(); + return replies.isEmpty(); } public void willBeDeleted() { diff --git a/src/main/java/org/wooriverygood/api/comment/domain/CommentLike.java b/src/main/java/org/wooriverygood/api/comment/domain/CommentLike.java index 320e161..5b9a741 100644 --- a/src/main/java/org/wooriverygood/api/comment/domain/CommentLike.java +++ b/src/main/java/org/wooriverygood/api/comment/domain/CommentLike.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.wooriverygood.api.member.domain.Member; @Entity @Table(name = "commentLikes") @@ -19,15 +20,15 @@ public class CommentLike { @JoinColumn(name = "comment_id", referencedColumnName = "comment_id") private Comment comment; - @Column - private String username; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; @Builder - public CommentLike(Long id, Comment comment, String username) { + public CommentLike(Long id, Comment comment, Member member) { this.id = id; this.comment = comment; - this.username = username; + this.member = member; } public void delete() { diff --git a/src/main/java/org/wooriverygood/api/comment/dto/CommentResponse.java b/src/main/java/org/wooriverygood/api/comment/dto/CommentResponse.java index 91b790b..d610aa6 100644 --- a/src/main/java/org/wooriverygood/api/comment/dto/CommentResponse.java +++ b/src/main/java/org/wooriverygood/api/comment/dto/CommentResponse.java @@ -17,8 +17,6 @@ public class CommentResponse { private final String commentContent; - private final String commentAuthor; - private final Long postId; private final int commentLikeCount; @@ -33,12 +31,20 @@ public class CommentResponse { private final boolean reported; + private final boolean isMine; + + private final long memberId; + @Builder - public CommentResponse(Long commentId, String commentContent, String commentAuthor, Long postId, int commentLikeCount, LocalDateTime commentTime, boolean liked, List replies, boolean updated, boolean reported) { + public CommentResponse( + Long commentId, String commentContent, Long postId, + int commentLikeCount, LocalDateTime commentTime, boolean liked, + List replies, boolean updated, boolean reported, + boolean isMine, long memberId + ) { this.commentId = commentId; this.commentContent = commentContent; - this.commentAuthor = commentAuthor; this.postId = postId; this.commentLikeCount = commentLikeCount; this.commentTime = commentTime; @@ -46,14 +52,16 @@ public CommentResponse(Long commentId, String commentContent, String commentAuth this.replies = replies; this.updated = updated; this.reported = reported; + this.isMine = isMine; + this.memberId = memberId; } - public static CommentResponse of(Comment comment, List replies, boolean liked) { + public static CommentResponse of(Comment comment, List replies, boolean liked, boolean isMine) { return CommentResponse.builder() .commentId(comment.getId()) .commentContent(comment.getContent()) - .commentAuthor(comment.getAuthor()) + .memberId(comment.getMember().getId()) .postId(comment.getPost().getId()) .commentLikeCount(comment.getLikeCount()) .commentTime(comment.getCreatedAt()) @@ -61,20 +69,22 @@ public static CommentResponse of(Comment comment, List replies, b .replies(replies) .updated(comment.isUpdated()) .reported(comment.isReportedTooMuch()) + .isMine(isMine) .build(); } - public static CommentResponse softRemovedOf(Comment comment, List replies) { + public static CommentResponse softRemovedOf(Comment comment, List replies, boolean isMine) { return CommentResponse.builder() .commentId(comment.getId()) .commentContent(null) - .commentAuthor(comment.getAuthor()) + .memberId(comment.getMember().getId()) .postId(comment.getPost().getId()) .commentLikeCount(comment.getLikeCount()) .commentTime(comment.getCreatedAt()) .replies(replies) .updated(comment.isUpdated()) .reported(comment.isReportedTooMuch()) + .isMine(isMine) .build(); } diff --git a/src/main/java/org/wooriverygood/api/comment/dto/ReplyResponse.java b/src/main/java/org/wooriverygood/api/comment/dto/ReplyResponse.java index c9a5566..7556f1a 100644 --- a/src/main/java/org/wooriverygood/api/comment/dto/ReplyResponse.java +++ b/src/main/java/org/wooriverygood/api/comment/dto/ReplyResponse.java @@ -16,8 +16,6 @@ public class ReplyResponse { private final String replyContent; - private final String replyAuthor; - private final int replyLikeCount; private final LocalDateTime replyTime; @@ -28,13 +26,21 @@ public class ReplyResponse { private final boolean reported; + private final boolean isMine; - @Builder + private final long memberId; - public ReplyResponse(Long replyId, String replyContent, String replyAuthor, int replyLikeCount, LocalDateTime replyTime, boolean liked, boolean updated, boolean reported) { + + @Builder + public ReplyResponse( + Long replyId, String replyContent, int replyLikeCount, + LocalDateTime replyTime, boolean liked, boolean updated, + boolean reported, boolean isMine, long memberId + ) { this.replyId = replyId; this.replyContent = replyContent; - this.replyAuthor = replyAuthor; + this.isMine = isMine; + this.memberId = memberId; this.replyLikeCount = replyLikeCount; this.replyTime = replyTime; this.liked = liked; @@ -42,16 +48,17 @@ public ReplyResponse(Long replyId, String replyContent, String replyAuthor, int this.reported = reported; } - public static ReplyResponse from(Comment reply, boolean liked) { + public static ReplyResponse of(Comment reply, boolean liked, boolean isMine) { return ReplyResponse.builder() .replyId(reply.getId()) .replyContent(reply.getContent()) - .replyAuthor(reply.getAuthor()) + .memberId(reply.getMember().getId()) .replyLikeCount(reply.getLikeCount()) .replyTime(reply.getCreatedAt()) .liked(liked) .updated(reply.isUpdated()) .reported(reply.isReportedTooMuch()) + .isMine(isMine) .build(); } diff --git a/src/main/java/org/wooriverygood/api/comment/repository/CommentLikeRepository.java b/src/main/java/org/wooriverygood/api/comment/repository/CommentLikeRepository.java index 28c33f5..00e475d 100644 --- a/src/main/java/org/wooriverygood/api/comment/repository/CommentLikeRepository.java +++ b/src/main/java/org/wooriverygood/api/comment/repository/CommentLikeRepository.java @@ -3,14 +3,15 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.wooriverygood.api.comment.domain.Comment; import org.wooriverygood.api.comment.domain.CommentLike; +import org.wooriverygood.api.member.domain.Member; import java.util.Optional; public interface CommentLikeRepository extends JpaRepository { - Optional findByCommentAndUsername(Comment comment, String username); + Optional findByCommentAndMember(Comment comment, Member member); - boolean existsByCommentAndUsername(Comment comment, String username); + boolean existsByCommentAndMember(Comment comment, Member member); void deleteAllByComment(Comment comment); } diff --git a/src/main/java/org/wooriverygood/api/course/domain/Course.java b/src/main/java/org/wooriverygood/api/course/domain/Course.java index efab51b..bda5b32 100644 --- a/src/main/java/org/wooriverygood/api/course/domain/Course.java +++ b/src/main/java/org/wooriverygood/api/course/domain/Course.java @@ -1,6 +1,7 @@ package org.wooriverygood.api.course.domain; import jakarta.persistence.*; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,8 +9,8 @@ @Entity @Getter -@NoArgsConstructor @Table(name = "courses") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Course { @Id @@ -36,6 +37,7 @@ public class Course { @ColumnDefault("0") private int reviewCount; + @Builder public Course(Long id, String name, String category, double credit, int isYouguan, String kaikeYuanxi, int reviewCount) { this.id = id; diff --git a/src/main/java/org/wooriverygood/api/global/auth/AuthInfo.java b/src/main/java/org/wooriverygood/api/global/auth/AuthInfo.java index 8c56647..4aa4f01 100644 --- a/src/main/java/org/wooriverygood/api/global/auth/AuthInfo.java +++ b/src/main/java/org/wooriverygood/api/global/auth/AuthInfo.java @@ -6,11 +6,15 @@ @Getter public class AuthInfo { + private Long memberId; + private final String sub; + private final String username; @Builder - public AuthInfo(String sub, String username) { + public AuthInfo(Long memberId, String sub, String username) { + this.memberId = memberId; this.sub = sub; this.username = username; } diff --git a/src/main/java/org/wooriverygood/api/global/auth/AuthenticationPrincipalArgumentResolver.java b/src/main/java/org/wooriverygood/api/global/auth/AuthenticationPrincipalArgumentResolver.java index a3a1e77..c0d17da 100644 --- a/src/main/java/org/wooriverygood/api/global/auth/AuthenticationPrincipalArgumentResolver.java +++ b/src/main/java/org/wooriverygood/api/global/auth/AuthenticationPrincipalArgumentResolver.java @@ -1,5 +1,6 @@ package org.wooriverygood.api.global.auth; +import lombok.RequiredArgsConstructor; import org.springframework.core.MethodParameter; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -8,9 +9,15 @@ import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; +@RequiredArgsConstructor public class AuthenticationPrincipalArgumentResolver implements HandlerMethodArgumentResolver { + private final MemberRepository memberRepository; + + @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(Login.class); @@ -23,8 +30,9 @@ public Object resolveArgument(MethodParameter parameter, WebDataBinderFactory binderFactory) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.getPrincipal() instanceof Jwt jwt) + if (authentication != null && authentication.getPrincipal() instanceof Jwt jwt) { return createAuthInfo(jwt); + } return AuthInfo.builder().build(); } @@ -33,7 +41,14 @@ private AuthInfo createAuthInfo(Jwt jwt) { String sub = jwt.getClaim("sub"); String username = jwt.getClaim("username"); + Member member = memberRepository.findByUsername(username) + .orElseGet(() -> { + Member newMember = Member.builder().username(username).build(); + return memberRepository.save(newMember); + }); + return AuthInfo.builder() + .memberId(member.getId()) .sub(sub) .username(username) .build(); diff --git a/src/main/java/org/wooriverygood/api/global/config/WebConfig.java b/src/main/java/org/wooriverygood/api/global/config/WebConfig.java index 40ddcb3..9278e3c 100644 --- a/src/main/java/org/wooriverygood/api/global/config/WebConfig.java +++ b/src/main/java/org/wooriverygood/api/global/config/WebConfig.java @@ -1,20 +1,25 @@ package org.wooriverygood.api.global.config; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.wooriverygood.api.global.auth.AuthenticationPrincipalArgumentResolver; +import org.wooriverygood.api.member.repository.MemberRepository; import java.util.List; @Configuration +@RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { + private final MemberRepository memberRepository; + @Bean public AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver() { - return new AuthenticationPrincipalArgumentResolver(); + return new AuthenticationPrincipalArgumentResolver(memberRepository); } @Override diff --git a/src/main/java/org/wooriverygood/api/member/domain/Member.java b/src/main/java/org/wooriverygood/api/member/domain/Member.java new file mode 100644 index 0000000..6dbee95 --- /dev/null +++ b/src/main/java/org/wooriverygood/api/member/domain/Member.java @@ -0,0 +1,56 @@ +package org.wooriverygood.api.member.domain; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.wooriverygood.api.global.error.exception.AuthorizationException; +import org.wooriverygood.api.review.domain.Review; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Entity +@Getter +@Table(name = "members") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Member { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String username; + + @Column(name = "old_username") + private String oldUsername; + + private String email; + + @OneToMany(mappedBy = "member") + private List reviews = new ArrayList<>(); + + + @Builder + public Member(Long id, String username) { + this.id = id; + this.username = username; + } + + public boolean isSame(Member member) { + return Objects.equals(this.id, member.getId()); + } + + public void verify(Member member) { + if (!isSame(member)) { + throw new AuthorizationException(); + } + } + + public void addReview(Review review) { + reviews.add(review); + } + +} \ No newline at end of file diff --git a/src/main/java/org/wooriverygood/api/member/exception/MemberNotFoundException.java b/src/main/java/org/wooriverygood/api/member/exception/MemberNotFoundException.java new file mode 100644 index 0000000..7581fc4 --- /dev/null +++ b/src/main/java/org/wooriverygood/api/member/exception/MemberNotFoundException.java @@ -0,0 +1,12 @@ +package org.wooriverygood.api.member.exception; + +import org.wooriverygood.api.global.error.exception.NotFoundException; + +public class MemberNotFoundException extends NotFoundException { + private static final String MESSAGE = "유저 정보를 찾을 수 없습니다."; + + + public MemberNotFoundException() { + super(MESSAGE); + } +} diff --git a/src/main/java/org/wooriverygood/api/member/repository/MemberRepository.java b/src/main/java/org/wooriverygood/api/member/repository/MemberRepository.java new file mode 100644 index 0000000..d10e1df --- /dev/null +++ b/src/main/java/org/wooriverygood/api/member/repository/MemberRepository.java @@ -0,0 +1,12 @@ +package org.wooriverygood.api.member.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.wooriverygood.api.member.domain.Member; + +import java.util.Optional; + +public interface MemberRepository extends JpaRepository { + + Optional findByUsername(String username); + +} diff --git a/src/main/java/org/wooriverygood/api/post/application/PostCreateService.java b/src/main/java/org/wooriverygood/api/post/application/PostCreateService.java index 50dfeff..403b65a 100644 --- a/src/main/java/org/wooriverygood/api/post/application/PostCreateService.java +++ b/src/main/java/org/wooriverygood/api/post/application/PostCreateService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.post.dto.NewPostRequest; @@ -10,24 +13,28 @@ import org.wooriverygood.api.global.auth.AuthInfo; @Service +@Transactional @RequiredArgsConstructor public class PostCreateService { private final PostRepository postRepository; - @Transactional + private final MemberRepository memberRepository; + public void addPost(AuthInfo authInfo, NewPostRequest newPostRequest) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); PostCategory.parse(newPostRequest.getPostCategory()); - Post post = createPost(authInfo, newPostRequest); + Post post = createPost(member, newPostRequest); postRepository.save(post); } - private Post createPost(AuthInfo authInfo, NewPostRequest newPostRequest) { + private Post createPost(Member member, NewPostRequest newPostRequest) { return Post.builder() .title(newPostRequest.getPostTitle()) .content(newPostRequest.getPostContent()) .category(PostCategory.parse(newPostRequest.getPostCategory())) - .author(authInfo.getUsername()) + .member(member) .build(); } diff --git a/src/main/java/org/wooriverygood/api/post/application/PostDeleteService.java b/src/main/java/org/wooriverygood/api/post/application/PostDeleteService.java index aec5f1c..feeed2c 100644 --- a/src/main/java/org/wooriverygood/api/post/application/PostDeleteService.java +++ b/src/main/java/org/wooriverygood/api/post/application/PostDeleteService.java @@ -4,6 +4,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.wooriverygood.api.comment.repository.CommentRepository; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.exception.PostNotFoundException; import org.wooriverygood.api.post.repository.PostLikeRepository; @@ -11,6 +14,7 @@ import org.wooriverygood.api.global.auth.AuthInfo; @Service +@Transactional @RequiredArgsConstructor public class PostDeleteService { @@ -20,12 +24,15 @@ public class PostDeleteService { private final PostLikeRepository postLikeRepository; + private final MemberRepository memberRepository; + - @Transactional public void deletePost(AuthInfo authInfo, long postId) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Post post = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); - post.validateAuthor(authInfo.getUsername()); + post.validateAuthor(member); deleteCommentAndPostLike(post); postRepository.delete(post); diff --git a/src/main/java/org/wooriverygood/api/post/application/PostFindService.java b/src/main/java/org/wooriverygood/api/post/application/PostFindService.java index b60439a..76e5d92 100644 --- a/src/main/java/org/wooriverygood/api/post/application/PostFindService.java +++ b/src/main/java/org/wooriverygood/api/post/application/PostFindService.java @@ -5,6 +5,9 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.post.dto.PostDetailResponse; @@ -18,18 +21,22 @@ import java.util.List; @Service -@Transactional(readOnly = true) @RequiredArgsConstructor +@Transactional(readOnly = true) public class PostFindService { private final PostRepository postRepository; private final PostLikeRepository postLikeRepository; + private final MemberRepository memberRepository; + public PostsResponse findPosts(AuthInfo authInfo, Pageable pageable, String postCategory) { Page page = findPostsPage(pageable, postCategory); - return convertToPostsResponse(authInfo, page); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + return convertToPostsResponse(member, page); } private Page findPostsPage(Pageable pageable, String postCategory) { @@ -43,21 +50,26 @@ private Page findPostsPage(Pageable pageable, String postCategory) { public PostDetailResponse findPostById(long postId, AuthInfo authInfo) { Post post = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); - boolean liked = postLikeRepository.existsByPostAndUsername(post, authInfo.getUsername()); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + boolean liked = postLikeRepository.existsByPostAndMember(post, member); + boolean isMine = post.getMember().equals(member); postRepository.increaseViewCount(postId); - return PostDetailResponse.of(post, liked); + return PostDetailResponse.of(post, member.getId(), liked, isMine); } public PostsResponse findMyPosts(AuthInfo authInfo, Pageable pageable) { - Page page = postRepository.findByAuthorOrderByIdDesc(authInfo.getUsername(), pageable); - return convertToPostsResponse(authInfo, page); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + Page page = postRepository.findByMemberOrderByIdDesc(member, pageable); + return convertToPostsResponse(member, page); } - private PostsResponse convertToPostsResponse(AuthInfo authInfo, Page page) { + private PostsResponse convertToPostsResponse(Member member, Page page) { List posts = page.getContent().stream() .map(post -> { - boolean liked = postLikeRepository.existsByPostAndUsername(post, authInfo.getUsername()); - return PostResponse.of(post, liked); + boolean liked = postLikeRepository.existsByPostAndMember(post, member); + return PostResponse.of(post, liked, post.getMember().equals(member)); }) .toList(); diff --git a/src/main/java/org/wooriverygood/api/post/application/PostLikeToggleService.java b/src/main/java/org/wooriverygood/api/post/application/PostLikeToggleService.java index e1536a0..29508ce 100644 --- a/src/main/java/org/wooriverygood/api/post/application/PostLikeToggleService.java +++ b/src/main/java/org/wooriverygood/api/post/application/PostLikeToggleService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostLike; import org.wooriverygood.api.post.dto.PostLikeResponse; @@ -22,15 +25,19 @@ public class PostLikeToggleService { private final PostLikeRepository postLikeRepository; + private final MemberRepository memberRepository; + public PostLikeResponse togglePostLike(long postId, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Post post = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); - Optional postLike = postLikeRepository.findByPostAndUsername(post, authInfo.getUsername()); + Optional postLike = postLikeRepository.findByPostAndMember(post, member); if (postLike.isEmpty()) { - addPostLike(post, authInfo.getUsername()); + addPostLike(post, member); return createPostLikeResponse(post, true); } @@ -38,10 +45,10 @@ public PostLikeResponse togglePostLike(long postId, AuthInfo authInfo) { return createPostLikeResponse(post, false); } - private void addPostLike(Post post, String username) { + private void addPostLike(Post post, Member member) { PostLike newPostLike = PostLike.builder() .post(post) - .username(username) + .member(member) .build(); post.addPostLike(newPostLike); diff --git a/src/main/java/org/wooriverygood/api/post/application/PostUpdateService.java b/src/main/java/org/wooriverygood/api/post/application/PostUpdateService.java index a2b8b17..0978f36 100644 --- a/src/main/java/org/wooriverygood/api/post/application/PostUpdateService.java +++ b/src/main/java/org/wooriverygood/api/post/application/PostUpdateService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.dto.PostUpdateRequest; import org.wooriverygood.api.post.exception.PostNotFoundException; @@ -10,16 +13,21 @@ import org.wooriverygood.api.global.auth.AuthInfo; @Service +@Transactional @RequiredArgsConstructor public class PostUpdateService { private final PostRepository postRepository; - @Transactional + private final MemberRepository memberRepository; + + public void updatePost(long postId, PostUpdateRequest postUpdateRequest, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Post post = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); - post.validateAuthor(authInfo.getUsername()); + post.validateAuthor(member); post.updateTitle(postUpdateRequest.getPostTitle()); post.updateContent(postUpdateRequest.getPostContent()); diff --git a/src/main/java/org/wooriverygood/api/post/domain/Post.java b/src/main/java/org/wooriverygood/api/post/domain/Post.java index e9a4f06..ae1b951 100644 --- a/src/main/java/org/wooriverygood/api/post/domain/Post.java +++ b/src/main/java/org/wooriverygood/api/post/domain/Post.java @@ -7,6 +7,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.wooriverygood.api.global.error.exception.AuthorizationException; import org.wooriverygood.api.comment.domain.Comment; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.report.domain.PostReport; import java.time.LocalDateTime; @@ -14,8 +15,8 @@ import java.util.List; @Entity -@Table(name = "posts") @Getter +@Table(name = "posts") @EntityListeners(AuditingEntityListener.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post { @@ -35,8 +36,8 @@ public class Post { @Embedded private Content content; - @Column(name = "post_author", length = 1000) - private String author; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; @OneToMany(mappedBy = "post", fetch = FetchType.EAGER) private List comments = new ArrayList<>(); @@ -68,20 +69,22 @@ public class Post { @Builder - public Post(Long id, PostCategory category, String title, String content, String author, List comments, List postLikes, List reports, boolean updated) { + public Post(Long id, PostCategory category, String title, String content, + Member member, List comments, List postLikes, + List reports, boolean updated) { this.id = id; this.category = category; this.title = new Title(title); this.content = new Content(content); - this.author = author; + this.member = member; this.comments = comments; this.postLikes = postLikes; this.reports = reports; this.updated = updated; } - public void validateAuthor(String author) { - if (!this.author.equals(author)) throw new AuthorizationException(); + public void validateAuthor(Member member) { + this.member.verify(member); } public void addPostLike(PostLike postLike) { @@ -113,9 +116,9 @@ public int getCommentCount() { return comments.size(); } - public boolean hasReportByUser(String username) { + public boolean hasReportByMember(Member member) { for (PostReport report: reports) - if (report.isOwner(username)) + if (report.isOwner(member)) return true; return false; } diff --git a/src/main/java/org/wooriverygood/api/post/domain/PostLike.java b/src/main/java/org/wooriverygood/api/post/domain/PostLike.java index d1c9131..fd74461 100644 --- a/src/main/java/org/wooriverygood/api/post/domain/PostLike.java +++ b/src/main/java/org/wooriverygood/api/post/domain/PostLike.java @@ -2,10 +2,11 @@ import jakarta.persistence.*; import lombok.*; +import org.wooriverygood.api.member.domain.Member; @Entity -@Table(name = "postLikes") @Getter +@Table(name = "post_likes") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PostLike { @@ -17,15 +18,15 @@ public class PostLike { @JoinColumn(name = "post_id", referencedColumnName = "post_id") private Post post; - @Column - private String username; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; @Builder - public PostLike(Long id, Post post, String username) { + public PostLike(Long id, Post post, Member member) { this.id = id; this.post = post; - this.username = username; + this.member = member; } public void delete() { diff --git a/src/main/java/org/wooriverygood/api/post/dto/PostDetailResponse.java b/src/main/java/org/wooriverygood/api/post/dto/PostDetailResponse.java index 0f28679..d6c4af1 100644 --- a/src/main/java/org/wooriverygood/api/post/dto/PostDetailResponse.java +++ b/src/main/java/org/wooriverygood/api/post/dto/PostDetailResponse.java @@ -20,7 +20,9 @@ public class PostDetailResponse { private final String postCategory; - private final String postAuthor; + private final long memberId; + + private final boolean isMine; private final int postComments; @@ -38,12 +40,16 @@ public class PostDetailResponse { @Builder - public PostDetailResponse(Long postId, String postTitle, String postContent, String postCategory, String postAuthor, int postComments, int postLikes, LocalDateTime postTime, boolean liked, boolean updated, boolean reported, int viewCount) { + public PostDetailResponse(Long postId, String postTitle, String postContent, + String postCategory, long memberId, int postComments, + int postLikes, LocalDateTime postTime, boolean liked, + boolean isMine, boolean updated, boolean reported, int viewCount) { this.postId = postId; this.postTitle = postTitle; this.postContent = postContent; this.postCategory = postCategory; - this.postAuthor = postAuthor; + this.memberId = memberId; + this.isMine = isMine; this.postComments = postComments; this.postLikes = postLikes; this.postTime = postTime; @@ -53,13 +59,14 @@ public PostDetailResponse(Long postId, String postTitle, String postContent, Str this.viewCount = viewCount; } - public static PostDetailResponse of(Post post, boolean liked) { + public static PostDetailResponse of(Post post, long memberId, boolean liked, boolean isMine) { return PostDetailResponse.builder() .postId(post.getId()) .postTitle(post.getTitle()) .postContent(post.getContent()) .postCategory(post.getCategory().getValue()) - .postAuthor(post.getAuthor()) + .isMine(isMine) + .memberId(memberId) .postComments(post.getCommentCount()) .postLikes(post.getLikeCount()) .postTime(post.getCreatedAt()) diff --git a/src/main/java/org/wooriverygood/api/post/dto/PostResponse.java b/src/main/java/org/wooriverygood/api/post/dto/PostResponse.java index a05a03f..7b4c21d 100644 --- a/src/main/java/org/wooriverygood/api/post/dto/PostResponse.java +++ b/src/main/java/org/wooriverygood/api/post/dto/PostResponse.java @@ -32,9 +32,13 @@ public class PostResponse { private final int viewCount; + private final boolean isMine; + + private final long memberId; + @Builder - public PostResponse(Long postId, String postTitle, String postCategory, int postComments, int postLikes, LocalDateTime postTime, boolean liked, boolean updated, boolean reported, int viewCount) { + public PostResponse(Long postId, String postTitle, String postCategory, int postComments, int postLikes, LocalDateTime postTime, boolean liked, boolean updated, boolean reported, int viewCount, boolean isMine, long memberId) { this.postId = postId; this.postTitle = postTitle; this.postCategory = postCategory; @@ -45,9 +49,11 @@ public PostResponse(Long postId, String postTitle, String postCategory, int post this.updated = updated; this.reported = reported; this.viewCount = viewCount; + this.isMine = isMine; + this.memberId = memberId; } - public static PostResponse of(Post post, boolean liked) { + public static PostResponse of(Post post, boolean liked, boolean isMine) { return PostResponse.builder() .postId(post.getId()) .postTitle(post.getTitle()) @@ -59,6 +65,8 @@ public static PostResponse of(Post post, boolean liked) { .updated(post.isUpdated()) .reported(post.isReportedTooMuch()) .viewCount(post.getViewCount()) + .memberId(post.getMember().getId()) + .isMine(isMine) .build(); } diff --git a/src/main/java/org/wooriverygood/api/post/repository/PostLikeRepository.java b/src/main/java/org/wooriverygood/api/post/repository/PostLikeRepository.java index b8f9a0a..f1ff129 100644 --- a/src/main/java/org/wooriverygood/api/post/repository/PostLikeRepository.java +++ b/src/main/java/org/wooriverygood/api/post/repository/PostLikeRepository.java @@ -1,6 +1,7 @@ package org.wooriverygood.api.post.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostLike; @@ -8,9 +9,9 @@ public interface PostLikeRepository extends JpaRepository { - Optional findByPostAndUsername(Post post, String username); + Optional findByPostAndMember(Post post, Member member); - boolean existsByPostAndUsername(Post post, String username); + boolean existsByPostAndMember(Post post, Member member); void deleteAllByPost(Post post); } diff --git a/src/main/java/org/wooriverygood/api/post/repository/PostRepository.java b/src/main/java/org/wooriverygood/api/post/repository/PostRepository.java index 9b0282d..12aa857 100644 --- a/src/main/java/org/wooriverygood/api/post/repository/PostRepository.java +++ b/src/main/java/org/wooriverygood/api/post/repository/PostRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostCategory; @@ -16,7 +17,7 @@ public interface PostRepository extends JpaRepository { Page findAllByCategoryOrderByIdDesc(PostCategory category, Pageable pageable); - Page findByAuthorOrderByIdDesc(String author, Pageable pageable); + Page findByMemberOrderByIdDesc(Member member, Pageable pageable); @Transactional @Modifying(clearAutomatically = true) diff --git a/src/main/java/org/wooriverygood/api/report/application/CommentReportService.java b/src/main/java/org/wooriverygood/api/report/application/CommentReportService.java index 9b2f2bf..0984bcb 100644 --- a/src/main/java/org/wooriverygood/api/report/application/CommentReportService.java +++ b/src/main/java/org/wooriverygood/api/report/application/CommentReportService.java @@ -4,6 +4,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.wooriverygood.api.comment.exception.CommentNotFoundException; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.report.exception.DuplicatedCommentReportException; import org.wooriverygood.api.comment.domain.Comment; import org.wooriverygood.api.comment.repository.CommentRepository; @@ -21,26 +24,30 @@ public class CommentReportService { private final CommentReportRepository commentReportRepository; + private final MemberRepository memberRepository; + public void reportComment(Long commentId, ReportRequest request, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Comment comment = commentRepository.findById(commentId) .orElseThrow(CommentNotFoundException::new); CommentReport report = CommentReport.builder() .comment(comment) .message(request.getMessage()) - .username(authInfo.getUsername()) + .member(member) .build(); - checkIfAlreadyReport(comment, authInfo); + checkIfAlreadyReport(comment, member); comment.addReport(report); commentRepository.increaseReportCount(commentId); commentReportRepository.save(report); } - private void checkIfAlreadyReport(Comment comment, AuthInfo authInfo) { - if (comment.hasReportByUser(authInfo.getUsername())) + private void checkIfAlreadyReport(Comment comment, Member member) { + if (comment.hasReportByMember(member)) throw new DuplicatedCommentReportException(); } } diff --git a/src/main/java/org/wooriverygood/api/report/application/PostReportService.java b/src/main/java/org/wooriverygood/api/report/application/PostReportService.java index 082672a..20d64bf 100644 --- a/src/main/java/org/wooriverygood/api/report/application/PostReportService.java +++ b/src/main/java/org/wooriverygood/api/report/application/PostReportService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.report.exception.DuplicatedPostReportException; import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.post.domain.Post; @@ -21,26 +24,30 @@ public class PostReportService { private final PostReportRepository postReportRepository; + private final MemberRepository memberRepository; + public void reportPost(Long postId, ReportRequest request, AuthInfo authInfo) { + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); Post post = postRepository.findById(postId) .orElseThrow(PostNotFoundException::new); PostReport report = PostReport.builder() .post(post) .message(request.getMessage()) - .username(authInfo.getUsername()) + .member(member) .build(); - checkIfAlreadyReport(post, authInfo); + checkIfAlreadyReport(post, member); post.addReport(report); postRepository.increaseReportCount(postId); postReportRepository.save(report); } - private void checkIfAlreadyReport(Post post, AuthInfo authInfo) { - if (post.hasReportByUser(authInfo.getUsername())) + private void checkIfAlreadyReport(Post post, Member member) { + if (post.hasReportByMember(member)) throw new DuplicatedPostReportException(); } diff --git a/src/main/java/org/wooriverygood/api/report/domain/CommentReport.java b/src/main/java/org/wooriverygood/api/report/domain/CommentReport.java index 336b0a6..917a59f 100644 --- a/src/main/java/org/wooriverygood/api/report/domain/CommentReport.java +++ b/src/main/java/org/wooriverygood/api/report/domain/CommentReport.java @@ -1,14 +1,17 @@ package org.wooriverygood.api.report.domain; import jakarta.persistence.*; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.wooriverygood.api.comment.domain.Comment; +import org.wooriverygood.api.member.domain.Member; @Entity @Getter -@NoArgsConstructor +@Table(name = "comment_reports") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class CommentReport { @Id @@ -19,21 +22,21 @@ public class CommentReport { @JoinColumn(name = "comment_id", referencedColumnName = "comment_id") private Comment comment; - @Column - private String username; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; private String message; @Builder - public CommentReport(Long id, Comment comment, String username, String message) { + public CommentReport(Long id, Comment comment, Member member, String message) { this.id = id; this.comment = comment; - this.username = username; + this.member = member; this.message = message; } - public boolean isOwner(String username) { - return this.username.equals(username); + public boolean isOwner(Member member) { + return this.member.equals(member); } } diff --git a/src/main/java/org/wooriverygood/api/report/domain/PostReport.java b/src/main/java/org/wooriverygood/api/report/domain/PostReport.java index 352684a..e34ae25 100644 --- a/src/main/java/org/wooriverygood/api/report/domain/PostReport.java +++ b/src/main/java/org/wooriverygood/api/report/domain/PostReport.java @@ -5,10 +5,12 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.post.domain.Post; @Entity @Getter +@Table(name = "post_reports") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PostReport { @@ -20,22 +22,22 @@ public class PostReport { @JoinColumn(name = "post_id", referencedColumnName = "post_id") private Post post; - @Column - private String username; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; private String message; @Builder - public PostReport(Long id, Post post, String username, String message) { + public PostReport(Long id, Post post, Member member, String message) { this.id = id; this.post = post; - this.username = username; + this.member = member; this.message = message; } - public boolean isOwner(String username) { - return this.username.equals(username); + public boolean isOwner(Member member) { + return this.member.equals(member); } } diff --git a/src/main/java/org/wooriverygood/api/review/application/ReviewCreateService.java b/src/main/java/org/wooriverygood/api/review/application/ReviewCreateService.java index 2804038..b059183 100644 --- a/src/main/java/org/wooriverygood/api/review/application/ReviewCreateService.java +++ b/src/main/java/org/wooriverygood/api/review/application/ReviewCreateService.java @@ -7,6 +7,9 @@ import org.wooriverygood.api.course.domain.Course; import org.wooriverygood.api.course.repository.CourseRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.dto.NewReviewRequest; import org.wooriverygood.api.review.repository.ReviewRepository; @@ -19,26 +22,31 @@ public class ReviewCreateService { private final ReviewRepository reviewRepository; + private final MemberRepository memberRepository; + @Transactional public void addReview(AuthInfo authInfo, Long courseId, NewReviewRequest request) { Course course = courseRepository.findById(courseId) .orElseThrow(CourseNotFoundException::new); - Review review = createReview(course, authInfo, request); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + Review review = createReview(course, request, member); + member.addReview(review); reviewRepository.save(review); courseRepository.increaseReviewCount(review.getCourse().getId()); } - private Review createReview(Course course, AuthInfo authInfo, NewReviewRequest request) { + private Review createReview(Course course, NewReviewRequest request, Member member) { return Review.builder() .reviewTitle(request.getReviewTitle()) .course(course) .instructorName(request.getInstructorName()) + .member(member) .takenSemyr(request.getTakenSemyr()) .reviewContent(request.getReviewContent()) .grade(request.getGrade()) - .authorEmail(authInfo.getUsername()) .build(); } diff --git a/src/main/java/org/wooriverygood/api/review/application/ReviewDeleteService.java b/src/main/java/org/wooriverygood/api/review/application/ReviewDeleteService.java index 19e5c19..8e1f122 100644 --- a/src/main/java/org/wooriverygood/api/review/application/ReviewDeleteService.java +++ b/src/main/java/org/wooriverygood/api/review/application/ReviewDeleteService.java @@ -5,6 +5,9 @@ import org.springframework.transaction.annotation.Transactional; import org.wooriverygood.api.course.repository.CourseRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.exception.ReviewNotFoundException; import org.wooriverygood.api.review.repository.ReviewLikeRepository; @@ -20,12 +23,16 @@ public class ReviewDeleteService { private final ReviewLikeRepository reviewLikeRepository; + private final MemberRepository memberRepository; + @Transactional public void deleteReview(Long reviewId, AuthInfo authInfo) { Review review = reviewRepository.findById(reviewId) .orElseThrow(ReviewNotFoundException::new); - review.validateAuthor(authInfo.getUsername()); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + review.validateAuthor(member); reviewLikeRepository.deleteAllByReview(review); reviewRepository.delete(review); diff --git a/src/main/java/org/wooriverygood/api/review/application/ReviewFindService.java b/src/main/java/org/wooriverygood/api/review/application/ReviewFindService.java index d6cd6cb..3e51951 100644 --- a/src/main/java/org/wooriverygood/api/review/application/ReviewFindService.java +++ b/src/main/java/org/wooriverygood/api/review/application/ReviewFindService.java @@ -4,6 +4,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.dto.ReviewResponse; import org.wooriverygood.api.review.dto.ReviewsResponse; @@ -13,33 +16,39 @@ import java.util.List; @Service -@Transactional(readOnly = true) @RequiredArgsConstructor +@Transactional(readOnly = true) public class ReviewFindService { private final ReviewRepository reviewRepository; private final ReviewLikeRepository reviewLikeRepository; + private final MemberRepository memberRepository; + public ReviewsResponse findAllReviewsByCourseId(Long courseId, AuthInfo authInfo) { List reviews = reviewRepository.findAllByCourseId(courseId); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); return new ReviewsResponse(reviews.stream() .map(review -> { - boolean liked = reviewLikeRepository.existsByReviewAndUsername(review, authInfo.getUsername()); + boolean liked = reviewLikeRepository.existsByReviewAndMember(review, member); return ReviewResponse.of(review, - review.isSameAuthor(authInfo.getUsername()), + review.isSameAuthor(member), liked); }) .toList()); } public ReviewsResponse findMyReviews(AuthInfo authInfo) { - List reviews= reviewRepository.findByAuthorEmail(authInfo.getUsername()); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + List reviews= member.getReviews(); return new ReviewsResponse(reviews.stream() .map(review -> { - boolean liked = reviewLikeRepository.existsByReviewAndUsername(review, authInfo.getUsername()); + boolean liked = reviewLikeRepository.existsByReviewAndMember(review, member); return ReviewResponse.of(review, true, liked); }) .toList()); diff --git a/src/main/java/org/wooriverygood/api/review/application/ReviewLikeToggleService.java b/src/main/java/org/wooriverygood/api/review/application/ReviewLikeToggleService.java index 9128231..44925c0 100644 --- a/src/main/java/org/wooriverygood/api/review/application/ReviewLikeToggleService.java +++ b/src/main/java/org/wooriverygood/api/review/application/ReviewLikeToggleService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.exception.ReviewNotFoundException; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.domain.ReviewLike; @@ -22,15 +25,19 @@ public class ReviewLikeToggleService { private final ReviewLikeRepository reviewLikeRepository; + private final MemberRepository memberRepository; + public ReviewLikeResponse toggleReviewLike(Long reviewId, AuthInfo authInfo) { Review review = reviewRepository.findById(reviewId) .orElseThrow(ReviewNotFoundException::new); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); - Optional reviewLike = reviewLikeRepository.findByReviewAndUsername(review, authInfo.getUsername()); + Optional reviewLike = reviewLikeRepository.findByReviewAndMember(review, member); if (reviewLike.isEmpty()) { - addReviewLike(review, authInfo.getUsername()); + addReviewLike(review, member); return createReviewLikeResponse(review, true); } @@ -39,10 +46,10 @@ public ReviewLikeResponse toggleReviewLike(Long reviewId, AuthInfo authInfo) { } - private void addReviewLike(Review review, String username) { + private void addReviewLike(Review review, Member member) { ReviewLike reviewLike = ReviewLike.builder() .review(review) - .username(username) + .member(member) .build(); review.addReviewLike(reviewLike); diff --git a/src/main/java/org/wooriverygood/api/review/application/ReviewUpdateService.java b/src/main/java/org/wooriverygood/api/review/application/ReviewUpdateService.java index 2234fc9..d838810 100644 --- a/src/main/java/org/wooriverygood/api/review/application/ReviewUpdateService.java +++ b/src/main/java/org/wooriverygood/api/review/application/ReviewUpdateService.java @@ -4,6 +4,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.dto.ReviewUpdateRequest; import org.wooriverygood.api.review.exception.ReviewNotFoundException; @@ -15,19 +18,22 @@ public class ReviewUpdateService { private final ReviewRepository reviewRepository; + private final MemberRepository memberRepository; + @Transactional public void updateReview(Long reviewId, ReviewUpdateRequest request, AuthInfo authInfo) { Review review = reviewRepository.findById(reviewId) .orElseThrow(ReviewNotFoundException::new); - review.validateAuthor(authInfo.getUsername()); + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + review.validateAuthor(member); review.updateTitle(request.getReviewTitle()); review.updateInstructorName(request.getInstructorName()); review.updateTakenSemyr(request.getTakenSemyr()); review.updateContent(request.getReviewContent()); review.updateGrade(request.getGrade()); - review.updateAuthor(authInfo.getUsername()); } } diff --git a/src/main/java/org/wooriverygood/api/review/application/ReviewValidateAccessService.java b/src/main/java/org/wooriverygood/api/review/application/ReviewValidateAccessService.java index d6b2002..625f790 100644 --- a/src/main/java/org/wooriverygood/api/review/application/ReviewValidateAccessService.java +++ b/src/main/java/org/wooriverygood/api/review/application/ReviewValidateAccessService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.exception.MemberNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.exception.ReviewAccessDeniedException; import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.review.domain.Review; @@ -18,8 +21,13 @@ public class ReviewValidateAccessService { private final ReviewRepository reviewRepository; + private final MemberRepository memberRepository; + + public void validateReviewAccess(AuthInfo authInfo) { - Review review = reviewRepository.findTopByAuthorEmailOrderByCreatedAtDesc(authInfo.getUsername()) + Member member = memberRepository.findById(authInfo.getMemberId()) + .orElseThrow(MemberNotFoundException::new); + Review review = reviewRepository.findTopByMemberOrderByCreatedAtDesc(member) .orElseThrow(ReviewAccessDeniedException::new); LocalDateTime now = LocalDateTime.now(); diff --git a/src/main/java/org/wooriverygood/api/review/domain/Review.java b/src/main/java/org/wooriverygood/api/review/domain/Review.java index 787f5f8..2e339a0 100644 --- a/src/main/java/org/wooriverygood/api/review/domain/Review.java +++ b/src/main/java/org/wooriverygood/api/review/domain/Review.java @@ -1,6 +1,7 @@ package org.wooriverygood.api.review.domain; import jakarta.persistence.*; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,15 +10,16 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.wooriverygood.api.global.error.exception.AuthorizationException; import org.wooriverygood.api.course.domain.Course; +import org.wooriverygood.api.member.domain.Member; import java.time.LocalDateTime; import java.util.List; @Entity @Getter -@NoArgsConstructor -@EntityListeners(AuditingEntityListener.class) @Table(name = "reviews") +@EntityListeners(AuditingEntityListener.class) +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Review { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -43,8 +45,8 @@ public class Review { @Column(name = "grade", length = 45, nullable = false) private String grade; - @Column(name = "author_email", length = 300) - private String authorEmail; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; @Column(name = "like_count") @ColumnDefault("0") @@ -61,7 +63,9 @@ public class Review { private boolean updated; @Builder - public Review(Long id, Course course, String reviewContent, String reviewTitle, String instructorName, String takenSemyr, String grade, String authorEmail, LocalDateTime createdAt, List reviewLikes, boolean updated) { + public Review(Long id, Course course, String reviewContent, String reviewTitle, String instructorName, + String takenSemyr, String grade, LocalDateTime createdAt, Member member, + List reviewLikes, boolean updated) { this.id = id; this.course = course; this.reviewContent = reviewContent; @@ -69,20 +73,18 @@ public Review(Long id, Course course, String reviewContent, String reviewTitle, this.instructorName = instructorName; this.takenSemyr = takenSemyr; this.grade = grade; - this.authorEmail = authorEmail; this.createdAt = createdAt; this.reviewLikes = reviewLikes; this.updated = updated; + this.member = member; } - public boolean isSameAuthor(String author) { - return this.authorEmail.equals(author); + public boolean isSameAuthor(Member member) { + return this.member.isSame(member); } - public void validateAuthor(String author) { - if (!this.authorEmail.equals(author)) { - throw new AuthorizationException(); - } + public void validateAuthor(Member member) { + this.member.verify(member); } public void addReviewLike(ReviewLike reviewLike) { @@ -119,9 +121,4 @@ public void updateGrade(String grade) { updated = true; } - public void updateAuthor(String author) { - authorEmail = author; - updated = true; - } - } diff --git a/src/main/java/org/wooriverygood/api/review/domain/ReviewLike.java b/src/main/java/org/wooriverygood/api/review/domain/ReviewLike.java index 96e0960..bbf5398 100644 --- a/src/main/java/org/wooriverygood/api/review/domain/ReviewLike.java +++ b/src/main/java/org/wooriverygood/api/review/domain/ReviewLike.java @@ -1,30 +1,34 @@ package org.wooriverygood.api.review.domain; import jakarta.persistence.*; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.wooriverygood.api.member.domain.Member; @Entity -@Table(name = "reviewLikes") @Getter -@NoArgsConstructor +@Table(name = "review_likes") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class ReviewLike { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "review_id", referencedColumnName = "review_id") private Review review; - @Column - private String username; + @ManyToOne(fetch = FetchType.LAZY) + private Member member; + + @Builder - public ReviewLike(Long id, Review review, String username) { + public ReviewLike(Long id, Review review, Member member) { this.id = id; this.review = review; - this.username = username; + this.member = member; } public void delete() { review = null; } diff --git a/src/main/java/org/wooriverygood/api/review/repository/ReviewLikeRepository.java b/src/main/java/org/wooriverygood/api/review/repository/ReviewLikeRepository.java index da7077e..f9f5817 100644 --- a/src/main/java/org/wooriverygood/api/review/repository/ReviewLikeRepository.java +++ b/src/main/java/org/wooriverygood/api/review/repository/ReviewLikeRepository.java @@ -1,6 +1,7 @@ package org.wooriverygood.api.review.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.domain.ReviewLike; @@ -8,7 +9,7 @@ import java.util.Optional; public interface ReviewLikeRepository extends JpaRepository { - Optional findByReviewAndUsername(Review review, String username); - boolean existsByReviewAndUsername(Review review, String username); + Optional findByReviewAndMember(Review review, Member member); + boolean existsByReviewAndMember(Review review, Member member); void deleteAllByReview(Review review); } diff --git a/src/main/java/org/wooriverygood/api/review/repository/ReviewRepository.java b/src/main/java/org/wooriverygood/api/review/repository/ReviewRepository.java index ef21a4e..b2957a1 100644 --- a/src/main/java/org/wooriverygood/api/review/repository/ReviewRepository.java +++ b/src/main/java/org/wooriverygood/api/review/repository/ReviewRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.transaction.annotation.Transactional; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.review.domain.Review; import java.util.List; @@ -13,9 +14,7 @@ public interface ReviewRepository extends JpaRepository { List findAllByCourseId(Long courseId); - List findByAuthorEmail(String author); - - Optional findTopByAuthorEmailOrderByCreatedAtDesc(String author); + Optional findTopByMemberOrderByCreatedAtDesc(Member member); void deleteAllInBatch(); diff --git a/src/test/java/org/wooriverygood/api/comment/api/CommentApiTest.java b/src/test/java/org/wooriverygood/api/comment/api/CommentApiTest.java index afe7b04..b364b5b 100644 --- a/src/test/java/org/wooriverygood/api/comment/api/CommentApiTest.java +++ b/src/test/java/org/wooriverygood/api/comment/api/CommentApiTest.java @@ -8,6 +8,7 @@ import org.wooriverygood.api.global.error.exception.AuthorizationException; import org.wooriverygood.api.comment.exception.ReplyDepthException; import org.wooriverygood.api.comment.dto.*; +import org.wooriverygood.api.member.domain.Member; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.global.auth.AuthInfo; @@ -21,7 +22,6 @@ import static org.mockito.Mockito.*; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; - class CommentApiTest extends ApiTest { private List responses = new ArrayList<>(); @@ -31,7 +31,7 @@ class CommentApiTest extends ApiTest { .category(PostCategory.OFFER) .title("title6") .content("content6") - .author("user-3333") + .member(new Member(1L, "username")) .comments(new ArrayList<>()) .postLikes(new ArrayList<>()) .build(); @@ -42,7 +42,6 @@ void setUp() { responses.add(CommentResponse.builder() .commentId(i) .commentContent("content" + i) - .commentAuthor("user-"+(i % 5)) .postId(post.getId()) .commentLikeCount((int) i + 8) .commentTime(LocalDateTime.now()) @@ -50,6 +49,8 @@ void setUp() { .replies(new ArrayList<>()) .updated(i % 2 == 0) .reported(false) + .memberId(1L) + .isMine(true) .build()); } for (int i = 12; i <= 15; i++) { @@ -57,7 +58,8 @@ void setUp() { .add(ReplyResponse.builder() .replyId((long) i) .replyContent("reply content " + i) - .replyAuthor("user-" + (i % 2)) + .memberId(1L) + .isMine(true) .replyLikeCount(i - 6) .replyTime(LocalDateTime.now()) .liked(false) diff --git a/src/test/java/org/wooriverygood/api/comment/application/CommentCreateServiceTest.java b/src/test/java/org/wooriverygood/api/comment/application/CommentCreateServiceTest.java index d622f25..8826a3b 100644 --- a/src/test/java/org/wooriverygood/api/comment/application/CommentCreateServiceTest.java +++ b/src/test/java/org/wooriverygood/api/comment/application/CommentCreateServiceTest.java @@ -1,6 +1,5 @@ package org.wooriverygood.api.comment.application; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -10,22 +9,20 @@ import org.wooriverygood.api.comment.dto.NewCommentRequest; import org.wooriverygood.api.comment.dto.NewReplyRequest; import org.wooriverygood.api.comment.repository.CommentRepository; -import org.wooriverygood.api.post.domain.Post; -import org.wooriverygood.api.post.domain.PostCategory; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.repository.PostRepository; -import org.wooriverygood.api.util.MockTest; -import java.util.ArrayList; import java.util.Optional; 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 org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class CommentCreateServiceTest extends MockTest { +class CommentCreateServiceTest extends CommentServiceTest { @InjectMocks private CommentCreateService commentCreateService; @@ -36,48 +33,22 @@ class CommentCreateServiceTest extends MockTest { @Mock private CommentRepository commentRepository; - private Post post = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author("author6") - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); - - private Comment comment; - - private Comment reply; + @Mock + private MemberRepository memberRepository; - @BeforeEach - void setUp() { - comment = Comment.builder() - .post(post) - .build(); - reply = Comment.builder() - .parent(comment) - .build(); - } - @Test @DisplayName("특정 게시글의 댓글을 작성한다.") void addComment() { - NewCommentRequest newCommentRequest = NewCommentRequest.builder() + NewCommentRequest request = NewCommentRequest.builder() .content("comment content") .build(); - - when(commentRepository.save(any(Comment.class))) - .thenReturn(Comment.builder() - .author(authInfo.getUsername()) - .content(newCommentRequest.getContent()) - .build()); - + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(post)); - commentCreateService.addComment(authInfo, 1L, newCommentRequest); + commentCreateService.addComment(authInfo, post.getId(), request); verify(commentRepository).save(any(Comment.class)); } @@ -88,15 +59,18 @@ void addReply() { NewReplyRequest request = NewReplyRequest.builder() .content("reply content") .build(); - when(commentRepository.findById(anyLong())) - .thenReturn(Optional.ofNullable(comment)); + .thenReturn(Optional.ofNullable(commentWithoutReply)); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); - commentCreateService.addReply(1L, request, authInfo); - Comment reply = comment.getChildren().get(0); + commentCreateService.addReply(commentWithoutReply.getId(), request, authInfo); - assertThat(reply.getContent()).isEqualTo(request.getContent()); - assertThat(reply.getParent()).isEqualTo(comment); + assertAll( + () -> assertThat(commentWithoutReply.getReplies().size()).isEqualTo(1), + () -> assertThat(commentWithoutReply.getReplies().get(0).getContent()).isEqualTo(request.getContent()), + () -> assertThat(commentWithoutReply.getReplies().get(0).getParent()).isEqualTo(commentWithoutReply) + ); } @Test @@ -105,11 +79,10 @@ void addReply_exception_depth() { NewReplyRequest request = NewReplyRequest.builder() .content("reply content") .build(); - when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(reply)); - assertThatThrownBy(() -> commentCreateService.addReply(1L, request, authInfo)) + assertThatThrownBy(() -> commentCreateService.addReply(reply.getId(), request, authInfo)) .isInstanceOf(ReplyDepthException.class); } diff --git a/src/test/java/org/wooriverygood/api/comment/application/CommentDeleteServiceTest.java b/src/test/java/org/wooriverygood/api/comment/application/CommentDeleteServiceTest.java index 1e02536..e7075a1 100644 --- a/src/test/java/org/wooriverygood/api/comment/application/CommentDeleteServiceTest.java +++ b/src/test/java/org/wooriverygood/api/comment/application/CommentDeleteServiceTest.java @@ -4,20 +4,21 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.wooriverygood.api.comment.domain.Comment; import org.wooriverygood.api.comment.repository.CommentLikeRepository; import org.wooriverygood.api.comment.repository.CommentRepository; import org.wooriverygood.api.global.error.exception.AuthorizationException; -import org.wooriverygood.api.util.MockTest; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import java.util.Optional; +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 org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; -class CommentDeleteServiceTest extends MockTest { +class CommentDeleteServiceTest extends CommentServiceTest { @InjectMocks private CommentDeleteService commentDeleteService; @@ -29,54 +30,49 @@ class CommentDeleteServiceTest extends MockTest { private CommentLikeRepository commentLikeRepository; @Mock - private Comment comment; - - @Mock - private Comment reply; + private MemberRepository memberRepository; @Test @DisplayName("권한이 있는 댓글을 삭제한다.") void deleteComment() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); - when(comment.isParent()) - .thenReturn(true); - when(comment.hasNoReply()) - .thenReturn(true); + comment.deleteReply(reply); commentDeleteService.deleteComment(comment.getId(), authInfo); - verify(comment).validateAuthor(authInfo.getUsername()); - verify(commentLikeRepository).deleteAllByComment(comment); - verify(commentRepository).delete(comment); + assertAll( + () -> verify(commentLikeRepository).deleteAllByComment(comment), + () -> verify(commentRepository).delete(comment) + ); } @Test @DisplayName("권한이 있는 대댓글을 삭제한다.") void deleteReply() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(reply)); - when(reply.isParent()) - .thenReturn(false); - when(reply.getParent()) - .thenReturn(comment); + commentDeleteService.deleteComment(reply.getId(), authInfo); - verify(reply).validateAuthor(authInfo.getUsername()); - verify(commentLikeRepository).deleteAllByComment(reply); - verify(comment).deleteChild(reply); - verify(commentRepository).delete(reply); + assertAll( + () -> verify(commentLikeRepository).deleteAllByComment(reply), + () -> verify(commentRepository).delete(reply) + ); } @Test @DisplayName("권한이 없는 대댓글을 삭제할 수 없다.") void deleteReply_exception_noAuth() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.of(new Member(5L, "username"))); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(reply)); - doThrow(new AuthorizationException()) - .when(reply) - .validateAuthor(anyString()); assertThatThrownBy(() -> commentDeleteService.deleteComment(reply.getId(), authInfo)) .isInstanceOf(AuthorizationException.class); @@ -85,45 +81,43 @@ void deleteReply_exception_noAuth() { @Test @DisplayName("부모 댓글을 삭제해도 대댓글은 남아있다.") void deleteComment_keepChildren() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); - when(comment.isParent()) - .thenReturn(true); - when(comment.hasNoReply()) - .thenReturn(false); commentDeleteService.deleteComment(comment.getId(), authInfo); - verify(comment).willBeDeleted(); + assertAll( + () -> assertThat(comment.isSoftRemoved()).isEqualTo(true), + () -> assertThat(comment.canDelete()).isEqualTo(false) + ); } @Test @DisplayName("특정 대댓글 삭제 후, 삭제 예정으로 처리되고 대댓글이 없는 부모 댓글을 삭제한다.") void deletePrentAndReply() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(reply)); - when(reply.isParent()) - .thenReturn(false); - when(reply.getParent()) - .thenReturn(comment); - when(comment.canDelete()) - .thenReturn(true); + comment.willBeDeleted(); commentDeleteService.deleteComment(reply.getId(), authInfo); - verify(comment).deleteChild(reply); - verify(commentRepository).delete(reply); - verify(commentRepository).delete(comment); + assertAll( + () -> verify(commentRepository).delete(reply), + () -> verify(commentRepository).delete(comment) + ); } @Test @DisplayName("권한이 없는 댓글은 삭제할 수 없다") void deleteComment_exception_noAuth() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.of(new Member(5L, "username"))); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); - doThrow(new AuthorizationException()) - .when(comment) - .validateAuthor(anyString()); assertThatThrownBy(() -> commentDeleteService.deleteComment(comment.getId(), authInfo)) .isInstanceOf(AuthorizationException.class); diff --git a/src/test/java/org/wooriverygood/api/comment/application/CommentFindServiceTest.java b/src/test/java/org/wooriverygood/api/comment/application/CommentFindServiceTest.java index 762f447..2fe1f11 100644 --- a/src/test/java/org/wooriverygood/api/comment/application/CommentFindServiceTest.java +++ b/src/test/java/org/wooriverygood/api/comment/application/CommentFindServiceTest.java @@ -9,18 +9,18 @@ import org.wooriverygood.api.comment.dto.CommentsResponse; import org.wooriverygood.api.comment.repository.CommentLikeRepository; import org.wooriverygood.api.comment.repository.CommentRepository; -import org.wooriverygood.api.post.domain.Post; -import org.wooriverygood.api.post.domain.PostCategory; -import org.wooriverygood.api.util.MockTest; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; -class CommentFindServiceTest extends MockTest { +class CommentFindServiceTest extends CommentServiceTest { @InjectMocks private CommentFindService commentFindService; @@ -31,28 +31,22 @@ class CommentFindServiceTest extends MockTest { @Mock private CommentLikeRepository commentLikeRepository; + @Mock + private MemberRepository memberRepository; + private final int COMMENT_COUNT = 10; private List comments = new ArrayList<>(); - private Post post = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author("author6") - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); @BeforeEach void setUp() { - for (int i = 0; i < COMMENT_COUNT; i++) { + for (long i = 0; i < COMMENT_COUNT; i++) { Comment comment = Comment.builder() - .id((long) i) + .id(i) .content("comment" + i) - .author("author" + i) .post(post) + .member(member) .build(); comments.add(comment); } @@ -61,9 +55,11 @@ void setUp() { @Test @DisplayName("유효한 id를 통해 특정 게시글의 댓글들을 불러온다.") void findAllCommentsByPostId() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findAllByPostId(anyLong())) .thenReturn(comments); - when(commentLikeRepository.existsByCommentAndUsername(any(Comment.class), anyString())) + when(commentLikeRepository.existsByCommentAndMember(any(Comment.class), any(Member.class))) .thenReturn(true); CommentsResponse response = commentFindService.findAllCommentsByPostId(2L, authInfo); @@ -78,10 +74,12 @@ void findAllCommentsByPostId_softRemoved() { comments.add(Comment.builder() .id(1L) .content("Content") - .author("Author") .post(post) + .member(member) .softRemoved(true) .build()); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findAllByPostId(anyLong())) .thenReturn(comments); @@ -93,20 +91,10 @@ void findAllCommentsByPostId_softRemoved() { @Test @DisplayName("대댓글만 불러올 수 없다.") void findAllCommentsByPostId_cannot_only_reply() { - Comment comment = Comment.builder() - .id(1L) - .content("Parent") - .author("author1") - .post(post) - .build(); comments = new ArrayList<>(); - comments.add(Comment.builder() - .id(2L) - .content("Child") - .author("Author2") - .post(post) - .parent(comment) - .build()); + comments.add(reply); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findAllByPostId(anyLong())) .thenReturn(comments); @@ -119,22 +107,10 @@ void findAllCommentsByPostId_cannot_only_reply() { @DisplayName("댓글과 대댓글들을 모두 불러온다.") void findAllCommentsByPostId_withReplies() { comments = new ArrayList<>(); - Comment comment = Comment.builder() - .id(1L) - .content("Parent") - .author("author1") - .post(post) - .build(); comments.add(comment); - Comment reply = Comment.builder() - .id(2L) - .content("Child") - .author("Author2") - .post(post) - .parent(comment) - .build(); comments.add(reply); - comment.addChildren(reply); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findAllByPostId(anyLong())) .thenReturn(comments); diff --git a/src/test/java/org/wooriverygood/api/comment/application/CommentLikeToggleServiceTest.java b/src/test/java/org/wooriverygood/api/comment/application/CommentLikeToggleServiceTest.java index d20e806..da1da3f 100644 --- a/src/test/java/org/wooriverygood/api/comment/application/CommentLikeToggleServiceTest.java +++ b/src/test/java/org/wooriverygood/api/comment/application/CommentLikeToggleServiceTest.java @@ -1,7 +1,5 @@ package org.wooriverygood.api.comment.application; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -11,18 +9,17 @@ import org.wooriverygood.api.comment.dto.*; import org.wooriverygood.api.comment.repository.CommentLikeRepository; import org.wooriverygood.api.comment.repository.CommentRepository; -import org.wooriverygood.api.post.domain.Post; -import org.wooriverygood.api.post.domain.PostCategory; -import org.wooriverygood.api.util.MockTest; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; -import java.util.ArrayList; -import java.util.List; import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; -class CommentLikeToggleServiceTest extends MockTest { +class CommentLikeToggleServiceTest extends CommentServiceTest { @InjectMocks private CommentLikeToggleService commentLikeToggleService; @@ -33,82 +30,49 @@ class CommentLikeToggleServiceTest extends MockTest { @Mock private CommentLikeRepository commentLikeRepository; - private final int COMMENT_COUNT = 10; - - List comments = new ArrayList<>(); - - private Post post = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author("author6") - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); - - private Comment comment = Comment.builder() - .id(2L) - .post(post) - .content("comment content") - .author(authInfo.getUsername()) - .commentLikes(new ArrayList<>()) - .build(); - - private Comment reply = Comment.builder() - .id(3L) - .post(post) - .content("reply content") - .author(authInfo.getUsername()) - .commentLikes(new ArrayList<>()) - .parent(comment) - .build(); - - - @BeforeEach - void setUpPosts() { - comment.getChildren().add(reply); - - for (int i = 0; i < COMMENT_COUNT; i++) { - Comment comment = Comment.builder() - .id((long) i) - .content("comment" + i) - .author("author" + i) - .post(post) - .build(); - comments.add(comment); - } - } + @Mock + private MemberRepository memberRepository; + @Test @DisplayName("특정 댓글의 좋아요를 1 올린다.") void likeComment_up() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); + when(commentLikeRepository.findByCommentAndMember(any(Comment.class), any(Member.class))) + .thenReturn(Optional.empty()); CommentLikeResponse response = commentLikeToggleService.likeComment(comment.getId(), authInfo); - Assertions.assertThat(response.getLikeCount()).isEqualTo(comment.getLikeCount() + 1); - Assertions.assertThat(response.isLiked()).isEqualTo(true); + assertAll( + () -> assertThat(response.getLikeCount()).isEqualTo(comment.getLikeCount() + 1), + () -> assertThat(response.isLiked()).isEqualTo(true) + ); } @Test @DisplayName("특정 댓글의 좋아요를 1 내린다.") void likeComment_down() { CommentLike commentLike = CommentLike.builder() - .id(2L) + .id(1L) .comment(comment) - .username(authInfo.getUsername()) + .member(member) .build(); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); - when(commentLikeRepository.findByCommentAndUsername(any(Comment.class), anyString())) + when(commentLikeRepository.findByCommentAndMember(any(Comment.class), any(Member.class))) .thenReturn(Optional.ofNullable(commentLike)); CommentLikeResponse response = commentLikeToggleService.likeComment(comment.getId(), authInfo); - Assertions.assertThat(response.getLikeCount()).isEqualTo(comment.getLikeCount() - 1); - Assertions.assertThat(response.isLiked()).isEqualTo(false); + assertAll( + () -> assertThat(response.getLikeCount()).isEqualTo(comment.getLikeCount() - 1), + () -> assertThat(response.isLiked()).isEqualTo(false) + ); } } \ No newline at end of file diff --git a/src/test/java/org/wooriverygood/api/comment/application/CommentServiceTest.java b/src/test/java/org/wooriverygood/api/comment/application/CommentServiceTest.java new file mode 100644 index 0000000..b436d21 --- /dev/null +++ b/src/test/java/org/wooriverygood/api/comment/application/CommentServiceTest.java @@ -0,0 +1,57 @@ +package org.wooriverygood.api.comment.application; + +import org.junit.jupiter.api.BeforeEach; +import org.wooriverygood.api.comment.domain.Comment; +import org.wooriverygood.api.post.domain.Post; +import org.wooriverygood.api.post.domain.PostCategory; +import org.wooriverygood.api.util.MockTest; + +import java.util.ArrayList; + +public class CommentServiceTest extends MockTest { + + protected Post post; + + protected Comment comment; + + protected Comment commentWithoutReply; + + protected Comment reply; + + + @BeforeEach + void dateSetUp() { + post = Post.builder() + .id(1L) + .category(PostCategory.OFFER) + .title("simple title") + .content("simple content") + .member(member) + .comments(new ArrayList<>()) + .postLikes(new ArrayList<>()) + .build(); + comment = Comment.builder() + .id(1L) + .content("content") + .post(post) + .member(member) + .commentLikes(new ArrayList<>()) + .reports(new ArrayList<>()) + .build(); + reply = Comment.builder() + .id(2L) + .content("content") + .post(post) + .parent(comment) + .member(member) + .build(); + comment.addReply(reply); + commentWithoutReply = Comment.builder() + .id(3L) + .content("content") + .post(post) + .member(member) + .build(); + } + +} diff --git a/src/test/java/org/wooriverygood/api/comment/application/CommentUpdateServiceTest.java b/src/test/java/org/wooriverygood/api/comment/application/CommentUpdateServiceTest.java index 5121407..3baea56 100644 --- a/src/test/java/org/wooriverygood/api/comment/application/CommentUpdateServiceTest.java +++ b/src/test/java/org/wooriverygood/api/comment/application/CommentUpdateServiceTest.java @@ -1,28 +1,24 @@ package org.wooriverygood.api.comment.application; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.wooriverygood.api.comment.domain.Comment; import org.wooriverygood.api.comment.dto.CommentUpdateRequest; import org.wooriverygood.api.comment.repository.CommentRepository; -import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.global.error.exception.AuthorizationException; -import org.wooriverygood.api.post.domain.Post; -import org.wooriverygood.api.post.domain.PostCategory; -import org.wooriverygood.api.util.MockTest; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; -import java.util.ArrayList; import java.util.Optional; 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 org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -class CommentUpdateServiceTest extends MockTest { +class CommentUpdateServiceTest extends CommentServiceTest { @InjectMocks private CommentUpdateService commentUpdateService; @@ -30,29 +26,9 @@ class CommentUpdateServiceTest extends MockTest { @Mock private CommentRepository commentRepository; - private Post post = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author("author6") - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); - - private Comment comment; - + @Mock + private MemberRepository memberRepository; - @BeforeEach - void setUp() { - comment = Comment.builder() - .id(2L) - .post(post) - .content("comment content") - .author(authInfo.getUsername()) - .commentLikes(new ArrayList<>()) - .build(); - } @Test @DisplayName("권한이 있는 댓글을 수정한다.") @@ -60,14 +36,17 @@ void updateComment() { CommentUpdateRequest request = CommentUpdateRequest.builder() .content("new comment content") .build(); - + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); commentUpdateService.updateComment(comment.getId(), request, authInfo); - assertThat(comment.isUpdated()).isEqualTo(true); - assertThat(comment.getContent()).isEqualTo(request.getContent()); + assertAll( + () -> assertThat(comment.isUpdated()).isEqualTo(true), + () -> assertThat(comment.getContent()).isEqualTo(request.getContent()) + ); } @Test @@ -76,15 +55,12 @@ void updateComment_exception_noAuth() { CommentUpdateRequest request = CommentUpdateRequest.builder() .content("new comment content") .build(); - AuthInfo noAuthInfo = AuthInfo.builder() - .sub("no") - .username("no") - .build(); - + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(new Member(5L, "username"))); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); - assertThatThrownBy(() -> commentUpdateService.updateComment(comment.getId(), request, noAuthInfo)) + assertThatThrownBy(() -> commentUpdateService.updateComment(comment.getId(), request, authInfo)) .isInstanceOf(AuthorizationException.class); } diff --git a/src/test/java/org/wooriverygood/api/post/api/PostApiTest.java b/src/test/java/org/wooriverygood/api/post/api/PostApiTest.java index 82a0f4c..a86351c 100644 --- a/src/test/java/org/wooriverygood/api/post/api/PostApiTest.java +++ b/src/test/java/org/wooriverygood/api/post/api/PostApiTest.java @@ -56,6 +56,8 @@ void findPostsByCategory() { .liked(i % 6 == 0) .updated(i % 9 == 0) .reported(false) + .memberId(1L) + .isMine(false) .build()); when(postFindService.findPosts(any(AuthInfo.class), any(Pageable.class), anyString())) @@ -89,6 +91,8 @@ void findPost() { .liked(false) .updated(false) .reported(false) + .memberId(1L) + .isMine(false) .build()); restDocs diff --git a/src/test/java/org/wooriverygood/api/post/application/PostCreateServiceTest.java b/src/test/java/org/wooriverygood/api/post/application/PostCreateServiceTest.java index 42b4581..ca0e67e 100644 --- a/src/test/java/org/wooriverygood/api/post/application/PostCreateServiceTest.java +++ b/src/test/java/org/wooriverygood/api/post/application/PostCreateServiceTest.java @@ -1,20 +1,24 @@ package org.wooriverygood.api.post.application; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.dto.NewPostRequest; import org.wooriverygood.api.post.exception.InvalidPostCategoryException; import org.wooriverygood.api.post.repository.PostRepository; -import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.util.MockTest; +import java.util.Optional; + import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class PostCreateServiceTest extends MockTest { @@ -24,15 +28,9 @@ class PostCreateServiceTest extends MockTest { @Mock private PostRepository postRepository; - private AuthInfo authInfo; + @Mock + private MemberRepository memberRepository; - @BeforeEach - void setUp() { - authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); - } @Test @DisplayName("새로운 게시글을 작성한다.") @@ -42,6 +40,8 @@ void addPost() { .postCategory("자유") .postContent("content") .build(); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); postCreateService.addPost(authInfo, request); @@ -57,6 +57,9 @@ void addPost_exception_invalid_category() { .postContent("content") .build(); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + assertThatThrownBy(() -> postCreateService.addPost(authInfo, newPostRequest)) .isInstanceOf(InvalidPostCategoryException.class); } diff --git a/src/test/java/org/wooriverygood/api/post/application/PostDeleteServiceTest.java b/src/test/java/org/wooriverygood/api/post/application/PostDeleteServiceTest.java index 4d04c48..bb3a8c0 100644 --- a/src/test/java/org/wooriverygood/api/post/application/PostDeleteServiceTest.java +++ b/src/test/java/org/wooriverygood/api/post/application/PostDeleteServiceTest.java @@ -1,28 +1,26 @@ package org.wooriverygood.api.post.application; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; import org.wooriverygood.api.global.error.exception.AuthorizationException; import org.wooriverygood.api.comment.repository.CommentRepository; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; -import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.post.repository.PostLikeRepository; import org.wooriverygood.api.post.repository.PostRepository; -import org.wooriverygood.api.global.auth.AuthInfo; -import org.wooriverygood.api.util.MockTest; -import java.util.ArrayList; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -class PostDeleteServiceTest extends MockTest { +class PostDeleteServiceTest extends PostServiceTest { @InjectMocks private PostDeleteService postDeleteService; @@ -36,57 +34,42 @@ class PostDeleteServiceTest extends MockTest { @Mock private PostLikeRepository postLikeRepository; - private Post singlePost; - - private AuthInfo authInfo; - - @BeforeEach - void setUp() { - authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); + @Mock + private MemberRepository memberRepository; - singlePost = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author(authInfo.getUsername()) - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); - } @Test @DisplayName("권한이 있는 게시글을 삭제한다.") void deletePost() { - Mockito.when(postRepository.findById(any(Long.class))) - .thenReturn(Optional.ofNullable(singlePost)); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(postRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(post)); - postDeleteService.deletePost(authInfo, singlePost.getId()); + postDeleteService.deletePost(authInfo, post.getId()); - verify(commentRepository).deleteAllByPost(singlePost); - verify(postLikeRepository).deleteAllByPost(singlePost); + assertAll( + () -> verify(commentRepository).deleteAllByPost(post), + () -> verify(postLikeRepository).deleteAllByPost(post) + ); } @Test - @DisplayName("권한이 없는 게시글을 삭제한다.") + @DisplayName("권한이 없는 게시글을 삭제하면 예외가 발생한다.") void deletePost_exception_noAuth() { Post noAuthPost = Post.builder() - .id(99L) - .category(PostCategory.OFFER) - .title("title99") - .content("content99") - .author("43434-45654-234") - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) + .id(9L) + .title("title") + .content("content") + .member(new Member(5L, "username")) .build(); - Mockito.when(postRepository.findById(any(Long.class))) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(noAuthPost)); - assertThatThrownBy(() -> postDeleteService.deletePost(authInfo, singlePost.getId())) + assertThatThrownBy(() -> postDeleteService.deletePost(authInfo, post.getId())) .isInstanceOf(AuthorizationException.class); } diff --git a/src/test/java/org/wooriverygood/api/post/application/PostFindServiceTest.java b/src/test/java/org/wooriverygood/api/post/application/PostFindServiceTest.java index 3d75646..d557dcc 100644 --- a/src/test/java/org/wooriverygood/api/post/application/PostFindServiceTest.java +++ b/src/test/java/org/wooriverygood/api/post/application/PostFindServiceTest.java @@ -1,6 +1,5 @@ package org.wooriverygood.api.post.application; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -9,6 +8,8 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.post.dto.PostDetailResponse; @@ -16,19 +17,19 @@ import org.wooriverygood.api.post.exception.PostNotFoundException; import org.wooriverygood.api.post.repository.PostLikeRepository; import org.wooriverygood.api.post.repository.PostRepository; -import org.wooriverygood.api.global.auth.AuthInfo; -import org.wooriverygood.api.util.MockTest; import java.util.ArrayList; import java.util.List; import java.util.Optional; 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 org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; - -class PostFindServiceTest extends MockTest { +class PostFindServiceTest extends PostServiceTest { @InjectMocks private PostFindService postFindService; @@ -39,30 +40,30 @@ class PostFindServiceTest extends MockTest { @Mock private PostLikeRepository postLikeRepository; + @Mock + private MemberRepository memberRepository; + private List posts = new ArrayList<>(); private List myPosts = new ArrayList<>(); private List freePosts = new ArrayList<>(); - private AuthInfo authInfo; - private final int POST_COUNT = 23; + @BeforeEach void setUp() { - authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); - + posts.clear(); + myPosts.clear(); + freePosts.clear(); for (long i = 1; i <= POST_COUNT; i++) { Post post = Post.builder() .id(i) .category(PostCategory.FREE) .title("title" + i) .content("content" + i) - .author(authInfo.getUsername()) + .member(member) .comments(new ArrayList<>()) .postLikes(new ArrayList<>()) .build(); @@ -75,7 +76,7 @@ void setUp() { } @Test - @DisplayName("로그인 한 상황에서 게시글을 불러온다.") + @DisplayName("로그인 한 상황에서 모든 카테고리의 게시글을 불러온다.") void findPosts_login() { Pageable pageable = PageRequest.of(0, 10); @@ -85,12 +86,18 @@ void findPosts_login() { PageImpl page = new PageImpl<>(posts, pageable, this.posts.size()); when(postRepository.findAllByOrderByIdDesc(any(PageRequest.class))) .thenReturn(page); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(postLikeRepository.existsByPostAndMember(any(Post.class), any(Member.class))) + .thenReturn(true); PostsResponse response = postFindService.findPosts(authInfo, pageable, ""); - assertThat(response.getPosts().size()).isEqualTo(10); - assertThat(response.getTotalPageCount()).isEqualTo(3); - assertThat(response.getTotalPostCount()).isEqualTo(POST_COUNT); + assertAll( + () -> assertThat(response.getPosts().size()).isEqualTo(10), + () -> assertThat(response.getTotalPageCount()).isEqualTo(3), + () -> assertThat(response.getTotalPostCount()).isEqualTo(POST_COUNT) + ); } @Test @@ -103,32 +110,29 @@ void findPosts_category_free() { PageImpl page = new PageImpl<>(posts, pageable, this.freePosts.size()); when(postRepository.findAllByCategoryOrderByIdDesc(any(PostCategory.class), any(PageRequest.class))) .thenReturn(page); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); PostsResponse response = postFindService.findPosts(authInfo, pageable, "자유"); - assertThat(response.getPosts().size()).isEqualTo(10); - assertThat(response.getTotalPageCount()).isEqualTo(2); - assertThat(response.getTotalPostCount()).isEqualTo(14); + assertAll( + () -> assertThat(response.getPosts().size()).isEqualTo(10), + () -> assertThat(response.getTotalPageCount()).isEqualTo(2), + () -> assertThat(response.getTotalPostCount()).isEqualTo(14) + ); } @Test @DisplayName("유효한 id를 이용하여 특정 게시글을 불러온다.") void findPostById() { - Post singlePost = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author(authInfo.getUsername()) - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); - when(postRepository.findById(any())) - .thenReturn(Optional.ofNullable(singlePost)); + when(postRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(post)); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); PostDetailResponse response = postFindService.findPostById(6L, authInfo); - assertThat(response).isNotNull(); + assertThat(response.getPostId()).isEqualTo(post.getId()); } @Test @@ -137,7 +141,7 @@ void findPostById_exception_invalidId() { when(postRepository.findById(any())) .thenThrow(PostNotFoundException.class); - Assertions.assertThatThrownBy(() -> postFindService.findPostById(6L, authInfo)) + assertThatThrownBy(() -> postFindService.findPostById(6L, authInfo)) .isInstanceOf(PostNotFoundException.class); } @@ -150,14 +154,18 @@ void findMyPosts() { int end = Math.min(start + pageable.getPageSize(), this.myPosts.size()); List posts = this.myPosts.subList(start, end); PageImpl page = new PageImpl<>(posts, pageable, this.myPosts.size()); - when(postRepository.findByAuthorOrderByIdDesc(any(String.class), any(PageRequest.class))) + when(postRepository.findByMemberOrderByIdDesc(any(Member.class), any(PageRequest.class))) .thenReturn(page); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); PostsResponse response = postFindService.findMyPosts(authInfo, pageable); - assertThat(response.getPosts().size()).isEqualTo(10); - assertThat(response.getTotalPageCount()).isEqualTo(2); - assertThat(response.getTotalPostCount()).isEqualTo(14); + assertAll( + () -> assertThat(response.getPosts().size()).isEqualTo(10), + () -> assertThat(response.getTotalPageCount()).isEqualTo(2), + () -> assertThat(response.getTotalPostCount()).isEqualTo(14) + ); } } \ No newline at end of file diff --git a/src/test/java/org/wooriverygood/api/post/application/PostLikeToggleServiceTest.java b/src/test/java/org/wooriverygood/api/post/application/PostLikeToggleServiceTest.java index ef265ce..c4722e6 100644 --- a/src/test/java/org/wooriverygood/api/post/application/PostLikeToggleServiceTest.java +++ b/src/test/java/org/wooriverygood/api/post/application/PostLikeToggleServiceTest.java @@ -1,26 +1,25 @@ package org.wooriverygood.api.post.application; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; -import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.post.domain.PostLike; import org.wooriverygood.api.post.dto.PostLikeResponse; import org.wooriverygood.api.post.repository.PostLikeRepository; import org.wooriverygood.api.post.repository.PostRepository; -import org.wooriverygood.api.global.auth.AuthInfo; -import org.wooriverygood.api.util.MockTest; -import java.util.ArrayList; import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; -class PostLikeToggleServiceTest extends MockTest { +class PostLikeToggleServiceTest extends PostServiceTest { @InjectMocks private PostLikeToggleService postLikeToggleService; @@ -31,31 +30,26 @@ class PostLikeToggleServiceTest extends MockTest { @Mock private PostLikeRepository postLikeRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("") - .username("22222-34534-123") - .build(); - - private Post post = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author(authInfo.getUsername()) - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); + @Mock + private MemberRepository memberRepository; + @Test @DisplayName("특정 게시글에 좋아요를 1 올린다.") void likePost_up() { + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(post)); + when(postLikeRepository.findByPostAndMember(any(Post.class), any(Member.class))) + .thenReturn(Optional.empty()); PostLikeResponse response = postLikeToggleService.togglePostLike(post.getId(), authInfo); - Assertions.assertThat(response.getLikeCount()).isEqualTo(post.getLikeCount() + 1); - Assertions.assertThat(response.isLiked()).isEqualTo(true); + assertAll( + () -> assertThat(response.getLikeCount()).isEqualTo(post.getLikeCount() + 1), + () -> assertThat(response.isLiked()).isEqualTo(true) + ); } @Test @@ -64,17 +58,21 @@ void likePost_down() { PostLike postLike = PostLike.builder() .id(1L) .post(post) - .username(authInfo.getUsername()) + .member(member) .build(); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(post)); - when(postLikeRepository.findByPostAndUsername(any(Post.class), anyString())) + when(postLikeRepository.findByPostAndMember(any(Post.class), any(Member.class))) .thenReturn(Optional.ofNullable(postLike)); PostLikeResponse response = postLikeToggleService.togglePostLike(postLike.getId(), authInfo); - Assertions.assertThat(response.getLikeCount()).isEqualTo(post.getLikeCount() - 1); - Assertions.assertThat(response.isLiked()).isEqualTo(false); + assertAll( + () -> assertThat(response.getLikeCount()).isEqualTo(post.getLikeCount() - 1), + () -> assertThat(response.isLiked()).isEqualTo(false) + ); } } \ No newline at end of file diff --git a/src/test/java/org/wooriverygood/api/post/application/PostServiceTest.java b/src/test/java/org/wooriverygood/api/post/application/PostServiceTest.java new file mode 100644 index 0000000..6b944df --- /dev/null +++ b/src/test/java/org/wooriverygood/api/post/application/PostServiceTest.java @@ -0,0 +1,28 @@ +package org.wooriverygood.api.post.application; + +import org.junit.jupiter.api.BeforeEach; +import org.wooriverygood.api.post.domain.Post; +import org.wooriverygood.api.post.domain.PostCategory; +import org.wooriverygood.api.util.MockTest; + +import java.util.ArrayList; + +public class PostServiceTest extends MockTest { + + protected Post post; + + @BeforeEach + void dateSetUp() { + post = Post.builder() + .id(1L) + .category(PostCategory.OFFER) + .title("simple title") + .content("simple content") + .member(member) + .comments(new ArrayList<>()) + .postLikes(new ArrayList<>()) + .reports(new ArrayList<>()) + .build(); + } + +} diff --git a/src/test/java/org/wooriverygood/api/post/application/PostUpdateServiceTest.java b/src/test/java/org/wooriverygood/api/post/application/PostUpdateServiceTest.java index 70c113d..22a5b59 100644 --- a/src/test/java/org/wooriverygood/api/post/application/PostUpdateServiceTest.java +++ b/src/test/java/org/wooriverygood/api/post/application/PostUpdateServiceTest.java @@ -1,25 +1,27 @@ package org.wooriverygood.api.post.application; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.wooriverygood.api.global.error.exception.AuthorizationException; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.domain.Post; import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.post.dto.PostUpdateRequest; import org.wooriverygood.api.post.repository.PostRepository; -import org.wooriverygood.api.global.auth.AuthInfo; -import org.wooriverygood.api.util.MockTest; import java.util.ArrayList; import java.util.Optional; -import static org.mockito.ArgumentMatchers.any; +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 org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -class PostUpdateServiceTest extends MockTest { +class PostUpdateServiceTest extends PostServiceTest { @InjectMocks private PostUpdateService postUpdateService; @@ -27,32 +29,20 @@ class PostUpdateServiceTest extends MockTest { @Mock private PostRepository postRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("") - .username("22222-34534-123") - .build(); - @Mock - private Post post = Post.builder() - .id(6L) - .category(PostCategory.OFFER) - .title("title6") - .content("content6") - .author(authInfo.getUsername()) - .comments(new ArrayList<>()) - .postLikes(new ArrayList<>()) - .build(); + private MemberRepository memberRepository; private Post noAuthPost = Post.builder() .id(99L) .category(PostCategory.OFFER) .title("title99") .content("content99") - .author("43434-45654-234") + .member(new Member(5L, "username")) .comments(new ArrayList<>()) .postLikes(new ArrayList<>()) .build(); + @Test @DisplayName("권한이 있는 게시글을 수정한다.") void updatePost() { @@ -60,12 +50,17 @@ void updatePost() { .postTitle("new title") .postContent("new content") .build(); - - when(postRepository.findById(any(Long.class))) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(post)); postUpdateService.updatePost(post.getId(), request, authInfo); + assertAll( + () -> assertThat(post.getTitle()).isEqualTo(request.getPostTitle()), + () -> assertThat(post.getContent()).isEqualTo(request.getPostContent()) + ); } @Test @@ -75,11 +70,12 @@ void updatePost_exception_noAuth() { .postTitle("new title") .postContent("new content") .build(); - - when(postRepository.findById(any(Long.class))) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(noAuthPost)); - Assertions.assertThatThrownBy(() -> postUpdateService.updatePost(noAuthPost.getId(), request, authInfo)) + assertThatThrownBy(() -> postUpdateService.updatePost(noAuthPost.getId(), request, authInfo)) .isInstanceOf(AuthorizationException.class); } diff --git a/src/test/java/org/wooriverygood/api/report/application/CommentReportServiceTest.java b/src/test/java/org/wooriverygood/api/report/application/CommentReportServiceTest.java index 47988c3..55961e3 100644 --- a/src/test/java/org/wooriverygood/api/report/application/CommentReportServiceTest.java +++ b/src/test/java/org/wooriverygood/api/report/application/CommentReportServiceTest.java @@ -1,10 +1,15 @@ package org.wooriverygood.api.report.application; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.wooriverygood.api.comment.application.CommentServiceTest; import org.wooriverygood.api.comment.exception.CommentNotFoundException; +import org.wooriverygood.api.member.repository.MemberRepository; +import org.wooriverygood.api.post.domain.Post; +import org.wooriverygood.api.post.domain.PostCategory; import org.wooriverygood.api.report.domain.CommentReport; import org.wooriverygood.api.report.exception.DuplicatedCommentReportException; import org.wooriverygood.api.comment.domain.Comment; @@ -14,14 +19,17 @@ import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.util.MockTest; +import java.util.ArrayList; import java.util.Optional; +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 org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class CommentReportServiceTest extends MockTest { +class CommentReportServiceTest extends CommentServiceTest { @InjectMocks private CommentReportService commentReportService; @@ -32,53 +40,54 @@ class CommentReportServiceTest extends MockTest { @Mock private CommentReportRepository commentReportRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22432-12312-3531") - .username("22432-12312-3531") - .build(); - @Mock - private Comment comment; - + private MemberRepository memberRepository; + + private Post post; + + + @BeforeEach + void setUp() { + post = Post.builder() + .id(6L) + .category(PostCategory.OFFER) + .title("title6") + .content("content6") + .member(member) + .comments(new ArrayList<>()) + .postLikes(new ArrayList<>()) + .build(); + } @Test @DisplayName("유효한 id를 통해 특정 댓글을 신고한다.") void reportComment() { ReportRequest request = new ReportRequest("report message"); - when(comment.hasReportByUser(anyString())) - .thenReturn(false); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); - commentReportService.reportComment(1L, request, authInfo); - - verify(comment).hasReportByUser(authInfo.getUsername()); - verify(comment).addReport(any(CommentReport.class)); - verify(commentRepository).increaseReportCount(anyLong()); - verify(commentReportRepository).save(any(CommentReport.class)); - } - - @Test - @DisplayName("신고하려는 댓글의 id가 유효하지 않으면 예외를 발생한다.") - void reportComment_exception_invalidId() { - ReportRequest request = new ReportRequest("report message"); - - when(commentRepository.findById(anyLong())) - .thenThrow(new CommentNotFoundException()); + commentReportService.reportComment(comment.getId(), request, authInfo); - assertThatThrownBy(() -> commentReportService.reportComment(1L, request, authInfo)) - .isInstanceOf(CommentNotFoundException.class); + assertAll( + () -> assertThat(comment.getReports().size()).isEqualTo(1), + () -> verify(commentRepository).increaseReportCount(comment.getId()), + () -> verify(commentReportRepository).save(any(CommentReport.class)) + ); } @Test @DisplayName("동일한 댓글을 한 번 이상 신고하면 예외를 발생한다.") void reportComment_exception_duplicated() { ReportRequest request = new ReportRequest("report message"); - when(comment.hasReportByUser(anyString())) - .thenReturn(true); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(commentRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(comment)); + commentReportService.reportComment(comment.getId(), request, authInfo); + assertThatThrownBy(() -> commentReportService.reportComment(1L, request, authInfo)) .isInstanceOf(DuplicatedCommentReportException.class); } diff --git a/src/test/java/org/wooriverygood/api/report/application/PostReportServiceTest.java b/src/test/java/org/wooriverygood/api/report/application/PostReportServiceTest.java index d778050..f5fe642 100644 --- a/src/test/java/org/wooriverygood/api/report/application/PostReportServiceTest.java +++ b/src/test/java/org/wooriverygood/api/report/application/PostReportServiceTest.java @@ -4,24 +4,25 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.wooriverygood.api.global.auth.AuthInfo; -import org.wooriverygood.api.post.domain.Post; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; +import org.wooriverygood.api.post.application.PostServiceTest; import org.wooriverygood.api.post.exception.PostNotFoundException; import org.wooriverygood.api.post.repository.PostRepository; import org.wooriverygood.api.report.domain.PostReport; import org.wooriverygood.api.report.dto.ReportRequest; import org.wooriverygood.api.report.exception.DuplicatedPostReportException; import org.wooriverygood.api.report.repository.PostReportRepository; -import org.wooriverygood.api.util.MockTest; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class PostReportServiceTest extends MockTest { +class PostReportServiceTest extends PostServiceTest { @InjectMocks private PostReportService postReportService; @@ -32,41 +33,37 @@ class PostReportServiceTest extends MockTest { @Mock private PostReportRepository postReportRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22432-12312-3531") - .username("22432-12312-3531") - .build(); - @Mock - private Post post; + private MemberRepository memberRepository; @Test @DisplayName("유효한 id를 통해 특정 게시글을 신고한다.") void reportPost() { ReportRequest request = new ReportRequest("report message"); - when(post.hasReportByUser(anyString())) - .thenReturn(false); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(post)); postReportService.reportPost(1L, request, authInfo); - verify(post).hasReportByUser(authInfo.getUsername()); - verify(post).addReport(any(PostReport.class)); - verify(postRepository).increaseReportCount(anyLong()); - verify(postReportRepository).save(any(PostReport.class)); + assertAll( + () -> verify(postRepository).increaseReportCount(post.getId()), + () -> verify(postReportRepository).save(any(PostReport.class)) + ); } @Test @DisplayName("신고하려는 게시글 id가 유효하지 않으면 예외를 발생한다.") void reportPost_exception_invalidId() { ReportRequest request = new ReportRequest("report message"); - + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(postRepository.findById(anyLong())) .thenThrow(new PostNotFoundException()); - assertThatThrownBy(() -> postReportService.reportPost(1L, request, authInfo)) + assertThatThrownBy(() -> postReportService.reportPost(post.getId(), request, authInfo)) .isInstanceOf(PostNotFoundException.class); } @@ -74,12 +71,13 @@ void reportPost_exception_invalidId() { @DisplayName("동일한 게시글을 한 번 이상 신고하면 예외를 발생한다.") void reportPost_exception_duplicated() { ReportRequest request = new ReportRequest("report message"); - when(post.hasReportByUser(anyString())) - .thenReturn(true); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); when(postRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(post)); + postReportService.reportPost(post.getId(), request, authInfo); - assertThatThrownBy(() -> postReportService.reportPost(1L, request, authInfo)) + assertThatThrownBy(() -> postReportService.reportPost(post.getId(), request, authInfo)) .isInstanceOf(DuplicatedPostReportException.class); } diff --git a/src/test/java/org/wooriverygood/api/review/application/ReviewCreateServiceTest.java b/src/test/java/org/wooriverygood/api/review/application/ReviewCreateServiceTest.java index dda08e1..a5ac22d 100644 --- a/src/test/java/org/wooriverygood/api/review/application/ReviewCreateServiceTest.java +++ b/src/test/java/org/wooriverygood/api/review/application/ReviewCreateServiceTest.java @@ -7,6 +7,7 @@ import org.wooriverygood.api.course.domain.Course; import org.wooriverygood.api.course.repository.CourseRepository; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.dto.NewReviewRequest; import org.wooriverygood.api.review.repository.ReviewRepository; @@ -14,6 +15,7 @@ import java.util.Optional; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.*; @@ -29,10 +31,8 @@ class ReviewCreateServiceTest extends MockTest { @Mock private ReviewRepository reviewRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); + @Mock + private MemberRepository memberRepository; private Course course = Course.builder() .id(1L) @@ -57,11 +57,15 @@ void addReview() { when(courseRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(course)); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); reviewCreateService.addReview(authInfo, 1L, request); - verify(reviewRepository).save(any(Review.class)); - verify(courseRepository).increaseReviewCount(course.getId()); + assertAll( + () -> verify(reviewRepository).save(any(Review.class)), + () -> verify(courseRepository).increaseReviewCount(course.getId()) + ); } } \ No newline at end of file diff --git a/src/test/java/org/wooriverygood/api/review/application/ReviewDeleteServiceTest.java b/src/test/java/org/wooriverygood/api/review/application/ReviewDeleteServiceTest.java index bad8f86..0099a3b 100644 --- a/src/test/java/org/wooriverygood/api/review/application/ReviewDeleteServiceTest.java +++ b/src/test/java/org/wooriverygood/api/review/application/ReviewDeleteServiceTest.java @@ -1,13 +1,15 @@ package org.wooriverygood.api.review.application; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.wooriverygood.api.course.domain.Course; import org.wooriverygood.api.course.repository.CourseRepository; -import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.global.error.exception.AuthorizationException; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.exception.ReviewNotFoundException; import org.wooriverygood.api.review.repository.ReviewLikeRepository; @@ -17,8 +19,8 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; class ReviewDeleteServiceTest extends MockTest { @@ -35,42 +37,52 @@ class ReviewDeleteServiceTest extends MockTest { @Mock private ReviewLikeRepository reviewLikeRepository; - private Course course = Course.builder() - .id(1L) - .build(); + @Mock + private MemberRepository memberRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); + private Course course; - @Mock private Review review; + @BeforeEach + void setUp() { + course = Course.builder() + .id(1L) + .build(); + review = Review.builder() + .member(member) + .course(course) + .build(); + } + @Test @DisplayName("권한이 있는 리뷰를 삭제한다.") void deleteReview() { when(reviewRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(review)); - when(review.getCourse()) - .thenReturn(course); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); reviewDeleteService.deleteReview(1L, authInfo); - verify(review).validateAuthor(authInfo.getUsername()); - verify(reviewLikeRepository).deleteAllByReview(review); - verify(reviewRepository).delete(review); - verify(courseRepository).decreaseReviewCount(course.getId()); + assertAll( + () -> verify(reviewLikeRepository).deleteAllByReview(review), + () -> verify(reviewRepository).delete(review), + () -> verify(courseRepository).decreaseReviewCount(course.getId()) + ); } @Test @DisplayName("권한이 없는 리뷰는 삭제가 불가능하다.") void deleteReview_exception_noAuth() { + Review review = Review.builder() + .id(2L) + .member(new Member(5L, "noAuth")) + .build(); when(reviewRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(review)); - doThrow(new AuthorizationException()) - .when(review) - .validateAuthor(anyString()); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); assertThatThrownBy(() -> reviewDeleteService.deleteReview(1L, authInfo)) .isInstanceOf(AuthorizationException.class); diff --git a/src/test/java/org/wooriverygood/api/review/application/ReviewFindServiceTest.java b/src/test/java/org/wooriverygood/api/review/application/ReviewFindServiceTest.java index 29677fb..b3fa693 100644 --- a/src/test/java/org/wooriverygood/api/review/application/ReviewFindServiceTest.java +++ b/src/test/java/org/wooriverygood/api/review/application/ReviewFindServiceTest.java @@ -6,7 +6,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.wooriverygood.api.course.domain.Course; -import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.dto.ReviewsResponse; import org.wooriverygood.api.review.repository.ReviewLikeRepository; @@ -15,10 +16,10 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; class ReviewFindServiceTest extends MockTest { @@ -32,12 +33,10 @@ class ReviewFindServiceTest extends MockTest { @Mock private ReviewLikeRepository reviewLikeRepository; - private List reviews = new ArrayList<>(); + @Mock + private MemberRepository memberRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); + private List reviews = new ArrayList<>(); private Course course = Course.builder() .id(1L) @@ -57,12 +56,12 @@ void setUp() { Review review = Review.builder() .id(i) .course(course) + .member(member) .reviewContent("review" + i) .reviewTitle("review" + i) .instructorName("jiaoshou") .takenSemyr("22-23") .grade("60") - .authorEmail("author" + i) .reviewLikes(new ArrayList<>()) .updated(false) .build(); @@ -75,7 +74,9 @@ void setUp() { void findAllReviewsByCourseId() { when(reviewRepository.findAllByCourseId(any())) .thenReturn(reviews); - when(reviewLikeRepository.existsByReviewAndUsername(any(Review.class), anyString())) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(reviewLikeRepository.existsByReviewAndMember(any(Review.class), any(Member.class))) .thenReturn(true); ReviewsResponse response = reviewFindService.findAllReviewsByCourseId(1L, authInfo); @@ -87,8 +88,11 @@ void findAllReviewsByCourseId() { @Test @DisplayName("사용자 본인이 작성한 리뷰들을 불러온다.") void findMyReviews() { - when(reviewRepository.findByAuthorEmail(any(String.class))) - .thenReturn(reviews); + for (Review review : reviews) { + member.addReview(review); + } + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); ReviewsResponse response = reviewFindService.findMyReviews(authInfo); diff --git a/src/test/java/org/wooriverygood/api/review/application/ReviewLikeToggleServiceTest.java b/src/test/java/org/wooriverygood/api/review/application/ReviewLikeToggleServiceTest.java index 430a4ad..c9f114e 100644 --- a/src/test/java/org/wooriverygood/api/review/application/ReviewLikeToggleServiceTest.java +++ b/src/test/java/org/wooriverygood/api/review/application/ReviewLikeToggleServiceTest.java @@ -2,27 +2,27 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.domain.ReviewLike; import org.wooriverygood.api.review.dto.*; import org.wooriverygood.api.review.repository.ReviewLikeRepository; import org.wooriverygood.api.review.repository.ReviewRepository; -import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.util.MockTest; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; -@ExtendWith(MockitoExtension.class) -public class ReviewLikeToggleServiceTest { +public class ReviewLikeToggleServiceTest extends MockTest { @InjectMocks private ReviewLikeToggleService reviewLikeToggleService; @@ -33,10 +33,8 @@ public class ReviewLikeToggleServiceTest { @Mock private ReviewLikeRepository reviewLikeRepository; - private final AuthInfo authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); + @Mock + private MemberRepository memberRepository; private final Review review = Review.builder() .id(1L) @@ -45,7 +43,7 @@ public class ReviewLikeToggleServiceTest { .instructorName("jiaoshou") .takenSemyr("22-23") .grade("100") - .authorEmail(authInfo.getUsername()) + .member(member) .reviewLikes(new ArrayList<>()) .updated(false) .createdAt(LocalDateTime.of(2022, 6, 13, 12, 00)) @@ -57,11 +55,15 @@ public class ReviewLikeToggleServiceTest { void likeReview_up() { when(reviewRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(review)); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); ReviewLikeResponse response = reviewLikeToggleService.toggleReviewLike(review.getId(), authInfo); - assertThat(response.getLikeCount()).isEqualTo(review.getLikeCount() + 1); - assertThat(response.isLiked()).isEqualTo(true); + assertAll( + () -> assertThat(response.getLikeCount()).isEqualTo(review.getLikeCount() + 1), + () -> assertThat(response.isLiked()).isEqualTo(true) + ); } @Test @@ -70,12 +72,14 @@ void likeReview_down() { ReviewLike reviewLike = ReviewLike.builder() .id(3L) .review(review) - .username(authInfo.getUsername()) + .member(member) .build(); when(reviewRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(review)); - when(reviewLikeRepository.findByReviewAndUsername(any(Review.class), anyString())) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(reviewLikeRepository.findByReviewAndMember(any(Review.class), any(Member.class))) .thenReturn(Optional.ofNullable(reviewLike)); ReviewLikeResponse response = reviewLikeToggleService.toggleReviewLike(review.getId(), authInfo); diff --git a/src/test/java/org/wooriverygood/api/review/application/ReviewUpdateServiceTest.java b/src/test/java/org/wooriverygood/api/review/application/ReviewUpdateServiceTest.java index 86a4cbe..5944d58 100644 --- a/src/test/java/org/wooriverygood/api/review/application/ReviewUpdateServiceTest.java +++ b/src/test/java/org/wooriverygood/api/review/application/ReviewUpdateServiceTest.java @@ -1,11 +1,13 @@ package org.wooriverygood.api.review.application; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.global.error.exception.AuthorizationException; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.domain.Review; import org.wooriverygood.api.review.dto.ReviewUpdateRequest; import org.wooriverygood.api.review.repository.ReviewRepository; @@ -13,8 +15,9 @@ import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.Mockito.*; class ReviewUpdateServiceTest extends MockTest { @@ -25,14 +28,19 @@ class ReviewUpdateServiceTest extends MockTest { @Mock private ReviewRepository reviewRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); - @Mock + private MemberRepository memberRepository; + private Review review; + @BeforeEach + void setUp() { + review = Review.builder() + .id(1L) + .member(member) + .build(); + } + @Test @DisplayName("권한이 있는 리뷰를 수정한다.") void updateReview() { @@ -43,19 +51,20 @@ void updateReview() { .takenSemyr("18-19") .grade("100") .build(); - - when(reviewRepository.findById(any(Long.class))) + when(reviewRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(review)); - - reviewUpdateService.updateReview(1L, request, authInfo); - - verify(review).validateAuthor(authInfo.getUsername()); - verify(review).updateTitle(request.getReviewTitle()); - verify(review).updateInstructorName(request.getInstructorName()); - verify(review).updateTakenSemyr(request.getTakenSemyr()); - verify(review).updateContent(request.getReviewContent()); - verify(review).updateGrade(request.getGrade()); - verify(review).updateAuthor(authInfo.getUsername()); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + + reviewUpdateService.updateReview(review.getId(), request, authInfo); + + assertAll( + () -> assertThat(review.getReviewTitle()).isEqualTo(request.getReviewTitle()), + () -> assertThat(review.getInstructorName()).isEqualTo(request.getInstructorName()), + () -> assertThat(review.getTakenSemyr()).isEqualTo(request.getTakenSemyr()), + () -> assertThat(review.getReviewContent()).isEqualTo(request.getReviewContent()), + () -> assertThat(review.getGrade()).isEqualTo(request.getGrade()) + ); } @Test @@ -64,13 +73,12 @@ void updateReview_noAuth() { ReviewUpdateRequest request = ReviewUpdateRequest.builder() .build(); - when(reviewRepository.findById(any(Long.class))) + when(reviewRepository.findById(anyLong())) .thenReturn(Optional.ofNullable(review)); - doThrow(new AuthorizationException()) - .when(review) - .validateAuthor(anyString()); + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.of(new Member(5L, "noAuth"))); - assertThatThrownBy(() -> reviewUpdateService.updateReview(1L, request, authInfo)) + assertThatThrownBy(() -> reviewUpdateService.updateReview(review.getId(), request, authInfo)) .isInstanceOf(AuthorizationException.class); } diff --git a/src/test/java/org/wooriverygood/api/review/application/ReviewValidateAccessServiceTest.java b/src/test/java/org/wooriverygood/api/review/application/ReviewValidateAccessServiceTest.java index 99375b1..e389a88 100644 --- a/src/test/java/org/wooriverygood/api/review/application/ReviewValidateAccessServiceTest.java +++ b/src/test/java/org/wooriverygood/api/review/application/ReviewValidateAccessServiceTest.java @@ -4,6 +4,9 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.wooriverygood.api.course.domain.Course; +import org.wooriverygood.api.member.domain.Member; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.review.exception.ReviewAccessDeniedException; import org.wooriverygood.api.global.auth.AuthInfo; import org.wooriverygood.api.review.domain.Review; @@ -11,10 +14,12 @@ import org.wooriverygood.api.util.MockTest; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; class ReviewValidateAccessServiceTest extends MockTest { @@ -25,10 +30,8 @@ class ReviewValidateAccessServiceTest extends MockTest { @Mock private ReviewRepository reviewRepository; - private AuthInfo authInfo = AuthInfo.builder() - .sub("22222-34534-123") - .username("22222-34534-123") - .build(); + @Mock + private MemberRepository memberRepository; @Test @@ -38,7 +41,9 @@ void canAccessReviews_true() { .createdAt(LocalDateTime.now().minusMonths(6)) .build(); - when(reviewRepository.findTopByAuthorEmailOrderByCreatedAtDesc(any(String.class))) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(reviewRepository.findTopByMemberOrderByCreatedAtDesc(any(Member.class))) .thenReturn(Optional.ofNullable(review)); reviewValidateAccessService.validateReviewAccess(authInfo); @@ -47,7 +52,9 @@ void canAccessReviews_true() { @Test @DisplayName("리뷰를 작성하지 않았다면, 예외를 발생시킨다.") void canAccessReviews_false_noReview() { - when(reviewRepository.findTopByAuthorEmailOrderByCreatedAtDesc(any(String.class))) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(reviewRepository.findTopByMemberOrderByCreatedAtDesc(any(Member.class))) .thenReturn(Optional.empty()); assertThatThrownBy(() -> reviewValidateAccessService.validateReviewAccess(authInfo)) @@ -61,7 +68,9 @@ void canAccessReviews_false_sixMonths() { .createdAt(LocalDateTime.of(2022, 6, 13, 12, 00)) .build(); - when(reviewRepository.findTopByAuthorEmailOrderByCreatedAtDesc(any(String.class))) + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + when(reviewRepository.findTopByMemberOrderByCreatedAtDesc(any(Member.class))) .thenReturn(Optional.ofNullable(review)); assertThatThrownBy(() -> reviewValidateAccessService.validateReviewAccess(authInfo)) diff --git a/src/test/java/org/wooriverygood/api/util/ApiTest.java b/src/test/java/org/wooriverygood/api/util/ApiTest.java index 519bf5e..1ea00cc 100644 --- a/src/test/java/org/wooriverygood/api/util/ApiTest.java +++ b/src/test/java/org/wooriverygood/api/util/ApiTest.java @@ -14,6 +14,7 @@ import org.wooriverygood.api.comment.api.CommentApi; import org.wooriverygood.api.comment.application.*; import org.wooriverygood.api.course.application.CourseFindService; +import org.wooriverygood.api.member.repository.MemberRepository; import org.wooriverygood.api.post.application.*; import org.wooriverygood.api.report.api.ReportApi; import org.wooriverygood.api.report.application.CommentReportService; @@ -46,6 +47,9 @@ public class ApiTest { protected MockMvcRequestSpecification restDocs; + @MockBean + protected MemberRepository memberRepository; + @MockBean protected CourseCreateService courseCreateService; diff --git a/src/test/java/org/wooriverygood/api/util/MockTest.java b/src/test/java/org/wooriverygood/api/util/MockTest.java index e8ee391..a4aae7c 100644 --- a/src/test/java/org/wooriverygood/api/util/MockTest.java +++ b/src/test/java/org/wooriverygood/api/util/MockTest.java @@ -1,15 +1,26 @@ package org.wooriverygood.api.util; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; import org.wooriverygood.api.global.auth.AuthInfo; +import org.wooriverygood.api.member.domain.Member; @ExtendWith(MockitoExtension.class) public class MockTest { protected AuthInfo authInfo = AuthInfo.builder() + .memberId(1L) .sub("22222-34534-123") .username("22222-34534-123") .build(); + protected Member member; + + + @BeforeEach + void mockData() { + member = new Member(1L, authInfo.getUsername()); + } + } diff --git a/src/test/java/org/wooriverygood/api/util/ResponseFixture.java b/src/test/java/org/wooriverygood/api/util/ResponseFixture.java index 0925a3d..af0f2f8 100644 --- a/src/test/java/org/wooriverygood/api/util/ResponseFixture.java +++ b/src/test/java/org/wooriverygood/api/util/ResponseFixture.java @@ -30,6 +30,8 @@ public static PostResponse postResponse(long id, String category, AuthInfo authI .liked(id % 6 == 0) .updated(id % 9 == 0) .reported(false) + .memberId(1L) + .isMine(false) .build(); } @@ -52,6 +54,8 @@ public static PostResponse reportedPostResponse(long id, String category, AuthIn .liked(id % 6 == 0) .updated(id % 9 == 0) .reported(true) + .memberId(1L) + .isMine(false) .build(); }