Skip to content

Commit 648311d

Browse files
add Product API testing part
1 parent 248fd30 commit 648311d

File tree

3 files changed

+278
-0
lines changed

3 files changed

+278
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package csembstu.alamgir.server.controller;
2+
3+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
4+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
5+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
6+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
import org.mockito.Mockito;
15+
16+
import csembstu.alamgir.server.dto.request.CreateProductRequest;
17+
import csembstu.alamgir.server.entity.Product;
18+
import csembstu.alamgir.server.service.ProductService;
19+
20+
import org.springframework.beans.factory.annotation.Autowired;
21+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
22+
import org.springframework.http.MediaType;
23+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
24+
import org.springframework.test.web.servlet.MockMvc;
25+
26+
import com.fasterxml.jackson.databind.ObjectMapper;
27+
28+
@WebMvcTest(ProductController.class)
29+
public class ProductControllerTest {
30+
31+
@Autowired private MockMvc mockMvc;
32+
@MockitoBean private ProductService productService;
33+
@Autowired private ObjectMapper objectMapper;
34+
35+
private CreateProductRequest newProduct1;
36+
private CreateProductRequest newProduct2;
37+
38+
@BeforeEach
39+
void init() {
40+
newProduct1 = new CreateProductRequest(); newProduct1.setName("Frozen Vaccine"); newProduct1.setMaxTemperature(-20.0); newProduct1.setMinTemperature(-10.0);
41+
newProduct2 = new CreateProductRequest(); newProduct2.setName("Fresh Milk"); newProduct2.setMaxTemperature(2.0); newProduct2.setMinTemperature(6.0);
42+
}
43+
44+
private Product mapToEntity(CreateProductRequest request, String id) {
45+
Product product = new Product();
46+
product.setId(id); product.setName(request.getName()); product.setMaxTemperature(request.getMaxTemperature()); product.setMinTemperature(request.getMinTemperature());
47+
return product;
48+
}
49+
50+
51+
52+
53+
54+
@Test
55+
@DisplayName("POST /api/products : 201 CREATED")
56+
57+
void shouldCreateProductSuccessfully() throws Exception {
58+
59+
// GIVEN
60+
Product saveProduct1 = mapToEntity(newProduct1, "p1");
61+
Mockito.when(productService.createProduct(Mockito.any(CreateProductRequest.class))).thenReturn(saveProduct1);
62+
63+
// WHEN
64+
mockMvc.perform(post("/api/products")
65+
.contentType(MediaType.APPLICATION_JSON)
66+
.content(objectMapper.writeValueAsString(newProduct1)))
67+
.andExpect(status().isCreated())
68+
.andExpect(jsonPath("$.id").value("p1"))
69+
.andExpect(jsonPath("$.maxTemperature").value(-20.0))
70+
.andExpect(jsonPath("$.minTemperature").value(-10.0));
71+
72+
// VERIFY
73+
Mockito.verify(productService).createProduct(Mockito.any(CreateProductRequest.class));
74+
}
75+
76+
77+
78+
79+
@Test
80+
@DisplayName("GET /api/products : 200 OK")
81+
void shouldReturnAllProduct() throws Exception {
82+
83+
// GIVEN
84+
Product savedProoduct1 = mapToEntity(newProduct1, "p1");
85+
Product savedProoduct2 = mapToEntity(newProduct2, "p1");
86+
List<Product> productList = Arrays.asList(savedProoduct1, savedProoduct2);
87+
88+
// WHEN AND THEN
89+
Mockito.when(productService.getAllProduct()).thenReturn(productList);
90+
91+
92+
mockMvc.perform(get("/api/products"))
93+
.andExpect(status().isOk())
94+
.andExpect(jsonPath("$.size()").value(2))
95+
96+
.andExpect(jsonPath("$[0].name").value("Frozen Vaccine"))
97+
.andExpect(jsonPath("$.[0]maxTemperature").value(-20.0))
98+
.andExpect(jsonPath("$[0].minTemperature").value(-10.0))
99+
100+
.andExpect(jsonPath("$[1].name").value("Fresh Milk"))
101+
.andExpect(jsonPath("$.[1]maxTemperature").value(2.0))
102+
.andExpect(jsonPath("$[1].minTemperature").value(6.0));
103+
104+
// VERIFY
105+
Mockito.verify(productService).getAllProduct();
106+
}
107+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package csembstu.alamgir.server.repository;
2+
3+
import static org.junit.jupiter.api.Assertions.assertFalse;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Test;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
11+
12+
import csembstu.alamgir.server.entity.Product;
13+
14+
@DataJpaTest
15+
public class ProductRepositoryTest {
16+
17+
@Autowired
18+
private ProductRepository productRepository;
19+
20+
@BeforeEach
21+
void init() {
22+
Product mockProduct = new Product();
23+
mockProduct.setName("Frozen Vaccine");
24+
mockProduct.setMaxTemperature(-20);
25+
mockProduct.setMinTemperature(-10);
26+
productRepository.save(mockProduct);
27+
}
28+
29+
30+
31+
@Test
32+
@DisplayName("EXISTS: Should return true when name match")
33+
void shouldReturnTrueWhenNameMatch() {
34+
35+
boolean exists = productRepository.existsByName("Frozen Vaccine");
36+
assertTrue(exists);
37+
}
38+
39+
40+
41+
42+
@Test
43+
@DisplayName("EXISTS: Should return false when Name does not match")
44+
void shouldReturnFalseWhenNameIsIncorrect() {
45+
boolean exists = productRepository.existsByName("Alamgir");
46+
assertFalse(exists);
47+
}
48+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package csembstu.alamgir.server.service;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
import static org.mockito.ArgumentMatchers.any;
8+
import static org.mockito.Mockito.times;
9+
import static org.mockito.Mockito.verify;
10+
import static org.mockito.Mockito.when;
11+
12+
import java.util.Arrays;
13+
import java.util.List;
14+
15+
import org.apache.coyote.BadRequestException;
16+
import org.junit.jupiter.api.BeforeEach;
17+
import org.junit.jupiter.api.DisplayName;
18+
import org.junit.jupiter.api.Test;
19+
import org.junit.jupiter.api.extension.ExtendWith;
20+
import org.mockito.InjectMocks;
21+
import org.mockito.Mock;
22+
import org.mockito.junit.jupiter.MockitoExtension;
23+
24+
import csembstu.alamgir.server.dto.request.CreateProductRequest;
25+
import csembstu.alamgir.server.entity.Product;
26+
import csembstu.alamgir.server.repository.ProductRepository;
27+
28+
@ExtendWith(MockitoExtension.class)
29+
public class ProductServiceTest {
30+
31+
@Mock
32+
ProductRepository productRepository;
33+
34+
@InjectMocks
35+
private ProductService productService;
36+
37+
private CreateProductRequest newProduct1;
38+
private CreateProductRequest newProduct2;
39+
40+
@BeforeEach
41+
void init() {
42+
newProduct1 = new CreateProductRequest(); newProduct1.setName("Frozen Vaccine"); newProduct1.setMaxTemperature(-20.0); newProduct1.setMinTemperature(-10.0);
43+
newProduct2 = new CreateProductRequest(); newProduct2.setName("Fresh Milk"); newProduct2.setMaxTemperature(2.0); newProduct2.setMinTemperature(6.0);
44+
}
45+
46+
private Product mapToEntity(CreateProductRequest request, String id) {
47+
Product product = new Product(); product.setId(id); product.setName(request.getName()); product.setMaxTemperature(request.getMaxTemperature()); product.setMinTemperature(request.getMinTemperature());
48+
return product;
49+
}
50+
51+
52+
53+
54+
@Test
55+
@DisplayName("Create Product: Should save successfully when product is unique")
56+
void shouldSaveProductSuccessfullyWhenUnique() throws BadRequestException {
57+
58+
// GIVEN
59+
Product mockProduct1 = mapToEntity(newProduct1, "p1");
60+
when(productRepository.existsByName(mockProduct1.getName())).thenReturn(false);
61+
when(productRepository.save(any(Product.class))).thenReturn(mockProduct1);
62+
63+
// WHEN
64+
Product savedProduct = productService.createProduct(newProduct1);
65+
66+
// THEN
67+
assertNotNull(savedProduct);
68+
assertEquals("Frozen Vaccine", savedProduct.getName());
69+
assertEquals(-20.0, savedProduct.getMaxTemperature());
70+
assertEquals(-10.0, savedProduct.getMinTemperature());
71+
72+
// VERIFY
73+
verify(productRepository).existsByName("Frozen Vaccine");
74+
verify(productRepository, times(1)).save(any(Product.class));
75+
76+
}
77+
78+
79+
80+
@Test
81+
@DisplayName("Create Product: Should throw BadRequestException when Product exists")
82+
void shouldThrowExceptionWhenProductAlreadyExists() {
83+
84+
// GIVEN
85+
Product mockProduct = mapToEntity(newProduct1, "p1");
86+
when(productRepository.existsByName(mockProduct.getName())).thenReturn(true);
87+
88+
// WHEN
89+
BadRequestException exception = assertThrows(BadRequestException.class, () -> {
90+
productService.createProduct(newProduct1);
91+
});
92+
93+
// THEN
94+
assertTrue(exception.getMessage().contains("already exists"));
95+
96+
}
97+
98+
99+
100+
101+
@Test
102+
@DisplayName("Get All Product: Should return list of all products")
103+
void shouldReturnAllProductSuccessfully() {
104+
105+
// GIVEN
106+
Product mockProduct1 = mapToEntity(newProduct1, "p1");
107+
Product mockProduct2 = mapToEntity(newProduct2, "p2");
108+
List<Product> productList = Arrays.asList(mockProduct1, mockProduct2);
109+
when(productRepository.findAll()).thenReturn(productList);
110+
111+
// WHEN
112+
List<Product> products = productService.getAllProduct();
113+
114+
// THEN
115+
assertNotNull(products);
116+
assertEquals(2, products.size());
117+
assertEquals(mockProduct1, products.get(0));
118+
assertEquals(mockProduct2, products.get(1));
119+
120+
// VERIFY
121+
verify(productRepository, times(1)).findAll();
122+
}
123+
}

0 commit comments

Comments
 (0)