diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductControllerTest.java index 1e6985a7b6f05d55f872142fddee575a3ff9c412..4c6bce4dbf8ecd7d238c54ed7ce6c577d2f9b03f 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductControllerTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductControllerTest.java @@ -7,6 +7,7 @@ import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import ntnu.idatt2016.v233.SmartMat.service.AllergyService; import ntnu.idatt2016.v233.SmartMat.service.product.CategoryService; import ntnu.idatt2016.v233.SmartMat.service.product.ProductService; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -15,11 +16,11 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import java.util.Arrays; import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @@ -38,17 +39,43 @@ public class ProductControllerTest { @InjectMocks private ProductController productController; - @Test - public void createProduct_productDoesNotExist_returnsCreatedProduct() { - // Arrange - ProductRequest productRequest = ProductRequest.builder() + private Product product; + + private ProductRequest productRequest; + + @BeforeEach + public void setUp() { + product = new Product(); + product.setEan(123L); + product.setName("Test Product"); + product.setDescription("A test kylling"); + product.setUnit("kg"); + product.setAmount(1.0); + + productRequest = ProductRequest.builder() .ean(123L) .name("Test Product") .description("A test product kylling") .image("http://test.com/image.jpg") - .allergies(List.of("Gluten", "Melk")) .build(); + List<Allergy> allergies = Arrays.asList( + Allergy.builder().name("test-allergy").build(), + Allergy.builder().name("test-allergy2").build() + ); + + List<Product> allergyProducts = Arrays.asList( + Product.builder().ean(123L).name("Test Product").build(), + Product.builder().ean(1234L).name("Test Product 2").build() + ); + + product.setAllergies(allergies); + + allergies.forEach(allergy -> allergy.setProducts(allergyProducts)); + } + + @Test + public void createProduct_productDoesNotExist_returnsCreatedProduct() { when(productService.getProductById(123L)).thenReturn(Optional.empty()); when(productService.getProductVolume(123L)).thenReturn(Optional.of(List.of("1", "kg"))); when(categoryService.getCategoryByName(anyString())).thenReturn(Optional.of(Category.builder() @@ -59,27 +86,24 @@ public class ProductControllerTest { // Act ResponseEntity<Product> response = productController.createProduct(productRequest); - Product product = response.getBody(); + Product productResponse = response.getBody(); + // Assert assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals(123L, product.getEan()); - assertEquals("Test Product", product.getName()); - assertEquals("A test product kylling", product.getDescription()); - assertEquals("http://test.com/image.jpg", product.getUrl()); - assertEquals("kg", product.getUnit()); - assertEquals(1.0, product.getAmount()); + assert productResponse != null; + assertEquals(123L, productResponse.getEan()); + assertEquals("Test Product", productResponse.getName()); + assertEquals("A test product kylling", productResponse.getDescription()); + assertEquals("http://test.com/image.jpg", productResponse.getUrl()); + assertEquals("kg", productResponse.getUnit()); + assertEquals(1.0, productResponse.getAmount()); } @Test public void createProduct_productExists_returnsConflict() { // Arrange - ProductRequest productRequest = ProductRequest.builder() - .ean(123L) - .name("Test Product") - .description("A test product kylling") - .image("http://test.com/image.jpg") - .build(); + when(productService.getProductById(123L)).thenReturn(Optional.of(new Product())); when(categoryService.getCategoryByName(anyString())).thenReturn(Optional.of(Category.builder() @@ -96,11 +120,7 @@ public class ProductControllerTest { @Test public void getProduct_productExists_returnsProduct() { - // Arrange - Product product = new Product(); - product.setEan(123L); - product.setName("Test Product"); - product.setDescription("A test kylling"); + when(productService.getProductById(123L)).thenReturn(Optional.of(product)); @@ -110,6 +130,7 @@ public class ProductControllerTest { // Assert assertEquals(HttpStatus.OK, response.getStatusCode()); + assert result != null; assertEquals(123L, result.getEan()); assertEquals("Test Product", result.getName()); } @@ -126,4 +147,79 @@ public class ProductControllerTest { assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); assertFalse(response.hasBody()); } + + @Test + public void getAllProducts_returnsAllProducts() { + // Arrange + List<Product> products = Arrays.asList( + new Product(), + new Product(), + new Product() + ); + when(productService.getAllProducts()).thenReturn(products); + + // Act + ResponseEntity<List<Product>> response = productController.getAllProducts(); + + // Assert + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + assertEquals(3, response.getBody().size()); + } + + @Test + public void deleteProduct_productDoesNotExist_returnsNotFound() { + // Arrange + when(productService.getProductById(123L)).thenReturn(Optional.empty()); + + // Act + ResponseEntity<String> response = productController.deleteProduct(123L); + + // Assert + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals("Product not found", response.getBody()); + } + + @Test + public void updateProduct_productDoesNotExist_returnsNotFound() { + // Arrange + when(productService.getProductById(123L)).thenReturn(Optional.empty()); + + // Act + ResponseEntity<Product> response = productController.updateProduct(123L, productRequest); + + // Assert + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + } + + @Test + public void getProductByName_productExists_returnsProduct() { + // Arrange + when(productService.getProductByName("Test Product")).thenReturn(Optional.of(product)); + + // Act + ResponseEntity<Product> response = productController.getProductByName("Test Product"); + Product result = response.getBody(); + + // Assert + assertEquals(HttpStatus.OK, response.getStatusCode()); + assert result != null; + assertEquals(123L, result.getEan()); + assertEquals("Test Product", result.getName()); + } + + @Test + public void getProductByName_productDoesNotExist_returnsNotFound() { + // Arrange + when(productService.getProductByName("Nonexistent Product")).thenReturn(Optional.empty()); + + // Act + ResponseEntity<Product> response = productController.getProductByName("Nonexistent Product"); + + // Assert + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertFalse(response.hasBody()); + } + + } \ No newline at end of file