package com.baeldung.ecommerce; import com.baeldung.ecommerce.controller.OrderController; import com.baeldung.ecommerce.controller.ProductController; import com.baeldung.ecommerce.dto.OrderProductDto; import com.baeldung.ecommerce.model.Order; import com.baeldung.ecommerce.model.Product; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; import java.util.Collections; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasProperty; @RunWith(SpringRunner.class) @SpringBootTest(classes = { EcommerceApplication.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class EcommerceApplicationIntegrationTest { @Autowired private TestRestTemplate restTemplate; @LocalServerPort private int port; @Autowired private ProductController productController; @Autowired private OrderController orderController; @Test public void contextLoads() { Assertions .assertThat(productController) .isNotNull(); Assertions .assertThat(orderController) .isNotNull(); } @Test public void givenGetProductsApiCall_whenProductListRetrieved_thenSizeMatchAndListContainsProductNames() { ResponseEntity> responseEntity = restTemplate.exchange("http://localhost:" + port + "/api/products", HttpMethod.GET, null, new ParameterizedTypeReference>() { }); Iterable products = responseEntity.getBody(); Assertions .assertThat(products) .hasSize(7); assertThat(products, hasItem(hasProperty("name", is("TV Set")))); assertThat(products, hasItem(hasProperty("name", is("Game Console")))); assertThat(products, hasItem(hasProperty("name", is("Sofa")))); assertThat(products, hasItem(hasProperty("name", is("Icecream")))); assertThat(products, hasItem(hasProperty("name", is("Beer")))); assertThat(products, hasItem(hasProperty("name", is("Phone")))); assertThat(products, hasItem(hasProperty("name", is("Watch")))); } @Test public void givenGetOrdersApiCall_whenProductListRetrieved_thenSizeMatchAndListContainsProductNames() { ResponseEntity> responseEntity = restTemplate.exchange("http://localhost:" + port + "/api/orders", HttpMethod.GET, null, new ParameterizedTypeReference>() { }); Iterable orders = responseEntity.getBody(); Assertions .assertThat(orders) .hasSize(0); } @Test public void givenPostOrder_whenBodyRequestMatcherJson_thenResponseContainsEqualObjectProperties() { final ResponseEntity postResponse = restTemplate.postForEntity("http://localhost:" + port + "/api/orders", prepareOrderForm(), Order.class); Order order = postResponse.getBody(); Assertions .assertThat(postResponse.getStatusCode()) .isEqualByComparingTo(HttpStatus.CREATED); assertThat(order, hasProperty("status", is("PAID"))); assertThat(order.getOrderProducts(), hasItem(hasProperty("quantity", is(2)))); } private OrderController.OrderForm prepareOrderForm() { OrderController.OrderForm orderForm = new OrderController.OrderForm(); OrderProductDto productDto = new OrderProductDto(); productDto.setProduct(new Product(1L, "TV Set", 300.00, "http://placehold.it/200x100")); productDto.setQuantity(2); orderForm.setProductOrders(Collections.singletonList(productDto)); return orderForm; } }