From afe33e87861d37acaf08549a2b2c0a3eea86a5d3 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 04:20:11 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fixture:=20=ED=94=BC=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20fixture=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/FeedCreateServiceRequestBuilder.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 bucketback-domain/src/testFixtures/java/com/programmers/bucketback/domains/feed/model/FeedCreateServiceRequestBuilder.java diff --git a/bucketback-domain/src/testFixtures/java/com/programmers/bucketback/domains/feed/model/FeedCreateServiceRequestBuilder.java b/bucketback-domain/src/testFixtures/java/com/programmers/bucketback/domains/feed/model/FeedCreateServiceRequestBuilder.java new file mode 100644 index 000000000..8e6a6301c --- /dev/null +++ b/bucketback-domain/src/testFixtures/java/com/programmers/bucketback/domains/feed/model/FeedCreateServiceRequestBuilder.java @@ -0,0 +1,14 @@ +package com.programmers.bucketback.domains.feed.model; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class FeedCreateServiceRequestBuilder { + public static FeedCreateServiceRequest build(final Long bucketId) { + return new FeedCreateServiceRequest( + bucketId, + "content" + ); + } +} From c6ea24bf9a485e018a6581858f4d4e0d1dd3a72a Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 04:20:34 +0900 Subject: [PATCH 2/8] =?UTF-8?q?test:=20=ED=94=BC=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/implementation/FeedAppenderTest.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java new file mode 100644 index 000000000..518f4c6ef --- /dev/null +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java @@ -0,0 +1,92 @@ +package com.programmers.bucketback.domains.feed.implementation; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.programmers.bucketback.domains.bucket.domain.Bucket; +import com.programmers.bucketback.domains.bucket.domain.BucketBuilder; +import com.programmers.bucketback.domains.bucket.domain.BucketItem; +import com.programmers.bucketback.domains.bucket.implementation.BucketReader; +import com.programmers.bucketback.domains.feed.domain.Feed; +import com.programmers.bucketback.domains.feed.domain.FeedItem; +import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequest; +import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequestBuilder; +import com.programmers.bucketback.domains.feed.repository.FeedRepository; +import com.programmers.bucketback.domains.item.implementation.ItemReader; + +@ExtendWith(MockitoExtension.class) +class FeedAppenderTest { + + @InjectMocks + private FeedAppender feedAppender; + + @Mock + private FeedRepository feedRepository; + + @Mock + private BucketReader bucketReader; + + @Mock + private ItemReader itemReader; + + @Test + @DisplayName("피드 생성 테스트를 한다.") + void feedAppendTest() { + // given + ArgumentCaptor feedArgumentCaptor = ArgumentCaptor.forClass(Feed.class); + + Long memberId = 1L; + Bucket bucket = BucketBuilder.build(); + FeedCreateServiceRequest request = FeedCreateServiceRequestBuilder.build(bucket.getId()); + + given(bucketReader.read(request.bucketId(), memberId)) + .willReturn(bucket); + + given(itemReader.read(anyLong())).willAnswer( + invocation -> bucket.getBucketItems().stream() + .filter(bucketItem -> bucketItem.getItem().getId() == invocation.getArgument(0)) + .findFirst() + .map(BucketItem::getItem) + .orElseThrow(() -> new AssertionError("아이템이 없습니다.")) + ); + + Feed expectedFeed = Feed.builder() + .memberId(memberId) + .hobby(bucket.getHobby()) + .content(request.content()) + .bucketName(bucket.getName()) + .bucketBudget(bucket.getBudget()) + .build(); + + List feedItems = bucket.getBucketItems().stream() + .map(bucketItem -> new FeedItem(bucketItem.getItem())) + .toList(); + + feedItems.forEach(expectedFeed::addFeedItem); + + given(feedRepository.save(any(Feed.class))) + .willReturn(expectedFeed); + + // when + feedAppender.append(memberId, request); + + // then + then(feedRepository).should().save(feedArgumentCaptor.capture()); + + Feed actualFeed = feedArgumentCaptor.getValue(); + assertThat(actualFeed) + .usingRecursiveComparison() + .isEqualTo(expectedFeed); + } + +} \ No newline at end of file From 89a980fdc03bf26e73422fe2446d23fdb1791792 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 04:34:44 +0900 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=ED=94=BC=EB=93=9C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=83=9D=EC=84=B1=ED=95=A0=20=EB=95=8C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0=20=EC=95=88=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bucketback/domains/feed/implementation/FeedAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bucketback-domain/src/main/java/com/programmers/bucketback/domains/feed/implementation/FeedAppender.java b/bucketback-domain/src/main/java/com/programmers/bucketback/domains/feed/implementation/FeedAppender.java index beb4c9389..f0a80ce7e 100644 --- a/bucketback-domain/src/main/java/com/programmers/bucketback/domains/feed/implementation/FeedAppender.java +++ b/bucketback-domain/src/main/java/com/programmers/bucketback/domains/feed/implementation/FeedAppender.java @@ -58,13 +58,13 @@ public Long append( /** 피드 아이템 생성 */ public List createFeedItems(final List itemIds) { return itemIds.stream() + .distinct() .map(itemId -> { Item item = itemReader.read(itemId); FeedItem feedItem = new FeedItem(item); return feedItem; }) - .distinct() .collect(Collectors.toList()); } From 27975195f2d78cefb794923ede319121187a7f0a Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 04:35:38 +0900 Subject: [PATCH 4/8] =?UTF-8?q?test:=20=EC=A4=91=EB=B3=B5=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=95=84=EC=9D=B4=EB=94=94=EA=B0=80=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9C=BC=EB=A1=9C=20=EB=93=A4=EC=96=B4?= =?UTF-8?q?=EC=99=94=EC=9D=84=20=EB=95=8C=20=ED=94=BC=EB=93=9C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/implementation/FeedAppenderTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java index 518f4c6ef..edad36813 100644 --- a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java @@ -4,6 +4,7 @@ import static org.mockito.BDDMockito.*; import java.util.List; +import java.util.stream.LongStream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,6 +23,8 @@ import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequest; import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequestBuilder; import com.programmers.bucketback.domains.feed.repository.FeedRepository; +import com.programmers.bucketback.domains.item.domain.Item; +import com.programmers.bucketback.domains.item.domain.ItemBuilder; import com.programmers.bucketback.domains.item.implementation.ItemReader; @ExtendWith(MockitoExtension.class) @@ -89,4 +92,34 @@ void feedAppendTest() { .isEqualTo(expectedFeed); } + @Test + @DisplayName("중복된 아이템 id에 대한 피드 아이템 생성 테스트를 한다.") + void createFeedItemsTest() { + // given + List itemIds = List.of(1L, 1L, 2L, 3L, 3L, 3L); + + List items = LongStream.range(1L, 3L) + .mapToObj(ItemBuilder::build) + .toList(); + + List expectedFeedItems = items.stream() + .map(FeedItem::new) + .toList(); + + given(itemReader.read(anyLong())).willAnswer( + invocation -> items.stream() + .filter(item -> item.getId() == invocation.getArgument(0)) + .findFirst() + .orElseThrow(() -> new AssertionError("아이템이 없습니다.")) + ); + + // when + List actualFeedItems = feedAppender.createFeedItems(itemIds); + + // then + assertThat(actualFeedItems) + .usingRecursiveComparison() + .isEqualTo(expectedFeedItems); + } + } \ No newline at end of file From 280d03078f58448eb5319fef6a35fe4d25b6bd60 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 04:55:29 +0900 Subject: [PATCH 5/8] =?UTF-8?q?test:=20=ED=94=BC=EB=93=9C=20=EC=A2=8B?= =?UTF-8?q?=EC=95=84=EC=9A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/implementation/FeedAppenderTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java index edad36813..90b998262 100644 --- a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java @@ -7,6 +7,7 @@ import java.util.stream.LongStream; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; @@ -18,10 +19,13 @@ import com.programmers.bucketback.domains.bucket.domain.BucketBuilder; import com.programmers.bucketback.domains.bucket.domain.BucketItem; import com.programmers.bucketback.domains.bucket.implementation.BucketReader; +import com.programmers.bucketback.domains.feed.FeedBuilder; import com.programmers.bucketback.domains.feed.domain.Feed; import com.programmers.bucketback.domains.feed.domain.FeedItem; +import com.programmers.bucketback.domains.feed.domain.FeedLike; import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequest; import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequestBuilder; +import com.programmers.bucketback.domains.feed.repository.FeedLikeRepository; import com.programmers.bucketback.domains.feed.repository.FeedRepository; import com.programmers.bucketback.domains.item.domain.Item; import com.programmers.bucketback.domains.item.domain.ItemBuilder; @@ -42,6 +46,12 @@ class FeedAppenderTest { @Mock private ItemReader itemReader; + @Mock + private FeedReader feedReader; + + @Mock + private FeedLikeRepository feedLikeRepository; + @Test @DisplayName("피드 생성 테스트를 한다.") void feedAppendTest() { @@ -122,4 +132,39 @@ void createFeedItemsTest() { .isEqualTo(expectedFeedItems); } + @Nested + @DisplayName("피드 좋아요 테스트") + class FeedLikeTest { + + @Test + @DisplayName("피드 좋아요를 한다.") + void likeTest() { + // given + ArgumentCaptor feedLikeArgumentCaptor = ArgumentCaptor.forClass(FeedLike.class); + + final Long memberId = 1L; + final Long feedId = 1L; + + final Feed feed = FeedBuilder.build(); + + FeedLike expectedFeedLike = new FeedLike(memberId, feed); + + given(feedReader.read(feedId)) + .willReturn(feed); + + given(feedReader.alreadyLiked(memberId, feed)) + .willReturn(false); + + // when + feedAppender.like(memberId, feedId); + + // then + then(feedLikeRepository).should().save(feedLikeArgumentCaptor.capture()); + FeedLike actualFeedLike = feedLikeArgumentCaptor.getValue(); + assertThat(actualFeedLike) + .usingRecursiveComparison() + .isEqualTo(expectedFeedLike); + + } + } } \ No newline at end of file From fa7b4e0a255409188c11a10d43beb5f3f44a6dee Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 05:00:03 +0900 Subject: [PATCH 6/8] =?UTF-8?q?test:=20=EC=9D=B4=EB=AF=B8=20=EC=A2=8B?= =?UTF-8?q?=EC=95=84=EC=9A=94=EB=A5=BC=20=EB=88=84=EB=A5=B8=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EC=97=90=20=EB=8C=80=ED=95=B4=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- .../feed/implementation/FeedAppenderTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java index 90b998262..ee60eab4e 100644 --- a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java @@ -30,6 +30,7 @@ import com.programmers.bucketback.domains.item.domain.Item; import com.programmers.bucketback.domains.item.domain.ItemBuilder; import com.programmers.bucketback.domains.item.implementation.ItemReader; +import com.programmers.bucketback.error.BusinessException; @ExtendWith(MockitoExtension.class) class FeedAppenderTest { @@ -166,5 +167,25 @@ void likeTest() { .isEqualTo(expectedFeedLike); } + + @Test + @DisplayName("이미 좋아요를 한 피드에 대해 좋아요를 한다.") + void alreadyLikedTest() { + // given + final Long memberId = 1L; + final Long feedId = 1L; + + final Feed feed = FeedBuilder.build(); + + given(feedReader.read(feedId)) + .willReturn(feed); + + given(feedReader.alreadyLiked(memberId, feed)) + .willReturn(true); + + // when & then + assertThatThrownBy(() -> feedAppender.like(memberId, feedId)) + .isInstanceOf(BusinessException.class); + } } } \ No newline at end of file From cd892f68ce47927237b690182d8c79acca21fce5 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 05:00:54 +0900 Subject: [PATCH 7/8] =?UTF-8?q?style:=20=ED=8C=8C=EC=9D=BC=20=EB=A7=88?= =?UTF-8?q?=EC=A7=80=EB=A7=89=EC=97=90=20=EA=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/feed/implementation/FeedAppenderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java index ee60eab4e..b5819dab4 100644 --- a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java @@ -188,4 +188,4 @@ void alreadyLikedTest() { .isInstanceOf(BusinessException.class); } } -} \ No newline at end of file +} From 1cd69e5388d48e3e7d6d7d474a8946273fad5708 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Wed, 29 Nov 2023 05:14:28 +0900 Subject: [PATCH 8/8] =?UTF-8?q?test:=20LongStream.range=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=98=EB=8A=94=20=EA=B0=92=EC=9D=98=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=EB=A5=BC=20=EA=B3=A0=EB=A0=A4=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/feed/implementation/FeedAppenderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java index b5819dab4..98a1ae3a2 100644 --- a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedAppenderTest.java @@ -109,7 +109,7 @@ void createFeedItemsTest() { // given List itemIds = List.of(1L, 1L, 2L, 3L, 3L, 3L); - List items = LongStream.range(1L, 3L) + List items = LongStream.range(1L, 4L) .mapToObj(ItemBuilder::build) .toList();