From f693cc9c82e43c272882afb7587fd6ad4246b3cc Mon Sep 17 00:00:00 2001 From: Bulgogi-Pizza Date: Tue, 25 Feb 2025 04:47:08 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#30]=20:=20api=20test=20?= =?UTF-8?q?code=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/user/UserAdminResponseDto.java | 4 +- .../admin/user/UserCreateRequestDto.java | 2 + .../domain/address/dto/AddressRequestDto.java | 2 + .../domain/address/entity/Address.java | 1 + .../orderDetails/OrderDetailsRequestDto.java | 2 + .../orderDetails/OrderDetailsResponseDto.java | 4 + .../restaurant/RestaurantResponseDto.java | 5 +- .../repository/UserRepositoryCustomImpl.java | 1 - .../util/RestaurantAddressTools.java | 1 - .../admin/user/UserAdminApiTest.java | 87 +++++++++++-- .../address/AddressIntegrationTest.java | 94 ++++++++++++++ .../domain/order/OrderIntegrationTest.java | 116 ++++++++--------- .../RestaurantAddressIntegrationTest.java | 13 +- .../restaurant/RestaurantIntegrationTest.java | 122 +++++------------- .../ReviewIntegrationTest.java | 119 +++++++++-------- .../testutil/TestEntityCreateTools.java | 9 ++ 16 files changed, 355 insertions(+), 227 deletions(-) create mode 100644 src/test/java/com/sparta/spring_deep/_delivery/domain/address/AddressIntegrationTest.java rename src/test/java/com/sparta/spring_deep/_delivery/domain/{order => review}/ReviewIntegrationTest.java (59%) diff --git a/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminResponseDto.java b/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminResponseDto.java index d5ece2c..2284a81 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminResponseDto.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminResponseDto.java @@ -4,11 +4,13 @@ import com.sparta.spring_deep._delivery.domain.user.entity.User; import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; import java.time.LocalDateTime; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor +@AllArgsConstructor public class UserAdminResponseDto { private String username; @@ -19,7 +21,7 @@ public class UserAdminResponseDto { private String createdBy; private LocalDateTime updatedAt; private String updatedBy; - private boolean isDeleted; + private Boolean isDeleted; private LocalDateTime deletedAt; private String deletedBy; diff --git a/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserCreateRequestDto.java b/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserCreateRequestDto.java index b2242ce..258750b 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserCreateRequestDto.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/admin/user/UserCreateRequestDto.java @@ -2,11 +2,13 @@ import com.sparta.spring_deep._delivery.domain.user.entity.IsPublic; import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; +import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @NoArgsConstructor +@Data public class UserCreateRequestDto { private String username; diff --git a/src/main/java/com/sparta/spring_deep/_delivery/domain/address/dto/AddressRequestDto.java b/src/main/java/com/sparta/spring_deep/_delivery/domain/address/dto/AddressRequestDto.java index b4f99a2..1d32294 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/domain/address/dto/AddressRequestDto.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/domain/address/dto/AddressRequestDto.java @@ -1,8 +1,10 @@ package com.sparta.spring_deep._delivery.domain.address.dto; +import lombok.AllArgsConstructor; import lombok.Getter; @Getter +@AllArgsConstructor public class AddressRequestDto { private String addressId; diff --git a/src/main/java/com/sparta/spring_deep/_delivery/domain/address/entity/Address.java b/src/main/java/com/sparta/spring_deep/_delivery/domain/address/entity/Address.java index bc05496..a5c62d4 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/domain/address/entity/Address.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/domain/address/entity/Address.java @@ -45,6 +45,7 @@ public class Address extends BaseEntity { @Builder public Address(User user, String address, String addressName) { + super(user.getUsername()); this.user = user; this.address = address; this.addressName = addressName; diff --git a/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsRequestDto.java b/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsRequestDto.java index d9880f2..aac5d9b 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsRequestDto.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsRequestDto.java @@ -5,6 +5,7 @@ import jakarta.validation.constraints.Size; import java.util.List; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; @@ -12,6 +13,7 @@ @Getter @Setter @RequiredArgsConstructor +@AllArgsConstructor public class OrderDetailsRequestDto { @NotNull diff --git a/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsResponseDto.java b/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsResponseDto.java index bc86ed9..c860653 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsResponseDto.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/domain/order/orderDetails/OrderDetailsResponseDto.java @@ -5,11 +5,15 @@ import com.sparta.spring_deep._delivery.domain.order.orderItem.OrderItem; import java.math.BigDecimal; import java.util.List; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.Setter; @Getter @Setter +@RequiredArgsConstructor +@AllArgsConstructor public class OrderDetailsResponseDto { private String id; diff --git a/src/main/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantResponseDto.java b/src/main/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantResponseDto.java index 2d0c730..7205de8 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantResponseDto.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantResponseDto.java @@ -32,9 +32,10 @@ public RestaurantResponseDto(Restaurant restaurant) { this.engAddr = restaurant.getRestaurantAddress().getEngAddr(); } - public RestaurantResponseDto(UUID id, CategoryEnum category, String name, String phone, - String roadAddr, String jibunAddr, String detailAddr, String engAddr) { + public RestaurantResponseDto(UUID id, String ownerId, CategoryEnum category, String name, + String phone, String roadAddr, String jibunAddr, String detailAddr, String engAddr) { this.id = id; + this.ownerId = ownerId; this.category = category; this.name = name; this.phone = phone; diff --git a/src/main/java/com/sparta/spring_deep/_delivery/domain/user/repository/UserRepositoryCustomImpl.java b/src/main/java/com/sparta/spring_deep/_delivery/domain/user/repository/UserRepositoryCustomImpl.java index beb0dc9..468272c 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/domain/user/repository/UserRepositoryCustomImpl.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/domain/user/repository/UserRepositoryCustomImpl.java @@ -71,7 +71,6 @@ public Page searchByOption(UserAdminSearchDto searchDto, .select(Projections.constructor( UserAdminResponseDto.class, user.username, - user.password, user.email, user.role, user.isPublic, diff --git a/src/main/java/com/sparta/spring_deep/_delivery/util/RestaurantAddressTools.java b/src/main/java/com/sparta/spring_deep/_delivery/util/RestaurantAddressTools.java index f05c779..fcb43b1 100644 --- a/src/main/java/com/sparta/spring_deep/_delivery/util/RestaurantAddressTools.java +++ b/src/main/java/com/sparta/spring_deep/_delivery/util/RestaurantAddressTools.java @@ -9,7 +9,6 @@ import java.util.Map; import lombok.RequiredArgsConstructor; import org.apache.logging.log4j.util.InternalException; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/test/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminApiTest.java b/src/test/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminApiTest.java index 4915966..da57657 100644 --- a/src/test/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminApiTest.java +++ b/src/test/java/com/sparta/spring_deep/_delivery/admin/user/UserAdminApiTest.java @@ -1,19 +1,28 @@ package com.sparta.spring_deep._delivery.admin.user; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.sparta.spring_deep._delivery.domain.user.details.UserDetailsImpl; import com.sparta.spring_deep._delivery.domain.user.entity.IsPublic; import com.sparta.spring_deep._delivery.domain.user.entity.User; import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository; +import com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools; +import java.util.Map; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -26,6 +35,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; @@ -46,8 +56,8 @@ public class UserAdminApiTest { @Autowired private UserAdminService userAdminService; - private User user; - private User ADMIN; + private User customer; + private User admin; private Authentication getAuth(User user) { UserDetailsImpl userDetails = new UserDetailsImpl(user); @@ -58,7 +68,7 @@ private Authentication getAuth(User user) { @BeforeEach void setUp() { // 테스트용 사용자 생성 - user = User.builder() + customer = User.builder() .username("userTest") .password("userTest1234*") .email("testuser@test.com") @@ -67,10 +77,20 @@ void setUp() { .build(); // 감사 정보 설정 (실제 환경에서는 AuditorAware에 의해 자동 설정됨) - user.setCreatedBy("system"); + customer.setCreatedBy("system"); // 사용자 저장 및 초기화 - user = userRepository.save(user); + customer = userRepository.save(customer); + + // 감사 정보 설정 (실제 환경에서는 AuditorAware에 의해 자동 설정됨) + customer.setCreatedBy("system"); + + // 사용자 저장 및 초기화 + customer = userRepository.save(customer); + + // 테스트용 사용자 생성 + admin = TestEntityCreateTools.createUser("admin", UserRole.ADMIN); + admin = userRepository.save(admin); } @AfterEach @@ -84,15 +104,62 @@ void tearDown() { void searchUsers() throws Exception { ResultActions result = mockMvc.perform(get("/admin/users/search") - .with(authentication(getAuth(ADMIN))) + .with(authentication(getAuth(admin))) .contentType(MediaType.APPLICATION_JSON)); result.andDo(print()) .andExpect(status().isOk()) - .andExpect(jsonPath("$.content", hasSize(1))) - .andExpect(jsonPath("$.totalElements", is(1))) - .andExpect(jsonPath("$.content[0].username", is(user.getUsername()))); + .andExpect(jsonPath("$.content", hasSize(greaterThanOrEqualTo(2)))); } + @Test + void createUser() throws Exception { + UserCreateRequestDto requestDto = new UserCreateRequestDto(); + requestDto.setUsername("test"); + requestDto.setPassword("test1234*"); + requestDto.setEmail("test@test.com"); + requestDto.setRole(UserRole.CUSTOMER); + requestDto.setIsPublic(IsPublic.PUBLIC); + + // ObjectMapper 복사 및 설정 + ObjectMapper testMapper = objectMapper.copy(); + testMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + MvcResult mvcResult = mockMvc.perform( + post("/admin/users") + .with(authentication(getAuth(admin))) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestDto)) + ) + .andExpect(status().isOk()) + .andReturn(); + + // 응답 본문 검증 + String responseBody = mvcResult.getResponse().getContentAsString(); + System.out.println("ResponseBody: " + responseBody); + UserAdminResponseDto responseDto = objectMapper + .readValue(responseBody, UserAdminResponseDto.class); + + // JSON을 Map으로 변환하여 확인 + Map responseMap = objectMapper + .readValue(responseBody, new TypeReference<>() { + }); + System.out.println("🔍 ResponseMap: " + responseMap); + + // 생성된 사용자 검증 + User savedUser = userRepository.findByUsername("test") + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + + assertEquals("test", savedUser.getUsername()); + assertEquals("test@test.com", savedUser.getEmail()); + assertEquals(UserRole.CUSTOMER, savedUser.getRole()); + assertEquals(IsPublic.PUBLIC, savedUser.getIsPublic()); + // 추가 필드 검증 + assertFalse(responseDto.getIsDeleted()); + assertNotNull(responseDto.getCreatedAt()); + assertEquals("admin", responseDto.getCreatedBy()); // 생성자 확인 + assertNull(responseDto.getDeletedAt()); + assertNull(responseDto.getDeletedBy()); + } } diff --git a/src/test/java/com/sparta/spring_deep/_delivery/domain/address/AddressIntegrationTest.java b/src/test/java/com/sparta/spring_deep/_delivery/domain/address/AddressIntegrationTest.java new file mode 100644 index 0000000..1848755 --- /dev/null +++ b/src/test/java/com/sparta/spring_deep/_delivery/domain/address/AddressIntegrationTest.java @@ -0,0 +1,94 @@ +package com.sparta.spring_deep._delivery.domain.address; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication; +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 com.fasterxml.jackson.databind.ObjectMapper; +import com.sparta.spring_deep._delivery.domain.address.dto.AddressRequestDto; +import com.sparta.spring_deep._delivery.domain.address.entity.Address; +import com.sparta.spring_deep._delivery.domain.address.repository.AddressRepository; +import com.sparta.spring_deep._delivery.domain.user.entity.IsPublic; +import com.sparta.spring_deep._delivery.domain.user.entity.User; +import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; +import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository; +import org.junit.jupiter.api.BeforeEach; +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.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class AddressIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private UserRepository userRepository; + + @Autowired + private AddressRepository addressRepository; + + private User customer; + private Address address; + + @BeforeEach + void setUp() { + customer = User.builder() + .username("userTest") + .password("userTest1234*") + .email("testuser@test.com") + .role(UserRole.CUSTOMER) + .isPublic(IsPublic.PUBLIC) + .build(); + + /* + // 2. 주소 생성 + address = new Address(); + // Address 엔티티에 존재하는 필드명을 사용 (예: address, addressName) + ReflectionTestUtils.setField(address, "address", "test address"); + ReflectionTestUtils.setField(address, "addressName", "test"); + ReflectionTestUtils.setField(address, "user", customer); + address = addressRepository.save(address); + */ + + } + + // 인증 객체 생성 + private UsernamePasswordAuthenticationToken getAuth(User user) { + return new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); + } + + @Test + void createAddressTest() throws Exception { + String testAddress = "서울시 강남구 테헤란로 123"; + String testAddressName = "회사"; + + AddressRequestDto addressRequestDto = new AddressRequestDto(null, testAddress, + testAddressName); +// ReflectionTestUtils.setField(addressRequestDto, "addressName", testAddressName); +// ReflectionTestUtils.setField(addressRequestDto, "address", testAddress); + + mockMvc.perform(post("/api/addresses") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(addressRequestDto)) + .with(authentication(getAuth(customer)))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.addressName").value(testAddressName)) + .andExpect(jsonPath("$.address").value(testAddress)) + .andExpect(jsonPath("$.user.username").value(customer.getUsername())); + + } + +} diff --git a/src/test/java/com/sparta/spring_deep/_delivery/domain/order/OrderIntegrationTest.java b/src/test/java/com/sparta/spring_deep/_delivery/domain/order/OrderIntegrationTest.java index 7912110..5969720 100644 --- a/src/test/java/com/sparta/spring_deep/_delivery/domain/order/OrderIntegrationTest.java +++ b/src/test/java/com/sparta/spring_deep/_delivery/domain/order/OrderIntegrationTest.java @@ -1,5 +1,11 @@ package com.sparta.spring_deep._delivery.domain.order; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createAddress; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createMenu; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurant; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurantAddress; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createUser; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.getAuth; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -18,9 +24,12 @@ import com.sparta.spring_deep._delivery.domain.order.orderItem.OrderItemDto; import com.sparta.spring_deep._delivery.domain.restaurant.Restaurant; import com.sparta.spring_deep._delivery.domain.restaurant.RestaurantRepository; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddressRepository; import com.sparta.spring_deep._delivery.domain.user.entity.User; +import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository; -import java.math.BigDecimal; +import com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools; import java.util.List; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -29,8 +38,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.transaction.annotation.Transactional; @@ -66,69 +73,46 @@ public class OrderIntegrationTest { private User customer; private Address address; private Restaurant restaurant; + private RestaurantAddress restaurantAddress; private Menu menu; + @Autowired + private RestaurantAddressRepository restaurantAddressRepository; @BeforeEach void setUp() { // 1. 소유자와 고객 생성 - owner = new User(); - ReflectionTestUtils.setField(owner, "username", "Owner"); + owner = createUser("owner", UserRole.OWNER); owner = userRepository.save(owner); - customer = new User(); - ReflectionTestUtils.setField(customer, "username", "Customer"); + customer = createUser("customer", UserRole.CUSTOMER); customer = userRepository.save(customer); // 2. 주소 생성 - address = new Address(); - // Address 엔티티에 존재하는 필드명을 사용 (예: address, addressName) - ReflectionTestUtils.setField(address, "address", "test address"); - ReflectionTestUtils.setField(address, "addressName", "test"); - ReflectionTestUtils.setField(address, "user", customer); + address = createAddress(customer, "test address", "test"); address = addressRepository.save(address); - // 3. 음식점 생성 - restaurant = new Restaurant(); - ReflectionTestUtils.setField(restaurant, "owner", owner); - ReflectionTestUtils.setField(restaurant, "name", "레스토랑"); - // category는 enum 타입이므로 enum 상수를 직접 설정 - ReflectionTestUtils.setField(restaurant, "category", Restaurant.CategoryEnum.HANSIK); - // restaurantAddress 필드가 RestaurantAddress 타입이라면 별도의 객체를 만들어 주입해야 함. - // 만약 단순 문자열이라면 아래처럼 설정: - ReflectionTestUtils.setField(restaurant, "restaurantAddress", "서울시"); - ReflectionTestUtils.setField(restaurant, "phone", "02-111-1234"); + // 가게 주소 + restaurantAddress = createRestaurantAddress(owner.getUsername()); + restaurantAddress = restaurantAddressRepository.save(restaurantAddress); + + // 가게 + restaurant = createRestaurant(owner, restaurantAddress, "불맛짜장", "010-2222-3333"); restaurant = restaurantRepository.save(restaurant); // 4. 메뉴 생성 - menu = new Menu(); - // 메뉴의 경우 음식점 ID를 설정 (문자열이 아니라 UUID 혹은 해당 타입) - ReflectionTestUtils.setField(menu, "restaurantId", restaurant.getId()); - ReflectionTestUtils.setField(menu, "name", "test menu"); - ReflectionTestUtils.setField(menu, "description", "test description"); - ReflectionTestUtils.setField(menu, "price", BigDecimal.valueOf(5000)); - ReflectionTestUtils.setField(menu, "isHidden", false); - ReflectionTestUtils.setField(menu, "isDeleted", false); + menu = createMenu(customer, restaurant, "test menu", "test description", 5000.0); menu = menuRepository.save(menu); } - // 인증 객체 생성 - private UsernamePasswordAuthenticationToken getAuth(User user) { - return new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); - } - // 주문 생성 요청을 위한 헬퍼 메서드 private OrderDetailsResponseDto createOrder() throws Exception { - OrderDetailsRequestDto requestDto = new OrderDetailsRequestDto(); - // DTO에 문자열로 ID를 설정 (getter 내부에서 UUID로 변환) - ReflectionTestUtils.setField(requestDto, "restaurantId", restaurant.getId().toString()); - ReflectionTestUtils.setField(requestDto, "addressId", address.getId().toString()); - ReflectionTestUtils.setField(requestDto, "request", "testRequest"); + // 주문 요청 Dto // 주문 항목 생성 (menuId는 문자열) - OrderItemDto orderItemDto = new OrderItemDto(); - ReflectionTestUtils.setField(orderItemDto, "menuId", menu.getId().toString()); - ReflectionTestUtils.setField(orderItemDto, "quantity", 1); - ReflectionTestUtils.setField(requestDto, "orderItemDtos", List.of(orderItemDto)); + OrderItemDto orderItemDto = new OrderItemDto(menu.getId().toString(), 1); + OrderDetailsRequestDto requestDto = new OrderDetailsRequestDto( + restaurant.getId().toString(), address.getId().toString(), "testRequest", + List.of(orderItemDto)); String jsonRequest = objectMapper.writeValueAsString(requestDto); @@ -146,13 +130,13 @@ private OrderDetailsResponseDto createOrder() throws Exception { // 주문 생성 및 상세 조회 테스트 @Test void testCreateAndGetOrderDetails() throws Exception { - OrderDetailsResponseDto createdOrder = createOrder(); - UUID orderId = UUID.fromString(createdOrder.getId()); - mockMvc.perform(get("/api/orders/{orderId}", orderId) + OrderDetailsResponseDto responseDto = createOrder(); + + mockMvc.perform(get("/api/orders/{orderId}", responseDto.getId().toString()) + .contentType(MediaType.APPLICATION_JSON) .with(authentication(getAuth(customer)))) .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(orderId.toString())) .andExpect(jsonPath("$.customerId").value(customer.getUsername())) .andExpect(jsonPath("$.restaurantId").value(restaurant.getId().toString())) .andExpect(jsonPath("$.addressId").value(address.getId().toString())) @@ -162,22 +146,26 @@ void testCreateAndGetOrderDetails() throws Exception { // 주문 상태 변경 테스트 (예: PENDING → PREPARING) @Test void testUpdateOrderStatus() throws Exception { - OrderDetailsResponseDto createdOrder = createOrder(); - UUID orderId = UUID.fromString(createdOrder.getId()); + OrderDetailsResponseDto responseDto = createOrder(); + + UUID orderId = UUID.fromString(responseDto.getId()); mockMvc.perform(put("/api/orders/{orderId}/status", orderId) - .param("status", "PREPARING") + .param("status", OrderStatusEnum.CONFIRMED.toString()) .with(authentication(getAuth(owner)))) .andExpect(status().isOk()) - .andExpect(jsonPath("$.orderId").value(orderId.toString())) - .andExpect(jsonPath("$.status").value("PREPARING")); + .andExpect(jsonPath("$.id").value(orderId.toString())) + .andExpect(jsonPath("$.status").value(OrderStatusEnum.CONFIRMED.toString())); + } // 주문 취소 테스트 @Test void testCancelOrder() throws Exception { - OrderDetailsResponseDto createdOrder = createOrder(); - UUID orderId = UUID.fromString(createdOrder.getId()); + Order createOrder = TestEntityCreateTools.createOrder(customer, restaurant, address, + 20000.0, "testRequest"); + orderRepository.save(createOrder); // 왐마 슈우우웃 와우우우우 아래도 똑같이 save 복붙 성공! ㅋㅋㅋㅋㅋㅋㅋㅋ아싸 최고십니다... + String orderId = createOrder.getId().toString(); mockMvc.perform(put("/api/orders/{orderId}/cancel", orderId) .with(authentication(getAuth(customer)))) @@ -187,8 +175,10 @@ void testCancelOrder() throws Exception { // 주문 삭제 테스트 @Test void testDeleteOrder() throws Exception { - OrderDetailsResponseDto createdOrder = createOrder(); - UUID orderId = UUID.fromString(createdOrder.getId()); + Order createOrder = TestEntityCreateTools.createOrder(customer, restaurant, address, + 20000.0, "testRequest"); + orderRepository.save(createOrder); + String orderId = createOrder.getId().toString(); mockMvc.perform(delete("/api/orders/{orderId}", orderId) .with(authentication(getAuth(customer)))) @@ -199,8 +189,12 @@ void testDeleteOrder() throws Exception { @Test void testSearchMyOrders() throws Exception { // 고객 주문 2건 생성 - createOrder(); - createOrder(); + Order createOrder1 = TestEntityCreateTools.createOrder(customer, restaurant, address, + 20000.0, "testRequest"); + Order createOrder2 = TestEntityCreateTools.createOrder(customer, restaurant, address, + 10000.0, "testRequest"); + orderRepository.save(createOrder1); + orderRepository.save(createOrder2); mockMvc.perform(get("/api/orders/me/search") .with(authentication(getAuth(customer)))) @@ -212,7 +206,9 @@ void testSearchMyOrders() throws Exception { @Test void testPollingOrders() throws Exception { // 주문이 존재하도록 하나 생성 - createOrder(); + Order createOrder = TestEntityCreateTools.createOrder(customer, restaurant, address, + 10000.0, "testRequest"); + orderRepository.save(createOrder); mockMvc.perform(get("/api/orders/polling") .with(authentication(getAuth(customer)))) diff --git a/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantAddressIntegrationTest.java b/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantAddressIntegrationTest.java index e1d5440..84dcbeb 100644 --- a/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantAddressIntegrationTest.java +++ b/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantAddressIntegrationTest.java @@ -1,4 +1,4 @@ -package com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress; +package com.sparta.spring_deep._delivery.domain.restaurant; import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurantAddress; import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createUser; @@ -11,6 +11,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddressCreateRequestDto; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddressRepository; import com.sparta.spring_deep._delivery.domain.user.details.UserDetailsImpl; import com.sparta.spring_deep._delivery.domain.user.entity.User; import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; @@ -142,10 +145,10 @@ void testGetRestaurantAddressSuccess() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(address.getId().toString())) - .andExpect(jsonPath("$.roadAddr").value("Test Road")) - .andExpect(jsonPath("$.detailAddr").value("Test Detail")) - .andExpect(jsonPath("$.jibunAddr").value("Test Jibun")) - .andExpect(jsonPath("$.engAddr").value("Test Eng")); + .andExpect(jsonPath("$.roadAddr").value("서울특별시 강남구 논현로111길 21 (논현동)")) + .andExpect(jsonPath("$.detailAddr").value("강남빌딩 202호")) + .andExpect(jsonPath("$.jibunAddr").value("서울특별시 강남구 논현동 206-4")) + .andExpect(jsonPath("$.engAddr").value("21 Nonhyeon-ro 111-gil, Gangnam-gu, Seoul")); } // ----- 수정 API (PUT /api/restaurantAddresses/{id}) ----- diff --git a/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantIntegrationTest.java b/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantIntegrationTest.java index 255ecc2..57b2343 100644 --- a/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantIntegrationTest.java +++ b/src/test/java/com/sparta/spring_deep/_delivery/domain/restaurant/RestaurantIntegrationTest.java @@ -1,5 +1,9 @@ package com.sparta.spring_deep._delivery.domain.restaurant; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurant; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurantAddress; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createUser; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.getAuth; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.hasSize; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication; @@ -14,8 +18,8 @@ import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress; import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddressRepository; import com.sparta.spring_deep._delivery.domain.user.entity.User; +import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository; -import java.util.Collections; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -23,7 +27,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.transaction.annotation.Transactional; @@ -55,29 +58,17 @@ public class RestaurantIntegrationTest { @BeforeEach void setUp() { // 테스트용 소유자 생성 - owner = new User(); - ReflectionTestUtils.setField(owner, "username", "owner1"); + owner = createUser("owner1", UserRole.OWNER); owner = userRepository.save(owner); // 소유자가 아닌 사용자 생성 - nonOwner = new User(); - ReflectionTestUtils.setField(nonOwner, "username", "user2"); + nonOwner = createUser("user2", UserRole.CUSTOMER); nonOwner = userRepository.save(nonOwner); // 테스트용 주소 생성 - address = new RestaurantAddress(); - ReflectionTestUtils.setField(address, "roadAddr", "Test Road"); - ReflectionTestUtils.setField(address, "jibunAddr", "Test Jibun"); - ReflectionTestUtils.setField(address, "detailAddr", "Test Detail"); - ReflectionTestUtils.setField(address, "engAddr", "Test Eng"); + address = createRestaurantAddress("owner1"); address = restaurantAddressRepository.save(address); - - } - - // 인증 객체 생성 (소유자/비소유자 구분) - private UsernamePasswordAuthenticationToken getAuth(User user) { - return new UsernamePasswordAuthenticationToken(user, null, Collections.emptyList()); } // ===== GET /api/restaurants/{restaurantId} ===== @@ -85,34 +76,16 @@ private UsernamePasswordAuthenticationToken getAuth(User user) { // 성공 케이스: 존재하는 음식점 조회 @Test void testGetRestaurantSuccess() throws Exception { - // 테스트 음식점 생성 (생성 시 ReflectionTestUtils로 DTO 필드 주입) - RestaurantAdminCreateRequestDto createDto = new RestaurantAdminCreateRequestDto(); - ReflectionTestUtils.setField(createDto, "ownerId", owner.getUsername()); - ReflectionTestUtils.setField(createDto, "name", "Test Restaurant"); - ReflectionTestUtils.setField(createDto, "category", Restaurant.CategoryEnum.HANSIK); - ReflectionTestUtils.setField(createDto, "roadAddr", address.getRoadAddr()); - ReflectionTestUtils.setField(createDto, "detailAddr", address.getDetailAddr()); - ReflectionTestUtils.setField(createDto, "phone", "010-1111-2222"); - Restaurant restaurant = new Restaurant(createDto, owner, address, owner.getUsername()); + Restaurant restaurant = createRestaurant(owner, address, "꿀맛짬뽕", "010-2222-2222"); restaurant = restaurantRepository.save(restaurant); - RestaurantAdminCreateRequestDto createRequestDto = new RestaurantAdminCreateRequestDto(); - createRequestDto.setOwnerId(owner.getUsername()); // 굿 - createRequestDto.setName("Test Restaurant"); - createRequestDto.setCategory(Restaurant.CategoryEnum.HANSIK); - createRequestDto.setRoadAddr(address.getRoadAddr()); - createRequestDto.setDetailAddr(address.getDetailAddr()); - createRequestDto.setPhone("010-1111-2222"); - - Restaurant restaurant1 = new Restaurant(createDto, owner, address, owner.getUsername()); - mockMvc.perform(get("/api/restaurants/{restaurantId}", restaurant.getId()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(restaurant.getId().toString())) - .andExpect(jsonPath("$.name").value("Test Restaurant")) - .andExpect(jsonPath("$.phone").value("010-1111-2222")) + .andExpect(jsonPath("$.name").value("꿀맛짬뽕")) + .andExpect(jsonPath("$.phone").value("010-2222-2222")) .andExpect(jsonPath("$.roadAddr").value(address.getRoadAddr())); } @@ -131,23 +104,15 @@ void testGetRestaurantNotFound() throws Exception { @Test void testUpdateRestaurantSuccess() throws Exception { // 초기 음식점 생성 - RestaurantAdminCreateRequestDto createDto = new RestaurantAdminCreateRequestDto(); - ReflectionTestUtils.setField(createDto, "ownerId", owner.getUsername()); - ReflectionTestUtils.setField(createDto, "name", "Original Restaurant"); - ReflectionTestUtils.setField(createDto, "category", Restaurant.CategoryEnum.HANSIK); - ReflectionTestUtils.setField(createDto, "roadAddr", address.getRoadAddr()); - ReflectionTestUtils.setField(createDto, "detailAddr", address.getDetailAddr()); - ReflectionTestUtils.setField(createDto, "phone", "010-1111-2222"); - - Restaurant restaurant = new Restaurant(createDto, owner, address, owner.getUsername()); + Restaurant restaurant = createRestaurant(owner, address, "꿀맛짬뽕", "010-2222-2222"); restaurant = restaurantRepository.save(restaurant); // 수정할 내용 (RestaurantRequestDto는 setter 제공) RestaurantRequestDto updateDto = new RestaurantRequestDto(); updateDto.setName("Updated Restaurant"); updateDto.setCategory(Restaurant.CategoryEnum.YANGSIK); - updateDto.setRoadAddr("Updated Road"); - updateDto.setDetailAddr("Updated Detail"); + updateDto.setRoadAddr("논현로 111길 21"); + updateDto.setDetailAddr("강남빌딩 200호"); updateDto.setPhone("010-2222-3333"); String updateJson = objectMapper.writeValueAsString(updateDto); @@ -166,22 +131,14 @@ void testUpdateRestaurantSuccess() throws Exception { @Test void testUpdateRestaurantNotOwner() throws Exception { // 음식점 생성 (소유자는 owner) - RestaurantAdminCreateRequestDto createDto = new RestaurantAdminCreateRequestDto(); - ReflectionTestUtils.setField(createDto, "ownerId", owner.getUsername()); - ReflectionTestUtils.setField(createDto, "name", "Original Restaurant"); - ReflectionTestUtils.setField(createDto, "category", Restaurant.CategoryEnum.HANSIK); - ReflectionTestUtils.setField(createDto, "roadAddr", address.getRoadAddr()); - ReflectionTestUtils.setField(createDto, "detailAddr", address.getDetailAddr()); - ReflectionTestUtils.setField(createDto, "phone", "010-1111-2222"); - - Restaurant restaurant = new Restaurant(createDto, owner, address, owner.getUsername()); + Restaurant restaurant = createRestaurant(owner, address, "꿀맛짬뽕", "010-2222-2222"); restaurant = restaurantRepository.save(restaurant); RestaurantRequestDto updateDto = new RestaurantRequestDto(); updateDto.setName("Updated Restaurant"); updateDto.setCategory(Restaurant.CategoryEnum.YANGSIK); - updateDto.setRoadAddr("Updated Road"); - updateDto.setDetailAddr("Updated Detail"); + updateDto.setRoadAddr("논현로 111길 21"); + updateDto.setDetailAddr("강남빌딩 200호"); updateDto.setPhone("010-2222-3333"); String updateJson = objectMapper.writeValueAsString(updateDto); @@ -200,7 +157,7 @@ void testUpdateRestaurantNotFound() throws Exception { RestaurantRequestDto updateDto = new RestaurantRequestDto(); updateDto.setName("Updated Restaurant"); updateDto.setCategory(Restaurant.CategoryEnum.YANGSIK); - updateDto.setRoadAddr("Updated Road"); + updateDto.setRoadAddr("논현로 111길 21"); updateDto.setDetailAddr("Updated Detail"); updateDto.setPhone("010-2222-3333"); @@ -219,15 +176,8 @@ void testUpdateRestaurantNotFound() throws Exception { // 성공 케이스: 소유자에 의한 삭제 @Test void testDeleteRestaurantSuccess() throws Exception { - RestaurantAdminCreateRequestDto createDto = new RestaurantAdminCreateRequestDto(); - ReflectionTestUtils.setField(createDto, "ownerId", owner.getUsername()); - ReflectionTestUtils.setField(createDto, "name", "Restaurant to Delete"); - ReflectionTestUtils.setField(createDto, "category", Restaurant.CategoryEnum.HANSIK); - ReflectionTestUtils.setField(createDto, "roadAddr", address.getRoadAddr()); - ReflectionTestUtils.setField(createDto, "detailAddr", address.getDetailAddr()); - ReflectionTestUtils.setField(createDto, "phone", "010-1111-2222"); - - Restaurant restaurant = new Restaurant(createDto, owner, address, owner.getUsername()); + // 음식점 생성 (소유자는 owner) + Restaurant restaurant = createRestaurant(owner, address, "꿀맛짬뽕", "010-2222-2222"); restaurant = restaurantRepository.save(restaurant); mockMvc.perform(delete("/api/restaurants/{restaurantId}", restaurant.getId()) @@ -269,29 +219,17 @@ void testDeleteRestaurantNotFound() throws Exception { @Test void testSearchRestaurantSuccess() throws Exception { // 두 개의 음식점 생성 - RestaurantAdminCreateRequestDto createDto1 = new RestaurantAdminCreateRequestDto(); - ReflectionTestUtils.setField(createDto1, "ownerId", owner.getUsername()); - ReflectionTestUtils.setField(createDto1, "name", "Alpha Restaurant"); - ReflectionTestUtils.setField(createDto1, "category", Restaurant.CategoryEnum.HANSIK); - ReflectionTestUtils.setField(createDto1, "roadAddr", "Road A"); - ReflectionTestUtils.setField(createDto1, "detailAddr", "Detail A"); - ReflectionTestUtils.setField(createDto1, "phone", "010-0000-0001"); - Restaurant restaurant1 = new Restaurant(createDto1, owner, address, owner.getUsername()); - restaurantRepository.save(restaurant1); - - RestaurantAdminCreateRequestDto createDto2 = new RestaurantAdminCreateRequestDto(); - ReflectionTestUtils.setField(createDto2, "ownerId", owner.getUsername()); - ReflectionTestUtils.setField(createDto2, "name", "Beta Restaurant"); - ReflectionTestUtils.setField(createDto2, "category", Restaurant.CategoryEnum.YANGSIK); - ReflectionTestUtils.setField(createDto2, "roadAddr", "Road B"); - ReflectionTestUtils.setField(createDto2, "detailAddr", "Detail B"); - ReflectionTestUtils.setField(createDto2, "phone", "010-0000-0002"); - Restaurant restaurant2 = new Restaurant(createDto2, owner, address, owner.getUsername()); - restaurantRepository.save(restaurant2); - - // name 파라미터에 "Restaurant"가 포함된 경우 검색 (검색 결과가 2건 이상이어야 함) + // 음식점 생성 (소유자는 owner) + Restaurant restaurant1 = createRestaurant(owner, address, "진짜짬뽕", "010-2222-2222"); + restaurant1 = restaurantRepository.save(restaurant1); + + // 음식점 생성 (소유자는 owner) + Restaurant restaurant2 = createRestaurant(owner, address, "짜장진짜", "010-2222-2222"); + restaurant2 = restaurantRepository.save(restaurant2); + + // name 파라미터에 "진짜"가 포함된 경우 검색 (검색 결과가 2건 이상이어야 함) mockMvc.perform(get("/api/restaurants/search") - .param("name", "Restaurant") + .param("name", "진짜") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.content", hasSize(greaterThanOrEqualTo(2)))); diff --git a/src/test/java/com/sparta/spring_deep/_delivery/domain/order/ReviewIntegrationTest.java b/src/test/java/com/sparta/spring_deep/_delivery/domain/review/ReviewIntegrationTest.java similarity index 59% rename from src/test/java/com/sparta/spring_deep/_delivery/domain/order/ReviewIntegrationTest.java rename to src/test/java/com/sparta/spring_deep/_delivery/domain/review/ReviewIntegrationTest.java index 7fc2f68..28bcc23 100644 --- a/src/test/java/com/sparta/spring_deep/_delivery/domain/order/ReviewIntegrationTest.java +++ b/src/test/java/com/sparta/spring_deep/_delivery/domain/review/ReviewIntegrationTest.java @@ -1,5 +1,11 @@ -package com.sparta.spring_deep._delivery.domain.order; - +package com.sparta.spring_deep._delivery.domain.review; + +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createAddress; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createOrder; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurant; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createRestaurantAddress; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.createUser; +import static com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools.getAuth; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -9,22 +15,25 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; +import com.sparta.spring_deep._delivery.domain.address.entity.Address; import com.sparta.spring_deep._delivery.domain.address.repository.AddressRepository; +import com.sparta.spring_deep._delivery.domain.order.Order; +import com.sparta.spring_deep._delivery.domain.order.OrderRepository; +import com.sparta.spring_deep._delivery.domain.order.OrderStatusEnum; import com.sparta.spring_deep._delivery.domain.restaurant.Restaurant; import com.sparta.spring_deep._delivery.domain.restaurant.RestaurantRepository; -import com.sparta.spring_deep._delivery.domain.review.ReviewRequestDto; -import com.sparta.spring_deep._delivery.domain.review.ReviewResponseDto; -import com.sparta.spring_deep._delivery.domain.user.entity.IsPublic; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress; +import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddressRepository; import com.sparta.spring_deep._delivery.domain.user.entity.User; import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository; +import com.sparta.spring_deep._delivery.testutil.TestEntityCreateTools; import org.junit.jupiter.api.BeforeEach; 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.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; @@ -53,54 +62,65 @@ public class ReviewIntegrationTest { @Autowired private AddressRepository addressRepository; + @Autowired + private ReviewRepository reviewRepository; + // 소유자, 고객, 음식점, 주문 객체를 테스트 전 생성합니다. private User owner; private User customer; + private User admin; private Restaurant restaurant; + private Address address; + private RestaurantAddress restaurantAddress; private Order order; + @Autowired + private RestaurantAddressRepository restaurantAddressRepository; + @BeforeEach void setUp() { + // 어드민 + admin = createUser("admin", UserRole.ADMIN); + admin = userRepository.save(admin); + // 가게 사장님 - owner = User.builder() - .username("owner") - .password("1234") - .email("owner@test.com") - .role(UserRole.OWNER) - .isPublic(IsPublic.PUBLIC) - .build(); + owner = createUser("owner", UserRole.OWNER); owner = userRepository.save(owner); // 고객 - customer = User.builder() - .username("customer") - .password("1234") - .email("customer@test.com") - .role(UserRole.CUSTOMER) - .isPublic(IsPublic.PUBLIC) - .build(); + customer = createUser("customer", UserRole.CUSTOMER); customer = userRepository.save(customer); + // 가게 주소 + restaurantAddress = createRestaurantAddress(owner.getUsername()); + restaurantAddress = restaurantAddressRepository.save(restaurantAddress); + + // 가게 + restaurant = createRestaurant(owner, restaurantAddress, "불맛짜장", "010-2222-3333"); + restaurant = restaurantRepository.save(restaurant); + + // 주소 + address = createAddress(customer, "충남 천안시", "천안 집"); + address = addressRepository.save(address); + + // 주문 + order = createOrder(customer, restaurant, address, 20000.0, "밥 적게 주세요"); + order.updateOrderStatus(admin, OrderStatusEnum.DELIVERED); + order = orderRepository.save(order); - } - // 인증 객체 생성: 테스트 시 API 호출에 사용합니다. - private UsernamePasswordAuthenticationToken getAuth(User user) { - return new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); } - // 리뷰 생성 API 호출 헬퍼 메서드 - private ReviewResponseDto createReview() throws Exception { - // ReviewRequestDto 생성: 리뷰 작성에 필요한 orderId, rating, comment를 설정합니다. - ReviewRequestDto requestDto = new ReviewRequestDto(); - ReflectionTestUtils.setField(requestDto, "orderId", order.getId().toString()); - ReflectionTestUtils.setField(requestDto, "rating", 5); - ReflectionTestUtils.setField(requestDto, "comment", "Excellent service"); + // 1. 리뷰 생성 테스트 + @Test + void testCreateReview() throws Exception { + // 리뷰 생성 + ReviewRequestDto requestDto = new ReviewRequestDto(order.getId().toString(), "testComment1", + 5); String jsonRequest = objectMapper.writeValueAsString(requestDto); - // POST /api/reviews 엔드포인트 호출 (고객 인증) MvcResult result = mockMvc.perform(post("/api/reviews") .contentType(MediaType.APPLICATION_JSON) .content(jsonRequest) @@ -108,35 +128,20 @@ private ReviewResponseDto createReview() throws Exception { .andExpect(status().isCreated()) .andReturn(); - String responseContent = result.getResponse().getContentAsString(); - return objectMapper.readValue(responseContent, ReviewResponseDto.class); - } - - // 1. 리뷰 생성 및 상세 조회 테스트 - @Test - void testCreateAndGetReview() throws Exception { - // 리뷰 생성 - ReviewResponseDto createdReview = createReview(); - String reviewId = createdReview.getId().toString(); - - // GET /api/reviews/{reviewId} 엔드포인트를 호출하여 리뷰 상세 정보를 검증 - mockMvc.perform(get("/api/reviews/{reviewId}", reviewId) - .with(authentication(getAuth(customer)))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(reviewId)) - .andExpect(jsonPath("$.rating").value(5)) - .andExpect(jsonPath("$.comment").value("Excellent service")); } // 2. 리뷰 수정 테스트 @Test void testUpdateReview() throws Exception { // 리뷰 생성 - ReviewResponseDto createdReview = createReview(); + Review createdReview = TestEntityCreateTools.createReview(order, customer, 5, + "testComment1"); + reviewRepository.save(createdReview); String reviewId = createdReview.getId().toString(); - // 수정할 내용이 담긴 ReviewRequestDto 생성 (리뷰 수정 시 orderId는 필요 없을 수 있음) + // 수정할 내용이 담긴 ReviewRequestDto 생성 ReviewRequestDto updateDto = new ReviewRequestDto(); + ReflectionTestUtils.setField(updateDto, "orderId", order.getId().toString()); ReflectionTestUtils.setField(updateDto, "rating", 4); ReflectionTestUtils.setField(updateDto, "comment", "Good service"); @@ -157,7 +162,9 @@ void testUpdateReview() throws Exception { @Test void testDeleteReview() throws Exception { // 리뷰 생성 - ReviewResponseDto createdReview = createReview(); + Review createdReview = TestEntityCreateTools.createReview(order, customer, 5, + "testComment1"); + reviewRepository.save(createdReview); String reviewId = createdReview.getId().toString(); // DELETE /api/reviews/{reviewId} 호출 (고객 인증) @@ -170,8 +177,10 @@ void testDeleteReview() throws Exception { @Test void testSearchReviewsForRestaurant() throws Exception { // 리뷰 2건 생성 - createReview(); - createReview(); + Review review1 = TestEntityCreateTools.createReview(order, customer, 5, "testComment1"); + Review review2 = TestEntityCreateTools.createReview(order, customer, 4, "testComment2"); + reviewRepository.save(review1); + reviewRepository.save(review2); // GET /api/reviews/{restaurantId}/search 호출하여 해당 음식점의 리뷰 목록을 조회 mockMvc.perform(get("/api/reviews/{restaurantId}/search", restaurant.getId().toString()) diff --git a/src/test/java/com/sparta/spring_deep/_delivery/testutil/TestEntityCreateTools.java b/src/test/java/com/sparta/spring_deep/_delivery/testutil/TestEntityCreateTools.java index 33fb329..9840fce 100644 --- a/src/test/java/com/sparta/spring_deep/_delivery/testutil/TestEntityCreateTools.java +++ b/src/test/java/com/sparta/spring_deep/_delivery/testutil/TestEntityCreateTools.java @@ -13,6 +13,7 @@ import com.sparta.spring_deep._delivery.domain.restaurant.Restaurant.CategoryEnum; import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress; import com.sparta.spring_deep._delivery.domain.review.Review; +import com.sparta.spring_deep._delivery.domain.user.details.UserDetailsImpl; import com.sparta.spring_deep._delivery.domain.user.entity.IsPublic; import com.sparta.spring_deep._delivery.domain.user.entity.User; import com.sparta.spring_deep._delivery.domain.user.entity.UserRole; @@ -24,6 +25,8 @@ import java.util.Map; import org.apache.logging.log4j.util.InternalException; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -35,6 +38,12 @@ public class TestEntityCreateTools { private static final String restaurantAddressUrl = dotenv.get("RESTAURANT_URL"); private static final String restaurantAddressKey = dotenv.get("RESTAURANT_KEY"); + public static Authentication getAuth(User user) { + UserDetailsImpl userDetails = new UserDetailsImpl(user); + return new UsernamePasswordAuthenticationToken(userDetails, null, + userDetails.getAuthorities()); + } + // 유저 생성 public static User createUser(String username, UserRole role) { return User.builder()