diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java index 9265609330a6a1164792c8cdcc9116e08afa3360..115760fa842ff53a8733956e82227e227646291e 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java @@ -2,7 +2,9 @@ package ntnu.idatt2016.v233.SmartMat.controller.group; import lombok.AllArgsConstructor; import ntnu.idatt2016.v233.SmartMat.dto.request.FridgeProductRequest; +import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; +import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import ntnu.idatt2016.v233.SmartMat.service.group.FridgeService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -56,12 +58,12 @@ public class FridgeController { * @return success if the product was added, bad request if the product was already in the fridge, or not found if the group or product doesn't exist */ @PostMapping("/group/product") - public ResponseEntity<Object> addProductToFridge(@RequestBody FridgeProductRequest request) { + public ResponseEntity<Product> addProductToFridge(@RequestBody FridgeProductRequest request) { return fridgeService.addProductToFridge(request).map(ResponseEntity::ok).orElseGet(()-> ResponseEntity.notFound().build()); } @PutMapping("/group/product") - public ResponseEntity<Object> updateProductInFridge(@RequestBody FridgeProductRequest request) { + public ResponseEntity<FridgeProductAsso> updateProductInFridge(@RequestBody FridgeProductRequest request) { return fridgeService.updateProductInFridge(request).map(ResponseEntity::ok).orElseGet(()-> ResponseEntity.notFound().build()); } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java index b143fa8fcfc08cdb532efdf8ff89329715acb3f2..0c0a92dbb3fcdb31c1312e562f184a48ae02ac93 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java @@ -69,41 +69,37 @@ public class FridgeService { * @param fridgeProductRequest the fridge product request * @return the product that was added to the fridge */ - public Optional<Object> addProductToFridge(FridgeProductRequest fridgeProductRequest) { + public Optional<Product> addProductToFridge(FridgeProductRequest fridgeProductRequest) { Optional<Product> product = productService.getProductById(fridgeProductRequest.ean()); Optional<Fridge> fridge = fridgeRepository.findByGroupGroupId(fridgeProductRequest.groupId()); if(product.isEmpty() || fridge.isEmpty()) return Optional.empty(); fridge.get().addProduct(FridgeProductAsso.builder() - .fridgeId(fridge.get()) - .ean(product.get()) - .amount(fridgeProductRequest.amount()) - .daysToExpiration(fridgeProductRequest.days()) - .purchaseDate(java.sql.Date.valueOf(LocalDate.now())) + .fridgeId(fridge.get()) + .ean(product.get()) + .amount(fridgeProductRequest.amount()) + .daysToExpiration(fridgeProductRequest.days()) + .purchaseDate(java.sql.Date.valueOf(LocalDate.now())) .build()); fridgeRepository.save(fridge.get()); - return Optional.of(product); - + return product; } - - public Optional<Object> updateProductInFridge(FridgeProductRequest request) { + + public Optional<FridgeProductAsso> updateProductInFridge(FridgeProductRequest request) { Optional<FridgeProductAsso> fridgeProductAsso = fridgeProductAssoRepo.findById(request.fridgeProductId()); if (fridgeProductAsso.isEmpty()) return Optional.empty(); - - Integer amount = request.amount(); - Integer days = request.days(); - if (amount != null) fridgeProductAsso.get() - .setAmount(request.amount()); + int amount = request.amount(); + int days = request.days(); + + fridgeProductAsso.get().setAmount(amount); + fridgeProductAsso.get().setDaysToExpiration(days); - if (days != null) fridgeProductAsso.get() - .setDaysToExpiration(request.days()); - fridgeProductAssoRepo.save(fridgeProductAsso.get()); - return Optional.of(fridgeProductAsso); + return fridgeProductAsso; } @@ -159,12 +155,12 @@ public class FridgeService { * @param amount the amount to delete * @return an optional containing the fridge product if it exists */ - public Optional<Object> deleteAmountFromFridge(long fridgeProductId, double amount) { + public Optional<FridgeProductAsso> deleteAmountFromFridge(long fridgeProductId, double amount) { Optional<FridgeProductAsso> fridgeProductAsso = fridgeProductAssoRepo.findAllById(fridgeProductId); if(fridgeProductAsso.isEmpty()) return Optional.empty(); FridgeProductAsso fridgeProductAsso1 = fridgeProductAsso.get(); if(amount < fridgeProductAsso1.getAmount() ){ - fridgeProductAsso1.setAmount(fridgeProductAsso1.getAmount() -amount); + fridgeProductAsso1.setAmount(fridgeProductAsso1.getAmount() - amount); return Optional.of(fridgeProductAssoRepo.save(fridgeProductAsso1)); } else { Group group = fridgeProductAsso1.getFridgeId().getGroup(); @@ -172,7 +168,7 @@ public class FridgeService { group.setLevel(GroupUtil.getLevel(group.getPoints())); groupRepository.save(group); fridgeProductAssoRepo.delete(fridgeProductAsso.get()); - return Optional.of(true); + return Optional.empty(); } } @@ -181,7 +177,7 @@ public class FridgeService { * @param fridgeProductId the ID of the fridge product association to delete * @return an Optional containing the saved waste object, or an empty Optional if the fridge product association with the given ID is not found */ - public Optional<Object> wasteProductFromFridge(long fridgeProductId){ + public Optional<Waste> wasteProductFromFridge(long fridgeProductId){ Optional<FridgeProductAsso> fridgeProductAsso = fridgeProductAssoRepo.findById(fridgeProductId); if(fridgeProductAsso.isEmpty()) return Optional.empty(); FridgeProductAsso fridgeProductAsso1 = fridgeProductAsso.get(); @@ -192,7 +188,13 @@ public class FridgeService { group.setLevel(GroupUtil.getLevel(group.getPoints())); } groupRepository.save(group); - return Optional.of(wasteRepository.save(Waste.builder().amount(fridgeProductAsso1.getAmount()).unit(fridgeProductAsso1.getEan().getUnit()).ean(fridgeProductAsso1.getEan()).groupId(fridgeProductAsso1.getFridgeId().getGroup()).timestamp(new Timestamp(System.currentTimeMillis())).build())); + return Optional.of(wasteRepository.save(Waste.builder() + .amount(fridgeProductAsso1.getAmount()) + .unit(fridgeProductAsso1.getEan().getUnit()) + .ean(fridgeProductAsso1.getEan()) + .groupId(fridgeProductAsso1.getFridgeId().getGroup()) + .timestamp(new Timestamp(System.currentTimeMillis())) + .build())); } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..fcfc26930462979000077ecde7551c47148c47f1 --- /dev/null +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeControllerTest.java @@ -0,0 +1,144 @@ +package ntnu.idatt2016.v233.SmartMat.controller.group; + +import com.fasterxml.jackson.databind.ObjectMapper; +import ntnu.idatt2016.v233.SmartMat.dto.request.FridgeProductRequest; +import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; +import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; +import ntnu.idatt2016.v233.SmartMat.entity.product.Product; +import ntnu.idatt2016.v233.SmartMat.service.group.FridgeService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Optional; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@ExtendWith(SpringExtension.class) +@WebMvcTest(FridgeController.class) +@AutoConfigureMockMvc(addFilters = false) // Disables security for this test class +public class FridgeControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @MockBean + private FridgeService fridgeService; + + private Fridge fridge; + private Product product; + private FridgeProductAsso fridgeProductAsso; + private FridgeProductRequest fridgeProductRequest; + + @BeforeEach + public void setUp() { + // Create and set up your test data here + fridge = new Fridge(); + product = new Product(); + fridgeProductAsso = new FridgeProductAsso(); + fridgeProductRequest = new FridgeProductRequest(1L, 1L, 1L, 2, 7); + } + + @Test + public void getFridgeByGroupId() throws Exception { + when(fridgeService.getFridgeByGroupId(1L)).thenReturn(Optional.of(fridge)); + + mockMvc.perform(get("/api/fridges/group/1")) + .andExpect(status().isOk()); + } + + @Test + public void getFridgeByGroupId_notFound() throws Exception { + when(fridgeService.getFridgeByGroupId(1L)).thenReturn(Optional.empty()); + + mockMvc.perform(get("/api/fridges/group/1")) + .andExpect(status().isNotFound()); + } + + @Test + public void getFridgeByFridgeId() throws Exception { + when(fridgeService.getFridgeByFridgeId(1L)).thenReturn(Optional.of(fridge)); + + mockMvc.perform(get("/api/fridges/fridge/1")) + .andExpect(status().isOk()); + } + + @Test + public void getFridgeByFridgeId_notFound() throws Exception { + when(fridgeService.getFridgeByFridgeId(1L)).thenReturn(Optional.empty()); + + mockMvc.perform(get("/api/fridges/fridge/1")) + .andExpect(status().isNotFound()); + } + + @Test + public void addProductToFridge() throws Exception { + when(fridgeService.addProductToFridge(any(FridgeProductRequest.class))).thenReturn(Optional.of(product)); + + mockMvc.perform(post("/api/fridges/group/product") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(fridgeProductRequest))) + .andExpect(status().isOk()); + } + + @Test + public void addProductToFridge_notFound() throws Exception { + when(fridgeService.addProductToFridge(any(FridgeProductRequest.class))).thenReturn(Optional.empty()); + + mockMvc.perform(post("/api/fridges/group/product") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(fridgeProductRequest))) + .andExpect(status().isNotFound()); + } + + @Test + public void updateProductInFridge() throws Exception { + when(fridgeService.updateProductInFridge(any(FridgeProductRequest.class))).thenReturn(Optional.of(fridgeProductAsso)); + + mockMvc.perform(put("/api/fridges/group/product") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(fridgeProductRequest))) + .andExpect(status().isOk()); + } + + @Test + public void updateProductInFridge_notFound() throws Exception { + when(fridgeService.updateProductInFridge(any(FridgeProductRequest.class))).thenReturn(Optional.empty()); + + mockMvc.perform(put("/api/fridges/group/product") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(fridgeProductRequest))) + .andExpect(status().isNotFound()); + } + + @Test + public void removeProductFromFridge_success() throws Exception { + when(fridgeService.removeProductFromFridge(1L)).thenReturn(true); + + mockMvc.perform(delete("/api/fridges/delete/product/1")) + .andExpect(status().isOk()) + .andExpect(content().string("Success")); + } + + @Test + public void removeProductFromFridge_badRequest() throws Exception { + when(fridgeService.removeProductFromFridge(1L)).thenReturn(false); + + mockMvc.perform(delete("/api/fridges/delete/product/1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string("Product not found in the fridge")); + } +}