diff --git a/product-order-service/src/main/java/com/example/productorderservice/product/GetProductResponse.java b/product-order-service/src/main/java/com/example/productorderservice/product/GetProductResponse.java new file mode 100644 index 00000000..e54cbd63 --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/product/GetProductResponse.java @@ -0,0 +1,18 @@ +package com.example.productorderservice.product; + +import org.springframework.util.Assert; + +record GetProductResponse( + long id, + String name, + int price, + DiscountPolicy discountPolicy +) { + + GetProductResponse { + Assert.notNull(id, "상품 ID는 필수입니다."); + Assert.hasText(name, "상품명은 필수입니다."); + Assert.isTrue(price > 0, "상품 가격은 0보다 커야 합니다."); + Assert.notNull(discountPolicy, "할인 정책은 필수입니다."); + } +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/product/ProductAdapter.java b/product-order-service/src/main/java/com/example/productorderservice/product/ProductAdapter.java index f34e423e..794ce04e 100644 --- a/product-order-service/src/main/java/com/example/productorderservice/product/ProductAdapter.java +++ b/product-order-service/src/main/java/com/example/productorderservice/product/ProductAdapter.java @@ -15,4 +15,10 @@ class ProductAdapter implements ProductPort { public void save(Product product) { productRepository.save(product); } + + @Override + public Product getProduct(long productId) { + return productRepository.findById(productId) + .orElseThrow(() -> new IllegalArgumentException("상품이 존재하지 않습니다.")); + } } diff --git a/product-order-service/src/main/java/com/example/productorderservice/product/ProductPort.java b/product-order-service/src/main/java/com/example/productorderservice/product/ProductPort.java index 21c30258..0c3f19af 100644 --- a/product-order-service/src/main/java/com/example/productorderservice/product/ProductPort.java +++ b/product-order-service/src/main/java/com/example/productorderservice/product/ProductPort.java @@ -2,4 +2,6 @@ package com.example.productorderservice.product; interface ProductPort { void save(Product product); + + Product getProduct(long productId); } diff --git a/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java b/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java index 1b573696..497a535c 100644 --- a/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java +++ b/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java @@ -18,4 +18,15 @@ class ProductService { productPort.save(product); } + + public GetProductResponse getProduct(long productId) { + final Product product = productPort.getProduct(productId); + + return new GetProductResponse( + product.getId(), + product.getName(), + product.getPrice(), + product.getDiscountPolicy() + ); + } } diff --git a/product-order-service/src/test/java/com/example/productorderservice/product/ProductApiTest.java b/product-order-service/src/test/java/com/example/productorderservice/product/ProductApiTest.java index 6494f325..97fd6408 100644 --- a/product-order-service/src/test/java/com/example/productorderservice/product/ProductApiTest.java +++ b/product-order-service/src/test/java/com/example/productorderservice/product/ProductApiTest.java @@ -15,20 +15,12 @@ class ProductApiTest extends ApiTest { @Test void 상품등록() { final var request = 상품등록요청_생성(); - final var response = 상품등록요청(request); + final var response = ProductSteps.상품등록요청(request); assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); } - private static ExtractableResponse 상품등록요청(AddProductRequest request) { - return RestAssured.given().log().all() - .contentType(MediaType.APPLICATION_JSON_VALUE) - .body(request) - .when() - .post("/products") - .then() - .log().all().extract(); - } + private static AddProductRequest 상품등록요청_생성() { final String name = "상품명"; diff --git a/product-order-service/src/test/java/com/example/productorderservice/product/ProductServiceTest.java b/product-order-service/src/test/java/com/example/productorderservice/product/ProductServiceTest.java index a006b524..31fe1b33 100644 --- a/product-order-service/src/test/java/com/example/productorderservice/product/ProductServiceTest.java +++ b/product-order-service/src/test/java/com/example/productorderservice/product/ProductServiceTest.java @@ -1,10 +1,11 @@ package com.example.productorderservice.product; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import static org.assertj.core.api.Assertions.*; + @SpringBootTest class ProductServiceTest { @@ -13,18 +14,22 @@ class ProductServiceTest { @Test void 상품등록() { - final AddProductRequest request = 상품등록요청_생성(); + final AddProductRequest request = ProductSteps.상품등록요청_생성(); productService.addProduct(request); } - private static AddProductRequest 상품등록요청_생성() { - final String name = "상품명"; - final int price = 1000; - final DiscountPolicy discountPolicy = DiscountPolicy.NONE; + @Test + void 상품조회() { + // 상품등록 + productService.addProduct(ProductSteps.상품등록요청_생성()); + final long productId = 1L; - final AddProductRequest request = new AddProductRequest(name, price, discountPolicy); - return request; + // 상품 조회 + final GetProductResponse response = productService.getProduct(productId); + + // 상품의 응답을 검증 + assertThat(response).isNotNull(); } } diff --git a/product-order-service/src/test/java/com/example/productorderservice/product/ProductSteps.java b/product-order-service/src/test/java/com/example/productorderservice/product/ProductSteps.java new file mode 100644 index 00000000..dc744492 --- /dev/null +++ b/product-order-service/src/test/java/com/example/productorderservice/product/ProductSteps.java @@ -0,0 +1,28 @@ +package com.example.productorderservice.product; + +import io.restassured.RestAssured; +import io.restassured.response.ExtractableResponse; +import io.restassured.response.Response; +import org.springframework.http.MediaType; + +public class ProductSteps { + + public static ExtractableResponse 상품등록요청(AddProductRequest request) { + return RestAssured.given().log().all() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(request) + .when() + .post("/products") + .then() + .log().all().extract(); + } + + public static AddProductRequest 상품등록요청_생성() { + final String name = "상품명"; + final int price = 1000; + final DiscountPolicy discountPolicy = DiscountPolicy.NONE; + + final AddProductRequest request = new AddProductRequest(name, price, discountPolicy); + return request; + } +}