From 79815ebd686a431018d3cc453fec61c2896d21a1 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Fri, 26 Jan 2024 15:15:40 +0900 Subject: [PATCH 01/12] =?UTF-8?q?test:=20=EC=B1=84=ED=8C=85=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=ED=8B=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅 서비스 테스트 코드 틀 작성 --- .../domain/chat/service/ChatServiceTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java new file mode 100644 index 00000000..6032a705 --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java @@ -0,0 +1,41 @@ +package kr.co.fastcampus.yanabada.domain.chat.service; + +import kr.co.fastcampus.yanabada.domain.chat.repository.ChatMessageRepository; +import kr.co.fastcampus.yanabada.domain.chat.repository.ChatRoomRepository; +import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; +import kr.co.fastcampus.yanabada.domain.notification.service.NotificationService; +import kr.co.fastcampus.yanabada.domain.product.repository.ProductRepository; +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; + +@ExtendWith(MockitoExtension.class) +public class ChatServiceTest { + + @Mock + private ChatRoomRepository chatRoomRepository; + + @Mock + private ChatMessageRepository chatMessageRepository; + + @Mock + private MemberRepository memberRepository; + + @Mock + private ProductRepository productRepository; + + @Mock + private NotificationService notificationService; + + @InjectMocks + private ChatService chatService; + + @Test + @DisplayName("숙박 종료 날짜가 시작") + void + + +} From 2965735af1e434e4fe8cb3340aeeff159d3473fc Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:41:27 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20DB=20=ED=81=B4=EB=A6=AC=EB=84=88?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB 클리너 클래스 구현 --- .../common/utils/DatabaseCleaner.java | 45 +++++++++++++++++++ .../common/utils/DatabaseClearExtension.java | 19 ++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseCleaner.java create mode 100644 src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseClearExtension.java diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseCleaner.java b/src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseCleaner.java new file mode 100644 index 00000000..a97c5b51 --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseCleaner.java @@ -0,0 +1,45 @@ +package kr.co.fastcampus.yanabada.common.utils; + +import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import java.util.ArrayList; +import java.util.List; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class DatabaseCleaner { + + private final List tableNames = new ArrayList<>(); + + @PersistenceContext + private EntityManager entityManager; + + @SuppressWarnings("unchecked") + @PostConstruct + private void findDatabaseTableNames() { + List tableInfos = entityManager.createNativeQuery("SHOW TABLES").getResultList(); + for (Object[] tableInfo : tableInfos) { + String tableName = (String) tableInfo[0]; + tableNames.add(tableName); + } + } + + private void truncate() { + entityManager.createNativeQuery(String.format("SET FOREIGN_KEY_CHECKS %d", 0)) + .executeUpdate(); + for (String tableName : tableNames) { + entityManager.createNativeQuery(String.format("TRUNCATE TABLE %s", tableName)) + .executeUpdate(); + } + entityManager.createNativeQuery(String.format("SET FOREIGN_KEY_CHECKS %d", 1)) + .executeUpdate(); + } + + @Transactional + public void clear() { + entityManager.clear(); + truncate(); + } +} diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseClearExtension.java b/src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseClearExtension.java new file mode 100644 index 00000000..e8deda2f --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/common/utils/DatabaseClearExtension.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.common.utils; + +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +public class DatabaseClearExtension implements BeforeEachCallback { + + @Override + public void beforeEach(ExtensionContext context) { + DatabaseCleaner databaseCleaner = getDataCleaner(context); + databaseCleaner.clear(); + } + + private DatabaseCleaner getDataCleaner(ExtensionContext extensionContext) { + return SpringExtension.getApplicationContext(extensionContext) + .getBean(DatabaseCleaner.class); + } +} From 3c00e7bbb5d4a068b68df7d1606fa1269eb5e644 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:42:17 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 컨트롤러 테스트 추상 클래스 구현 --- .../yanabada/common/utils/ApiTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java b/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java new file mode 100644 index 00000000..a9be1614 --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java @@ -0,0 +1,65 @@ +package kr.co.fastcampus.yanabada.common.utils; + +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createAccommodation; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createAccommodationOption; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createBuyer; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createOrder; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createProduct; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createRoom; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createRoomOption; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createSeller; + +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; +import kr.co.fastcampus.yanabada.domain.accommodation.repository.AccommodationOptionRepository; +import kr.co.fastcampus.yanabada.domain.accommodation.repository.AccommodationRepository; +import kr.co.fastcampus.yanabada.domain.accommodation.repository.RoomOptionRepository; +import kr.co.fastcampus.yanabada.domain.accommodation.repository.RoomRepository; +import kr.co.fastcampus.yanabada.domain.member.entity.Member; +import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; +import kr.co.fastcampus.yanabada.domain.order.repository.OrderRepository; +import kr.co.fastcampus.yanabada.domain.product.repository.ProductRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@ExtendWith(DatabaseClearExtension.class) +@SpringBootTest +public abstract class ApiTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private AccommodationRepository accommodationRepository; + + @Autowired + private AccommodationOptionRepository accommodationOptionRepository; + + @Autowired + private RoomRepository roomRepository; + + @Autowired + private RoomOptionRepository roomOptionRepository; + + @Autowired + private OrderRepository orderRepository; + + @Autowired + private ProductRepository productRepository; + + @BeforeEach + void setup() { + Member seller = memberRepository.save(createSeller()); + memberRepository.save(createBuyer()); + Accommodation accommodation = accommodationRepository.save(createAccommodation()); + accommodationOptionRepository.save(createAccommodationOption(accommodation)); + Room room = roomRepository.save(createRoom(accommodation)); + roomOptionRepository.save(createRoomOption(room)); + Order order = orderRepository.save(createOrder(room,seller)); + productRepository.save(createProduct(order)); + + } +} From 76224f894130b66af9f5dae768cd348e9df4111e Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:42:40 +0900 Subject: [PATCH 04/12] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅 컨트롤러 테스트 코드 작성 --- .../controller/ChatControllerTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java new file mode 100644 index 00000000..c40f5142 --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java @@ -0,0 +1,75 @@ +package kr.co.fastcampus.yanabada.domain.chat.service.controller; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.CANNOT_NEGOTIATE_OWN_PRODUCT; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import kr.co.fastcampus.yanabada.common.security.WithMockMember; +import kr.co.fastcampus.yanabada.common.utils.ApiTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + + +@AutoConfigureMockMvc +public class ChatControllerTest extends ApiTest { + + private static final MediaType MEDIA_TYPE = MediaType.APPLICATION_JSON; + + @Autowired + private MockMvc mockMvc; + + @DisplayName("[API][POST] 채팅방 생성 성공") + @Test + @WithMockMember + void add_chatRoom_success() throws Exception { + //given + String url = "/v1/chats"; + String request = """ + { + "productId": 1, + "buyerId": 2 + } + """; + + //when + mockMvc.perform(post(url) + .content(request) + .contentType(MEDIA_TYPE) + ) + + //then + .andExpect(status().is2xxSuccessful()) + .andExpect(jsonPath("$.status").value("SUCCESS")); + } + + @DisplayName("[API][POST] 채팅방 생성 실패") + @Test + @WithMockMember + void add_chatRoom_fail() throws Exception { + //given + String url = "/v1/chats"; + String request = """ + { + "productId": 1, + "buyerId": 1 + } + """; + + //when + mockMvc.perform(post(url) + .content(request) + .contentType(MEDIA_TYPE) + ) + + //then + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.status").value("FAIL")) + .andExpect(jsonPath("$.errorMessage") + .value(CANNOT_NEGOTIATE_OWN_PRODUCT.getMessage())); + } +} From 39ad9f6efa277d13ddda1257239ae71a1d8e2618 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:43:01 +0900 Subject: [PATCH 05/12] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅 도메인 리팩토링 --- .../chat/repository/ChatRoomRepository.java | 5 +++-- .../domain/chat/service/ChatService.java | 20 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/chat/repository/ChatRoomRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/chat/repository/ChatRoomRepository.java index 60dda421..31c5077e 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/chat/repository/ChatRoomRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/chat/repository/ChatRoomRepository.java @@ -4,14 +4,15 @@ import java.util.Optional; import kr.co.fastcampus.yanabada.common.exception.ChatRoomNotFoundException; import kr.co.fastcampus.yanabada.domain.chat.entity.ChatRoom; +import kr.co.fastcampus.yanabada.domain.member.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface ChatRoomRepository extends JpaRepository { - Optional findByProductIdAndSellerIdAndBuyerId( - Long productId, Long sellerId, Long buyerId + Optional findByProductIdAndSellerAndBuyer( + Long productId, Member seller, Member buyer ); @Query("SELECT cr FROM ChatRoom cr " diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatService.java index 23988b8e..7e830f83 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatService.java @@ -51,10 +51,10 @@ public class ChatService { public ChatRoomInfoResponse getOrSaveChatRoom(ChatRoomSaveRequest request) { Product product = productRepository.getProduct(request.productId()); checkNegotiationPossibility(product); - Long sellerId = product.getOrder().getMember().getId(); - Long buyerId = request.buyerId(); - checkIfOwnProduct(sellerId, buyerId); - return getChatRoomInfoResponse(request, product, sellerId, buyerId); + Member seller = memberRepository.getMember(product.getOrder().getMember().getId()); + Member buyer = memberRepository.getMember(request.buyerId()); + checkIfOwnProduct(seller, buyer); + return getChatRoomInfoResponse(request, product, seller, buyer); } private void checkNegotiationPossibility(Product product) { @@ -65,23 +65,21 @@ private void checkNegotiationPossibility(Product product) { } } - private void checkIfOwnProduct(Long sellerId, Long buyerId) { - if (Objects.equals(sellerId, buyerId)) { + private void checkIfOwnProduct(Member seller, Member buyer) { + if (Objects.equals(seller, buyer)) { throw new CannotNegotiateOwnProductException(); } } private ChatRoomInfoResponse getChatRoomInfoResponse( - ChatRoomSaveRequest request, Product product, Long sellerId, Long buyerId + ChatRoomSaveRequest request, Product product, Member seller, Member buyer ) { - Optional foundChatRoom = chatRoomRepository.findByProductIdAndSellerIdAndBuyerId( - product.getId(), sellerId, buyerId + Optional foundChatRoom = chatRoomRepository.findByProductIdAndSellerAndBuyer( + product.getId(), seller, buyer ); if (foundChatRoom.isPresent()) { return ChatRoomInfoResponse.from(foundChatRoom.get()); } else { - Member seller = memberRepository.getMember(sellerId); - Member buyer = memberRepository.getMember(buyerId); LocalDateTime now = LocalDateTime.now(); ChatRoom chatRoom = chatRoomRepository.save( request.toEntity(product, seller, buyer, now, now) From f21071f4e58942bab58d08f3f0a395f46eab9b75 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:43:23 +0900 Subject: [PATCH 06/12] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9C=A0=ED=8B=B8=EB=A6=AC=ED=8B=B0=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 테스트코드 유틸리티 클래스 리팩토링 --- .../yanabada/common/utils/TestUtils.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/utils/TestUtils.java b/src/test/java/kr/co/fastcampus/yanabada/common/utils/TestUtils.java index 4d64288b..fa0a77b5 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/common/utils/TestUtils.java +++ b/src/test/java/kr/co/fastcampus/yanabada/common/utils/TestUtils.java @@ -103,11 +103,23 @@ public static Order createOrder(Room room, Member member) { ); } - public static Member createMember() { + public static Member createSeller() { return Member.builder() - .email("test@test.com") - .nickName("testNickname") - .password("1234") + .email("seller@test.com") + .nickName("sellerNickname") + .password("password123!") + .phoneNumber("010-1234-1234") + .roleType(ROLE_USER) + .image("a.jpg") + .providerType(EMAIL) + .build(); + } + + public static Member createBuyer() { + return Member.builder() + .email("buyer@test.com") + .nickName("buyerNickname") + .password("password123") .phoneNumber("010-1234-1234") .roleType(ROLE_USER) .image("a.jpg") From 643687fea319c5e16ad98c865b0a978070abbe16 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:43:59 +0900 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅 서비스 클래스 테스트 코드 작성 --- .../domain/chat/service/ChatServiceTest.java | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java index 6032a705..9710a984 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java @@ -1,9 +1,33 @@ package kr.co.fastcampus.yanabada.domain.chat.service; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createAccommodation; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createAccommodationOption; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createOrder; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createProduct; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createRoom; +import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createRoomOption; +import static org.hibernate.validator.internal.util.Contracts.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import kr.co.fastcampus.yanabada.common.exception.CannotNegotiateOwnProductException; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.AccommodationOption; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.RoomOption; +import kr.co.fastcampus.yanabada.domain.chat.dto.request.ChatRoomSaveRequest; +import kr.co.fastcampus.yanabada.domain.chat.dto.response.ChatRoomInfoResponse; +import kr.co.fastcampus.yanabada.domain.chat.entity.ChatRoom; import kr.co.fastcampus.yanabada.domain.chat.repository.ChatMessageRepository; import kr.co.fastcampus.yanabada.domain.chat.repository.ChatRoomRepository; +import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; import kr.co.fastcampus.yanabada.domain.notification.service.NotificationService; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; +import kr.co.fastcampus.yanabada.domain.product.entity.Product; import kr.co.fastcampus.yanabada.domain.product.repository.ProductRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -34,8 +58,60 @@ public class ChatServiceTest { private ChatService chatService; @Test - @DisplayName("숙박 종료 날짜가 시작") - void + @DisplayName("채팅방 생성") + void getOrSaveChatRoom_success() { + Member seller = mock(Member.class); + Member buyer = mock(Member.class); + Accommodation accommodation = createAccommodation(); + AccommodationOption accommodationOption = createAccommodationOption(accommodation); + accommodation.registerAccommodationOption(accommodationOption); + Room room = createRoom(accommodation); + RoomOption roomOption = createRoomOption(room); + room.registerRoomOption(roomOption); + accommodation.addRoom(room); + Order order = createOrder(room, seller); + Product product = createProduct(order); + ChatRoom chatRoom = mock(ChatRoom.class); + + given(productRepository.getProduct(1L)).willReturn(product); + given(seller.getId()).willReturn(2L); + given(memberRepository.getMember(2L)).willReturn(seller); + given(memberRepository.getMember(1L)).willReturn(buyer); + when(chatRoomRepository.save(any())).thenReturn(chatRoom); + + //when + ChatRoomSaveRequest request = new ChatRoomSaveRequest(1L, 1L); + ChatRoomInfoResponse result = chatService.getOrSaveChatRoom(request); + + //then + assertNotNull(result); + } + + @Test + @DisplayName("채팅방 생성 실패") + void getOrSaveChatRoom_fail() { + Member seller = mock(Member.class); + Member buyer = mock(Member.class); + Accommodation accommodation = createAccommodation(); + AccommodationOption accommodationOption = createAccommodationOption(accommodation); + accommodation.registerAccommodationOption(accommodationOption); + Room room = createRoom(accommodation); + RoomOption roomOption = createRoomOption(room); + room.registerRoomOption(roomOption); + accommodation.addRoom(room); + Order order = createOrder(room, seller); + Product product = createProduct(order); + ChatRoom chatRoom = mock(ChatRoom.class); + given(productRepository.getProduct(1L)).willReturn(product); + given(seller.getId()).willReturn(1L); + given(memberRepository.getMember(1L)).willReturn(seller); + given(memberRepository.getMember(1L)).willReturn(buyer); + //when then + ChatRoomSaveRequest request = new ChatRoomSaveRequest(1L, 1L); + assertThrows(CannotNegotiateOwnProductException.class, () -> { + chatService.getOrSaveChatRoom(request); + }); + } } From ae20ca93313fc19be7067c4249de61f2d93b6e13 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 16:49:59 +0900 Subject: [PATCH 08/12] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 위치 변경 --- .../kr/co/fastcampus/yanabada/common/utils/ApiTest.java | 6 +++--- .../yanabada/domain/chat/service/ChatServiceTest.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java b/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java index a9be1614..e5789d66 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java +++ b/src/test/java/kr/co/fastcampus/yanabada/common/utils/ApiTest.java @@ -52,13 +52,13 @@ public abstract class ApiTest { @BeforeEach void setup() { - Member seller = memberRepository.save(createSeller()); - memberRepository.save(createBuyer()); Accommodation accommodation = accommodationRepository.save(createAccommodation()); accommodationOptionRepository.save(createAccommodationOption(accommodation)); Room room = roomRepository.save(createRoom(accommodation)); roomOptionRepository.save(createRoomOption(room)); - Order order = orderRepository.save(createOrder(room,seller)); + Member seller = memberRepository.save(createSeller()); + memberRepository.save(createBuyer()); + Order order = orderRepository.save(createOrder(room, seller)); productRepository.save(createProduct(order)); } diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java index 9710a984..c157f20f 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java @@ -60,8 +60,6 @@ public class ChatServiceTest { @Test @DisplayName("채팅방 생성") void getOrSaveChatRoom_success() { - Member seller = mock(Member.class); - Member buyer = mock(Member.class); Accommodation accommodation = createAccommodation(); AccommodationOption accommodationOption = createAccommodationOption(accommodation); accommodation.registerAccommodationOption(accommodationOption); @@ -69,6 +67,8 @@ void getOrSaveChatRoom_success() { RoomOption roomOption = createRoomOption(room); room.registerRoomOption(roomOption); accommodation.addRoom(room); + Member seller = mock(Member.class); + Member buyer = mock(Member.class); Order order = createOrder(room, seller); Product product = createProduct(order); ChatRoom chatRoom = mock(ChatRoom.class); @@ -90,8 +90,6 @@ void getOrSaveChatRoom_success() { @Test @DisplayName("채팅방 생성 실패") void getOrSaveChatRoom_fail() { - Member seller = mock(Member.class); - Member buyer = mock(Member.class); Accommodation accommodation = createAccommodation(); AccommodationOption accommodationOption = createAccommodationOption(accommodation); accommodation.registerAccommodationOption(accommodationOption); @@ -99,6 +97,8 @@ void getOrSaveChatRoom_fail() { RoomOption roomOption = createRoomOption(room); room.registerRoomOption(roomOption); accommodation.addRoom(room); + Member seller = mock(Member.class); + Member buyer = mock(Member.class); Order order = createOrder(room, seller); Product product = createProduct(order); ChatRoom chatRoom = mock(ChatRoom.class); From 2479c82ddb6bae76c7aaef90b9e78fe872945a71 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 18:45:01 +0900 Subject: [PATCH 09/12] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 로그 제거 --- .../yanabada/domain/chat/controller/ChatController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/chat/controller/ChatController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/chat/controller/ChatController.java index 6f5ebe13..60f6fbd7 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/chat/controller/ChatController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/chat/controller/ChatController.java @@ -42,7 +42,6 @@ public class ChatController { @MessageMapping("/message") public void message(ReceivedChatMessage message) { - System.out.println("컨트롤러message = " + message); messagingTemplate.convertAndSend( chatroomTopicPrefix + message.chatRoomCode(), chatService.saveChatMessage(message) From def10420d55e24416996e7d0f0ef77761014e4bf Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 18:45:26 +0900 Subject: [PATCH 10/12] =?UTF-8?q?test:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅방 수정, 채팅방 삭제 테스트 코드 작성 --- .../domain/chat/service/ChatServiceTest.java | 85 ++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java index c157f20f..49f1a493 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/ChatServiceTest.java @@ -6,6 +6,7 @@ import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createProduct; import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createRoom; import static kr.co.fastcampus.yanabada.common.utils.TestUtils.createRoomOption; +import static org.assertj.core.api.Assertions.assertThat; import static org.hibernate.validator.internal.util.Contracts.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -13,13 +14,17 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.time.LocalDateTime; import kr.co.fastcampus.yanabada.common.exception.CannotNegotiateOwnProductException; +import kr.co.fastcampus.yanabada.common.utils.EntityCodeGenerator; import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; import kr.co.fastcampus.yanabada.domain.accommodation.entity.AccommodationOption; import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; import kr.co.fastcampus.yanabada.domain.accommodation.entity.RoomOption; +import kr.co.fastcampus.yanabada.domain.chat.dto.request.ChatRoomModifyRequest; import kr.co.fastcampus.yanabada.domain.chat.dto.request.ChatRoomSaveRequest; import kr.co.fastcampus.yanabada.domain.chat.dto.response.ChatRoomInfoResponse; +import kr.co.fastcampus.yanabada.domain.chat.dto.response.ChatRoomModifyResponse; import kr.co.fastcampus.yanabada.domain.chat.entity.ChatRoom; import kr.co.fastcampus.yanabada.domain.chat.repository.ChatMessageRepository; import kr.co.fastcampus.yanabada.domain.chat.repository.ChatRoomRepository; @@ -58,8 +63,10 @@ public class ChatServiceTest { private ChatService chatService; @Test - @DisplayName("채팅방 생성") + @DisplayName("채팅방 생성 성공") void getOrSaveChatRoom_success() { + + //given Accommodation accommodation = createAccommodation(); AccommodationOption accommodationOption = createAccommodationOption(accommodation); accommodation.registerAccommodationOption(accommodationOption); @@ -90,6 +97,8 @@ void getOrSaveChatRoom_success() { @Test @DisplayName("채팅방 생성 실패") void getOrSaveChatRoom_fail() { + + //given Accommodation accommodation = createAccommodation(); AccommodationOption accommodationOption = createAccommodationOption(accommodation); accommodation.registerAccommodationOption(accommodationOption); @@ -114,4 +123,78 @@ void getOrSaveChatRoom_fail() { chatService.getOrSaveChatRoom(request); }); } + + @Test + @DisplayName("채팅방 수정 성공") + void updateChatRoom_success() { + + //given + Accommodation accommodation = createAccommodation(); + AccommodationOption accommodationOption = createAccommodationOption(accommodation); + accommodation.registerAccommodationOption(accommodationOption); + Room room = createRoom(accommodation); + RoomOption roomOption = createRoomOption(room); + room.registerRoomOption(roomOption); + accommodation.addRoom(room); + Member seller = mock(Member.class); + Member buyer = mock(Member.class); + Order order = createOrder(room, seller); + Product product = createProduct(order); + String code = EntityCodeGenerator.generate(); + ChatRoom chatRoom = ChatRoom.create( + product, seller, buyer, + code, + LocalDateTime.now(), + LocalDateTime.now() + ); + + given(chatRoomRepository.getChatroom(any())).willReturn(chatRoom); + given(memberRepository.getMember(1L)).willReturn(buyer); + + //when + ChatRoomModifyRequest request = new ChatRoomModifyRequest(code); + ChatRoomModifyResponse result = chatService.updateChatRoom(1L, request); + + //then + assertNotNull(result); + assertThat(result.chatRoomCode()).isEqualTo(code); + assertThat(result.updatedMemberId()).isEqualTo(1L); + } + + @Test + @DisplayName("채팅방 삭제 성공") + void modifyOrDeleteChatRoom_success() { + + //given + Accommodation accommodation = createAccommodation(); + AccommodationOption accommodationOption = createAccommodationOption(accommodation); + accommodation.registerAccommodationOption(accommodationOption); + Room room = createRoom(accommodation); + RoomOption roomOption = createRoomOption(room); + room.registerRoomOption(roomOption); + accommodation.addRoom(room); + Member seller = mock(Member.class); + Member buyer = mock(Member.class); + Order order = createOrder(room, seller); + Product product = createProduct(order); + String code = EntityCodeGenerator.generate(); + ChatRoom chatRoom = ChatRoom.create( + product, seller, buyer, + code, + LocalDateTime.now(), + LocalDateTime.now() + ); + + given(chatRoomRepository.getChatroom(any())).willReturn(chatRoom); + given(memberRepository.getMember(1L)).willReturn(buyer); + + //when + ChatRoomModifyRequest request = new ChatRoomModifyRequest(code); + ChatRoomModifyResponse result = chatService.modifyOrDeleteChatRoom(1L, request); + + //then + assertNotNull(result); + assertThat(result.chatRoomCode()).isEqualTo(code); + assertThat(result.updatedMemberId()).isEqualTo(1L); + } } From fde654baa5cc238c206b84ca0e42cb1ae3bef9cd Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 18:45:42 +0900 Subject: [PATCH 11/12] =?UTF-8?q?test:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=ED=86=B5=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅방 수정, 채팅방 삭제 통합 테스트 코드 작성 --- .../controller/ChatControllerTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java index c40f5142..7aad6626 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java @@ -1,10 +1,13 @@ package kr.co.fastcampus.yanabada.domain.chat.service.controller; import static kr.co.fastcampus.yanabada.common.response.ErrorCode.CANNOT_NEGOTIATE_OWN_PRODUCT; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import io.restassured.path.json.JsonPath; import kr.co.fastcampus.yanabada.common.security.WithMockMember; import kr.co.fastcampus.yanabada.common.utils.ApiTest; import org.junit.jupiter.api.DisplayName; @@ -13,6 +16,8 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.ResultActions; @AutoConfigureMockMvc @@ -72,4 +77,86 @@ void add_chatRoom_fail() throws Exception { .andExpect(jsonPath("$.errorMessage") .value(CANNOT_NEGOTIATE_OWN_PRODUCT.getMessage())); } + + @DisplayName("[API][PUT] 채팅방 수정 성공") + @Test + @WithMockMember + void modifyChatRoom_success() throws Exception { + //given + String url = "/v1/chats"; + String request = """ + { + "productId": 1, + "buyerId": 2 + } + """; + + ResultActions resultActions = mockMvc.perform(post(url) + .content(request) + .contentType(MEDIA_TYPE) + ); + MvcResult mvcResult = resultActions.andReturn(); + String responseBody = mvcResult.getResponse().getContentAsString(); + JsonPath jsonPath = JsonPath.from(responseBody); + String chatRoomCode = jsonPath.getString("data.chatRoomCode"); + + String secondUrl = "/v1/chats"; + String secondRequest = """ + { + "chatRoomCode": "%s" + } + """.formatted(chatRoomCode); + + //when + mockMvc.perform(put(secondUrl) + .content(secondRequest) + .contentType(MEDIA_TYPE) + ) + //then + .andExpect(status().is2xxSuccessful()) + .andExpect(jsonPath("$.status").value("SUCCESS")) + .andExpect(jsonPath("$.data.chatRoomCode").value(chatRoomCode)) + .andExpect(jsonPath("$.data.updatedMemberId").value(1L)); + } + + @DisplayName("[API][DELETE] 채팅방 삭제 성공") + @Test + @WithMockMember + void modifyOrDeleteChatRoom_success() throws Exception { + //given + String url = "/v1/chats"; + String request = """ + { + "productId": 1, + "buyerId": 2 + } + """; + + ResultActions resultActions = mockMvc.perform(post(url) + .content(request) + .contentType(MEDIA_TYPE) + ); + MvcResult mvcResult = resultActions.andReturn(); + String responseBody = mvcResult.getResponse().getContentAsString(); + JsonPath jsonPath = JsonPath.from(responseBody); + String chatRoomCode = jsonPath.getString("data.chatRoomCode"); + + String secondUrl = "/v1/chats"; + String secondRequest = """ + { + "chatRoomCode": "%s" + } + """.formatted(chatRoomCode); + + //when + mockMvc.perform(delete(secondUrl) + .content(secondRequest) + .contentType(MEDIA_TYPE) + ) + //then + .andExpect(status().is2xxSuccessful()) + .andExpect(jsonPath("$.status").value("SUCCESS")) + .andExpect(jsonPath("$.data.chatRoomCode").value(chatRoomCode)) + .andExpect(jsonPath("$.data.updatedMemberId").value(1L)); + } } From 0cf27fb7e99cddb5b9e55d781934ee41434ef8d6 Mon Sep 17 00:00:00 2001 From: JuHyeonPark Date: Wed, 31 Jan 2024 18:46:28 +0900 Subject: [PATCH 12/12] =?UTF-8?q?style:=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 스타일 수정 --- .../chat/service/controller/ChatControllerTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java index 7aad6626..6566ba10 100644 --- a/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/chat/service/controller/ChatControllerTest.java @@ -92,9 +92,9 @@ void modifyChatRoom_success() throws Exception { """; ResultActions resultActions = mockMvc.perform(post(url) - .content(request) - .contentType(MEDIA_TYPE) - ); + .content(request) + .contentType(MEDIA_TYPE) + ); MvcResult mvcResult = resultActions.andReturn(); String responseBody = mvcResult.getResponse().getContentAsString(); JsonPath jsonPath = JsonPath.from(responseBody); @@ -109,9 +109,9 @@ void modifyChatRoom_success() throws Exception { //when mockMvc.perform(put(secondUrl) - .content(secondRequest) - .contentType(MEDIA_TYPE) - ) + .content(secondRequest) + .contentType(MEDIA_TYPE) + ) //then .andExpect(status().is2xxSuccessful()) .andExpect(jsonPath("$.status").value("SUCCESS"))