Commit 1de1a4e1 authored by Ashok Kumar K's avatar Ashok Kumar K

changed url and added integration tests

parent 17d0436f
......@@ -4,7 +4,6 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EcomProductApplication {
public static void main(String[] args) {
......
......@@ -3,7 +3,6 @@ package com.nisum.ecomproduct.controller;
import com.nisum.ecomproduct.model.Product;
import com.nisum.ecomproduct.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
......@@ -12,7 +11,7 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RefreshScope
@RestController
@Validated
public class ProductController {
......
spring:
data:
mongodb:
host: localhost
port: 27017
database: ecom-test
cloud:
config:
discovery:
enabled: false
config:
enabled: false
package com.nisum.ecomproduct.controller;
import com.nisum.ecomproduct.model.Product;
import com.nisum.ecomproduct.repository.ProductRepository;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
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.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
@SpringBootTest(webEnvironment = DEFINED_PORT)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ActiveProfiles("test")
public class ProductControllerIntegrationTest {
@LocalServerPort
private int port;
private String url;
private final String randomId = "someHexString";
@Autowired
TestRestTemplate testRestTemplate;
@Autowired
ProductRepository productRepository;
@BeforeAll
public void setUp() {
initializeDb();
url = "http://localhost:" + port;
}
@Test
void saveProduct_returnsProduct_201() {
Product product = getProductRequestObject();
ResponseEntity<Product> productResponseEntity = testRestTemplate.postForEntity("/save", product, Product.class);
assertEquals(HttpStatus.CREATED, productResponseEntity.getStatusCode());
Product productResponse = productResponseEntity.getBody();
assertNotNull(productResponse);
assertNotNull(productResponse.getId());
}
@Test
void saveProducts_returnsProducts_201() {
List<Product> products = getProductRequestObjectList();
HttpEntity<List<Product>> productsHttpEntity = new HttpEntity<>(products);
ResponseEntity<List<Product>> productListResponseEntity = testRestTemplate.exchange("/saveall", HttpMethod.POST, productsHttpEntity, new ParameterizedTypeReference<List<Product>>() {
});
assertEquals(HttpStatus.CREATED, productListResponseEntity.getStatusCode());
List<Product> productListResponse = productListResponseEntity.getBody();
assertNotNull(productListResponse);
productListResponse.forEach(product -> assertNotNull(product.getId()));
}
private Product getProductRequestObject() {
Product product = new Product();
product.setName("Dell Mouse");
product.setDescription("Input device of the computer");
product.setPrice(300D);
return product;
}
private Product getProductResponseObject() {
Product product = getProductRequestObject();
product.setId(randomId);
return product;
}
private List<Product> getProductRequestObjectList() {
Product product1 = new Product();
product1.setName("Bean bag with beans - L");
product1.setDescription("Comfortable binge");
product1.setPrice(800D);
Product product2 = new Product();
product2.setName("Bean bag with beans - XL");
product2.setDescription("Comfortable binge");
product2.setPrice(1000D);
Product product3 = new Product();
product3.setName("Bean bag with beans - XXL");
product3.setDescription("IComfortable binge");
product3.setPrice(1600D);
return Arrays.asList(product1, product2, product3);
}
private List<Product> getProductResponseObjectList() {
List<Product> products = getProductRequestObjectList();
products.forEach(product -> product.setId(randomId));
return products;
}
private void initializeDb() {
productRepository.deleteAll();
productRepository.saveAll(getProductRequestObjectList());
}
}
......@@ -36,7 +36,7 @@ class ProductControllerTest {
@Autowired
ObjectMapper objectMapper;
private String randomId = "someHexString";
private final String randomId = "someHexString";
@Test
void saveProduct() throws Exception {
......@@ -44,7 +44,7 @@ class ProductControllerTest {
Product productResponseObject = getProductResponseObject();
when(productService.saveProduct(any())).thenReturn(productResponseObject);
MvcResult result = mockMvc.perform(post("/product/save")
MvcResult result = mockMvc.perform(post("/save")
.content(objectMapper.writeValueAsString(productRequestObject))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated())
......@@ -60,7 +60,7 @@ class ProductControllerTest {
List<Product> productsResponse = getProductResponseObjectList();
when(productService.saveProducts(any())).thenReturn(productsResponse);
mockMvc.perform(post("/product/saveall")
mockMvc.perform(post("/saveall")
.content(objectMapper.writeValueAsString(productsRequest))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$", hasSize(3)))
......@@ -74,7 +74,7 @@ class ProductControllerTest {
@Test
void getProductById_returnsProduct_200() throws Exception {
when(productService.getProductById(randomId)).thenReturn(getProductResponseObject());
mockMvc.perform(get("/product/id/" + randomId))
mockMvc.perform(get("/id/" + randomId))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id", is(randomId)))
.andReturn();
......@@ -83,14 +83,10 @@ class ProductControllerTest {
@Test
void getProductById_throws_404() throws Exception {
when(productService.getProductById(randomId)).thenThrow(new ProductNotFoundException());
mockMvc.perform(get("/product/id/" + randomId))
mockMvc.perform(get("/id/" + randomId))
.andExpect(status().isNotFound());
}
@Test
void getRelatedProducts() {
}
@Test
void updateProduct_returnsProduct_200() throws Exception {
Product productRequestObject = getProductRequestObject();
......@@ -98,7 +94,7 @@ class ProductControllerTest {
Product productResponseObject = getProductResponseObject();
when(productService.updateProduct(any())).thenReturn(productResponseObject);
MvcResult result = mockMvc.perform(put("/product/update")
MvcResult result = mockMvc.perform(put("/update")
.content(objectMapper.writeValueAsString(productRequestObject))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
......@@ -114,7 +110,7 @@ class ProductControllerTest {
productRequestObject.setId(randomId);
when(productService.updateProduct(any())).thenThrow(new ProductNotFoundException());
mockMvc.perform(put("/product/update")
mockMvc.perform(put("/update")
.content(objectMapper.writeValueAsString(productRequestObject))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNotFound())
......@@ -124,14 +120,14 @@ class ProductControllerTest {
@Test
void deleteProductById_204() throws Exception {
doNothing().when(productService).deleteProductById(randomId);
mockMvc.perform(delete("/product/" + randomId))
mockMvc.perform(delete("/" + randomId))
.andExpect(status().isNoContent());
}
@Test
void deleteProductById_throwsProductNotFoundException_404() throws Exception {
doThrow(new ProductNotFoundException()).when(productService).deleteProductById(randomId);
mockMvc.perform(delete("/product/" + randomId))
mockMvc.perform(delete("/" + randomId))
.andExpect(status().isNotFound());
}
......
package com.nisum.ecomproduct.service.impl;
import com.nisum.ecomproduct.exception.ProductNotFoundException;
import com.nisum.ecomproduct.model.Product;
import com.nisum.ecomproduct.repository.ProductRepository;
import com.nisum.ecomproduct.service.ProductService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.ActiveProfiles;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@SpringBootTest
@ActiveProfiles("test")
class ProductServiceImplTest {
@Autowired
ProductService productService;
@MockBean
ProductRepository productRepository;
private final String randomId = "someHexString";
@Test
void saveProduct() {
Product productToSave = getProductRequestObject();
doReturn(getProductResponseObject()).when(productRepository).save(productToSave);
Product savedProduct = productService.saveProduct(productToSave);
assertNotNull(savedProduct);
assertNotNull(savedProduct.getId());
}
@Test
void saveProducts() {
List<Product> productsToSave = getProductRequestObjectList();
when(productRepository.saveAll(productsToSave)).thenReturn(getProductResponseObjectList());
List<Product> savedProducts = productService.saveProducts(productsToSave);
assertNotNull(savedProducts);
savedProducts.forEach(savedProduct -> {
assertNotNull(savedProduct);
assertNotNull(savedProduct.getId());
});
}
@Test()
void deleteProductById_throwsProductNotFoundException() {
when(productRepository.existsById(randomId)).thenReturn(false);
assertThrows(ProductNotFoundException.class, () -> productService.deleteProductById(randomId));
}
private Product getProductRequestObject() {
Product product = new Product();
product.setName("Dell Mouse");
product.setDescription("Input device of the computer");
product.setPrice(300D);
return product;
}
private Product getProductResponseObject() {
Product product = getProductRequestObject();
product.setId(randomId);
return product;
}
private List<Product> getProductRequestObjectList() {
Product product1 = new Product();
product1.setName("Bean bag with beans - L");
product1.setDescription("Comfortable binge");
product1.setPrice(800D);
Product product2 = new Product();
product2.setName("Bean bag with beans - XL");
product2.setDescription("Comfortable binge");
product2.setPrice(1000D);
Product product3 = new Product();
product3.setName("Bean bag with beans - XXL");
product3.setDescription("IComfortable binge");
product3.setPrice(1600D);
return Arrays.asList(product1, product2, product3);
}
private List<Product> getProductResponseObjectList() {
List<Product> products = getProductRequestObjectList();
products.forEach(product -> product.setId(randomId));
return products;
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment