From d473eb6fdf36e4c6be142bc6a5b89c7867df35d6 Mon Sep 17 00:00:00 2001 From: birkon <birkon@stud.ntnu.no> Date: Thu, 4 May 2023 10:20:45 +0200 Subject: [PATCH] added authentication on shoppinglist endpoints and controller/service tests --- .../controller/ShoppingListController.java | 4 +- .../repository/ShoppingListRepository.java | 11 ++- .../SmartMat/service/ShoppingListService.java | 12 +++ .../ShoppingListControllerTest.java | 84 ++++++++++++++++++- .../group/FridgeControllerTest.java | 2 +- .../service/ShoppingListServiceTest.java | 31 +++++++ 6 files changed, 139 insertions(+), 5 deletions(-) diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java index 352447b2..4c4d085f 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java @@ -44,7 +44,9 @@ public class ShoppingListController { * @return the shopping list, or an error if the ID is invalid */ @GetMapping("/{id}") - public ResponseEntity<ShoppingList> getShoppingListById(@PathVariable("id") long id) { + public ResponseEntity<ShoppingList> getShoppingListById(@PathVariable("id") long id, Authentication auth) { + shoppingListService.isUserInShoppinglist(id, auth.getName()); + Optional<ShoppingList> shoppingList = shoppingListService.getShoppingListById(id); return shoppingList.map(list -> ResponseEntity.status(HttpStatus.OK).body(list)) .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build()); diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/ShoppingListRepository.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/ShoppingListRepository.java index 8bbc7684..dcc5f416 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/ShoppingListRepository.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/ShoppingListRepository.java @@ -1,5 +1,6 @@ package ntnu.idatt2016.v233.SmartMat.repository; +import java.util.List; import java.util.Optional; import ntnu.idatt2016.v233.SmartMat.entity.ShoppingList; @@ -23,5 +24,13 @@ public interface ShoppingListRepository extends JpaRepository<ShoppingList, Long */ Optional<ShoppingList> getByGroupGroupId(long id); - + + /** + * Gets all shopping lists by the username of the user + * @param username the username of the user + * @return a list of shopping lists + */ + List<ShoppingList> findAllByGroupUsersUsername(String username); + + } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListService.java index c7867e9c..6f1f69f3 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListService.java @@ -105,4 +105,16 @@ public class ShoppingListService { return shoppingListRepository.findById(shoppingListId); } + + /** + * Check if user can edit/get shoppinglist + * @param id id of shoppinglist + * @param name name of user + * @return true if user is in shoppinglist, false if not + */ + public boolean isUserInShoppinglist(long id, String name) { + return shoppingListRepository.findAllByGroupUsersUsername(name).stream() + .anyMatch(shoppingList -> shoppingList.getShoppingListID() == id); + + } } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java index 04b1935e..cf325eb3 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java @@ -1,5 +1,6 @@ package ntnu.idatt2016.v233.SmartMat.controller; +import ntnu.idatt2016.v233.SmartMat.dto.enums.Authority; import ntnu.idatt2016.v233.SmartMat.dto.request.ShoppingListRequest; import ntnu.idatt2016.v233.SmartMat.entity.ShoppingList; import ntnu.idatt2016.v233.SmartMat.service.ShoppingListService; @@ -11,7 +12,12 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import java.util.Collection; +import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -28,6 +34,80 @@ public class ShoppingListControllerTest { private ShoppingList shoppingList; + private final Authentication regularUser = new Authentication() { + @Override + public Collection<? extends GrantedAuthority> getAuthorities() { + return List.of(new SimpleGrantedAuthority(Authority.USER.name())); + } + + @Override + public Object getCredentials() { + return null; + } + + @Override + public Object getDetails() { + return null; + } + + @Override + public Object getPrincipal() { + return null; + } + + @Override + public boolean isAuthenticated() { + return true; + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + + } + + @Override + public String getName() { + return "test"; + } + }; + + private Authentication adminUser = new Authentication() { + @Override + public Collection<? extends GrantedAuthority> getAuthorities() { + return List.of(new SimpleGrantedAuthority(Authority.ADMIN.name())); + } + + @Override + public Object getCredentials() { + return null; + } + + @Override + public Object getDetails() { + return null; + } + + @Override + public Object getPrincipal() { + return null; + } + + @Override + public boolean isAuthenticated() { + return true; + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + + } + + @Override + public String getName() { + return "test"; + } + }; + @BeforeEach public void setUp() { shoppingList = new ShoppingList(); @@ -39,7 +119,7 @@ public class ShoppingListControllerTest { long id = 1; when(shoppingListService.getShoppingListById(id)).thenReturn(Optional.of(shoppingList)); - ResponseEntity<ShoppingList> response = shoppingListController.getShoppingListById(id); + ResponseEntity<ShoppingList> response = shoppingListController.getShoppingListById(id, adminUser); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(shoppingList, response.getBody()); @@ -50,7 +130,7 @@ public class ShoppingListControllerTest { long id = 1; when(shoppingListService.getShoppingListById(id)).thenReturn(Optional.empty()); - ResponseEntity<ShoppingList> response = shoppingListController.getShoppingListById(id); + ResponseEntity<ShoppingList> response = shoppingListController.getShoppingListById(id, adminUser); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); } 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 index 418ef509..4ae6df8a 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeControllerTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeControllerTest.java @@ -51,7 +51,7 @@ public class FridgeControllerTest { private FridgeProductRequest fridgeProductRequest; - private Authentication regularUser = new Authentication() { + private final Authentication regularUser = new Authentication() { @Override public Collection<? extends GrantedAuthority> getAuthorities() { return List.of(new SimpleGrantedAuthority(Authority.USER.name())); diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListServiceTest.java index c304217d..6ff1845b 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/ShoppingListServiceTest.java @@ -1,6 +1,8 @@ package ntnu.idatt2016.v233.SmartMat.service; import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -79,4 +81,33 @@ class ShoppingListServiceTest { verify(shoppingListRepository, times(1)).deleteById(1L); } + + @Test + void isUserInGroupWithShoppinglist(){ + ShoppingList shoppingList = new ShoppingList(); + Group group = new Group(); + shoppingList.setGroup(group); + + User user = User.builder() + .username("test") + .password("test") + .build(); + + group.addUser(UserGroupAsso.builder() + .user(user) + .group(group) + .build()); + + + when(shoppingListRepository.findAllByGroupUsersUsername(user.getUsername())) + .thenReturn(List.of(shoppingList)); + + boolean result = shoppingListService.isUserInShoppinglist( + shoppingList.getShoppingListID(), user.getUsername()); + + assertTrue(result); + + verify(shoppingListRepository, times(1)) + .findAllByGroupUsersUsername(user.getUsername()); + } } -- GitLab