diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/security/PrincipalDetails.java b/src/main/java/kr/co/fastcampus/yanabada/common/security/PrincipalDetails.java index 854d1e63..8e517431 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/security/PrincipalDetails.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/security/PrincipalDetails.java @@ -6,10 +6,12 @@ import java.util.List; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.entity.ProviderType; +import lombok.Builder; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +@Builder public record PrincipalDetails( Long id, String email, diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/RoomCancelPolicy.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/RoomCancelPolicy.java index 88ee0fab..3a27cccf 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/RoomCancelPolicy.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/RoomCancelPolicy.java @@ -7,8 +7,8 @@ @RequiredArgsConstructor(access = AccessLevel.PRIVATE) @Getter public enum RoomCancelPolicy { - YNBD_1(7L), - YNBD_2(6L), + YNBD_1(6L), + YNBD_2(5L), YNBD_3(Long.MAX_VALUE), ; diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/controller/OrderController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/controller/OrderController.java index 54ee40eb..8ec9aab9 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/controller/OrderController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/controller/OrderController.java @@ -26,8 +26,8 @@ public class OrderController { private final OrderService orderService; @PostMapping - public ResponseBody addOrder(@RequestBody OrderSaveRequest request) { - orderService.saveOrder(request); + public ResponseBody addOrders(@RequestBody List requests) { + orderService.saveOrders(requests); return ResponseBody.ok(); } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java index 5c42d785..0feef03b 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java @@ -32,10 +32,12 @@ public class OrderService { private final MemberRepository memberRepository; @Transactional - public void saveOrder(OrderSaveRequest request) { - Room room = roomRepository.getRoom(request.roomId()); - Member member = memberRepository.getMember(request.memberId()); - Order order = orderRepository.save(request.toEntity(room, member, LocalDateTime.now())); + public void saveOrders(List requests) { + requests.forEach(request -> { + Room room = roomRepository.getRoom(request.roomId()); + Member member = memberRepository.getMember(request.memberId()); + Order order = orderRepository.save(request.toEntity(room, member, LocalDateTime.now())); + }); } @Transactional(readOnly = true) diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/config/QueryDslTestConfig.java b/src/test/java/kr/co/fastcampus/yanabada/common/config/QueryDslTestConfig.java new file mode 100644 index 00000000..ecff8fe1 --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/common/config/QueryDslTestConfig.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.common.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class QueryDslTestConfig { + + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/security/WithMockMember.java b/src/test/java/kr/co/fastcampus/yanabada/common/security/WithMockMember.java new file mode 100644 index 00000000..e93620cb --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/common/security/WithMockMember.java @@ -0,0 +1,12 @@ +package kr.co.fastcampus.yanabada.common.security; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import org.springframework.security.test.context.support.WithSecurityContext; + +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = WithMockMemberSecurityContextFactory.class) +public @interface WithMockMember { + long id() default 1L; + String[] authorities() default "ROLE_USER"; +} diff --git a/src/test/java/kr/co/fastcampus/yanabada/common/security/WithMockMemberSecurityContextFactory.java b/src/test/java/kr/co/fastcampus/yanabada/common/security/WithMockMemberSecurityContextFactory.java new file mode 100644 index 00000000..85891d3e --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/common/security/WithMockMemberSecurityContextFactory.java @@ -0,0 +1,26 @@ +package kr.co.fastcampus.yanabada.common.security; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +public class WithMockMemberSecurityContextFactory + implements WithSecurityContextFactory { + + @Override + public SecurityContext createSecurityContext(WithMockMember annotation) { + PrincipalDetails memberDetails = PrincipalDetails.builder() + .id(annotation.id()) + .email("test@email.com") + .build(); + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication( + new UsernamePasswordAuthenticationToken( + memberDetails, + null, + memberDetails.getAuthorities()) + ); + return securityContext; + } +} diff --git a/src/test/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductControllerTest.java b/src/test/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductControllerTest.java new file mode 100644 index 00000000..b03bfad7 --- /dev/null +++ b/src/test/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductControllerTest.java @@ -0,0 +1,52 @@ +package kr.co.fastcampus.yanabada.domain.product.controller; + +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 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.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +@SpringBootTest +@AutoConfigureMockMvc +public class ProductControllerTest { + + private static final MediaType MEDIA_TYPE = MediaType.APPLICATION_JSON; + + @Autowired + private MockMvc mockMvc; + + @DisplayName("[API][POST] 상품 등록 - 정상적인 등록 요청일 경우, 정상적으로 상품이 등록됩니다.") + @Test + @WithMockMember + void add_success() throws Exception { + //given + String url = "/v1/products"; + String request = """ + { + "orderId": 1, + "price": "400000", + "description": "급하게 처분합니다. 네고 환영합니다!!!", + "canNegotiate": true, + "saleEndDate": "2024-01-26", + "isAutoCancel": true + } + """; + + //when + mockMvc.perform(post(url) + .content(request) + .contentType(MEDIA_TYPE) + ) + + //then + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.status").value("FAIL")); + } +}