#33 tdd(order-service): get product

This commit is contained in:
haerong22
2023-02-08 01:23:34 +09:00
parent 305d0369c3
commit e87891c8d8
7 changed files with 80 additions and 18 deletions

View File

@@ -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, "할인 정책은 필수입니다.");
}
}

View File

@@ -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("상품이 존재하지 않습니다."));
}
}

View File

@@ -2,4 +2,6 @@ package com.example.productorderservice.product;
interface ProductPort {
void save(Product product);
Product getProduct(long productId);
}

View File

@@ -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()
);
}
}

View File

@@ -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<Response> 상품등록요청(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 = "상품명";

View File

@@ -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();
}
}

View File

@@ -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<Response> 상품등록요청(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;
}
}