From cb243aac5ebb848470d1aedfbeb3cb411fd05830 Mon Sep 17 00:00:00 2001 From: jihaneol <6531z@naver.com> Date: Thu, 10 Apr 2025 23:46:40 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=8B=A4=EC=A4=91=20db?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ”— Resolves: #293 --- .../test/java/com/jishop/review/dtoTest.java | 16 -------- .../jishop/review/reviewRepositoryTest.java | 14 +++++-- .../com/jishop/review/reviewServiceTest.java | 7 +++- .../src/test/resources/application-test.yml | 38 +++++++++++++++++++ 4 files changed, 54 insertions(+), 21 deletions(-) delete mode 100644 backend/JiShop/src/test/java/com/jishop/review/dtoTest.java create mode 100644 backend/JiShop/src/test/resources/application-test.yml diff --git a/backend/JiShop/src/test/java/com/jishop/review/dtoTest.java b/backend/JiShop/src/test/java/com/jishop/review/dtoTest.java deleted file mode 100644 index 112370b4..00000000 --- a/backend/JiShop/src/test/java/com/jishop/review/dtoTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.jishop.review; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -public class dtoTest { - @Test - @DisplayName("request ํ…Œ์ŠคํŠธ") - void request() throws Exception { - // given - //when - System.out.println("df"); - //then - - } -} diff --git a/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java b/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java index de433453..5f6d2094 100644 --- a/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java +++ b/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java @@ -1,20 +1,26 @@ package com.jishop.review; +import com.jishop.product.repository.ProductRepository; import com.jishop.review.dto.ReviewImageResponse; import com.jishop.review.repository.ReviewRepository; 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.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; -@DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@SpringBootTest +@Transactional +@ActiveProfiles("test") public class reviewRepositoryTest { + @Autowired + private ProductRepository productRepository; + @Autowired private ReviewRepository reviewRepository; diff --git a/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java b/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java index b0862393..d3af48c2 100644 --- a/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java +++ b/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java @@ -7,11 +7,16 @@ import com.jishop.review.domain.tag.Tag; import com.jishop.review.dto.ReviewRequest; import com.jishop.saleproduct.domain.SaleProduct; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest +@ExtendWith(MockitoExtension.class) public class reviewServiceTest { + + + private Option createOption(OptionCategory optionCategory, String optionValue, int optionExtra) { return new Option(optionCategory, optionValue, optionExtra); } diff --git a/backend/JiShop/src/test/resources/application-test.yml b/backend/JiShop/src/test/resources/application-test.yml new file mode 100644 index 00000000..8ca08401 --- /dev/null +++ b/backend/JiShop/src/test/resources/application-test.yml @@ -0,0 +1,38 @@ +spring: + # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • + datasource: + shopdb: + jdbc-url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1 + username: sa + password: + driver-class-name: org.h2.Driver + logdb: + jdbc-url: jdbc:h2:mem:testdb2;MODE=MYSQL;DB_CLOSE_DELAY=-1 + username: sa + password: + driver-class-name: org.h2.Driver + + # JPA ์„ค์ • + jpa: + hibernate: + ddl-auto: create-drop + show-sql: true + database-platform: org.hibernate.dialect.H2Dialect + + data: + redis: + host: localhost + port: 6379 + # H2 ์ฝ˜์†” ์„ค์ • + h2: + console: + enabled: true + path: /h2-console + + # ์บ์‹œ ์„ค์ • + cache: + type: none + +# ์„œ๋ฒ„ ์„ค์ • +server: + port: 8081 \ No newline at end of file From 254621ccbde42cb6bbdf3d237269564d35f19477 Mon Sep 17 00:00:00 2001 From: jihaneol <6531z@naver.com> Date: Fri, 11 Apr 2025 01:28:33 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1=20-=20?= =?UTF-8?q?=EC=9D=B8=EB=A9=94=EB=AA=A8=EB=A6=AC=20=EC=84=A4=EC=A0=95=20-?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EA=B0=92=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ”— Resolves: #293 --- .../java/com/jishop/config/ShopDBConfig.java | 2 +- .../jishop/review/reviewRepositoryTest.java | 137 +++++++++++++++++- .../src/test/resources/application-test.yml | 6 +- 3 files changed, 140 insertions(+), 5 deletions(-) diff --git a/backend/JiShop/src/main/java/com/jishop/config/ShopDBConfig.java b/backend/JiShop/src/main/java/com/jishop/config/ShopDBConfig.java index 476bc862..0d522b65 100644 --- a/backend/JiShop/src/main/java/com/jishop/config/ShopDBConfig.java +++ b/backend/JiShop/src/main/java/com/jishop/config/ShopDBConfig.java @@ -30,7 +30,7 @@ public LocalContainerEntityManagerFactoryBean shopEntityManager() { em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); Properties properties = new Properties(); - properties.setProperty("hibernate.hbm2ddl.auto", "update"); + properties.put("hibernate.hbm2ddl.auto", "create-drop"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); properties.setProperty("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"); diff --git a/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java b/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java index 5f6d2094..11a6b7ea 100644 --- a/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java +++ b/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java @@ -1,8 +1,35 @@ package com.jishop.review; +import com.jishop.address.dto.AddressRequest; +import com.jishop.category.domain.Category; +import com.jishop.category.repository.CategoryRepository; +import com.jishop.member.domain.LoginType; +import com.jishop.member.domain.User; +import com.jishop.member.repository.UserRepository; +import com.jishop.option.domain.Option; +import com.jishop.option.domain.OptionCategory; +import com.jishop.option.repository.OptionRepository; +import com.jishop.order.domain.Order; +import com.jishop.order.domain.OrderDetail; +import com.jishop.order.dto.OrderDetailRequest; +import com.jishop.order.dto.OrderRequest; +import com.jishop.order.repository.OrderDetailRepository; +import com.jishop.order.repository.OrderRepository; +import com.jishop.product.domain.DiscountStatus; +import com.jishop.product.domain.Labels; +import com.jishop.product.domain.Product; +import com.jishop.product.domain.SaleStatus; import com.jishop.product.repository.ProductRepository; +import com.jishop.review.domain.tag.Tag; import com.jishop.review.dto.ReviewImageResponse; +import com.jishop.review.dto.ReviewRequest; +import com.jishop.review.dto.ReviewWithOutUserResponse; import com.jishop.review.repository.ReviewRepository; +import com.jishop.review.service.ReviewService; +import com.jishop.saleproduct.domain.SaleProduct; +import com.jishop.saleproduct.repository.SaleProductRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -13,27 +40,135 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + @SpringBootTest @Transactional @ActiveProfiles("test") public class reviewRepositoryTest { + @Autowired + private SaleProductRepository saleProductRepository; + + @Autowired + private OptionRepository optionRepository; + + @Autowired + private CategoryRepository categoryRepository; + @Autowired private ProductRepository productRepository; + @Autowired + private OrderRepository orderRepository; + @Autowired private ReviewRepository reviewRepository; + @Autowired + private UserRepository userRepository; + + @Autowired + private ReviewService reviewService; + @Autowired + private OrderDetailRepository orderDetailRepository; + + @BeforeEach + void init() { + + Category category = new Category(null, 5000L, "ํŒจ์…˜", "5000", "ํŒจ์…˜", 1); + Category category1 = new Category(category, 5010L, "์ƒ์˜", "5000>5010", "ํŒจ์…˜>์ƒ์˜", 2); + Category category2 = new Category(category1, 5100L, "์ ํผ", "5000>5010>5100", "ํŒจ์…˜>์ƒ์˜>์ ํผ", 3); + categoryRepository.save(category); + categoryRepository.save(category1); + categoryRepository.save(category2); + + Product product = new Product(category, 5000L, 5010L, 5100L, "MALL-001", "ํ…Œ์ŠคํŠธ ์ƒํ’ˆ", "ํ…Œ์ŠคํŠธ ์ƒํ’ˆ ์„ค๋ช…", 10000, 8000, 20, LocalDateTime.now() + , false, SaleStatus.SELLING, DiscountStatus.NONE, true, "ํ…Œ์ŠคํŠธ ๋ธŒ๋žœ๋“œ", 0, Labels.SPECIAL_PRICE, + "main.jpg", "image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "detail.jpg", 0); + + productRepository.save(product); + + Option option = new Option(OptionCategory.FASHION_CLOTHES, "ํ™”์ดํŠธ/FREE", 1000); + optionRepository.save(option); + + SaleProduct saleProduct = new SaleProduct(product, option, "ํ™”์ดํŠธ ์ ํผ"); + saleProductRepository.save(saleProduct); + + + OrderRequest sampleOrderRequest = createSampleOrderRequest(); + + User user = User.builder() + .loginId("testuser@example.com") // ๋กœ๊ทธ์ธ ์•„์ด๋”” (์ด๋ฉ”์ผ ๋˜๋Š” ์†Œ์…œ ID) + .password("testPassword123!") // ๋น„๋ฐ€๋ฒˆํ˜ธ (์†Œ์…œ ๋กœ๊ทธ์ธ์€ null ๊ฐ€๋Šฅ) + .name("ํ™๊ธธ๋™") // ์ด๋ฆ„ + .birthDate("1995-05-01") // ์ƒ๋…„์›”์ผ + .gender("M") // ์„ฑ๋ณ„ (M/F) + .phone("010-1234-5678") // ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ + .provider(LoginType.LOCAL) // ๋กœ๊ทธ์ธ ํƒ€์ž… (enum ๊ฐ’) + .ageAgreement(true) // ๋งŒ 14์„ธ ์ด์ƒ ๋™์˜ + .useAgreement(true) // ์„œ๋น„์Šค ์ด์šฉ ์•ฝ๊ด€ ๋™์˜ + .picAgreement(true) // ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๋ฐฉ์นจ ๋™์˜ + .adAgreement(false) // ๊ด‘๊ณ  ์ˆ˜์‹  ๋™์˜ + .build(); + + userRepository.save(user); + + Order order = Order.from(sampleOrderRequest, user, "1"); + OrderDetail orderDetail = OrderDetail.from(order, saleProduct, 3); + List list = new ArrayList<>(); + list.add(orderDetail); + order.updateOrderInfo(1000, 0, 1000, list, "1"); + orderRepository.save(order); + } + + @Test + @DisplayName("๋ฆฌ๋ทฐ ์ž‘์„ฑํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ") + void ๋ฆฌ๋ทฐ_์ž‘์„ฑ๋ฐŽ_์กฐํšŒ() throws Exception { + // given + ReviewRequest request = new ReviewRequest(1L, "๊ตณ๊ตณ", null, Tag.RECOMMENDED, 3); + User user = userRepository.findById(1L).orElseThrow(IllegalStateException::new); + Long review = reviewService.createReview(request, user); + //when + ReviewWithOutUserResponse detailReview = reviewService.getDetailReview(review); + //then + Assertions.assertEquals(user.getId(), 1L); + Assertions.assertEquals(review, 1L); + Assertions.assertEquals(detailReview.name(), "ํ™๊ธธ๋™"); + } + @Test @DisplayName("๋ฆฌ๋ทฐ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด์Šค") void imagesSlice() throws Exception { // given PageRequest pageable = PageRequest.of(0, 1, Sort.by(Sort.Direction.DESC, "createdAt")); - Slice reviewSlice= reviewRepository.findByAllWithImage(pageable).map(ReviewImageResponse::from); + Slice reviewSlice = reviewRepository.findByAllWithImage(pageable).map(ReviewImageResponse::from); //then System.out.println(reviewSlice.getContent()); System.out.println(reviewSlice.getNumber()); System.out.println(reviewSlice.hasNext()); } + + private OrderRequest createSampleOrderRequest() { + // ์ฃผ์†Œ ์ •๋ณด ์ƒ์„ฑ + AddressRequest addressRequest = new AddressRequest( + "ํ™๊ธธ๋™", + "010-1234-5678", + "12345", + "์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 123", + "456๋™ 789ํ˜ธ", + false + ); + + // ์ฃผ๋ฌธ ์ƒํ’ˆ ๋ชฉ๋ก ์ƒ์„ฑ + List orderDetailRequestList = List.of( + new OrderDetailRequest(1L, 3) // saleProductId: 1, quantity: 3 + ); + + // OrderRequest ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜ + return new OrderRequest(addressRequest, orderDetailRequestList); + } } diff --git a/backend/JiShop/src/test/resources/application-test.yml b/backend/JiShop/src/test/resources/application-test.yml index 8ca08401..0bdea12c 100644 --- a/backend/JiShop/src/test/resources/application-test.yml +++ b/backend/JiShop/src/test/resources/application-test.yml @@ -14,10 +14,10 @@ spring: # JPA ์„ค์ • jpa: - hibernate: - ddl-auto: create-drop show-sql: true - database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate.format_sql: true # SQL ์ด์˜๊ฒŒ ์ถœ๋ ฅ + hibernate.highlight_sql: true # SQL ์ปฌ๋Ÿฌ ์ถœ๋ ฅ data: redis: From 44efe8e9e05d0b6cc224abc1c11ecd64965d026a Mon Sep 17 00:00:00 2001 From: jihaneol <6531z@naver.com> Date: Fri, 11 Apr 2025 23:37:19 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=A6=AC=EB=B6=80=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ๋ ˆ๋””์Šค config mock ๋Œ€์ฒด - resolve mock ๋Œ€์ฒด - mockBean -> mockitoBean ๐Ÿ”— Resolves: #293 --- .../java/com/jishop/config/RedisConfig.java | 2 + .../com/jishop/config/RedissonConfig.java | 2 + .../com/jishop/config/TossPaymentConfig.java | 3 - .../review/service/ReviewServiceImpl.java | 12 +- .../com/jishop/config/TestRedisConfig.java | 29 +++++ ...ryTest.java => ReviewIntegrationTest.java} | 111 ++++++++++++------ .../com/jishop/review/reviewServiceTest.java | 9 +- 7 files changed, 117 insertions(+), 51 deletions(-) create mode 100644 backend/JiShop/src/test/java/com/jishop/config/TestRedisConfig.java rename backend/JiShop/src/test/java/com/jishop/review/{reviewRepositoryTest.java => ReviewIntegrationTest.java} (66%) diff --git a/backend/JiShop/src/main/java/com/jishop/config/RedisConfig.java b/backend/JiShop/src/main/java/com/jishop/config/RedisConfig.java index a936b68c..1b7c5b52 100644 --- a/backend/JiShop/src/main/java/com/jishop/config/RedisConfig.java +++ b/backend/JiShop/src/main/java/com/jishop/config/RedisConfig.java @@ -8,6 +8,7 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; @@ -19,6 +20,7 @@ import java.util.Arrays; @Configuration +@Profile("!test") @EnableRedisHttpSession public class RedisConfig { diff --git a/backend/JiShop/src/main/java/com/jishop/config/RedissonConfig.java b/backend/JiShop/src/main/java/com/jishop/config/RedissonConfig.java index 2c5c56c6..543af01d 100644 --- a/backend/JiShop/src/main/java/com/jishop/config/RedissonConfig.java +++ b/backend/JiShop/src/main/java/com/jishop/config/RedissonConfig.java @@ -6,8 +6,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; @Configuration +@Profile("!test") public class RedissonConfig { diff --git a/backend/JiShop/src/main/java/com/jishop/config/TossPaymentConfig.java b/backend/JiShop/src/main/java/com/jishop/config/TossPaymentConfig.java index 44beafac..4359f0af 100644 --- a/backend/JiShop/src/main/java/com/jishop/config/TossPaymentConfig.java +++ b/backend/JiShop/src/main/java/com/jishop/config/TossPaymentConfig.java @@ -1,13 +1,10 @@ package com.jishop.config; import lombok.Getter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.Base64; diff --git a/backend/JiShop/src/main/java/com/jishop/review/service/ReviewServiceImpl.java b/backend/JiShop/src/main/java/com/jishop/review/service/ReviewServiceImpl.java index fc497438..423160e6 100644 --- a/backend/JiShop/src/main/java/com/jishop/review/service/ReviewServiceImpl.java +++ b/backend/JiShop/src/main/java/com/jishop/review/service/ReviewServiceImpl.java @@ -18,6 +18,7 @@ import com.jishop.saleproduct.domain.SaleProduct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -47,7 +48,6 @@ public Long createReview(ReviewRequest reviewRequest, User user) { SaleProduct saleProduct = orderDetail.getSaleProduct(); - String productSummary = makeProductSummar(saleProduct, orderDetail); Product product = saleProduct.getProduct(); @@ -64,10 +64,14 @@ public Long createReview(ReviewRequest reviewRequest, User user) { reviewProduct.increaseRating(reviewRequest.rating()); - // ๋ฆฌ๋ทฐ ์ €์žฅ - Review review = reviewRepository.save(reviewRequest.toEntity(reviewRequest.images(), product, orderDetail, user, productSummary)); + String productSummary = makeProductSummar(saleProduct, orderDetail); - return review.getId(); + try { + Review review = reviewRepository.save(reviewRequest.toEntity(reviewRequest.images(), product, orderDetail, user, productSummary)); + return review.getId(); + } catch (DataIntegrityViolationException e) { + throw new DomainException(ErrorType.REVIEW_DUPLICATE); + } } private String makeProductSummar(SaleProduct saleProduct, OrderDetail orderDetail) { diff --git a/backend/JiShop/src/test/java/com/jishop/config/TestRedisConfig.java b/backend/JiShop/src/test/java/com/jishop/config/TestRedisConfig.java new file mode 100644 index 00000000..0242b32c --- /dev/null +++ b/backend/JiShop/src/test/java/com/jishop/config/TestRedisConfig.java @@ -0,0 +1,29 @@ +package com.jishop.config; + +import org.redisson.api.RedissonClient; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; + +import static org.mockito.Mockito.mock; + +@TestConfiguration +public class TestRedisConfig { + @Bean + public RedisConnectionFactory redisConnectionFactory() { + return mock(RedisConnectionFactory.class); + } + + @Bean + public RedisTemplate redisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory()); // ์ด๋ ‡๊ฒŒ factory ์—ฐ๊ฒฐ + return redisTemplate; + } + + @Bean + public RedissonClient redissonClient() { + return mock(RedissonClient.class); + } +} diff --git a/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java b/backend/JiShop/src/test/java/com/jishop/review/ReviewIntegrationTest.java similarity index 66% rename from backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java rename to backend/JiShop/src/test/java/com/jishop/review/ReviewIntegrationTest.java index 11a6b7ea..f7147a23 100644 --- a/backend/JiShop/src/test/java/com/jishop/review/reviewRepositoryTest.java +++ b/backend/JiShop/src/test/java/com/jishop/review/ReviewIntegrationTest.java @@ -1,8 +1,11 @@ package com.jishop.review; +import com.fasterxml.jackson.databind.ObjectMapper; import com.jishop.address.dto.AddressRequest; import com.jishop.category.domain.Category; import com.jishop.category.repository.CategoryRepository; +import com.jishop.config.TestRedisConfig; +import com.jishop.member.annotation.CurrentUserResolver; import com.jishop.member.domain.LoginType; import com.jishop.member.domain.User; import com.jishop.member.repository.UserRepository; @@ -13,7 +16,6 @@ import com.jishop.order.domain.OrderDetail; import com.jishop.order.dto.OrderDetailRequest; import com.jishop.order.dto.OrderRequest; -import com.jishop.order.repository.OrderDetailRepository; import com.jishop.order.repository.OrderRepository; import com.jishop.product.domain.DiscountStatus; import com.jishop.product.domain.Labels; @@ -21,33 +23,38 @@ import com.jishop.product.domain.SaleStatus; import com.jishop.product.repository.ProductRepository; import com.jishop.review.domain.tag.Tag; -import com.jishop.review.dto.ReviewImageResponse; import com.jishop.review.dto.ReviewRequest; -import com.jishop.review.dto.ReviewWithOutUserResponse; -import com.jishop.review.repository.ReviewRepository; import com.jishop.review.service.ReviewService; import com.jishop.saleproduct.domain.SaleProduct; import com.jishop.saleproduct.repository.SaleProductRepository; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; 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.data.domain.PageRequest; -import org.springframework.data.domain.Slice; -import org.springframework.data.domain.Sort; +import org.springframework.context.annotation.Import; +import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -@SpringBootTest +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + @Transactional +@SpringBootTest +@AutoConfigureMockMvc @ActiveProfiles("test") -public class reviewRepositoryTest { +@Import(TestRedisConfig.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ReviewIntegrationTest { @Autowired private SaleProductRepository saleProductRepository; @@ -55,6 +62,9 @@ public class reviewRepositoryTest { @Autowired private OptionRepository optionRepository; + @Autowired + private ReviewService reviewService; + @Autowired private CategoryRepository categoryRepository; @@ -64,20 +74,20 @@ public class reviewRepositoryTest { @Autowired private OrderRepository orderRepository; - @Autowired - private ReviewRepository reviewRepository; - @Autowired private UserRepository userRepository; @Autowired - private ReviewService reviewService; + private MockMvc mvc; + @Autowired - private OrderDetailRepository orderDetailRepository; + private ObjectMapper objectMapper; - @BeforeEach - void init() { + @MockitoBean + private CurrentUserResolver currentUserResolver; + @BeforeAll + void init() { Category category = new Category(null, 5000L, "ํŒจ์…˜", "5000", "ํŒจ์…˜", 1); Category category1 = new Category(category, 5010L, "์ƒ์˜", "5000>5010", "ํŒจ์…˜>์ƒ์˜", 2); Category category2 = new Category(category1, 5100L, "์ ํผ", "5000>5010>5100", "ํŒจ์…˜>์ƒ์˜>์ ํผ", 3); @@ -122,36 +132,43 @@ void init() { list.add(orderDetail); order.updateOrderInfo(1000, 0, 1000, list, "1"); orderRepository.save(order); + + } @Test - @DisplayName("๋ฆฌ๋ทฐ ์ž‘์„ฑํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ") - void ๋ฆฌ๋ทฐ_์ž‘์„ฑ๋ฐŽ_์กฐํšŒ() throws Exception { + @DisplayName("๋ฆฌ๋ทฐ ์ž‘์„ฑ") + void createReview() throws Exception { // given ReviewRequest request = new ReviewRequest(1L, "๊ตณ๊ตณ", null, Tag.RECOMMENDED, 3); User user = userRepository.findById(1L).orElseThrow(IllegalStateException::new); - Long review = reviewService.createReview(request, user); - //when - ReviewWithOutUserResponse detailReview = reviewService.getDetailReview(review); - //then - Assertions.assertEquals(user.getId(), 1L); - Assertions.assertEquals(review, 1L); - Assertions.assertEquals(detailReview.name(), "ํ™๊ธธ๋™"); + loginResolver(user); + + // when + Long result = ๋ฆฌ๋ทฐ์ž‘์„ฑ(request); + + // then + Assertions.assertNotNull(result); } + @Test - @DisplayName("๋ฆฌ๋ทฐ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด์Šค") - void imagesSlice() throws Exception { + @DisplayName("ํ•œ๋ฒˆํ•œ ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๋˜ ์ž‘์„ฑํ• ๋•Œ ์—๋Ÿฌ ๋ฐœ์ƒ.") + void duplicate_review() throws Exception { // given - PageRequest pageable = PageRequest.of(0, 1, Sort.by(Sort.Direction.DESC, "createdAt")); - Slice reviewSlice = reviewRepository.findByAllWithImage(pageable).map(ReviewImageResponse::from); - //then - System.out.println(reviewSlice.getContent()); - System.out.println(reviewSlice.getNumber()); - System.out.println(reviewSlice.hasNext()); + ReviewRequest request = new ReviewRequest(1L, "๊ตณ๊ตณ", null, Tag.RECOMMENDED, 3); + User user = userRepository.findById(1L).orElseThrow(IllegalStateException::new); + loginResolver(user); + ๋ฆฌ๋ทฐ์ž‘์„ฑ(request); + //when + mvc.perform(MockMvcRequestBuilders.post("/reviews") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isConflict()); } + private OrderRequest createSampleOrderRequest() { // ์ฃผ์†Œ ์ •๋ณด ์ƒ์„ฑ AddressRequest addressRequest = new AddressRequest( @@ -171,4 +188,24 @@ private OrderRequest createSampleOrderRequest() { // OrderRequest ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜ return new OrderRequest(addressRequest, orderDetailRequestList); } + + private void loginResolver(User user) throws Exception { + given(currentUserResolver.supportsParameter(any())) + .willReturn(true); + given(currentUserResolver.resolveArgument(any(), any(), any(), any())) + .willReturn(user);// ๊ฐ•์ œ ๋ฆฌํ„ด + } + + + private Long ๋ฆฌ๋ทฐ์ž‘์„ฑ(ReviewRequest request) throws Exception { + MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post("/reviews") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andReturn(); + + String response = mvcResult.getResponse().getContentAsString(); + + return objectMapper.readValue(response, Long.class); + } } diff --git a/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java b/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java index d3af48c2..ff40a375 100644 --- a/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java +++ b/backend/JiShop/src/test/java/com/jishop/review/reviewServiceTest.java @@ -4,19 +4,14 @@ import com.jishop.option.domain.OptionCategory; import com.jishop.order.domain.Order; import com.jishop.product.domain.Product; -import com.jishop.review.domain.tag.Tag; -import com.jishop.review.dto.ReviewRequest; import com.jishop.saleproduct.domain.SaleProduct; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.test.context.SpringBootTest; @ExtendWith(MockitoExtension.class) public class reviewServiceTest { - - private Option createOption(OptionCategory optionCategory, String optionValue, int optionExtra) { return new Option(optionCategory, optionValue, optionExtra); } @@ -30,8 +25,8 @@ private SaleProduct createSaleProduct(Product product, Option option) { } private Order createOrder(Long paymentId, Long userId, String mainProductName, int totalPrice, - String receiver, String receiverNumber, String zipCode, - String baseAddress, String detailAddress) { + String receiver, String receiverNumber, String zipCode, + String baseAddress, String detailAddress) { return Order.builder() .recipient(receiver) .phone(receiverNumber)