From ec2ece431a9f895f283cf79e7aebf268405c3e68 Mon Sep 17 00:00:00 2001 From: hyunseo Date: Fri, 15 Nov 2024 14:23:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[docs]=20erd=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 78fe53f8..889ef76b 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,20 @@ ## 목차 -> 1. [**_프로젝트 목적_**](#프로젝트-목적) +> 1. [**_프로젝트 목적_**](#프로젝트-목적) > 2. [**_서비스 정보_**](#서비스-정보) > 3. [**_개발 기간_**](#개발-기간) > 4. [**_배포 주소_**](#배포-주소) > 5. [**_팀원_**](#팀원) -> 6. [**_프로그램 구조_**](#프로그램-구조) -> 7. [**_API & ERD_**](#api--erd) -> 8. [**_저장소 정보_**](#저장소-정보) -> 9. [**_프로그램 구조_**](#프로그램-구조) -> 10. [**_주요 종속성 버전_**](#주요-종속성-버전) +> 6. [**_프로그램 구조_**](#프로그램-구조) +> 7. [**_API & ERD_**](#api--erd) +> 8. [**_저장소 정보_**](#저장소-정보) +> 9. [**_프로그램 구조_**](#프로그램-구조) +> 10. [**_주요 종속성 버전_**](#주요-종속성-버전) > 11. [**_기술 스택_**](#기술-스택) -> 12. [**_테스트_**](#테스트) -> 13. [**_세부 기능 흐름_**](#세부-기능-흐름) -> 14. [**_사용 예시_**](#사용-예시) - +> 12. [**_테스트_**](#테스트) +> 13. [**_세부 기능 흐름_**](#세부-기능-흐름) +> 14. [**_사용 예시_**](#사용-예시) ## 프로젝트 목적 @@ -142,7 +141,7 @@ > [**API Spec**](https://www.notion.so/API-9e96d1ef1475414b861a50d0e4ca366e) : _https://www.notion.so/API-9e96d1ef1475414b861a50d0e4ca366e_ -![image](https://github.com/user-attachments/assets/17cedf5c-c554-4723-9b08-6635005ea0b2) +![image](https://github.com/user-attachments/assets/fa35ff5f-bd6f-4693-9866-f67a9ccac4ff) > [**ERD**](https://www.notion.so/ERD-36ec8e40cb264abe87588e97ae77ac55) : > https://www.notion.so/ERD-36ec8e40cb264abe87588e97ae77ac55 @@ -260,7 +259,6 @@ _https://www.notion.so/API-9e96d1ef1475414b861a50d0e4ca366e_ - ### Place - 내가 좋아요한 장소 조회 시 인플루언서 정보 일부를 함께 반환합니다. - ## 사용 예시 > 실제 유저 사용 페이지 흐름 보여주기 ( 영상 x ) From 64d3e50984defe12507a98743a5cd72427160f62 Mon Sep 17 00:00:00 2001 From: hyunseo Date: Fri, 15 Nov 2024 16:00:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[test]=20=EC=9E=91=EC=84=B1=ED=95=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=ED=99=98=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 --- .../inplace/review/ReviewServiceTest.java | 73 ++++++++++++------- 1 file changed, 46 insertions(+), 27 deletions(-) diff --git a/src/test/java/team7/inplace/review/ReviewServiceTest.java b/src/test/java/team7/inplace/review/ReviewServiceTest.java index b662624b..93c97d72 100644 --- a/src/test/java/team7/inplace/review/ReviewServiceTest.java +++ b/src/test/java/team7/inplace/review/ReviewServiceTest.java @@ -1,5 +1,18 @@ package team7.inplace.review; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.verify; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -17,6 +30,7 @@ import team7.inplace.place.domain.Place; import team7.inplace.place.persistence.PlaceRepository; import team7.inplace.review.application.ReviewService; +import team7.inplace.review.application.dto.MyReviewInfo; import team7.inplace.review.application.dto.ReviewCommand; import team7.inplace.review.application.dto.ReviewInfo; import team7.inplace.review.domain.Review; @@ -28,18 +42,6 @@ import team7.inplace.user.domain.UserType; import team7.inplace.user.persistence.UserRepository; -import java.time.LocalDateTime; -import java.util.Arrays; -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.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) public class ReviewServiceTest { @@ -75,13 +77,13 @@ void setUp() { user = new User("name", "password", "nickname", UserType.KAKAO, Role.USER); place = new Place("name", "facility", "menuImgUrl", "category", - "Address 1|Address 2|Address 3", "x", "y", - Arrays.asList("한글날|수|N", "크리스마스|수|Y"), - Arrays.asList("오픈 시간|9:00 AM|월", "닫는 시간|6:00 PM|월"), - Arrays.asList("삼겹살|5000|false|menu.url|description", - "돼지찌개|7000|true|menu.url|description"), - LocalDateTime.of(2024, 3, 28, 5, 30), - Arrays.asList("menuBoard1.url", "menuBoard2.url") + "Address 1|Address 2|Address 3", "x", "y", + Arrays.asList("한글날|수|N", "크리스마스|수|Y"), + Arrays.asList("오픈 시간|9:00 AM|월", "닫는 시간|6:00 PM|월"), + Arrays.asList("삼겹살|5000|false|menu.url|description", + "돼지찌개|7000|true|menu.url|description"), + LocalDateTime.of(2024, 3, 28, 5, 30), + Arrays.asList("menuBoard1.url", "menuBoard2.url") ); command = new ReviewCommand(isLiked, comment); @@ -118,8 +120,8 @@ void createReviewTest_ReviewAlreadyExists() { given(reviewRepository.existsByUserIdAndPlaceId(userId, placeId)).willReturn(true); assertThatThrownBy(() -> reviewService.createReview(placeId, command)) - .isInstanceOf(InplaceException.class) - .hasMessage(ReviewErrorCode.REVIEW_ALREADY_EXISTS.getMessage()); + .isInstanceOf(InplaceException.class) + .hasMessage(ReviewErrorCode.REVIEW_ALREADY_EXISTS.getMessage()); authorizationUtil.close(); } @@ -140,8 +142,8 @@ void getReviews_LoggedIn() { Page result = reviewService.getReviews(placeId, pageable); assertThat(result.getContent().get(0)) - .extracting("comment", "mine") - .containsExactly(comment, true); + .extracting("comment", "mine") + .containsExactly(comment, true); authorizationUtil.close(); } @@ -160,8 +162,8 @@ void getReviews_NotLoggedIn() { Page result = reviewService.getReviews(placeId, pageable); assertThat(result.getContent().get(0)) - .extracting("comment", "mine") - .containsExactly(comment, false); + .extracting("comment", "mine") + .containsExactly(comment, false); authorizationUtil.close(); } @@ -181,9 +183,26 @@ void deleteReview_NotOwner() { given(userMock.getId()).willReturn(1L); // 리뷰의 userId가 1L assertThatThrownBy(() -> reviewService.deleteReview(reviewId)) - .isInstanceOf(InplaceException.class) - .hasMessage(ReviewErrorCode.NOT_OWNER.getMessage()); + .isInstanceOf(InplaceException.class) + .hasMessage(ReviewErrorCode.NOT_OWNER.getMessage()); authorizationUtil.close(); } + + @Test + void getMyReviewsTest() { + Pageable pageable = PageRequest.of(0, 10); + Review myReview = new Review(user, place, isLiked, comment); + Page reviewPage = new PageImpl<>(List.of(myReview)); + + given(reviewRepository.findByUserIdWithPlace(userId, pageable)).willReturn( + reviewPage); + + Page result = reviewService.getMyReviews(userId, pageable); + + verify(reviewRepository).findByUserIdWithPlace(userId, pageable); + assertThat(result.getContent().get(0)).isInstanceOf(MyReviewInfo.class); + assertThat(result.getContent().get(0).comment()).isEqualTo(myReview.getComment()); + assertThat(result.getContent().get(0).placeInfo().placeName()).isEqualTo(place.getName()); + } } From c4b4d4e083060bf8164b1eae3f3ff72c697e59d7 Mon Sep 17 00:00:00 2001 From: hyunseo Date: Fri, 15 Nov 2024 16:00:41 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[test]=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=9E=A5=EC=86=8C=20=EB=B0=98=ED=99=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../place/application/PlaceServiceTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/team7/inplace/place/application/PlaceServiceTest.java b/src/test/java/team7/inplace/place/application/PlaceServiceTest.java index fce4c233..6e60b5a8 100644 --- a/src/test/java/team7/inplace/place/application/PlaceServiceTest.java +++ b/src/test/java/team7/inplace/place/application/PlaceServiceTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mockStatic; @@ -13,6 +14,7 @@ import java.lang.reflect.Field; import java.time.LocalDateTime; import java.util.Arrays; +import java.util.List; import java.util.Optional; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -33,6 +35,7 @@ import team7.inplace.place.application.command.PlaceLikeCommand; import team7.inplace.place.application.command.PlacesCommand.PlacesCoordinateCommand; import team7.inplace.place.application.command.PlacesCommand.PlacesFilterParamsCommand; +import team7.inplace.place.application.dto.LikedPlaceInfo; import team7.inplace.place.application.dto.PlaceDetailInfo; import team7.inplace.place.application.dto.PlaceInfo; import team7.inplace.place.domain.Category; @@ -664,4 +667,24 @@ public void likedTest2() { .isLiked()) .isFalse(); } + + @Test + void getLikedPlaceInfoTest() { + Pageable pageable = PageRequest.of(0, 10); + Long userId = 1L; + LikedPlace likedPlace = new LikedPlace(user1, place1); + + Page likedPlacePage = new PageImpl<>(List.of(likedPlace)); + + given(likedPlaceRepository.findByUserIdAndIsLikedTrueWithPlace(userId, pageable)) + .willReturn(likedPlacePage); + given(videoRepository.findByPlaceIdInWithInfluencer(anyList())) + .willReturn(List.of(video1)); + + Page result = placeService.getLikedPlaceInfo(userId, pageable); + + verify(likedPlaceRepository).findByUserIdAndIsLikedTrueWithPlace(userId, pageable); + assertThat(result.getContent().get(0)).isInstanceOf(LikedPlaceInfo.class); + assertThat(result.getContent().get(0).influencerName()).isEqualTo(influencer1.getName()); + } } From 86a5cad297167d792ddeeab8a89c7566efb54e2e Mon Sep 17 00:00:00 2001 From: hyunseo Date: Fri, 15 Nov 2024 16:00:54 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[test]=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=9D=B8=ED=94=8C=EB=A3=A8=EC=96=B8=EC=84=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=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 --- .../FavoriteInfluencerServiceTest.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/test/java/team7/inplace/favoriteInfluencer/FavoriteInfluencerServiceTest.java diff --git a/src/test/java/team7/inplace/favoriteInfluencer/FavoriteInfluencerServiceTest.java b/src/test/java/team7/inplace/favoriteInfluencer/FavoriteInfluencerServiceTest.java new file mode 100644 index 00000000..094ab7a6 --- /dev/null +++ b/src/test/java/team7/inplace/favoriteInfluencer/FavoriteInfluencerServiceTest.java @@ -0,0 +1,58 @@ +package team7.inplace.favoriteInfluencer; + + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +import java.util.List; +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.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import team7.inplace.favoriteInfluencer.application.FavoriteInfluencerService; +import team7.inplace.favoriteInfluencer.domain.FavoriteInfluencer; +import team7.inplace.favoriteInfluencer.persistent.FavoriteInfluencerRepository; +import team7.inplace.influencer.application.dto.InfluencerInfo; +import team7.inplace.influencer.domain.Influencer; +import team7.inplace.user.domain.Role; +import team7.inplace.user.domain.User; +import team7.inplace.user.domain.UserType; + +@ExtendWith(MockitoExtension.class) +public class FavoriteInfluencerServiceTest { + + @Mock + private FavoriteInfluencerRepository favoriteRepository; + + @InjectMocks + private FavoriteInfluencerService favoriteInfluencerService; + + @Test + void getFavoriteInfluencers() { + Pageable pageable = PageRequest.of(0, 10); + Long userId = 1L; + User user = new User("name", "password", "nickname", UserType.KAKAO, Role.USER); + Influencer influencer1 = new Influencer("influencer1", "imgUrl1", "job1"); + FavoriteInfluencer favoriteInfluencer1 = new FavoriteInfluencer(user, influencer1); + favoriteInfluencer1.updateLike(true); + Page favoriteInfluencersPage = new PageImpl<>( + List.of(favoriteInfluencer1)); + + given(favoriteRepository.findByUserIdAndIsLikedTrue(userId, pageable)) + .willReturn(favoriteInfluencersPage); + + Page result = favoriteInfluencerService.getFavoriteInfluencers(userId, + pageable); + + verify(favoriteRepository).findByUserIdAndIsLikedTrue(userId, pageable); + assertThat(result.getContent().get(0)).isInstanceOf(InfluencerInfo.class); + assertThat(result.getContent().get(0).influencerName()).isEqualTo(influencer1.getName()); + assertThat(result.getContent().get(0).likes()).isEqualTo(true); + } +}