diff --git a/src/test/java/com/techeer/fashioncloud/domain/lookbook/service/LookBookServiceTest.java b/src/test/java/com/techeer/fashioncloud/domain/lookbook/service/LookBookServiceTest.java index 828596c..fefead1 100644 --- a/src/test/java/com/techeer/fashioncloud/domain/lookbook/service/LookBookServiceTest.java +++ b/src/test/java/com/techeer/fashioncloud/domain/lookbook/service/LookBookServiceTest.java @@ -1,148 +1,190 @@ -//package com.techeer.fashioncloud.domain.lookbook.service; -// -//import com.techeer.fashioncloud.domain.post.dto.request.LookBookCreateRequestDto; -//import com.techeer.fashioncloud.domain.post.dto.request.LookBookPostCreateRequestDto; -//import com.techeer.fashioncloud.domain.post.dto.response.LookBookPostDataResponseDto; -//import com.techeer.fashioncloud.domain.post.entity.LookBook; -//import com.techeer.fashioncloud.domain.post.entity.LookBookPost; -//import com.techeer.fashioncloud.domain.post.entity.Post; -//import com.techeer.fashioncloud.domain.post.repository.BookRepository; -//import com.techeer.fashioncloud.domain.post.repository.LookBookPostRepository; -//import com.techeer.fashioncloud.domain.post.repository.PostRepository; -//import com.techeer.fashioncloud.domain.post.service.LookBookService; -//import jakarta.transaction.Transactional; -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -//import org.junit.jupiter.api.extension.ExtendWith; -//import org.mockito.InjectMocks; -//import org.mockito.Mock; -//import org.mockito.junit.jupiter.MockitoExtension; -// -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Optional; -//import java.util.UUID; -// -//import static com.techeer.fashioncloud.fixture.PostFixtures.POST_FIXTURES; -//import static org.junit.jupiter.api.Assertions.assertEquals; -//import static org.mockito.ArgumentMatchers.any; -//import static org.mockito.Mockito.when; -// -//@ExtendWith(MockitoExtension.class) -//public class LookBookServiceTest { -// -// @Mock -// private LookBookPostRepository lookBookPostRepository; -// @InjectMocks -// private LookBookService lookBookService; -// -// @Mock -// private BookRepository bookRepository; -// -// @Mock -// private PostRepository postRepository; -// private LookBook lookBook; -// -// -// @BeforeEach -// @Transactional -// void setup() { -// lookBook = LookBook.builder() -// .id(UUID.fromString("0fb5a4a7-4743-4dc3-8a24-41cf9aef15ab")) -// .userId(UUID.fromString("eea26f3f-2457-49e7-9f69-3376ccdd72ee")) -// .title("title") -// .image("image") -// .build(); -// -// } -// -// -// @Test -// @DisplayName("룩북 생성") -// public void testLookBookCreate() { -// LookBookCreateRequestDto requestDto = LookBookCreateRequestDto.builder() -// .image(lookBook.getImage()) -// .title(lookBook.getTitle()) -// .userId(lookBook.getUserId()) -// .build(); -// -// -// when(bookRepository.save(any())).thenReturn(lookBook);//실제 repository를 주입받을 수 없으니 save가 동작하면 임의의 값을 리턴 -// LookBook look = lookBookService.lookBookCreate(requestDto); -// assertEquals(look, lookBook); -// -// -// } -// -// -// @Test -// @DisplayName("유저 ID로 룩북 목록 조회 테스트") -// public void testFindBookByUserId() { -// List expectedLookBooks = new ArrayList<>(); // 여기에 예상되는 LookBook 목록을 설정 -// when(bookRepository.findByUserId(lookBook.getUserId())).thenReturn(expectedLookBooks); -// assertEquals(expectedLookBooks, lookBookService.findBookByUserId(lookBook.getUserId())); -// } -// -// -// @Test -// @DisplayName("룩북 포스트 생성") -// public void testCreateLookBookPost() { -// UUID lookBookId = UUID.randomUUID(); // 임의의 룩북 ID 생성 -// UUID postId = UUID.fromString("eea26f3f-2457-49e7-9f69-3376ccdd72ee"); // 임의의 포스트 ID 생성 -// LookBookPostCreateRequestDto requestDto = LookBookPostCreateRequestDto.builder() -// .lookBookId(lookBookId) -// .postId(postId) -// .build(); -// -// Post post = POST_FIXTURES; -// -// LookBookPost expectedEntity = LookBookPost.builder() -// .lookBook(lookBook) -// .post(post) -// .build(); -// -// when(bookRepository.findById(lookBookId)).thenReturn(Optional.ofNullable(lookBook)); -// when(postRepository.findById(postId)).thenReturn(Optional.ofNullable(post)); -// when(lookBookPostRepository.save(any())).thenReturn(expectedEntity); -// -// LookBookPost createdEntity = lookBookService.lookBookPostCreate(requestDto); -// -// assertEquals(expectedEntity, createdEntity); -// } -// -// @Test -// @DisplayName("룩북 아이디로 룩북 포스트 목록 조회 테스트") -// public void testFindLookBookById() { -// // Arrange -// UUID lookBookId = UUID.randomUUID(); -// -// -// Post post = POST_FIXTURES; -// -// LookBookPost expectedLookBookPost1 = LookBookPost.builder() -// .lookBook(lookBook) -// .post(post) -// .build(); -// -// LookBookPost expectedLookBookPost2 = LookBookPost.builder() -// .lookBook(lookBook) -// .post(post) -// .build(); -// -// List expectedLookBookPosts = new ArrayList<>(); -// expectedLookBookPosts.add(expectedLookBookPost1); -// expectedLookBookPosts.add(expectedLookBookPost2); -// -// when(bookRepository.findById(lookBookId)).thenReturn(Optional.ofNullable(lookBook)); -// when(lookBookPostRepository.findByLookBook(lookBook)).thenReturn(expectedLookBookPosts); -// -// List result = lookBookService.findLookBookById(lookBookId); -// -// -// assertEquals(expectedLookBookPosts.size(), result.size()); -// -// } -// -// -//} \ No newline at end of file +package com.techeer.fashioncloud.domain.lookbook.service; + +import com.techeer.fashioncloud.domain.post.dto.request.LookBookCreateRequestDto; +import com.techeer.fashioncloud.domain.post.dto.request.LookBookPostCreateRequestDto; +import com.techeer.fashioncloud.domain.post.dto.response.LookBookGetResponseDto; +import com.techeer.fashioncloud.domain.post.dto.response.LookBookPostDataResponseDto; +import com.techeer.fashioncloud.domain.post.dto.response.LookBookResponseDto; +import com.techeer.fashioncloud.domain.post.dto.response.PostInfoResponseDto; +import com.techeer.fashioncloud.domain.post.entity.LookBook; +import com.techeer.fashioncloud.domain.post.entity.LookBookPost; +import com.techeer.fashioncloud.domain.post.entity.Post; +import com.techeer.fashioncloud.domain.post.repository.LookBookPostRepository; +import com.techeer.fashioncloud.domain.post.repository.LookBookRepository; +import com.techeer.fashioncloud.domain.post.repository.PostRepository; +import com.techeer.fashioncloud.domain.post.service.LookBookService; +import com.techeer.fashioncloud.fixture.PostFixtures; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static com.techeer.fashioncloud.fixture.PostFixtures.POST_FIXTURES_1; +import static org.hibernate.validator.internal.util.Contracts.assertNotNull; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static com.techeer.fashioncloud.fixture.PostFixtures.POST_FIXTURES; +import static com.techeer.fashioncloud.fixture.UserFixtures.USER_FIXTURES; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class LookBookServiceTest { + + @Mock + private LookBookRepository lookBookRepository; + @InjectMocks + private LookBookService lookBookService; + + @Mock + private LookBookPostRepository bookRepository; + + @Mock + private PostRepository postRepository; + private LookBook lookBook; + private LookBook lookBook2; + + + @BeforeEach + @Transactional + void setup() { + lookBook = LookBook.builder() + .id(1L) + .user(USER_FIXTURES) + .title("title1") + .image("image1") + .build(); + + + lookBook2 = LookBook.builder() + .id(2L) + .user(USER_FIXTURES) + .title("title1") + .image("image1") + .build(); + + } + + + @Test + @DisplayName("룩북 생성") + public void testLookBookCreate() { + + + LookBookCreateRequestDto requestDto = LookBookCreateRequestDto.builder() + .image(lookBook.getImage()) + .title(lookBook.getTitle()) + .build(); + + + when(lookBookRepository.save(any())).thenReturn(lookBook);//실제 repository를 주입받을 수 없으니 save가 동작하면 임의의 값을 리턴 + LookBookResponseDto look = lookBookService.lookBookCreate(USER_FIXTURES, requestDto); + + + assertEquals(LookBookResponseDto.of(lookBook).getId(), look.getId()); + } + + + @Test + @DisplayName("유저 ID로 룩북 목록 조회 테스트") + public void testFindBookByUserId() { + + + List expectedLookBooks = new ArrayList<>(); + expectedLookBooks.add(lookBook); + expectedLookBooks.add(lookBook2); + when(lookBookRepository.findByUserId(lookBook.getUser().getId())).thenReturn(expectedLookBooks); + + List result = lookBookService.findLookBooksByUserId(lookBook.getUser().getId()); + + // 예상 결과와 실제 결과를 비교 + assertEquals(expectedLookBooks.size(), result.size()); + + for (int i = 0; i < expectedLookBooks.size(); i++) { + LookBookResponseDto expectedDto = LookBookResponseDto.of(expectedLookBooks.get(i)); + LookBookResponseDto actualDto = result.get(i); + assertEquals(expectedDto.getId(), actualDto.getId()); + assertEquals(expectedDto.getUserId(), actualDto.getUserId()); + + } + + } + + @Test + @DisplayName("룩북 포스트 생성") + public void testCreateLookBookPost() { + Long lookBookId = 1L; + Long userId = 1L; + UUID postId = UUID.fromString("eea26f3f-2457-49e7-9f69-3376ccdd72ee"); + + Post post = POST_FIXTURES; + + LookBookPost expectedEntity = LookBookPost.builder() + .lookBook(lookBook) + .post(post) + .build(); + + when(lookBookRepository.findById(lookBookId)).thenReturn(Optional.ofNullable(lookBook)); + when(postRepository.findById(postId)).thenReturn(Optional.ofNullable(post)); + + assertDoesNotThrow(() -> lookBookService.addPostToLookBook(userId, 1L, postId)); + + // 호출한 메서드가 예상대로 동작했는지 여부를 확인 (예를 들어, 레파지토리 또는 다른 메서드 호출 여부) + verify(lookBookRepository, times(1)).findById(lookBookId); + verify(postRepository, times(1)).findById(postId); + // 결과가 예상한 엔티티와 일치하는지 확인 + } + + + + @Test + @DisplayName("룩북 아이디로 룩북 포스트 목록 조회 테스트") + public void testFindLookBookById() { + + Long lookBookId=1L; + List posts= new ArrayList<>(); + posts.add(POST_FIXTURES); + posts.add(POST_FIXTURES_1); + + when(lookBookRepository.findById(lookBookId)).thenReturn(Optional.ofNullable(lookBook)); + when(postRepository.getLookBookPosts(lookBook)).thenReturn(posts); + + LookBookGetResponseDto result = lookBookService.getLookBookById(lookBookId); + + assertNotNull(result); // 결과가 null이 아닌지 확인 + + // 결과의 필드를 확인 + assertEquals(lookBook.getTitle(), result.getTitle()); + assertEquals(lookBook.getImage(), result.getImage()); + assertEquals(lookBook.getUser().getId(), result.getUserId()); + assertEquals(lookBook.getUser().getUsername(), result.getUsername()); + assertEquals(lookBook.getCreatedAt(), result.getCreatedAt()); + assertEquals(lookBook.getUpdatedAt(), result.getUpdatedAt()); + + // 포스트 목록의 길이 확인 + assertEquals(posts.size(), result.getPosts().size()); + + + for (int i = 0; i < posts.size(); i++) { + Post post = posts.get(i); + PostInfoResponseDto postDto = result.getPosts().get(i); + assertEquals(post.getId(), postDto.getId()); + + } + + } + + +} \ No newline at end of file diff --git a/src/test/java/com/techeer/fashioncloud/domain/post/service/PostServiceTest.java b/src/test/java/com/techeer/fashioncloud/domain/post/service/PostServiceTest.java index 1c2fef7..7f89d44 100644 --- a/src/test/java/com/techeer/fashioncloud/domain/post/service/PostServiceTest.java +++ b/src/test/java/com/techeer/fashioncloud/domain/post/service/PostServiceTest.java @@ -4,6 +4,7 @@ //import com.techeer.fashioncloud.domain.post.entity.Post; //import com.techeer.fashioncloud.domain.post.repository.PostRepository; //import com.techeer.fashioncloud.domain.weather.constant.RainfallType; +//import com.techeer.fashioncloud.domain.weather.enums.SkyStatus; //import com.techeer.fashioncloud.global.entity.BaseEntity; //import jakarta.transaction.Transactional; //import org.junit.jupiter.api.BeforeEach; @@ -18,7 +19,6 @@ //import java.util.Optional; //import java.util.UUID; // -//import static com.techeer.fashioncloud.domain.post.enums.Review.추웠다; //import static com.techeer.fashioncloud.fixture.PostFixtures.POST_FIXTURES; //import static com.techeer.fashioncloud.fixture.PostFixtures.UPLOAD_POST_FIXTURES; //import static org.junit.Assert.assertEquals; diff --git a/src/test/java/com/techeer/fashioncloud/fixture/PostFixtures.java b/src/test/java/com/techeer/fashioncloud/fixture/PostFixtures.java index 02c2af1..c33a116 100644 --- a/src/test/java/com/techeer/fashioncloud/fixture/PostFixtures.java +++ b/src/test/java/com/techeer/fashioncloud/fixture/PostFixtures.java @@ -1,32 +1,55 @@ -//package com.techeer.fashioncloud.fixture; -// -//import com.techeer.fashioncloud.domain.post.entity.Post; -//import com.techeer.fashioncloud.domain.weather.constant.RainfallType; -// -//import java.util.UUID; -// -//import static com.techeer.fashioncloud.domain.post.enums.Review.추웠다; -// -//public class PostFixtures { -// public static final Post POST_FIXTURES = -// Post.builder() -// .userId(UUID.randomUUID()) -// .name("AA") -// .image("aaa") -// .skyStatus(SkyStatus.CLEAR) -// .rainfallType(RainfallType.CLEAR) -// .review(추웠다) -// .windChill(3.0) -// .build(); +package com.techeer.fashioncloud.fixture; + +import com.techeer.fashioncloud.domain.post.entity.Post; +import com.techeer.fashioncloud.domain.post.enums.Review; +import com.techeer.fashioncloud.domain.weather.enums.RainfallType; +import com.techeer.fashioncloud.domain.weather.enums.SkyStatus; + +import java.util.UUID; + +import static com.techeer.fashioncloud.fixture.UserFixtures.USER_FIXTURES; + + +public class PostFixtures { + public static final Post POST_FIXTURES = + Post.builder() + .id(UUID.randomUUID()) + .user(USER_FIXTURES) + .image("aaa") + .review(Review.CHILLY) + .temperature(10.0) + .skyStatus(SkyStatus.CLOUDY) + .windChill(3.0) + .build(); + public static final Post POST_FIXTURES_1 = + Post.builder() + .id(UUID.randomUUID()) + .user(USER_FIXTURES) + .image("aaa1") + .review(Review.CHILLY) + .temperature(10.0) + .skyStatus(SkyStatus.CLOUDY) + .windChill(3.0) + .build(); + public static final Post POST_FIXTURES_2 = + Post.builder() + .id(UUID.randomUUID()) + .user(USER_FIXTURES) + .image("aaa2") + .review(Review.CHILLY) + .temperature(10.0) + .skyStatus(SkyStatus.CLOUDY) + .windChill(3.0) + .build(); // public static final PostCreateServiceDto UPLOAD_POST_FIXTURES = -// PostCreateServiceDto.builder() +// PostCreateServiceDto.builder() // .userId(UUID.randomUUID()) // .name("AA") -// .image("aaa") +// .image("aaa") // .skyStatus(SkyStatus.CLEAR) // .temperature(3.0) // .rainfallType(RainfallType.CLEAR) // .windSpeed(7.0) // .review(추웠다) // .build(); -//} \ No newline at end of file +} \ No newline at end of file diff --git a/src/test/java/com/techeer/fashioncloud/fixture/UserFixtures.java b/src/test/java/com/techeer/fashioncloud/fixture/UserFixtures.java new file mode 100644 index 0000000..386e91c --- /dev/null +++ b/src/test/java/com/techeer/fashioncloud/fixture/UserFixtures.java @@ -0,0 +1,47 @@ +package com.techeer.fashioncloud.fixture; + + +import com.techeer.fashioncloud.domain.auth.enums.ROLE; +import com.techeer.fashioncloud.domain.post.entity.Post; +import com.techeer.fashioncloud.domain.user.entity.User; +import com.techeer.fashioncloud.domain.weather.enums.RainfallType; +import com.techeer.fashioncloud.domain.weather.enums.SkyStatus; + +import java.util.UUID; + +public class UserFixtures { + + public static final User USER_FIXTURES = + User.builder() + .id(1L) + .email("fashion@naver.com") + .password("fashion") + .username("username") + .profileUrl("imageUrl") + .address("address") + .role(ROLE.ADMIN) + .build(); + + public static final User USER_FIXTURES_1 = + User.builder() + .id(2L) + .email("fashion1@naver.com") + .password("fashion") + .username("username1") + .profileUrl("imageUrl") + .address("address") + .role(ROLE.ADMIN) + .build(); + + + public static final User USER_FIXTURES_2 = + User.builder() + .id(3L) + .email("fashion2@naver.com") + .password("fashion") + .username("username2") + .profileUrl("imageUrl") + .address("address") + .role(ROLE.ADMIN) + .build(); +}