diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java index 69d817afb763fa47b878b71fb315bb8dbb02f750..f091d79ad5b6f036006f4ba04d1b597151640da2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java @@ -1,6 +1,7 @@ package at.tuwien.endpoints; import at.tuwien.mapper.MetadataMapper; +import at.tuwien.service.UserService; import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.database.AccessTypeDto; import at.tuwien.api.database.DatabaseAccessDto; @@ -43,7 +44,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { private DatabaseRepository databaseRepository; @MockBean - private UserRepository userRepository; + private UserService userService; @Autowired private AccessEndpoint accessEndpoint; @@ -57,17 +58,27 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_create(null, USER_2_ID, null, null); + generic_create(null, null, null); }); } @Test - @WithMockUser(username = USER_4_USERNAME) + @WithMockUser(username = USER_2_USERNAME) public void create_noRoleNoAccess_fails() { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_create(USER_2_PRINCIPAL, USER_4_ID, USER_4_USERNAME, USER_4); + generic_create(USER_2_PRINCIPAL, USER_2, USER_4); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"create-database-access"}) + public void create_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_create(USER_2_PRINCIPAL, USER_2, USER_4); }); } @@ -77,12 +88,8 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { DatabaseNotFoundException, UserNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException { - /* mock */ - when(accessService.create(eq(DATABASE_1), eq(USER_2), any(AccessTypeDto.class))) - .thenReturn(DATABASE_1_USER_1_READ_ACCESS); - /* test */ - generic_create(USER_2_PRINCIPAL, USER_2_ID, USER_2_USERNAME, USER_2); + generic_create(USER_1_PRINCIPAL, USER_1, USER_2); } @Test @@ -129,17 +136,17 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_update(null, USER_4_USERNAME, USER_4, null, null); + generic_update(null, null, null, USER_2); }); } @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"update-database-access"}) - public void update_hasRoleNoAccess_fails() { + @WithMockUser(username = USER_2_USERNAME, authorities = {"update-database-access"}) + public void update_notOwner_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { - generic_update(null, USER_4_USERNAME, USER_4, USER_1_PRINCIPAL, USER_1); + generic_update(null, USER_2_PRINCIPAL, USER_2, USER_4); }); } @@ -149,7 +156,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_update(null, USER_4_USERNAME, USER_4, USER_4_PRINCIPAL, USER_4); + generic_update(null, USER_4_PRINCIPAL, USER_4, USER_2); }); } @@ -165,7 +172,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .update(eq(DATABASE_1), eq(USER_2), any(AccessTypeDto.class)); /* test */ - generic_update(DATABASE_1_USER_2_WRITE_OWN_ACCESS, USER_2_USERNAME, USER_2, USER_2_PRINCIPAL, USER_2); + generic_update(DATABASE_1_USER_2_WRITE_OWN_ACCESS, USER_1_PRINCIPAL, USER_1, USER_2); } @Test @@ -174,7 +181,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_revoke(USER_1_PRINCIPAL, USER_1); + generic_revoke(USER_1_PRINCIPAL, null, USER_1); }); } @@ -184,7 +191,17 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_revoke(USER_4_PRINCIPAL, USER_4); + generic_revoke(USER_4_PRINCIPAL, USER_4, USER_2); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-database-access"}) + public void revoke_notOwner_fails() { + + /* test */ + assertThrows(NotAllowedException.class, () -> { + generic_revoke(USER_2_PRINCIPAL, USER_2, USER_4); }); } @@ -200,14 +217,14 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .delete(DATABASE_1, USER_2); /* test */ - generic_revoke(USER_1_PRINCIPAL, USER_1); + generic_revoke(USER_1_PRINCIPAL, USER_1, USER_2); } /* ################################################################################################### */ /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - protected void generic_create(Principal principal, UUID userId, String username, User user) + protected void generic_create(Principal principal, User caller, User user) throws NotAllowedException, DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException { @@ -218,16 +235,25 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { doThrow(AccessNotFoundException.class) .when(accessService) .find(DATABASE_1, user); + if (principal != null) { + when(userService.findByUsername(principal.getName())) + .thenReturn(caller); + } else { + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(anyString()); + } if (user != null) { - when(userRepository.findByUsername(username)) - .thenReturn(Optional.of(user)); + when(userService.findById(user.getId())) + .thenReturn(user); } else { - when(userRepository.findByUsername(anyString())) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(anyString()); } /* test */ - final ResponseEntity<?> response = accessEndpoint.create(DATABASE_1_ID, userId, UPDATE_DATABASE_ACCESS_READ_DTO, principal); + final ResponseEntity<?> response = accessEndpoint.create(DATABASE_1_ID, user == null ? null : user.getId(), UPDATE_DATABASE_ACCESS_READ_DTO, principal); assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); assertNull(response.getBody()); } @@ -239,8 +265,8 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* mock */ when(databaseRepository.findById(databaseId)) .thenReturn(Optional.of(database)); - when(userRepository.findById(userId)) - .thenReturn(Optional.of(user)); + when(userService.findById(userId)) + .thenReturn(user); if (access != null) { log.trace("mock access {} for user with id {} for database with id {}", access.getType(), userId, databaseId); when(accessService.find(database, user)) @@ -252,8 +278,8 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .find(database, user); } if (principal != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(user)); + when(userService.findByUsername(principal.getName())) + .thenReturn(user); } /* test */ @@ -268,8 +294,8 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { } } - protected void generic_update(DatabaseAccess access, String otherUsername, User otherUser, Principal principal, - User user) throws NotAllowedException, DataServiceException, DataServiceConnectionException, + protected void generic_update(DatabaseAccess access, Principal principal, User caller, User user) + throws NotAllowedException, DataServiceException, DataServiceConnectionException, AccessNotFoundException, UserNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { @@ -286,19 +312,20 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .when(accessService) .find(DATABASE_1, USER_1); } - if (otherUsername != null) { - when(userRepository.findByUsername(otherUsername)) - .thenReturn(Optional.of(otherUser)); + if (user != null) { + when(userService.findByUsername(user.getUsername())) + .thenReturn(user); } else { - when(userRepository.findByUsername(anyString())) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService.findByUsername(anyString())); } if (principal != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(user)); + when(userService.findByUsername(principal.getName())) + .thenReturn(caller); } else { - when(userRepository.findByUsername(anyString())) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(anyString()); } /* test */ @@ -307,7 +334,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { assertNull(response.getBody()); } - protected void generic_revoke(Principal principal, User user) throws DataServiceConnectionException, + protected void generic_revoke(Principal principal, User caller, User user) throws DataServiceConnectionException, NotAllowedException, DataServiceException, UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, SearchServiceException, SearchServiceConnectionException { @@ -316,9 +343,13 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_1_USER_1_READ_ACCESS); when(databaseRepository.findById(DATABASE_1_ID)) .thenReturn(Optional.of(DATABASE_1)); + if (user != null) { + when(userService.findById(user.getId())) + .thenReturn(user); + } if (principal != null) { - when(userRepository.findByUsername(principal.getName())) - .thenReturn(Optional.of(user)); + when(userService.findByUsername(principal.getName())) + .thenReturn(caller); } /* test */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java index fa939b0cb1795b08257b743ddb239bd075871cf0..0e1822cabd1accbb7a4420fa5ed6fceac8ae142c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java @@ -66,10 +66,12 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void find_succeeds() throws AccessNotFoundException { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); /* test */ final DatabaseAccess response = accessService.find(DATABASE_1, USER_1); - assertEquals(AccessType.READ, response.getType()); + assertEquals(AccessType.WRITE_ALL, response.getType()); } @Test @@ -80,7 +82,7 @@ public class AccessServiceUnitTest extends AbstractUnitTest { when(databaseRepository.save(any(Database.class))) .thenReturn(DATABASE_1); when(dataServiceRestTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED) + .thenReturn(ResponseEntity.status(HttpStatus.ACCEPTED) .build()); when(searchServiceRestTemplate.exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(DatabaseDto.class))) .thenReturn(ResponseEntity.status(HttpStatus.ACCEPTED) @@ -94,6 +96,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void create_dataService400_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.BadRequest.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class)); @@ -108,6 +112,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void create_dataService403_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.Unauthorized.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class)); @@ -122,6 +128,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void create_dataService404_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.NotFound.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class)); @@ -136,6 +144,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void create_dataService500_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpServerErrorException.InternalServerError.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class)); @@ -153,7 +163,7 @@ public class AccessServiceUnitTest extends AbstractUnitTest { when(databaseRepository.save(any(Database.class))) .thenReturn(DATABASE_1); when(dataServiceRestTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED) + .thenReturn(ResponseEntity.status(HttpStatus.ACCEPTED) .build()); doThrow(HttpClientErrorException.BadRequest.class) .when(searchServiceRestTemplate) @@ -172,7 +182,7 @@ public class AccessServiceUnitTest extends AbstractUnitTest { when(databaseRepository.save(any(Database.class))) .thenReturn(DATABASE_1); when(dataServiceRestTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED) + .thenReturn(ResponseEntity.status(HttpStatus.ACCEPTED) .build()); doThrow(HttpClientErrorException.Unauthorized.class) .when(searchServiceRestTemplate) @@ -191,7 +201,7 @@ public class AccessServiceUnitTest extends AbstractUnitTest { when(databaseRepository.save(any(Database.class))) .thenReturn(DATABASE_1); when(dataServiceRestTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED) + .thenReturn(ResponseEntity.status(HttpStatus.ACCEPTED) .build()); doThrow(HttpClientErrorException.NotFound.class) .when(searchServiceRestTemplate) @@ -210,7 +220,7 @@ public class AccessServiceUnitTest extends AbstractUnitTest { when(databaseRepository.save(any(Database.class))) .thenReturn(DATABASE_1); when(dataServiceRestTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED) + .thenReturn(ResponseEntity.status(HttpStatus.ACCEPTED) .build()); doThrow(HttpServerErrorException.InternalServerError.class) .when(searchServiceRestTemplate) @@ -244,6 +254,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void update_dataService400_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.BadRequest.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class)); @@ -258,6 +270,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void update_dataService403_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.Unauthorized.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class)); @@ -272,6 +286,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void update_dataService404_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.NotFound.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class)); @@ -286,6 +302,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void update_dataService500_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpServerErrorException.InternalServerError.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class)); @@ -396,6 +414,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void delete_dataService403_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.Unauthorized.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.DELETE), any(HttpEntity.class), eq(Void.class)); @@ -410,6 +430,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void delete_dataService404_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpClientErrorException.NotFound.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.DELETE), any(HttpEntity.class), eq(Void.class)); @@ -424,6 +446,8 @@ public class AccessServiceUnitTest extends AbstractUnitTest { public void delete_dataService500_fails() { /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); doThrow(HttpServerErrorException.InternalServerError.class) .when(dataServiceRestTemplate) .exchange(anyString(), eq(HttpMethod.DELETE), any(HttpEntity.class), eq(Void.class)); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java index e483c6346a77eeb697a0224166140fee8ff0cdcf..886911d9f4a770fe8c620d7cc882cd7b4da05c55 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java @@ -55,7 +55,7 @@ public class DataServiceGatewayImpl implements DataServiceGateway { log.error("Failed to create access: {}", e.getMessage()); throw new DataServiceException("Failed to create access: " + e.getMessage(), e); } - if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) { + if (!response.getStatusCode().equals(HttpStatus.CREATED)) { log.error("Failed to create access: wrong http code: {}", response.getStatusCode()); throw new DataServiceException("Failed to create access: wrong http code: " + response.getStatusCode()); }