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 e444c646c7dc2c141e07fa38d390fed72433b5d3..b774d9c2840ab36f66618db825453a4fd7a628b7 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 @@ -27,8 +27,8 @@ import java.util.Optional; * Service for management of a group fridge * * @author Anders Austlid & Birk - * @version 1.2 - * @since 26.04.2023 + * @version 2 + * @since 04.05.2023 */ @AllArgsConstructor @Service @@ -100,19 +100,16 @@ public class FridgeService { 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() + fridgeProductAsso.get() .setAmount(request.amount()); - if (days != null) fridgeProductAsso.get() + fridgeProductAsso.get() .setDaysToExpiration(request.days()); - fridgeProductAssoRepo.save(fridgeProductAsso.get()); - return fridgeProductAsso; + + return Optional.of(fridgeProductAssoRepo.save(fridgeProductAsso.get())); } @@ -134,15 +131,6 @@ public class FridgeService { return true; } - /** - * Updates a fridge - * @param fridge the fridge to update - */ - public void updateFridge(Fridge fridge) { - if (fridgeRepository.findById(fridge.getFridgeId()).isEmpty()) - return; - fridgeRepository.save(fridge); - } /** diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java index 7034e9a0dc20af046286626a83c21fd80ce9b401..5db6d64914fe288c30a415f204603ee8a694a7ee 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java @@ -6,11 +6,16 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import ntnu.idatt2016.v233.SmartMat.dto.request.FridgeProductRequest; +import ntnu.idatt2016.v233.SmartMat.entity.Waste; import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; import ntnu.idatt2016.v233.SmartMat.entity.product.Product; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; import ntnu.idatt2016.v233.SmartMat.repository.group.GroupRepository; +import ntnu.idatt2016.v233.SmartMat.repository.group.WasteRepository; import ntnu.idatt2016.v233.SmartMat.repository.product.FridgeProductAssoRepo; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -21,7 +26,6 @@ import org.mockito.MockitoAnnotations; import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; import ntnu.idatt2016.v233.SmartMat.service.product.ProductService; -import java.sql.Date; import java.util.ArrayList; import java.util.Optional; @@ -38,6 +42,10 @@ public class FridgeServiceTest { @Mock private GroupRepository groupRepository; + + @Mock + private WasteRepository wasteRepository; + @Mock private FridgeProductAssoRepo fridgeProductAssoRepo; @@ -217,7 +225,353 @@ public class FridgeServiceTest { @Test void deleteEntireAmountFromProduct(){ + // Arrange + long ean = 12345L; + Product product = Product.builder() + .ean(ean) + .name("Test Product") + .build(); + + Fridge fridge = Fridge.builder() + .fridgeId(1234L) + .build(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + FridgeProductAsso fridgepr = FridgeProductAsso.builder() + .fridgeId(fridge) + .ean(product) + .id(123456L) + .amount(2) + .build(); + + fridge.addProduct(fridgepr); + product.addFridge(fridgepr); + + when(fridgeProductAssoRepo.findById(123456L)).thenReturn(Optional.of(fridgepr)); + when(fridgeProductAssoRepo.findAllById(123456L)).thenReturn(Optional.of(fridgepr)); + when(productService.getProductById(ean)).thenReturn(Optional.of(product)); + + double newAmount = fridgepr.getAmount() - 1; + + + when(fridgeProductAssoRepo.save(FridgeProductAsso.builder() + .amount(newAmount) + .id(123456L) + .ean(product) + .fridgeId(fridge) + .build() + )).thenReturn(FridgeProductAsso.builder() + .amount(newAmount) + .id(139132L) + .ean(product) + .fridgeId(fridge) + .build()); + + // Act + Optional<FridgeProductAsso> result = fridgeService.deleteAmountFromFridge(123456L, 2); + + // Assert + assertTrue(result.isEmpty()); + verify(fridgeProductAssoRepo).delete(any(FridgeProductAsso.class)); } + + @Test + void wasteProductFromFridge(){ + // Arrange + long ean = 12345L; + Product product = Product.builder() + .ean(ean) + .name("Test Product") + .build(); + + Fridge fridge = Fridge.builder() + .fridgeId(1234L) + .build(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + group.setPoints(100); + fridge.setGroup(group); + group.setFridge(fridge); + + FridgeProductAsso fridgepr = FridgeProductAsso.builder() + .fridgeId(fridge) + .ean(product) + .id(123456L) + .amount(2) + .build(); + + fridge.addProduct(fridgepr); + product.addFridge(fridgepr); + + when(fridgeProductAssoRepo.findById(123456L)).thenReturn(Optional.of(fridgepr)); + when(fridgeProductAssoRepo.findAllById(123456L)).thenReturn(Optional.of(fridgepr)); + when(productService.getProductById(ean)).thenReturn(Optional.of(product)); + when(wasteRepository.save(any(Waste.class))).thenReturn(Waste.builder() + .amount(2) + .ean(product) + .groupId(group) + .build()); + + // Act + + Optional<Waste> result = fridgeService.wasteProductFromFridge(123456L); + + // Assert + assertTrue(result.isPresent()); + assertEquals(2, result.get().getAmount()); + assertEquals(product.getEan(), result.get().getEan().getEan()); + assertEquals(group.getGroupId(), result.get().getGroupId().getGroupId()); + assertEquals(group.getPoints(), 99); + + verify(fridgeProductAssoRepo).delete(any(FridgeProductAsso.class)); + verify(groupRepository).save(any(Group.class)); + } + + @Test + void updateProductInFridge(){ + // Arrange + long ean = 12345L; + Product product = Product.builder() + .ean(ean) + .name("Test Product") + .build(); + + Fridge fridge = Fridge.builder() + .fridgeId(1234L) + .build(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + FridgeProductAsso fridgepr = FridgeProductAsso.builder() + .fridgeId(fridge) + .ean(product) + .id(123456L) + .amount(2) + .build(); + + fridge.addProduct(fridgepr); + product.addFridge(fridgepr); + + when(fridgeProductAssoRepo.findById(123456L)).thenReturn(Optional.of(fridgepr)); + when(productService.getProductById(ean)).thenReturn(Optional.of(product)); + + when(fridgeProductAssoRepo.save(any(FridgeProductAsso.class))).thenReturn(FridgeProductAsso.builder() + .fridgeId(fridge) + .ean(product) + .id(123456L) + .amount(1) + .daysToExpiration(100) + .buyPrice(100.0) + .build()); + // Act + + FridgeProductRequest fridgeProductRequest = new FridgeProductRequest(123456L, group.getGroupId(), + product.getEan(), 1, 100, 100); + + Optional<FridgeProductAsso> result = fridgeService.updateProductInFridge(fridgeProductRequest); + + // Assert + + assertTrue(result.isPresent()); + assertEquals(1, result.get().getAmount()); + assertEquals(100, result.get().getDaysToExpiration()); + assertEquals(100, result.get().getBuyPrice()); + + verify(fridgeProductAssoRepo).save(any(FridgeProductAsso.class)); + + } + + @Test + void isUserAssosiatedWithFridge(){ + Fridge fridge = new Fridge(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + User user = User.builder() + .username("test") + .password("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .id(new UserGroupId(user.getUsername(), group.getGroupId())) + .user(user) + .group(group) + .build(); + + user.addGroup(userGroupAsso); + group.addUser(userGroupAsso); + + when(fridgeRepository.findById(fridge.getFridgeId())).thenReturn(Optional.of(fridge)); + + // Act + + boolean result = fridgeService.isUserInFridge(user.getUsername(), fridge.getFridgeId()); + + // Assert + + assertTrue(result); + verify(fridgeRepository).findById(fridge.getFridgeId()); + + } + + @Test + void isUserNotAssosiatedWithFridge(){ + Fridge fridge = new Fridge(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + User user = User.builder() + .username("test") + .password("test") + .build(); + + when(fridgeRepository.findById(fridge.getFridgeId())).thenReturn(Optional.of(fridge)); + + // Act + + boolean result = fridgeService.isUserInFridge(user.getUsername(), fridge.getFridgeId()); + + // Assert + + assertFalse(result); + verify(fridgeRepository).findById(fridge.getFridgeId()); + + } + + @Test + void getFridgeByFridgeId(){ + // Arrange + Fridge fridge = Fridge.builder() + .fridgeId(1234L) + .build(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + when(fridgeRepository.findById(1234L)).thenReturn(Optional.of(fridge)); + + // Act + + Optional<Fridge> result = fridgeService.getFridgeByFridgeId(1234L); + + // Assert + + assertTrue(result.isPresent()); + assertEquals(1234L, result.get().getFridgeId()); + + verify(fridgeRepository).findById(1234L); + } + + @Test + void isUserInGroupWithFridgeProduct(){ + // Arrange + long ean = 12345L; + Product product = Product.builder() + .ean(ean) + .name("Test Product") + .build(); + + Fridge fridge = Fridge.builder() + .fridgeId(1234L) + .build(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + FridgeProductAsso fridgepr = FridgeProductAsso.builder() + .fridgeId(fridge) + .ean(product) + .id(123456L) + .amount(2) + .build(); + + fridge.addProduct(fridgepr); + product.addFridge(fridgepr); + + User user = User.builder() + .username("test") + .password("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .id(new UserGroupId(user.getUsername(), group.getGroupId())) + .user(user) + .group(group) + .build(); + + user.addGroup(userGroupAsso); + group.addUser(userGroupAsso); + + when(fridgeProductAssoRepo.findById(123456L)).thenReturn(Optional.of(fridgepr)); + + // Act + + boolean result = fridgeService.isUserInGroupWithFridgeProduct(user.getUsername(), 123456L); + + // Assert + + assertTrue(result); + verify(fridgeProductAssoRepo).findById(123456L); + } + + + @Test + void isUserInGroupWithFridgeProduct_not(){ + // Arrange + long ean = 12345L; + Product product = Product.builder() + .ean(ean) + .name("Test Product") + .build(); + + Fridge fridge = Fridge.builder() + .fridgeId(1234L) + .build(); + fridge.setProducts(new ArrayList<>()); + Group group = new Group(); + fridge.setGroup(group); + group.setFridge(fridge); + + FridgeProductAsso fridgepr = FridgeProductAsso.builder() + .fridgeId(fridge) + .ean(product) + .id(123456L) + .amount(2) + .build(); + + fridge.addProduct(fridgepr); + product.addFridge(fridgepr); + + User user = User.builder() + .username("test") + .password("test") + .build(); + + + when(fridgeProductAssoRepo.findById(123456L)).thenReturn(Optional.of(fridgepr)); + + // Act + + boolean result = fridgeService.isUserInGroupWithFridgeProduct(user.getUsername(), 123456L); + + // Assert + + assertFalse(result); + verify(fridgeProductAssoRepo).findById(123456L); + } + + } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java index d6ab5af0029f352ecb7dee9055380513eb98251b..3136a7253e101843d8b0d3722a9ba2998fefc820 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java @@ -9,6 +9,7 @@ import ntnu.idatt2016.v233.SmartMat.repository.ShoppingListRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.GroupRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.UserGroupAssoRepository; +import ntnu.idatt2016.v233.SmartMat.util.GroupUtil; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -18,8 +19,7 @@ import org.mockito.MockitoAnnotations; import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; public class GroupServiceTest { @@ -60,7 +60,7 @@ public class GroupServiceTest { verify(groupRepository).findByGroupName(groupName); } - /** + @Test void testCreateGroup() { // Arrange @@ -76,11 +76,13 @@ public class GroupServiceTest { // Assert assertEquals(group, result); + assertNotNull(result.getLinkCode()); + verify(groupRepository).findByGroupName(groupName); verify(groupRepository).findAllLinkCode(); verify(groupRepository).save(group); } - */ + @Test void testAddFridgeToGroup() { @@ -138,4 +140,256 @@ public class GroupServiceTest { assertTrue(result); verify(userGroupAssoRepository).findById(userGroupAsso.getId()); } + + @Test + void openOrCloseGroup(){ + // Arrange + long groupId = 1L; + Group group = new Group(); + group.setGroupId(groupId); + group.setOpen(false); + when(groupRepository.findByGroupId(groupId)).thenReturn(Optional.of(group)); + when(groupRepository.save(group)).thenReturn(group); + + // Act + groupService.OpenOrCloseGroup(groupId); + + // Assert + assertTrue(group.getOpen()); + + + + groupService.OpenOrCloseGroup(groupId); + + // Assert + assertFalse(group.getOpen()); + verify(groupRepository, times(2)).findByGroupId(groupId); + verify(groupRepository, times(2)).save(group); + } + + @Test + void removeUserFromGroup(){ + Group group = new Group(); + group.setGroupId(1L); + group.setOpen(false); + + User user = User.builder() + .username("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .user(user) + .group(group) + .id(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()) + .build(); + + user.addGroup(userGroupAsso); + group.addUser(userGroupAsso); + + when(userGroupAssoRepository.findById(userGroupAsso.getId())).thenReturn(Optional.of(userGroupAsso)); + when(groupRepository.findByGroupId(group.getGroupId())).thenReturn(Optional.of(group)); + + + assertTrue(groupService.removeUserFromGroup(userGroupAsso)); + + verify(userGroupAssoRepository).delete(userGroupAsso); + + + } + + @Test + void setLevelByGroupId(){ + // Arrange + long groupId = 1L; + Group group = new Group(); + group.setGroupId(groupId); + group.setLevel(1); + group.setPoints(10); + when(groupRepository.findByGroupId(groupId)).thenReturn(Optional.of(group)); + when(groupRepository.save(group)).thenReturn(group); + + // Act + groupService.setLevelByGroupId(groupId, group.getPoints()); + + // Assert + assertEquals(0, group.getLevel()); + verify(groupRepository).findByGroupId(groupId); + verify(groupRepository).save(group); + } + + @Test + void getProgressOfLevel(){ + // Arrange + long groupId = 1L; + Group group = new Group(); + group.setGroupId(groupId); + group.setLevel(1); + group.setPoints(100); + when(groupRepository.findByGroupId(groupId)).thenReturn(Optional.of(group)); + + // Act + Optional<Integer> result = groupService.getProgressOfLevel(groupId); + + // Assert + assertTrue(result.isPresent()); + + assertEquals(GroupUtil.getProgressOfLevel(group.getPoints()), result.get()); + verify(groupRepository).findByGroupId(groupId); + } + + @Test + void getUserGroupAsso(){ + Group group = new Group(); + group.setGroupId(1L); + group.setOpen(false); + + User user = User.builder() + .username("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .user(user) + .group(group) + .id(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()) + .build(); + + user.addGroup(userGroupAsso); + group.addUser(userGroupAsso); + + + when(userGroupAssoRepository.findById(userGroupAsso.getId())).thenReturn(Optional.of(userGroupAsso)); + + Optional<UserGroupAsso> result = groupService.getUserGroupAsso(userGroupAsso.getId().getUsername(), + userGroupAsso.getId().getGroupId()); + + assertTrue(result.isPresent()); + + assertEquals(userGroupAsso, result.get()); + + verify(userGroupAssoRepository).findById(userGroupAsso.getId()); + + } + + @Test + void getUserGroupAssoAuthority(){ + Group group = new Group(); + group.setGroupId(1L); + group.setOpen(false); + + User user = User.builder() + .username("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .user(user) + .group(group) + .groupAuthority("USER") + .id(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()) + .build(); + + user.addGroup(userGroupAsso); + group.addUser(userGroupAsso); + + when(userGroupAssoRepository.findById(userGroupAsso.getId())).thenReturn(Optional.of(userGroupAsso)); + + String result = groupService.getUserGroupAssoAuthority(userGroupAsso.getId().getUsername(), + userGroupAsso.getId().getGroupId()); + + + assertEquals("USER", result); + + verify(userGroupAssoRepository).findById(userGroupAsso.getId()); + + } + + @Test + void getGroupById(){ + // Arrange + long groupId = 1L; + Group group = new Group(); + group.setGroupId(groupId); + when(groupRepository.findById(groupId)).thenReturn(Optional.of(group)); + + // Act + Optional<Group> result = groupService.getGroupById(groupId); + + // Assert + assertTrue(result.isPresent()); + assertEquals(group, result.get()); + verify(groupRepository).findById(groupId); + } + + @Test + void getGroupById_notFound(){ + // Arrange + long groupId = 1L; + Group group = new Group(); + group.setGroupId(groupId); + when(groupRepository.findById(groupId)).thenReturn(Optional.of(group)); + + // Act + Optional<Group> result = groupService.getGroupById(5L); + + // Assert + assertTrue(result.isEmpty()); + verify(groupRepository).findById(5L); + } + + @Test + void updateUserGroupAsso(){ + Group group = new Group(); + group.setGroupId(1L); + group.setOpen(false); + + User user = User.builder() + .username("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .user(user) + .group(group) + .groupAuthority("USER") + .id(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()) + .build(); + + user.addGroup(userGroupAsso); + group.addUser(userGroupAsso); + + when(userGroupAssoRepository.findById(userGroupAsso.getId())).thenReturn(Optional.of(userGroupAsso)); + when(userGroupAssoRepository.save(any(UserGroupAsso.class))).thenReturn(UserGroupAsso.builder() + .id(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()) + .groupAuthority("ADMIN") + .group(group) + .user(user) + .build()); + + UserGroupAsso result = groupService.updateUserGroupAsso(UserGroupAsso.builder() + .id(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()) + .groupAuthority("ADMIN") + .group(group) + .user(user) + .build()); + + + assertEquals("ADMIN", result.getGroupAuthority()); + verify(userGroupAssoRepository).save(any(UserGroupAsso.class)); + } }