From cefee9d1c9bb8f4be027ccc3c4c5181aa5f58001 Mon Sep 17 00:00:00 2001 From: youngji Date: Sun, 16 Apr 2023 16:05:35 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat=20:=20bookshelf=5Flike=20entity=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookshelf/entity/BookshelfItem.java | 2 +- .../bookshelf/entity/BookshelfLike.java | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java index 4bb22ff8..1be4b566 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java @@ -27,7 +27,7 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "Bookshelf_item", +@Table(name = "Bookshelf_items", uniqueConstraints = { @UniqueConstraint(name = "bookshelf_id_book_id_unique_key", columnNames = {"bookshelf_id", "book_id"}) diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java new file mode 100644 index 00000000..6dc32df2 --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java @@ -0,0 +1,75 @@ +package com.dadok.gaerval.domain.bookshelf.entity; + +import java.util.Objects; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import com.dadok.gaerval.domain.user.entity.User; +import com.dadok.gaerval.global.common.JacocoExcludeGenerated; +import com.dadok.gaerval.global.common.entity.BaseTimeColumn; + +import io.jsonwebtoken.lang.Assert; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "Bookshelf_likes", + uniqueConstraints = { + @UniqueConstraint(name = "bookshelf_id_user_id_unique_key", + columnNames = {"bookshelf_id", "user_id"}) + } +) +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class BookshelfLike extends BaseTimeColumn { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(nullable = false, name = "user_id") + private User user; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(nullable = false, name = "bookshelf_id") + private Bookshelf bookshelf; + + private BookshelfLike(User user, Bookshelf bookshelf) { + Assert.notNull(bookshelf, "BookshelfLike의 bookshelf는 null일 수 없습니다."); + Assert.notNull(user, "BookshelfLike의 user은 null일 수 없습니다."); + this.user = user; + this.bookshelf = bookshelf; + } + + public static BookshelfLike create(User user, Bookshelf bookshelf) { + return new BookshelfLike(user, bookshelf); + } + + @Override + @JacocoExcludeGenerated + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + BookshelfLike that = (BookshelfLike)o; + return user.equals(that.user) && bookshelf.equals(that.bookshelf); + } + + @Override + @JacocoExcludeGenerated + public int hashCode() { + return Objects.hash(user, bookshelf); + } +} From 4dc28692156e9cd64a5e82f91bf889a22cc2a18f Mon Sep 17 00:00:00 2001 From: youngji Date: Sun, 16 Apr 2023 19:14:38 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat=20:=20=EC=97=B0=EA=B4=80=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20=ED=8E=B8=EC=9D=98=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/BookshelfLikeController.java | 29 +++++++++ .../domain/bookshelf/entity/Bookshelf.java | 9 +++ .../bookshelf/entity/BookshelfLike.java | 10 +-- .../repository/BookshelfLikeRepository.java | 12 ++++ .../service/BookshelfLikeService.java | 8 +++ .../service/DefaultBookshelfLikeService.java | 42 ++++++++++++ .../BookshelfLikeRepositoryTest.java | 64 +++++++++++++++++++ 7 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/service/BookshelfLikeService.java create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java create mode 100644 src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java new file mode 100644 index 00000000..220b98af --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java @@ -0,0 +1,29 @@ +package com.dadok.gaerval.domain.bookshelf.api; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.dadok.gaerval.domain.bookshelf.service.BookshelfLikeService; + +import lombok.RequiredArgsConstructor; + +@RequestMapping("/api/bookshelf") +@RestController +@RequiredArgsConstructor +public class BookshelfLikeController { + + private final BookshelfLikeService bookshelfLikeService; + + @PutMapping + public ResponseEntity createLike() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping + public ResponseEntity deleteLike() { + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java index 31b57a0a..5d18f012 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java @@ -54,6 +54,10 @@ public class Bookshelf extends BaseTimeColumn { @OneToMany(mappedBy = "bookshelf", cascade = CascadeType.ALL, orphanRemoval = true) private final List bookshelfItems = new ArrayList<>(); + @JsonManagedReference + @OneToMany(mappedBy = "bookshelf", cascade = CascadeType.PERSIST, orphanRemoval = true) + private final List bookshelfLikes = new ArrayList<>(); //set 덮어쓰기? + @Column(name = "job_id", nullable = true) private Long jobId; @@ -77,6 +81,11 @@ public void addBookShelfItem(BookshelfItem bookshelfItem) { bookshelfItems.add(bookshelfItem); } + public void addBookShelfLike(BookshelfLike bookshelfLike) { + CommonValidator.validateNotnull(bookshelfLike, "bookShelfItem"); + bookshelfLikes.add(bookshelfLike); + } + public void changeIsPublic(Boolean isPublic) { CommonValidator.validateNotnull(isPublic, "isPublic"); this.isPublic = isPublic; diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java index 6dc32df2..51e470ce 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java @@ -9,15 +9,14 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import com.dadok.gaerval.domain.user.entity.User; import com.dadok.gaerval.global.common.JacocoExcludeGenerated; import com.dadok.gaerval.global.common.entity.BaseTimeColumn; +import com.dadok.gaerval.global.util.CommonValidator; -import io.jsonwebtoken.lang.Assert; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -41,15 +40,16 @@ public class BookshelfLike extends BaseTimeColumn { @JoinColumn(nullable = false, name = "user_id") private User user; - @OneToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(nullable = false, name = "bookshelf_id") private Bookshelf bookshelf; private BookshelfLike(User user, Bookshelf bookshelf) { - Assert.notNull(bookshelf, "BookshelfLike의 bookshelf는 null일 수 없습니다."); - Assert.notNull(user, "BookshelfLike의 user은 null일 수 없습니다."); + CommonValidator.validateNotnull(bookshelf, "bookshelf"); + CommonValidator.validateNotnull(user, "user"); this.user = user; this.bookshelf = bookshelf; + bookshelf.addBookShelfLike(this); } public static BookshelfLike create(User user, Bookshelf bookshelf) { diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java new file mode 100644 index 00000000..aafc53a1 --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java @@ -0,0 +1,12 @@ +package com.dadok.gaerval.domain.bookshelf.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; + +public interface BookshelfLikeRepository extends JpaRepository { + + Optional findByUserIdAndBookshelfId(Long userId, Long bookshelfId); +} diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/BookshelfLikeService.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/BookshelfLikeService.java new file mode 100644 index 00000000..6f178860 --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/BookshelfLikeService.java @@ -0,0 +1,8 @@ +package com.dadok.gaerval.domain.bookshelf.service; + +public interface BookshelfLikeService { + + void createBookshelfLike(Long userId, Long bookshelfId); + + void deleteBookshelfLike(Long userId, Long bookshelfId); +} diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java new file mode 100644 index 00000000..96f1f88b --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java @@ -0,0 +1,42 @@ +package com.dadok.gaerval.domain.bookshelf.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.dadok.gaerval.domain.bookshelf.entity.Bookshelf; +import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; +import com.dadok.gaerval.domain.bookshelf.repository.BookshelfLikeRepository; +import com.dadok.gaerval.domain.user.entity.User; +import com.dadok.gaerval.domain.user.service.UserService; +import com.dadok.gaerval.global.error.exception.ResourceNotfoundException; + +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +public class DefaultBookshelfLikeService implements BookshelfLikeService { + + private final BookshelfLikeRepository bookshelfLikeRepository; + + private final UserService userService; + + private final BookshelfService bookshelfService; + + @Override + public void createBookshelfLike(Long userId, Long bookshelfId) { + User user = userService.getById(userId); + Bookshelf bookshelf = bookshelfService.getById(bookshelfId); + + BookshelfLike bookshelfLike = BookshelfLike.create(user, bookshelf); + bookshelfLikeRepository.save(bookshelfLike); + } + + @Override + public void deleteBookshelfLike(Long userId, Long bookshelfId) { + BookshelfLike bookshelfLike = bookshelfLikeRepository.findByUserIdAndBookshelfId(userId, bookshelfId) + .orElseThrow(() -> new ResourceNotfoundException(BookshelfLike.class)); + + bookshelfLikeRepository.deleteById(bookshelfLike.getId()); + } +} diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java new file mode 100644 index 00000000..7c68b16c --- /dev/null +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java @@ -0,0 +1,64 @@ +package com.dadok.gaerval.domain.bookshelf.repository; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.test.context.TestConstructor; + +import com.dadok.gaerval.domain.bookshelf.entity.Bookshelf; +import com.dadok.gaerval.domain.job.repository.JobRepository; +import com.dadok.gaerval.domain.user.entity.Authority; +import com.dadok.gaerval.domain.user.entity.Role; +import com.dadok.gaerval.domain.user.entity.User; +import com.dadok.gaerval.domain.user.entity.UserAuthority; +import com.dadok.gaerval.domain.user.repository.AuthorityRepository; +import com.dadok.gaerval.domain.user.repository.UserRepository; +import com.dadok.gaerval.global.oauth.OAuth2Attribute; +import com.dadok.gaerval.repository.CustomDataJpaTest; +import com.dadok.gaerval.testutil.JobObjectProvider; +import com.dadok.gaerval.testutil.UserObjectProvider; + +import lombok.RequiredArgsConstructor; + +@DisplayName("bookshelfLike repository 쿼리 테스트") +@CustomDataJpaTest +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@RequiredArgsConstructor +class BookshelfLikeRepositoryTest { + + private final BookshelfLikeRepository bookshelfLikeRepository; + + private final BookshelfRepository bookshelfRepository; + + private final JobRepository jobRepository; + + private final AuthorityRepository authorityRepository; + + private final UserRepository userRepository; + + private Authority authority; + + private User user; + + private Bookshelf bookshelf; + + @BeforeEach + void setUp() { + authority = authorityRepository.save(Authority.create(Role.USER)); + var job = jobRepository.save(JobObjectProvider.backendJob()); + Authority authority = authorityRepository.getReferenceById(Role.USER); + OAuth2Attribute oAuth2Attribute = UserObjectProvider.kakaoAttribute(); + user = User.createByOAuth(oAuth2Attribute, UserAuthority.create(authority)); + userRepository.saveAndFlush(user); + + user.changeJob(job); + bookshelf = bookshelfRepository.save(Bookshelf.create(user)); + } + + @Test + @DisplayName("조회 - 책장과 사용자을 입력받아 entity 조회") + void findByUserIdAndBookshelfId() { + bookshelfLikeRepository.findByUserIdAndBookshelfId(user.getId(), bookshelf.getId()); + } + +} \ No newline at end of file From 01fcf818b9bab492c0f1c2c116146fe792c68e52 Mon Sep 17 00:00:00 2001 From: youngji Date: Sun, 16 Apr 2023 20:26:45 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat=20:=20service=20layer=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/BookshelfLikeController.java | 4 +-- .../domain/bookshelf/entity/Bookshelf.java | 10 +++++- .../AlreadyExistsBookshelfLikeException.java | 23 ++++++++++++++ .../repository/BookshelfLikeRepository.java | 2 +- .../repository/BookshelfLikeSupport.java | 5 +++ .../repository/BookshelfLikeSupportImpl.java | 22 +++++++++++++ .../service/DefaultBookshelfLikeService.java | 10 +++--- .../dadok/gaerval/global/error/ErrorCode.java | 4 +-- .../error/handler/GlobalExceptionHandler.java | 12 ++++++- .../bookshelf/entity/BookshelfLikeTest.java | 31 +++++++++++++++++++ .../BookshelfLikeRepositoryTest.java | 16 ++++++++++ 11 files changed, 128 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java create mode 100644 src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java create mode 100644 src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java index 220b98af..0e58c8f4 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java @@ -2,7 +2,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,7 +17,7 @@ public class BookshelfLikeController { private final BookshelfLikeService bookshelfLikeService; - @PutMapping + @PostMapping public ResponseEntity createLike() { return ResponseEntity.ok().build(); } diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java index 5d18f012..c2f5f4d2 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java @@ -1,8 +1,10 @@ package com.dadok.gaerval.domain.bookshelf.entity; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -56,7 +58,7 @@ public class Bookshelf extends BaseTimeColumn { @JsonManagedReference @OneToMany(mappedBy = "bookshelf", cascade = CascadeType.PERSIST, orphanRemoval = true) - private final List bookshelfLikes = new ArrayList<>(); //set 덮어쓰기? + private final Set bookshelfLikes = new HashSet<>(); //set 덮어쓰기? @Column(name = "job_id", nullable = true) private Long jobId; @@ -97,6 +99,12 @@ public void validateOwner(Long userId) { } } + public void validateNotOwner(Long userId) { + if (Objects.equals(userId, user.getId())) { + throw new BookshelfUserNotMatchedException(); + } + } + public void changeJobId(Long jobId) { CommonValidator.validateNotnull(jobId, "jobId"); this.jobId = jobId; diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java new file mode 100644 index 00000000..cf7860f6 --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java @@ -0,0 +1,23 @@ +package com.dadok.gaerval.domain.bookshelf.exception; + +import static com.dadok.gaerval.global.error.ErrorCode.*; + +import com.dadok.gaerval.global.error.ErrorCode; +import com.dadok.gaerval.global.error.exception.BusinessException; + +public class AlreadyExistsBookshelfLikeException extends BusinessException { + + public AlreadyExistsBookshelfLikeException(Long bookshelfId) { + super(ALREADY_EXISTS_BOOKSHELF_LIKE, String.format(ALREADY_EXISTS_BOOKSHELF_LIKE.getMessage(), bookshelfId)); + } + + @Override + public String getMessage() { + return super.getMessage(); + } + + @Override + public ErrorCode getErrorCode() { + return ALREADY_EXISTS_BOOKSHELF_LIKE; + } +} diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java index aafc53a1..e85a6ec5 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepository.java @@ -6,7 +6,7 @@ import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; -public interface BookshelfLikeRepository extends JpaRepository { +public interface BookshelfLikeRepository extends JpaRepository, BookshelfLikeSupport { Optional findByUserIdAndBookshelfId(Long userId, Long bookshelfId); } diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java new file mode 100644 index 00000000..d6e87191 --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java @@ -0,0 +1,5 @@ +package com.dadok.gaerval.domain.bookshelf.repository; + +public interface BookshelfLikeSupport { + boolean existsByBookshelfIdAndUserId(Long bookshelfId, Long userId); +} diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java new file mode 100644 index 00000000..a0abfcd4 --- /dev/null +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java @@ -0,0 +1,22 @@ +package com.dadok.gaerval.domain.bookshelf.repository; + +import static com.dadok.gaerval.domain.bookshelf.entity.QBookshelfLike.*; + +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class BookshelfLikeSupportImpl implements BookshelfLikeSupport { + + private final JPAQueryFactory query; + + @Override + public boolean existsByBookshelfIdAndUserId(Long bookshelfId, Long userId) { + Integer fetchOne = query.selectOne().from(bookshelfLike) + .where(bookshelfLike.bookshelf.id.eq(bookshelfId), bookshelfLike.user.id.eq(userId)) + .fetchFirst(); + + return fetchOne != null; + } +} diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java index 96f1f88b..c7c4cb58 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java @@ -5,6 +5,7 @@ import com.dadok.gaerval.domain.bookshelf.entity.Bookshelf; import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; +import com.dadok.gaerval.domain.bookshelf.exception.AlreadyExistsBookshelfLikeException; import com.dadok.gaerval.domain.bookshelf.repository.BookshelfLikeRepository; import com.dadok.gaerval.domain.user.entity.User; import com.dadok.gaerval.domain.user.service.UserService; @@ -27,16 +28,17 @@ public class DefaultBookshelfLikeService implements BookshelfLikeService { public void createBookshelfLike(Long userId, Long bookshelfId) { User user = userService.getById(userId); Bookshelf bookshelf = bookshelfService.getById(bookshelfId); - - BookshelfLike bookshelfLike = BookshelfLike.create(user, bookshelf); - bookshelfLikeRepository.save(bookshelfLike); + bookshelf.validateNotOwner(userId); + if (bookshelfLikeRepository.existsByBookshelfIdAndUserId(bookshelfId, userId)) { + throw new AlreadyExistsBookshelfLikeException(bookshelf.getId()); + } + bookshelfLikeRepository.save(BookshelfLike.create(user, bookshelf)); } @Override public void deleteBookshelfLike(Long userId, Long bookshelfId) { BookshelfLike bookshelfLike = bookshelfLikeRepository.findByUserIdAndBookshelfId(userId, bookshelfId) .orElseThrow(() -> new ResourceNotfoundException(BookshelfLike.class)); - bookshelfLikeRepository.deleteById(bookshelfLike.getId()); } } diff --git a/src/main/java/com/dadok/gaerval/global/error/ErrorCode.java b/src/main/java/com/dadok/gaerval/global/error/ErrorCode.java index d616db1f..2b756898 100644 --- a/src/main/java/com/dadok/gaerval/global/error/ErrorCode.java +++ b/src/main/java/com/dadok/gaerval/global/error/ErrorCode.java @@ -36,6 +36,8 @@ public enum ErrorCode { ALREADY_CONTAIN_BOOKSHELF_ITEM(HttpStatus.BAD_REQUEST, "BS1", "이미 책장에 포함된 아아템입니다."), BOOKSHELF_USER_NOT_MATCHED(HttpStatus.UNAUTHORIZED, "BS2", "해당 책장에 올바르지 않은 사용자 접근입니다."), + ALREADY_EXISTS_BOOKSHELF_LIKE(HttpStatus.BAD_REQUEST, "BSL1", "해당 책장에 대한 좋아요가 이미 존재합니다. 책장 id : %s"), + // Book BOOK_DATA_INVALID(HttpStatus.INTERNAL_SERVER_ERROR, "B1", "잘못된 도서 데이터 형식입니다."), BOOK_API_NOT_AVAILABLE(HttpStatus.INTERNAL_SERVER_ERROR, "B2", "도서 API를 호출할 수 없습니다."), @@ -73,8 +75,6 @@ public enum ErrorCode { KAKAO_TIMEOUT(HttpStatus.REQUEST_TIMEOUT, "603", "카카오 플랫폼 내부에서 요청 처리 중 타임아웃이 발생한 경우"), KAKAO_SERVICE_CHECK(HttpStatus.SERVICE_UNAVAILABLE, "9798", "서비스 점검중"); - - private final HttpStatus status; private final String code; diff --git a/src/main/java/com/dadok/gaerval/global/error/handler/GlobalExceptionHandler.java b/src/main/java/com/dadok/gaerval/global/error/handler/GlobalExceptionHandler.java index a7f34b7a..c7b63bfb 100644 --- a/src/main/java/com/dadok/gaerval/global/error/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/dadok/gaerval/global/error/handler/GlobalExceptionHandler.java @@ -42,6 +42,7 @@ import com.dadok.gaerval.domain.book_group.exception.ExpiredJoinGroupPeriodException; import com.dadok.gaerval.domain.book_group.exception.NotMatchedPasswordException; import com.dadok.gaerval.domain.bookshelf.exception.AlreadyContainBookshelfItemException; +import com.dadok.gaerval.domain.bookshelf.exception.AlreadyExistsBookshelfLikeException; import com.dadok.gaerval.domain.bookshelf.exception.BookshelfUserNotMatchedException; import com.dadok.gaerval.global.config.security.exception.JwtAuthenticationException; import com.dadok.gaerval.global.error.ErrorCode; @@ -382,7 +383,6 @@ public ResponseEntity handleBookApiNotAvailableException( return of(errorCode, request.getRequestURI()); } - @ExceptionHandler(NotMarkedBookException.class) public ResponseEntity handleBookNotMarkedException( HttpServletRequest request, NotMarkedBookException e) { @@ -393,6 +393,16 @@ public ResponseEntity handleBookNotMarkedException( return of(errorCode, request.getRequestURI()); } + @ExceptionHandler(AlreadyExistsBookshelfLikeException.class) + public ResponseEntity handleAlreadyExistBookshelfLikeException( + HttpServletRequest request, AlreadyExistsBookshelfLikeException e) { + + ErrorCode errorCode = e.getErrorCode(); + logInfo(e, request.getRequestURI()); + + return of(errorCode, request.getRequestURI()); + } + private List makeFieldErrorsFromBindingResult(BindingResult bindingResult) { List fieldErrors = new ArrayList<>(); diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java new file mode 100644 index 00000000..2883a86a --- /dev/null +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java @@ -0,0 +1,31 @@ +package com.dadok.gaerval.domain.bookshelf.entity; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import com.dadok.gaerval.domain.user.entity.User; +import com.dadok.gaerval.testutil.JobObjectProvider; +import com.dadok.gaerval.testutil.UserObjectProvider; + +class BookshelfLikeTest { + + private final User owner = UserObjectProvider.createKakaoUser(JobObjectProvider.backendJob()); + + private final User user = UserObjectProvider.createNaverUser(); + + private final Bookshelf bookshelf = Bookshelf.create(owner); + + @Test + @DisplayName("create") + void test() { + BookshelfLike bookshelfLike = BookshelfLike.create(user, bookshelf); + ReflectionTestUtils.setField(bookshelfLike, "id", 5L); + + BookshelfLike bookshelfLike2 = BookshelfLike.create(user, bookshelf); + ReflectionTestUtils.setField(bookshelfLike2, "id", 6L); + + System.out.println(bookshelf.getBookshelfLikes()); + } + +} \ No newline at end of file diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java index 7c68b16c..3d0c39da 100644 --- a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java @@ -6,6 +6,7 @@ import org.springframework.test.context.TestConstructor; import com.dadok.gaerval.domain.bookshelf.entity.Bookshelf; +import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; import com.dadok.gaerval.domain.job.repository.JobRepository; import com.dadok.gaerval.domain.user.entity.Authority; import com.dadok.gaerval.domain.user.entity.Role; @@ -42,6 +43,8 @@ class BookshelfLikeRepositoryTest { private Bookshelf bookshelf; + private BookshelfLike bookshelfLike; + @BeforeEach void setUp() { authority = authorityRepository.save(Authority.create(Role.USER)); @@ -53,6 +56,8 @@ void setUp() { user.changeJob(job); bookshelf = bookshelfRepository.save(Bookshelf.create(user)); + bookshelfLike = BookshelfLike.create(user, bookshelf); + bookshelfLikeRepository.save(bookshelfLike); } @Test @@ -61,4 +66,15 @@ void findByUserIdAndBookshelfId() { bookshelfLikeRepository.findByUserIdAndBookshelfId(user.getId(), bookshelf.getId()); } + @Test + void save() { + BookshelfLike newBookshelfLike = BookshelfLike.create(user, bookshelf); + + System.out.println(bookshelfLike); + bookshelfLikeRepository.save(newBookshelfLike); + + System.out.println(bookshelfLike); + + } + } \ No newline at end of file From 3a41c0b3819a91b502ced8f3886db81349f1e734 Mon Sep 17 00:00:00 2001 From: youngji Date: Sun, 16 Apr 2023 20:32:49 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat=20:=20controller=20layer=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/BookshelfLikeController.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java index 0e58c8f4..9f0069cf 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java @@ -1,29 +1,55 @@ package com.dadok.gaerval.domain.bookshelf.api; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.dadok.gaerval.domain.bookshelf.service.BookshelfLikeService; +import com.dadok.gaerval.global.config.security.UserPrincipal; import lombok.RequiredArgsConstructor; -@RequestMapping("/api/bookshelf") +@RequestMapping("/api/bookshelf/{bookshelfId}/like") @RestController @RequiredArgsConstructor public class BookshelfLikeController { private final BookshelfLikeService bookshelfLikeService; - @PostMapping - public ResponseEntity createLike() { + /*** + *
+	 *     책장 좋아요 추가
+	 * 
+ * @param bookshelfId + * @param userPrincipal + * @return + */ + @PostMapping() + @PreAuthorize(value = "hasAnyRole('ROLE_ADMIN', 'ROLE_USER')") + public ResponseEntity createLike(@PathVariable Long bookshelfId, + @AuthenticationPrincipal UserPrincipal userPrincipal) { + bookshelfLikeService.createBookshelfLike(userPrincipal.getUserId(), bookshelfId); return ResponseEntity.ok().build(); } - @DeleteMapping - public ResponseEntity deleteLike() { + /*** + *
+	 *     책장 좋아요 해제
+	 * 
+ * @param bookshelfId + * @param userPrincipal + * @return + */ + @DeleteMapping() + @PreAuthorize(value = "hasAnyRole('ROLE_ADMIN', 'ROLE_USER')") + public ResponseEntity deleteLike(@PathVariable Long bookshelfId, + @AuthenticationPrincipal UserPrincipal userPrincipal) { + bookshelfLikeService.deleteBookshelfLike(userPrincipal.getUserId(), bookshelfId); return ResponseEntity.ok().build(); } } From a272f179c22c0a3f79ee0018f487616b443a7853 Mon Sep 17 00:00:00 2001 From: youngji Date: Sun, 16 Apr 2023 21:03:55 +0900 Subject: [PATCH 5/7] =?UTF-8?q?test=20:=20entity,=20repository=20test=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/BookshelfLikeController.java | 4 +- .../domain/bookshelf/entity/Bookshelf.java | 8 +-- .../bookshelf/entity/BookshelfLike.java | 8 +++ .../repository/BookshelfLikeSupport.java | 1 + .../service/DefaultBookshelfLikeService.java | 1 - .../bookshelf/entity/BookshelfLikeTest.java | 45 ++++++++++++--- .../BookshelfLikeRepositoryTest.java | 57 ++----------------- .../DefaultBookshelfLikeServiceTest.java | 5 ++ 8 files changed, 59 insertions(+), 70 deletions(-) create mode 100644 src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java index 9f0069cf..c25bf4f9 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java @@ -27,7 +27,7 @@ public class BookshelfLikeController { * * @param bookshelfId * @param userPrincipal - * @return + * @return status : ok */ @PostMapping() @PreAuthorize(value = "hasAnyRole('ROLE_ADMIN', 'ROLE_USER')") @@ -43,7 +43,7 @@ public ResponseEntity createLike(@PathVariable Long bookshelfId, * * @param bookshelfId * @param userPrincipal - * @return + * @return status : ok */ @DeleteMapping() @PreAuthorize(value = "hasAnyRole('ROLE_ADMIN', 'ROLE_USER')") diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java index c2f5f4d2..a878e293 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java @@ -84,7 +84,7 @@ public void addBookShelfItem(BookshelfItem bookshelfItem) { } public void addBookShelfLike(BookshelfLike bookshelfLike) { - CommonValidator.validateNotnull(bookshelfLike, "bookShelfItem"); + CommonValidator.validateNotnull(bookshelfLike, "bookshelfLike"); bookshelfLikes.add(bookshelfLike); } @@ -99,12 +99,6 @@ public void validateOwner(Long userId) { } } - public void validateNotOwner(Long userId) { - if (Objects.equals(userId, user.getId())) { - throw new BookshelfUserNotMatchedException(); - } - } - public void changeJobId(Long jobId) { CommonValidator.validateNotnull(jobId, "jobId"); this.jobId = jobId; diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java index 51e470ce..9340e8d5 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java @@ -12,6 +12,7 @@ import javax.persistence.Table; import javax.persistence.UniqueConstraint; +import com.dadok.gaerval.domain.bookshelf.exception.BookshelfUserNotMatchedException; import com.dadok.gaerval.domain.user.entity.User; import com.dadok.gaerval.global.common.JacocoExcludeGenerated; import com.dadok.gaerval.global.common.entity.BaseTimeColumn; @@ -47,6 +48,7 @@ public class BookshelfLike extends BaseTimeColumn { private BookshelfLike(User user, Bookshelf bookshelf) { CommonValidator.validateNotnull(bookshelf, "bookshelf"); CommonValidator.validateNotnull(user, "user"); + validateNotOwner(user, bookshelf); this.user = user; this.bookshelf = bookshelf; bookshelf.addBookShelfLike(this); @@ -56,6 +58,12 @@ public static BookshelfLike create(User user, Bookshelf bookshelf) { return new BookshelfLike(user, bookshelf); } + private void validateNotOwner(User user, Bookshelf bookshelf) { + if (Objects.equals(bookshelf.getUser().getId(), user.getId())) { + throw new BookshelfUserNotMatchedException(); + } + } + @Override @JacocoExcludeGenerated public boolean equals(Object o) { diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java index d6e87191..21202a3b 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java @@ -1,5 +1,6 @@ package com.dadok.gaerval.domain.bookshelf.repository; public interface BookshelfLikeSupport { + boolean existsByBookshelfIdAndUserId(Long bookshelfId, Long userId); } diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java index c7c4cb58..40c89177 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java @@ -28,7 +28,6 @@ public class DefaultBookshelfLikeService implements BookshelfLikeService { public void createBookshelfLike(Long userId, Long bookshelfId) { User user = userService.getById(userId); Bookshelf bookshelf = bookshelfService.getById(bookshelfId); - bookshelf.validateNotOwner(userId); if (bookshelfLikeRepository.existsByBookshelfIdAndUserId(bookshelfId, userId)) { throw new AlreadyExistsBookshelfLikeException(bookshelf.getId()); } diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java index 2883a86a..544529e7 100644 --- a/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLikeTest.java @@ -1,10 +1,15 @@ package com.dadok.gaerval.domain.bookshelf.entity; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; +import com.dadok.gaerval.domain.bookshelf.exception.BookshelfUserNotMatchedException; import com.dadok.gaerval.domain.user.entity.User; +import com.dadok.gaerval.global.error.exception.InvalidArgumentException; import com.dadok.gaerval.testutil.JobObjectProvider; import com.dadok.gaerval.testutil.UserObjectProvider; @@ -16,16 +21,42 @@ class BookshelfLikeTest { private final Bookshelf bookshelf = Bookshelf.create(owner); + @BeforeEach + void setUp() { + ReflectionTestUtils.setField(owner, "id", 1L); + ReflectionTestUtils.setField(user, "id", 2L); + } + + @Test + @DisplayName("create - 모든 필드가 유효 - 성공") + void create_success() { + assertDoesNotThrow(() -> { + BookshelfLike.create(user, bookshelf); + }); + } + @Test - @DisplayName("create") - void test() { - BookshelfLike bookshelfLike = BookshelfLike.create(user, bookshelf); - ReflectionTestUtils.setField(bookshelfLike, "id", 5L); + @DisplayName("create - 책장이 null일 경우 - 실패") + void create_bookshelfNull_fail() { + assertThrows(InvalidArgumentException.class, () -> { + BookshelfLike.create(user, null); + }); + } - BookshelfLike bookshelfLike2 = BookshelfLike.create(user, bookshelf); - ReflectionTestUtils.setField(bookshelfLike2, "id", 6L); + @Test + @DisplayName("create - 사용자가 null일 경우 - 실패") + void create_userNull_fail() { + assertThrows(InvalidArgumentException.class, () -> { + BookshelfLike.create(null, bookshelf); + }); + } - System.out.println(bookshelf.getBookshelfLikes()); + @Test + @DisplayName("create - 자신의 책장일경우 - 실패") + void create_BookshelfOwner_fail() { + assertThrows(BookshelfUserNotMatchedException.class, () -> { + BookshelfLike.create(owner, bookshelf); + }); } } \ No newline at end of file diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java index 3d0c39da..14cc88b2 100644 --- a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java @@ -1,23 +1,10 @@ package com.dadok.gaerval.domain.bookshelf.repository; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.test.context.TestConstructor; -import com.dadok.gaerval.domain.bookshelf.entity.Bookshelf; -import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; -import com.dadok.gaerval.domain.job.repository.JobRepository; -import com.dadok.gaerval.domain.user.entity.Authority; -import com.dadok.gaerval.domain.user.entity.Role; -import com.dadok.gaerval.domain.user.entity.User; -import com.dadok.gaerval.domain.user.entity.UserAuthority; -import com.dadok.gaerval.domain.user.repository.AuthorityRepository; -import com.dadok.gaerval.domain.user.repository.UserRepository; -import com.dadok.gaerval.global.oauth.OAuth2Attribute; import com.dadok.gaerval.repository.CustomDataJpaTest; -import com.dadok.gaerval.testutil.JobObjectProvider; -import com.dadok.gaerval.testutil.UserObjectProvider; import lombok.RequiredArgsConstructor; @@ -29,52 +16,16 @@ class BookshelfLikeRepositoryTest { private final BookshelfLikeRepository bookshelfLikeRepository; - private final BookshelfRepository bookshelfRepository; - - private final JobRepository jobRepository; - - private final AuthorityRepository authorityRepository; - - private final UserRepository userRepository; - - private Authority authority; - - private User user; - - private Bookshelf bookshelf; - - private BookshelfLike bookshelfLike; - - @BeforeEach - void setUp() { - authority = authorityRepository.save(Authority.create(Role.USER)); - var job = jobRepository.save(JobObjectProvider.backendJob()); - Authority authority = authorityRepository.getReferenceById(Role.USER); - OAuth2Attribute oAuth2Attribute = UserObjectProvider.kakaoAttribute(); - user = User.createByOAuth(oAuth2Attribute, UserAuthority.create(authority)); - userRepository.saveAndFlush(user); - - user.changeJob(job); - bookshelf = bookshelfRepository.save(Bookshelf.create(user)); - bookshelfLike = BookshelfLike.create(user, bookshelf); - bookshelfLikeRepository.save(bookshelfLike); - } - @Test @DisplayName("조회 - 책장과 사용자을 입력받아 entity 조회") void findByUserIdAndBookshelfId() { - bookshelfLikeRepository.findByUserIdAndBookshelfId(user.getId(), bookshelf.getId()); + bookshelfLikeRepository.findByUserIdAndBookshelfId(2L, 4L); } @Test - void save() { - BookshelfLike newBookshelfLike = BookshelfLike.create(user, bookshelf); - - System.out.println(bookshelfLike); - bookshelfLikeRepository.save(newBookshelfLike); - - System.out.println(bookshelfLike); - + @DisplayName("책장과 사용자를 입력받아 존재 여부 확인") + void existsByBookshelfIdAndUserId() { + bookshelfLikeRepository.existsByBookshelfIdAndUserId(2L, 4L); } } \ No newline at end of file diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java new file mode 100644 index 00000000..af569345 --- /dev/null +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java @@ -0,0 +1,5 @@ +package com.dadok.gaerval.domain.bookshelf.service; + +class DefaultBookshelfLikeServiceTest { + +} \ No newline at end of file From e783770addc38f87b0d2a90b926eef37dc539305 Mon Sep 17 00:00:00 2001 From: youngji Date: Sun, 16 Apr 2023 23:00:09 +0900 Subject: [PATCH 6/7] =?UTF-8?q?test=20:=20controller=20test=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 40 ++++++- .../api/BookshelfLikeController.java | 2 +- .../domain/bookshelf/entity/Bookshelf.java | 2 +- .../bookshelf/entity/BookshelfItem.java | 2 +- .../bookshelf/entity/BookshelfLike.java | 4 +- src/main/resources/sql/schema.sql | 15 +++ .../api/BookshelfLikeControllerTest.java | 96 ++++++++++++++++ .../DefaultBookshelfLikeServiceTest.java | 103 ++++++++++++++++++ 8 files changed, 257 insertions(+), 7 deletions(-) create mode 100644 src/test/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeControllerTest.java diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index d411ac50..545ecf71 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -427,6 +427,42 @@ include::{snippets}/bookshelf-controller-slice-test/find-summary-bookshelf-by-us include::{snippets}/bookshelf-controller-slice-test/find-summary-bookshelf-by-user-id/response-fields.adoc[] +=== 책장 좋아요 추가 + +==== Request + +include::{snippets}/bookshelf-like-controller-slice-test/create-like/http-request.adoc[] + +==== Path Parameter + +include::{snippets}/bookshelf-like-controller-slice-test/create-like/path-parameters.adoc[] + +==== Request Header + +include::{snippets}/bookshelf-like-controller-slice-test/create-like/request-headers.adoc[] + +==== Response + +include::{snippets}/bookshelf-like-controller-test/create-like/http-response.adoc[] + +=== 책장 좋아요 취소 + +==== Request + +include::{snippets}/bookshelf-like-controller-slice-test/delete-like/http-request.adoc[] + +==== Path Parameter + +include::{snippets}/bookshelf-like-controller-slice-test/delete-like/path-parameters.adoc[] + +==== Request Header + +include::{snippets}/bookshelf-like-controller-slice-test/delete-like/request-headers.adoc[] + +==== Response + +include::{snippets}/bookshelf-like-controller-test/delete-like/http-response.adoc[] + == Book - 책 === 책 검색 @@ -473,7 +509,6 @@ include::{snippets}/book-controller-slice-test/test-find-recent-query/http-respo include::{snippets}/book-controller-slice-test/test-find-recent-query/response-fields.adoc[] - === 책 상세 정보 ==== Request @@ -888,13 +923,14 @@ include::{snippets}/book-group-comment-controller-slice-test/delete-book-group-c include::{snippets}/book-group-comment-controller-slice-test/delete-book-group-comment_-should-return-ok/path-parameters.adoc[] - === 모임 검색 ==== Request + include::{snippets}/book-group-controller-slice-test/find-all-book-groups-by-query/http-request.adoc[] ==== Request Header + include::{snippets}/book-group-controller-slice-test/find-all-book-groups-by-query/request-headers.adoc[] ==== Request Parameter diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java index c25bf4f9..53e6a9b1 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeController.java @@ -14,7 +14,7 @@ import lombok.RequiredArgsConstructor; -@RequestMapping("/api/bookshelf/{bookshelfId}/like") +@RequestMapping("/api/bookshelves/{bookshelfId}/like") @RestController @RequiredArgsConstructor public class BookshelfLikeController { diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java index a878e293..3c0dddac 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/Bookshelf.java @@ -58,7 +58,7 @@ public class Bookshelf extends BaseTimeColumn { @JsonManagedReference @OneToMany(mappedBy = "bookshelf", cascade = CascadeType.PERSIST, orphanRemoval = true) - private final Set bookshelfLikes = new HashSet<>(); //set 덮어쓰기? + private final Set bookshelfLikes = new HashSet<>(); @Column(name = "job_id", nullable = true) private Long jobId; diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java index 1be4b566..4bb22ff8 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfItem.java @@ -27,7 +27,7 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "Bookshelf_items", +@Table(name = "Bookshelf_item", uniqueConstraints = { @UniqueConstraint(name = "bookshelf_id_book_id_unique_key", columnNames = {"bookshelf_id", "book_id"}) diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java index 9340e8d5..2a8cb96b 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/entity/BookshelfLike.java @@ -22,8 +22,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "Bookshelf_likes", +@Entity(name = "bookshelf_likes") +@Table( uniqueConstraints = { @UniqueConstraint(name = "bookshelf_id_user_id_unique_key", columnNames = {"bookshelf_id", "user_id"}) diff --git a/src/main/resources/sql/schema.sql b/src/main/resources/sql/schema.sql index 47d3fe11..7377b1d7 100644 --- a/src/main/resources/sql/schema.sql +++ b/src/main/resources/sql/schema.sql @@ -2,6 +2,8 @@ drop table if exists book_comments cascade; drop table if exists bookshelf_item cascade; +drop table if exists bookshelf_likes cascade; + drop table if exists bookshelves cascade; drop table if exists group_comments cascade; @@ -174,6 +176,19 @@ create table if not exists bookshelf_item foreign key (book_id) references books (id) ); +create table if not exists bookshelf_likes +( + id bigint auto_increment + primary key, + created_at datetime(6) not null, + modified_at datetime(6) null, + user_id bigint not null, + bookshelf_id bigint not null, + foreign key (bookshelf_id) references bookshelves (id), + foreign key (user_id) references users (id), + unique (user_id, bookshelf_id) + ); + create index job_id_index on bookshelves (job_id); diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeControllerTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeControllerTest.java new file mode 100644 index 00000000..14035ad7 --- /dev/null +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/api/BookshelfLikeControllerTest.java @@ -0,0 +1,96 @@ +package com.dadok.gaerval.domain.bookshelf.api; + +import static com.dadok.gaerval.global.config.security.jwt.AuthService.*; +import static org.mockito.Mockito.*; +import static org.springframework.restdocs.headers.HeaderDocumentation.*; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.restdocs.request.RequestDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.nio.charset.StandardCharsets; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; + +import com.dadok.gaerval.controller.ControllerSliceTest; +import com.dadok.gaerval.domain.bookshelf.service.BookshelfLikeService; +import com.dadok.gaerval.testutil.WithMockCustomOAuth2LoginUser; +import com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper; +import com.epages.restdocs.apispec.ResourceDocumentation; +import com.epages.restdocs.apispec.ResourceSnippetParameters; + +@WebMvcTest(controllers = BookshelfLikeController.class) +@WithMockCustomOAuth2LoginUser +class BookshelfLikeControllerSliceTest extends ControllerSliceTest { + + @MockBean + private BookshelfLikeService bookshelfLikeService; + + @DisplayName("createLike - 책장 좋아요 생성") + @Test + void createLike() throws Exception { + // Given + doNothing().when(bookshelfLikeService).createBookshelfLike(any(), eq(2L)); + + // When // Then + mockMvc.perform(post("/api/bookshelves/{bookshelvesId}/like", 2L) + .contentType(MediaType.APPLICATION_JSON) + .header(ACCESS_TOKEN_HEADER_NAME, MOCK_ACCESS_TOKEN) + .characterEncoding(StandardCharsets.UTF_8) + ).andExpect(status().isOk()) + .andDo(print()) + .andDo(this.restDocs.document( + requestHeaders( + headerWithName(ACCESS_TOKEN_HEADER_NAME).description(ACCESS_TOKEN_HEADER_NAME_DESCRIPTION) + ), + pathParameters( + parameterWithName("bookshelvesId").description("첵장 Id") + ) + )) + .andDo(MockMvcRestDocumentationWrapper.document("{class-name}/{method-name}", + ResourceDocumentation.resource(ResourceSnippetParameters.builder() + .requestHeaders( + headerWithName(ACCESS_TOKEN_HEADER_NAME).description(ACCESS_TOKEN_HEADER_NAME_DESCRIPTION)) + .pathParameters( + parameterWithName("bookshelvesId").description("첵장 Id") + ) + .build() + ))); + } + + @DisplayName("deleteLike - 책장 좋아요 삭제") + @Test + void deleteLike() throws Exception { + // Given + doNothing().when(bookshelfLikeService).deleteBookshelfLike(any(), eq(2L)); + + // When // Then + mockMvc.perform(delete("/api/bookshelves/{bookshelvesId}/like", 2L) + .contentType(MediaType.APPLICATION_JSON) + .header(ACCESS_TOKEN_HEADER_NAME, MOCK_ACCESS_TOKEN) + .characterEncoding(StandardCharsets.UTF_8) + ).andExpect(status().isOk()) + .andDo(print()) + .andDo(this.restDocs.document( + requestHeaders( + headerWithName(ACCESS_TOKEN_HEADER_NAME).description(ACCESS_TOKEN_HEADER_NAME_DESCRIPTION) + ), + pathParameters( + parameterWithName("bookshelvesId").description("첵장 Id") + ) + )) + .andDo(MockMvcRestDocumentationWrapper.document("{class-name}/{method-name}", + ResourceDocumentation.resource(ResourceSnippetParameters.builder() + .requestHeaders( + headerWithName(ACCESS_TOKEN_HEADER_NAME).description(ACCESS_TOKEN_HEADER_NAME_DESCRIPTION)) + .pathParameters( + parameterWithName("bookshelvesId").description("첵장 Id") + ) + .build() + ))); + } +} \ No newline at end of file diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java index af569345..2bb14bed 100644 --- a/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java @@ -1,5 +1,108 @@ package com.dadok.gaerval.domain.bookshelf.service; +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.Optional; + +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.springframework.test.util.ReflectionTestUtils; + +import com.dadok.gaerval.domain.bookshelf.entity.Bookshelf; +import com.dadok.gaerval.domain.bookshelf.entity.BookshelfLike; +import com.dadok.gaerval.domain.bookshelf.exception.AlreadyExistsBookshelfLikeException; +import com.dadok.gaerval.domain.bookshelf.repository.BookshelfLikeRepository; +import com.dadok.gaerval.domain.user.entity.User; +import com.dadok.gaerval.domain.user.service.UserService; +import com.dadok.gaerval.global.error.exception.ResourceNotfoundException; +import com.dadok.gaerval.testutil.JobObjectProvider; +import com.dadok.gaerval.testutil.UserObjectProvider; + +@ExtendWith(MockitoExtension.class) class DefaultBookshelfLikeServiceTest { + @InjectMocks + private DefaultBookshelfLikeService bookshelfLikeService; + + @Mock + private BookshelfLikeRepository bookshelfLikeRepository; + + @Mock + private BookshelfService bookshelfService; + + @Mock + private UserService userService; + + private final User user = UserObjectProvider.createKakaoUser(JobObjectProvider.backendJob()); + private final Bookshelf bookshelf = Bookshelf.create(UserObjectProvider.createNaverUser()); + + @Test + void createBookshelfLike_success() { + // Given + ReflectionTestUtils.setField(user, "id", 1L); + given(userService.getById(1L)) + .willReturn(user); + given(bookshelfService.getById(2L)) + .willReturn(bookshelf); + given(bookshelfLikeRepository.existsByBookshelfIdAndUserId(2L, 1L)) + .willReturn(Boolean.FALSE); + + // When + assertDoesNotThrow(() -> { + bookshelfLikeService.createBookshelfLike(1L, 2L); + }); + + // Then + assertThat(bookshelf.getBookshelfLikes().size()).isEqualTo(1); + } + + @Test + void createBookshelfLike_alreadyExist_fail() { + // Given + ReflectionTestUtils.setField(user, "id", 1L); + given(userService.getById(1L)) + .willReturn(user); + given(bookshelfService.getById(2L)) + .willReturn(bookshelf); + given(bookshelfLikeRepository.existsByBookshelfIdAndUserId(2L, 1L)) + .willReturn(Boolean.TRUE); + + // When // Then + assertThrows(AlreadyExistsBookshelfLikeException.class, () -> { + bookshelfLikeService.createBookshelfLike(1L, 2L); + }); + } + + @Test + void deleteBookshelfLike_success() { + // Given + ReflectionTestUtils.setField(user, "id", 1L); + BookshelfLike bookshelfLike = BookshelfLike.create(user, bookshelf); + + given(bookshelfLikeRepository.findByUserIdAndBookshelfId(1L, 2L)) + .willReturn(Optional.of(bookshelfLike)); + + // When // Then + assertDoesNotThrow(() -> { + bookshelfLikeService.deleteBookshelfLike(1L, 2L); + }); + } + + @Test + void deleteBookshelfLike_notExist_fail() { + // Given + given(bookshelfLikeRepository.findByUserIdAndBookshelfId(1L, 2L)) + .willReturn(Optional.empty()); + + // When // Then + assertThrows(ResourceNotfoundException.class, () -> { + bookshelfLikeService.deleteBookshelfLike(1L, 2L); + }); + } + } \ No newline at end of file From 55c9dc65e58c687dba4f599ef276886706ee800d Mon Sep 17 00:00:00 2001 From: youngji Date: Mon, 17 Apr 2023 12:31:44 +0900 Subject: [PATCH 7/7] =?UTF-8?q?chore=20:=20review=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/AlreadyExistsBookshelfLikeException.java | 10 ---------- .../bookshelf/repository/BookshelfLikeSupport.java | 2 +- .../bookshelf/repository/BookshelfLikeSupportImpl.java | 2 +- .../bookshelf/service/DefaultBookshelfLikeService.java | 2 +- .../repository/BookshelfLikeRepositoryTest.java | 3 +-- .../service/DefaultBookshelfLikeServiceTest.java | 4 ++-- 6 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java index cf7860f6..4c41288c 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/exception/AlreadyExistsBookshelfLikeException.java @@ -2,7 +2,6 @@ import static com.dadok.gaerval.global.error.ErrorCode.*; -import com.dadok.gaerval.global.error.ErrorCode; import com.dadok.gaerval.global.error.exception.BusinessException; public class AlreadyExistsBookshelfLikeException extends BusinessException { @@ -11,13 +10,4 @@ public AlreadyExistsBookshelfLikeException(Long bookshelfId) { super(ALREADY_EXISTS_BOOKSHELF_LIKE, String.format(ALREADY_EXISTS_BOOKSHELF_LIKE.getMessage(), bookshelfId)); } - @Override - public String getMessage() { - return super.getMessage(); - } - - @Override - public ErrorCode getErrorCode() { - return ALREADY_EXISTS_BOOKSHELF_LIKE; - } } diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java index 21202a3b..5ff02ead 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupport.java @@ -2,5 +2,5 @@ public interface BookshelfLikeSupport { - boolean existsByBookshelfIdAndUserId(Long bookshelfId, Long userId); + boolean existsLike(Long bookshelfId, Long userId); } diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java index a0abfcd4..9d1bb62d 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeSupportImpl.java @@ -12,7 +12,7 @@ public class BookshelfLikeSupportImpl implements BookshelfLikeSupport { private final JPAQueryFactory query; @Override - public boolean existsByBookshelfIdAndUserId(Long bookshelfId, Long userId) { + public boolean existsLike(Long bookshelfId, Long userId) { Integer fetchOne = query.selectOne().from(bookshelfLike) .where(bookshelfLike.bookshelf.id.eq(bookshelfId), bookshelfLike.user.id.eq(userId)) .fetchFirst(); diff --git a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java index 40c89177..b9a80d38 100644 --- a/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java +++ b/src/main/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeService.java @@ -28,7 +28,7 @@ public class DefaultBookshelfLikeService implements BookshelfLikeService { public void createBookshelfLike(Long userId, Long bookshelfId) { User user = userService.getById(userId); Bookshelf bookshelf = bookshelfService.getById(bookshelfId); - if (bookshelfLikeRepository.existsByBookshelfIdAndUserId(bookshelfId, userId)) { + if (bookshelfLikeRepository.existsLike(bookshelfId, userId)) { throw new AlreadyExistsBookshelfLikeException(bookshelf.getId()); } bookshelfLikeRepository.save(BookshelfLike.create(user, bookshelf)); diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java index 14cc88b2..0e264246 100644 --- a/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/repository/BookshelfLikeRepositoryTest.java @@ -25,7 +25,6 @@ void findByUserIdAndBookshelfId() { @Test @DisplayName("책장과 사용자를 입력받아 존재 여부 확인") void existsByBookshelfIdAndUserId() { - bookshelfLikeRepository.existsByBookshelfIdAndUserId(2L, 4L); + bookshelfLikeRepository.existsLike(2L, 4L); } - } \ No newline at end of file diff --git a/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java b/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java index 2bb14bed..adb9741c 100644 --- a/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java +++ b/src/test/java/com/dadok/gaerval/domain/bookshelf/service/DefaultBookshelfLikeServiceTest.java @@ -49,7 +49,7 @@ void createBookshelfLike_success() { .willReturn(user); given(bookshelfService.getById(2L)) .willReturn(bookshelf); - given(bookshelfLikeRepository.existsByBookshelfIdAndUserId(2L, 1L)) + given(bookshelfLikeRepository.existsLike(2L, 1L)) .willReturn(Boolean.FALSE); // When @@ -69,7 +69,7 @@ void createBookshelfLike_alreadyExist_fail() { .willReturn(user); given(bookshelfService.getById(2L)) .willReturn(bookshelf); - given(bookshelfLikeRepository.existsByBookshelfIdAndUserId(2L, 1L)) + given(bookshelfLikeRepository.existsLike(2L, 1L)) .willReturn(Boolean.TRUE); // When // Then