diff --git a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java deleted file mode 100644 index 370972f192629619377fc89faea976524a9bbccf..0000000000000000000000000000000000000000 --- a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.database.DatabaseCreateDto; -import at.tuwien.api.database.DatabaseDto; -import at.tuwien.config.*; -import at.tuwien.entities.database.Database; -import at.tuwien.repository.elastic.DatabaseIdxRepository; -import at.tuwien.repository.jpa.ContainerRepository; -import at.tuwien.repository.jpa.DatabaseRepository; -import at.tuwien.repository.jpa.ImageRepository; -import at.tuwien.repository.jpa.UserRepository; -import at.tuwien.service.impl.MariaDbServiceImpl; -import at.tuwien.test.BaseTest; -import com.rabbitmq.client.Channel; -import lombok.extern.log4j.Log4j2; -import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.*; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.io.File; -import java.security.Principal; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -@Log4j2 -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class DatabaseServiceIntegrationElasticTest extends BaseUnitTest { - - @MockBean - private ReadyConfig readyConfig; - - @MockBean - private Channel channel; - - @MockBean - private IndexConfig indexConfig; - - @MockBean - private DatabaseIdxRepository databaseIdxRepository; - - @Autowired - private ContainerRepository containerRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private ImageRepository imageRepository; - - @Autowired - private MariaDbServiceImpl databaseService; - - @Autowired - private H2Utils h2Utils; - - private final static String BIND = new File("../../dbrepo-metadata-db/test/src/test/resources/weather").toPath().toAbsolutePath() + ":/docker-entrypoint-initdb.d"; - - @BeforeAll - public static void beforeAll() { - afterAll(); - DockerConfig.createAllNetworks(); - } - - @AfterAll - public static void afterAll() { - DockerConfig.removeAllContainers(); - DockerConfig.removeAllNetworks(); - } - - @BeforeEach - public void beforeEach() { - afterEach(); - /* metadata database */ - h2Utils.runScript("schema.sql"); - imageRepository.save(IMAGE_1); - userRepository.save(USER_1_SIMPLE); - } - - @AfterEach - public void afterEach() { - DockerConfig.removeAllContainers(); - } - - @Test - public void create_elasticSearch_succeeds() throws Exception { - - /* mock */ - DockerConfig.createContainer(null, CONTAINER_ELASTIC, CONTAINER_ELASTIC_ENV); - DockerConfig.startContainer(CONTAINER_ELASTIC); - DockerConfig.createContainer(BIND, CONTAINER_1_SIMPLE, CONTAINER_1_ENV); - DockerConfig.startContainer(CONTAINER_1_SIMPLE); - when(databaseIdxRepository.save(any(DatabaseDto.class))) - .thenReturn(DATABASE_1_DTO); - - /* test */ - generic_create(CONTAINER_1_ID, DATABASE_1_CREATE, DATABASE_1); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected void generic_create(Long containerId, DatabaseCreateDto createDto, Database database) - throws Exception { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - containerRepository.save(CONTAINER_1_SIMPLE); - containerRepository.save(CONTAINER_2_SIMPLE); - containerRepository.save(CONTAINER_3_SIMPLE); - - /* test */ - final Database response = databaseService.create(containerId, createDto, principal); - assertEquals(database.getName(), response.getName()); - assertEquals(containerId, database.getId()); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java index 609b2bb0c0d76334ba3a99b43f23048c8643e031..fab253577ab409fb0eef7e81140ca2517be45721 100644 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java +++ b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java @@ -4,10 +4,14 @@ import at.tuwien.api.error.ApiErrorDto; import at.tuwien.api.identifier.IdentifierCreateDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierTypeDto; +import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.identifier.Identifier; +import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.mapper.IdentifierMapper; +import at.tuwien.service.AccessService; import at.tuwien.service.IdentifierService; +import at.tuwien.service.UserService; import io.micrometer.core.annotation.Timed; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -36,11 +40,16 @@ import java.util.stream.Collectors; @RequestMapping("/api/identifier") public class IdentifierEndpoint { + private final UserService userService; + private final AccessService accessService; private final IdentifierMapper identifierMapper; private final IdentifierService identifierService; @Autowired - public IdentifierEndpoint(IdentifierMapper identifierMapper, IdentifierService identifierService) { + public IdentifierEndpoint(UserService userService, AccessService accessService, IdentifierMapper identifierMapper, + IdentifierService identifierService) { + this.userService = userService; + this.accessService = accessService; this.identifierMapper = identifierMapper; this.identifierService = identifierService; } @@ -125,7 +134,7 @@ public class IdentifierEndpoint { @NotNull @RequestHeader(name = "Authorization") String authorization, @NotNull Principal principal) throws IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, - RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, IdentifierRequestException { + RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, IdentifierRequestException, AccessDeniedException { log.debug("endpoint create identifier, data={}, authorization={}, principal={}", data, authorization, principal); if (data.getType().equals(IdentifierTypeDto.SUBSET) && data.getQid() == null) { log.error("Identifier of type subset need to have a qid present"); @@ -134,6 +143,8 @@ public class IdentifierEndpoint { log.error("Identifier of type database must not have a qid present"); throw new IdentifierRequestException("Identifier of type database must not have a qid present"); } + final User user = userService.findByUsername(principal.getName()); + final DatabaseAccess access = accessService.find(data.getDbid(), user.getId()); final Identifier identifier = identifierService.create(data, principal, authorization); return ResponseEntity.status(HttpStatus.CREATED) .body(identifierMapper.identifierToIdentifierDto(identifier)); diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/auth/AuthTokenFilterTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/auth/AuthTokenFilterTest.java deleted file mode 100644 index c15afaef64ba04f31deb103d954e5ac5df5d1a20..0000000000000000000000000000000000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/auth/AuthTokenFilterTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package at.tuwien.auth; - -import at.tuwien.BaseUnitTest; -import at.tuwien.config.H2Utils; -import at.tuwien.config.IndexInitializer; -import at.tuwien.config.ReadyConfig; -import at.tuwien.repository.jpa.UserRepository; -import lombok.extern.log4j.Log4j2; -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.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class AuthTokenFilterTest extends BaseUnitTest { - - @MockBean - private IndexInitializer indexInitializer; - - @MockBean - private ReadyConfig readyConfig; - - @MockBean - private UserRepository userRepository; - - @Autowired - private AuthTokenFilter authTokenFilter; - - @Autowired - private H2Utils h2Utils; - - @BeforeEach - public void beforeEach() { - h2Utils.runScript("view.sql"); - } - - @Test - public void parseJwt_fails() { - final MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader("Authorization", "Basic dXNlcjpwYXNz"); - - /* test */ - final String response = authTokenFilter.parseJwt(request); - assertNull(response); - } - - @Test - public void parseJwt_noAuthenticationHeader_fails() { - final MockHttpServletRequest request = new MockHttpServletRequest(); - - /* test */ - final String response = authTokenFilter.parseJwt(request); - assertNull(response); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java index e513e30cda5fa34d34fb8c3179473c6ce2cc4f27..138ce5ce9ca56df82d2245160a8dbf26f951be8d 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java @@ -18,6 +18,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.annotation.DirtiesContext; @@ -54,38 +55,30 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { @Autowired private ContainerRepository containerRepository; + @Autowired + private RealmRepository realmRepository; + + @Autowired + private AccessRepository accessRepository; + @Autowired private IdentifierEndpoint identifierEndpoint; @BeforeEach public void beforeEach() { imageRepository.save(IMAGE_1); + realmRepository.save(REALM_DBREPO); userRepository.save(USER_1); userRepository.save(USER_2); - containerRepository.save(CONTAINER_1); - containerRepository.save(CONTAINER_2); - databaseRepository.save(DATABASE_1); - databaseRepository.save(DATABASE_2); - } - - @Test - public void list_anonymous_succeeds() throws IdentifierNotFoundException { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = this.generic_list(null, null, null); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - assertEquals(IDENTIFIER_1_ID, identifier.getId()); - assertEquals(IDENTIFIER_1_TITLE, identifier.getTitle()); - assertEquals(IDENTIFIER_1_DESCRIPTION, identifier.getDescription()); + containerRepository.save(CONTAINER_1_SIMPLE); + containerRepository.save(CONTAINER_2_SIMPLE); + databaseRepository.save(DATABASE_1_SIMPLE); + databaseRepository.save(DATABASE_2_SIMPLE); } @Test @WithAnonymousUser - public void list_anonymous2_succeeds() throws IdentifierNotFoundException { + public void list_anonymous_succeeds() { /* test */ final List<IdentifierDto> response = this.generic_list(null, null, null); @@ -93,11 +86,11 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void list_researcher_succeeds() throws IdentifierNotFoundException { + @WithMockUser(username = USER_1_USERNAME, authorities = {"list-identifiers"}) + public void list_hasRole_succeeds() { /* mock */ - identifierRepository.save(IDENTIFIER_1); + identifierRepository.save(IDENTIFIER_1_SIMPLE); /* test */ final List<IdentifierDto> response = this.generic_list(null, null, null); @@ -109,27 +102,11 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void list_researcherDatabaseId_succeeds() throws IdentifierNotFoundException { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = this.generic_list(DATABASE_1_ID, null, null); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - assertEquals(IDENTIFIER_1_ID, identifier.getId()); - assertEquals(IDENTIFIER_1_TITLE, identifier.getTitle()); - assertEquals(IDENTIFIER_1_DESCRIPTION, identifier.getDescription()); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, roles = {"DEVELOPER"}) - public void list_developer_succeeds() throws IdentifierNotFoundException { + @WithMockUser(username = USER_1_USERNAME) + public void list_noRole_succeeds() { /* mock */ - identifierRepository.save(IDENTIFIER_1); + identifierRepository.save(IDENTIFIER_1_SIMPLE); /* test */ final List<IdentifierDto> response = this.generic_list(null, null, null); @@ -141,14 +118,14 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"}) - public void list_dataSteward_succeeds() throws IdentifierNotFoundException { + @WithMockUser(username = USER_1_USERNAME) + public void list_databaseId_succeeds() { /* mock */ - identifierRepository.save(IDENTIFIER_1); + identifierRepository.save(IDENTIFIER_1_SIMPLE); /* test */ - final List<IdentifierDto> response = this.generic_list(null, null, null); + final List<IdentifierDto> response = this.generic_list(DATABASE_1_ID, null, null); assertEquals(1, response.size()); final IdentifierDto identifier = response.get(0); assertEquals(IDENTIFIER_1_ID, identifier.getId()); @@ -157,28 +134,34 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { } @Test - @Disabled("Creator constraint") - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void list_researcherDatabaseIdAndType_succeeds() throws IdentifierNotFoundException { + @WithMockUser(username = USER_1_USERNAME) + public void list_databaseIdAndType_succeeds() { /* mock */ - identifierRepository.save(IDENTIFIER_2); + containerRepository.save(CONTAINER_3_SIMPLE); + containerRepository.save(CONTAINER_4_SIMPLE); + databaseRepository.save(DATABASE_3_SIMPLE); + databaseRepository.save(DATABASE_4_SIMPLE); + identifierRepository.save(IDENTIFIER_1_SIMPLE); + identifierRepository.save(IDENTIFIER_2_SIMPLE); + identifierRepository.save(IDENTIFIER_3_SIMPLE); + identifierRepository.save(IDENTIFIER_4_SIMPLE); /* test */ - final List<IdentifierDto> response = this.generic_list(DATABASE_2_ID, null, IdentifierTypeDto.DATABASE); + final List<IdentifierDto> response = this.generic_list(DATABASE_4_ID, null, IdentifierTypeDto.DATABASE); assertEquals(1, response.size()); final IdentifierDto identifier = response.get(0); - assertEquals(IDENTIFIER_2_ID, identifier.getId()); - assertEquals(IDENTIFIER_2_TITLE, identifier.getTitle()); - assertEquals(IDENTIFIER_2_DESCRIPTION, identifier.getDescription()); + assertEquals(IDENTIFIER_4_ID, identifier.getId()); + assertEquals(IDENTIFIER_4_TITLE, identifier.getTitle()); + assertEquals(IDENTIFIER_4_DESCRIPTION, identifier.getDescription()); } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void list_researcherSubsetIdAndType_succeeds() throws IdentifierNotFoundException { + @WithMockUser(username = USER_1_USERNAME) + public void list_subsetIdAndType_succeeds() { /* mock */ - identifierRepository.save(IDENTIFIER_1); + identifierRepository.save(IDENTIFIER_1_SIMPLE); /* test */ final List<IdentifierDto> response = this.generic_list(DATABASE_1_ID, QUERY_1_ID, IdentifierTypeDto.SUBSET); @@ -190,15 +173,26 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void create_researcherDatabaseNotExists_fails() { + @WithMockUser(username = USER_1_USERNAME) + public void create_noRole_fails() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + identifierEndpoint.create(IDENTIFIER_2_DTO_REQUEST, "ABC", USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_accessNotExists_fails() { /* mock */ - containerRepository.save(CONTAINER_2); + containerRepository.save(CONTAINER_3_SIMPLE); + databaseRepository.save(DATABASE_3_SIMPLE); /* test */ - assertThrows(NotAllowedException.class, () -> { - identifierEndpoint.create(IDENTIFIER_2_DTO_REQUEST, "ABC", USER_1_PRINCIPAL); + assertThrows(at.tuwien.exception.AccessDeniedException.class, () -> { + identifierEndpoint.create(IDENTIFIER_3_DTO_REQUEST, "ABC", USER_1_PRINCIPAL); }); } @@ -206,7 +200,7 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest { /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - protected List<IdentifierDto> generic_list(Long databaseId, Long queryId, IdentifierTypeDto type) throws IdentifierNotFoundException { + protected List<IdentifierDto> generic_list(Long databaseId, Long queryId, IdentifierTypeDto type) { /* test */ final ResponseEntity<List<IdentifierDto>> response = identifierEndpoint.list(databaseId, queryId, type); diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java index 8ad52e70ba3bd5fe30900d7a635e4fd0ee0f7c09..0d1f7ce1cc92381d4f3de24101a43c44f851fd51 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java @@ -15,10 +15,7 @@ import at.tuwien.entities.identifier.RelatedIdentifier; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.QueryServiceGateway; -import at.tuwien.repository.jpa.DatabaseRepository; -import at.tuwien.repository.jpa.IdentifierRepository; -import at.tuwien.repository.jpa.RelatedIdentifierRepository; -import at.tuwien.repository.jpa.UserRepository; +import at.tuwien.repository.jpa.*; import at.tuwien.service.IdentifierService; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; @@ -31,6 +28,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -70,6 +68,9 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { @MockBean private RelatedIdentifierRepository relatedIdentifierRepository; + @MockBean + private AccessRepository accessRepository; + @MockBean private QueryServiceGateway queryServiceGateway; @@ -152,57 +153,56 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void create_creatorResearcherDatabase_succeeds() throws IdentifierAlreadyExistsException, + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_hasRoleDatabase_succeeds() throws IdentifierAlreadyExistsException, UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException { + IdentifierPublishingNotAllowedException, IdentifierRequestException, at.tuwien.exception.AccessDeniedException { + + /* mock */ + when(accessRepository.findByHdbidAndHuserid(DATABASE_1_ID, USER_1_ID)) + .thenReturn(Optional.of(DATABASE_1_RESEARCHER_READ_ACCESS)); /* test */ generic_create(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_1_PRINCIPAL, USER_1_USERNAME, USER_1); } @Test - @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"}) - public void create_nonCreatorResearcherDatabase_fails() { + @WithMockUser(username = USER_2_USERNAME, authorities = {"create-identifier"}) + public void create_hasRoleDatabaseNoAccess_fails() { /* test */ - assertThrows(NotAllowedException.class, () -> { + assertThrows(at.tuwien.exception.AccessDeniedException.class, () -> { generic_create(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_2_PRINCIPAL, USER_2_USERNAME, USER_2); }); } @Test - @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"}) - public void create_nonCreatorDataStewardDatabase_succeeds() throws IdentifierAlreadyExistsException, - UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException { - - /* test */ - generic_create(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_3_PRINCIPAL, USER_3_USERNAME, USER_3); - } - - @Test + @WithAnonymousUser public void create_anonymousQuery_fails() { /* test */ - assertThrows(AuthenticationCredentialsNotFoundException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, null, null, null); }); } @Test - @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"}) - public void create_creatorResearcherQuery_succeeds() throws IdentifierAlreadyExistsException, + @WithMockUser(username = USER_2_USERNAME, authorities = {"create-identifier"}) + public void create_hasRoleReadAccessQuery_succeeds() throws IdentifierAlreadyExistsException, UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException { + IdentifierPublishingNotAllowedException, IdentifierRequestException, at.tuwien.exception.AccessDeniedException { + + /* mock */ + when(accessRepository.findByHdbidAndHuserid(DATABASE_2_ID, USER_2_ID)) + .thenReturn(Optional.of(DATABASE_2_RESEARCHER_READ_ACCESS)); /* test */ generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_2_PRINCIPAL, USER_2_USERNAME, USER_2); } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void create_creatorResearcherInvalidSubset_fails() { + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_invalidSubset_fails() { final IdentifierCreateDto request = IdentifierCreateDto.builder() .qid(null) // <-- .cid(IDENTIFIER_1_CONTAINER_ID) @@ -224,8 +224,8 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void create_creatorResearcherInvalidDatabase_fails() { + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_invalidDatabase_fails() { final IdentifierCreateDto request = IdentifierCreateDto.builder() .qid(IDENTIFIER_1_QUERY_ID) // <-- .cid(IDENTIFIER_1_CONTAINER_ID) @@ -248,25 +248,15 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void create_nonCreatorResearcherQuery_fails() { + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) + public void create_query_fails() { /* test */ - assertThrows(NotAllowedException.class, () -> { + assertThrows(at.tuwien.exception.AccessDeniedException.class, () -> { generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_1_PRINCIPAL, USER_1_USERNAME, USER_1); }); } - @Test - @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"}) - public void create_nonCreatorDataStewardQuery_succeeds() throws IdentifierAlreadyExistsException, - UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException { - - /* test */ - generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_3_PRINCIPAL, USER_3_USERNAME, USER_3); - } - @Test public void update_anonymous_fails() { @@ -275,24 +265,16 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { } @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void update_creatorResearcher_fails() { + @WithMockUser(username = USER_1_USERNAME, authorities = {}) + public void update_noRole_fails() { /* test */ assertThrows(AccessDeniedException.class, this::generic_update); } @Test - @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"}) - public void update_nonCreatorResearcher_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, this::generic_update); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"}) - public void update_dataSteward_succeeds() throws IdentifierPublishingNotAllowedException, + @WithMockUser(username = USER_3_USERNAME, authorities = {"update-identifier"}) + public void update_hasRole_succeeds() throws IdentifierPublishingNotAllowedException, IdentifierNotFoundException, IdentifierRequestException { /* test */ @@ -300,34 +282,27 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { } @Test + @WithAnonymousUser public void delete_anonymous_fails() { - /* test */ - assertThrows(AuthenticationCredentialsNotFoundException.class, this::generic_delete); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"}) - public void delete_creatorResearcher_fails() { - /* test */ assertThrows(AccessDeniedException.class, this::generic_delete); } @Test - @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"}) - public void delete_nonCreatorResearcher_fails() { + @WithMockUser(username = USER_1_USERNAME, authorities = {}) + public void delete_noRole_fails() { /* test */ assertThrows(AccessDeniedException.class, this::generic_delete); } @Test - @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"}) - public void delete_dataSteward_succeeds() throws IdentifierNotFoundException, NotAllowedException { + @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-identifier"}) + public void delete_hasRole_succeeds() throws NotAllowedException, IdentifierNotFoundException { /* test */ - generic_delete(); + this.generic_delete(); } /* ################################################################################################### */ @@ -339,7 +314,7 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest { throws QueryNotFoundException, RemoteUnavailableException, IdentifierAlreadyExistsException, UserNotFoundException, DatabaseNotFoundException, IdentifierPublishingNotAllowedException, - IdentifierRequestException, NotAllowedException { + IdentifierRequestException, at.tuwien.exception.AccessDeniedException { /* mock */ when(databaseRepository.findById(databaseId)) diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java index 491b3eb7c574a0222ec07b5c56ecaf182dd5cbe4..0fe8adf13fae63b6aec2f3a2d92ee30c2453d1bb 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java @@ -13,6 +13,7 @@ import at.tuwien.exception.QueryNotFoundException; import at.tuwien.exception.RemoteUnavailableException; import at.tuwien.gateway.QueryServiceGateway; import at.tuwien.repository.jpa.IdentifierRepository; +import at.tuwien.repository.jpa.RealmRepository; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java index 4fd01d25093e0ca7389804ee5063946010a4c9af..7167767c8b3940c35c78569385a68449aa363ed7 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java @@ -12,6 +12,7 @@ import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpEntity; @@ -41,6 +42,7 @@ public class QueryServiceGatewayUnitTest extends BaseUnitTest { private ReadyConfig readyConfig; @MockBean + @Qualifier("restTemplate") private RestTemplate restTemplate; @MockBean diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java index 60c4bd45b4d0de8b2379c9564b66fd52b9646dab..36e265abbadfc726a5f3498f068bd44d819f8009 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Answers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -71,6 +72,7 @@ public class DataCiteIdentifierServiceUnitTest extends BaseUnitTest { private IdentifierRepository identifierRepository; @MockBean + @Qualifier("restTemplate") private RestTemplate restTemplate; @MockBean(answer = Answers.RETURNS_SELF) diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java index 4133a24409469526e74a2a87bfca541f73dd4e07..423c014e503edaa826f147ec0302479906af71f9 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java @@ -15,6 +15,7 @@ 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.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpEntity; @@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.util.List; +import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; @@ -48,6 +50,7 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest { private QueryServiceGateway queryServiceGateway; @MockBean + @Qualifier("restTemplate") private RestTemplate restTemplate; @Autowired @@ -68,11 +71,15 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest { @Autowired private UserRepository userRepository; + @Autowired + private RealmRepository realmRepository; + @BeforeEach public void beforeEach() { + imageRepository.save(IMAGE_1); + realmRepository.save(REALM_DBREPO); userRepository.save(USER_1); userRepository.save(USER_2); - imageRepository.save(IMAGE_1); containerRepository.save(CONTAINER_1); databaseRepository.save(DATABASE_1); containerRepository.save(CONTAINER_2); diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java index 9301bd73535d5491fa766f23e728118abff59f22..4eaff8493e39161e29140f89a53a6473357de654 100644 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java +++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java @@ -14,6 +14,7 @@ import org.apache.http.auth.BasicUserPrincipal; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.InputStreamResource; @@ -49,6 +50,7 @@ public class IdentifierServiceUnitTest extends BaseUnitTest { private DatabaseService databaseService; @MockBean + @Qualifier("restTemplate") private RestTemplate restTemplate; @MockBean @@ -204,7 +206,6 @@ public class IdentifierServiceUnitTest extends BaseUnitTest { @Test public void update_notVisibleByEveryone_fails() { - Identifier identifier = Identifier.builder().id(IDENTIFIER_1_ID).build(); IdentifierDto identifierDto = IdentifierDto.builder().id(IDENTIFIER_1_ID).visibility(VisibilityTypeDto.TRUSTED).build(); IDENTIFIER_1_DTO.setVisibility(VisibilityTypeDto.TRUSTED); @@ -224,7 +225,6 @@ public class IdentifierServiceUnitTest extends BaseUnitTest { throws DatabaseNotFoundException, UserNotFoundException, IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, RemoteUnavailableException, IdentifierRequestException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); final String bearer = "Bearer abcxyz"; /* mock */ @@ -241,13 +241,12 @@ public class IdentifierServiceUnitTest extends BaseUnitTest { /* test */ - identifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer); + identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer); } @Test public void create_existsSubset_fails() throws DatabaseNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); final String bearer = "Bearer abcxyz"; /* mock */ @@ -259,14 +258,13 @@ public class IdentifierServiceUnitTest extends BaseUnitTest { /* test */ assertThrows(IdentifierAlreadyExistsException.class, () -> { - identifierService.create(IDENTIFIER_2_DTO_REQUEST, principal, bearer); + identifierService.create(IDENTIFIER_2_DTO_REQUEST, USER_1_PRINCIPAL, bearer); }); } @Test public void create_existsDatabase_fails() throws DatabaseNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); final String bearer = "Bearer abcxyz"; /* mock */ @@ -278,7 +276,7 @@ public class IdentifierServiceUnitTest extends BaseUnitTest { /* test */ assertThrows(IdentifierAlreadyExistsException.class, () -> { - identifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer); + identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer); }); } diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt index 1d79dc4dfbaeddd7ead4a97cf1a2dd687567fec9..35a5374403f5de61697a0eaab9910352b4aed9a2 100644 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt +++ b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt @@ -1 +1 @@ -[1] “Sweden weather data“, Swedish Government, 2022, doi: http://localhost:3000/pid/4. \ No newline at end of file +[1] “Sweden weather data“, Swedish Government, 2022, Available: http://localhost:3000/pid/4. \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt index 5ae90052d725298c58895ff917990a652665bc07..909031b2db36b3f9696af84ae423e33f1ffde199 100644 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt +++ b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt @@ -1 +1 @@ -[1] M. Mustermann and M. Mustermann, “Australian weather data“, Australian Government, 2022, doi: http://localhost:3000/pid/2. \ No newline at end of file +[1] M. Mustermann and M. Mustermann, “Australian weather data“, Australian Government, 2022, Available: http://localhost:3000/pid/2. \ No newline at end of file diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java new file mode 100644 index 0000000000000000000000000000000000000000..84169f32e08a9580d23b3590bb7a5691dcfe3975 --- /dev/null +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java @@ -0,0 +1,23 @@ +package at.tuwien.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.io.IOException; + +@ResponseStatus(code = HttpStatus.FORBIDDEN) +public class AccessDeniedException extends IOException { + + public AccessDeniedException(String msg) { + super(msg); + } + + public AccessDeniedException(String msg, Throwable thr) { + super(msg, thr); + } + + public AccessDeniedException(Throwable thr) { + super(thr); + } + +} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/AccessRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/AccessRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..2795450ea714602c41b8be03d62cbfc1853aa967 --- /dev/null +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/AccessRepository.java @@ -0,0 +1,16 @@ + +package at.tuwien.repository.jpa; + +import at.tuwien.entities.database.DatabaseAccess; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface AccessRepository extends JpaRepository<DatabaseAccess, Long> { + + Optional<DatabaseAccess> findByHdbidAndHuserid(Long databaseId, UUID userId); + +} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java new file mode 100644 index 0000000000000000000000000000000000000000..37e5ae1603714ff54e0240f89cfffb3983e5f694 --- /dev/null +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java @@ -0,0 +1,11 @@ +package at.tuwien.service; + +import at.tuwien.entities.database.DatabaseAccess; +import at.tuwien.exception.AccessDeniedException; + +import java.util.UUID; + +public interface AccessService { + + DatabaseAccess find(Long databaseId, UUID userId) throws AccessDeniedException; +} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f23467c3af5f7302b60a32fae0d300a668af8114 --- /dev/null +++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java @@ -0,0 +1,34 @@ +package at.tuwien.service.impl; + +import at.tuwien.entities.database.DatabaseAccess; +import at.tuwien.exception.AccessDeniedException; +import at.tuwien.repository.jpa.AccessRepository; +import at.tuwien.service.AccessService; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.UUID; + +@Log4j2 +@Service +public class AccessServiceImpl implements AccessService { + + private final AccessRepository accessRepository; + + @Autowired + public AccessServiceImpl(AccessRepository accessRepository) { + this.accessRepository = accessRepository; + } + + @Override + public DatabaseAccess find(Long databaseId, UUID userId) throws AccessDeniedException { + final Optional<DatabaseAccess> optional = accessRepository.findByHdbidAndHuserid(databaseId, userId); + if (optional.isEmpty()) { + log.error("Failed to find access for user with id {}", userId); + throw new AccessDeniedException("Failed to find access"); + } + return optional.get(); + } +} diff --git a/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java index d6a515b3974c5a06a1ba62359a90d04163c184f8..64137ee49a6b18bed22b3e9814aa773c3a689da6 100644 --- a/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java @@ -928,6 +928,19 @@ public abstract class BaseTest { .owner(USER_4) .build(); + public final static Container CONTAINER_4_SIMPLE = Container.builder() + .id(CONTAINER_4_ID) + .name(CONTAINER_4_NAME) + .internalName(CONTAINER_4_INTERNALNAME) + .imageId(IMAGE_1_ID) + .image(CONTAINER_4_IMAGE) + .hash(CONTAINER_4_HASH) + .created(CONTAINER_4_CREATED) + .ipAddress(CONTAINER_4_IP) + .creator(null /* for jpa */) + .owner(null /* for jpa */) + .build(); + public final static Long CONTAINER_BROKER_ID = 5L; public final static String CONTAINER_BROKER_NAME = "dbrepo-broker-service"; public final static String CONTAINER_BROKER_INTERNAL_NAME = "dbrepo-broker-service"; @@ -1355,6 +1368,24 @@ public abstract class BaseTest { .views(List.of()) .build(); + public final static Database DATABASE_4_SIMPLE = Database.builder() + .id(DATABASE_4_ID) + .created(Instant.now().minus(4, HOURS)) + .lastModified(Instant.now()) + .isPublic(DATABASE_4_PUBLIC) + .name(DATABASE_4_NAME) + .description(DATABASE_4_DESCRIPTION) + .container(CONTAINER_4) + .internalName(DATABASE_4_INTERNALNAME) + .exchangeName(DATABASE_4_EXCHANGE) + .created(DATABASE_4_CREATED) + .lastModified(DATABASE_4_LAST_MODIFIED) + .creator(null /* for jpa */) + .owner(null /* for jpa */) + .tables(List.of() /* for jpa */) + .views(List.of() /* for jpa */) + .build(); + public final static DatabaseAccess DATABASE_4_RESEARCHER_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_4_ID) @@ -3912,9 +3943,35 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_1_RESULT_NUMBER) .publisher(IDENTIFIER_1_PUBLISHER) .type(IDENTIFIER_1_TYPE) + .creator(USER_1) .creators(List.of(IDENTIFIER_1_CREATOR_1)) .build(); + public final static Identifier IDENTIFIER_1_SIMPLE = Identifier.builder() + .id(IDENTIFIER_1_ID) + .containerId(IDENTIFIER_1_CONTAINER_ID) + .databaseId(IDENTIFIER_1_DATABASE_ID) + .queryId(IDENTIFIER_1_QUERY_ID) + .description(IDENTIFIER_1_DESCRIPTION) + .title(IDENTIFIER_1_TITLE) + .doi(IDENTIFIER_1_DOI) + .visibility(IDENTIFIER_1_VISIBILITY) + .created(IDENTIFIER_1_CREATED) + .lastModified(IDENTIFIER_1_MODIFIED) + .execution(IDENTIFIER_1_EXECUTION) + .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) + .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) + .queryHash(IDENTIFIER_1_QUERY_HASH) + .resultHash(IDENTIFIER_1_RESULT_HASH) + .query(IDENTIFIER_1_QUERY) + .queryNormalized(IDENTIFIER_1_NORMALIZED) + .resultNumber(IDENTIFIER_1_RESULT_NUMBER) + .publisher(IDENTIFIER_1_PUBLISHER) + .type(IDENTIFIER_1_TYPE) + .creator(null /* for jpa */) + .creators(List.of() /* for jpa */) + .build(); + public final static Identifier IDENTIFIER_1_WITH_DOI = Identifier.builder() .id(IDENTIFIER_1_ID) .containerId(IDENTIFIER_1_CONTAINER_ID) @@ -4073,6 +4130,32 @@ public abstract class BaseTest { .creators(List.of(IDENTIFIER_2_CREATOR_1, IDENTIFIER_2_CREATOR_2)) .build(); + public final static Identifier IDENTIFIER_2_SIMPLE = Identifier.builder() + .id(IDENTIFIER_2_ID) + .containerId(IDENTIFIER_2_CONTAINER_ID) + .databaseId(IDENTIFIER_2_DATABASE_ID) + .queryId(IDENTIFIER_2_QUERY_ID) + .description(IDENTIFIER_2_DESCRIPTION) + .title(IDENTIFIER_2_TITLE) + .doi(IDENTIFIER_2_DOI) + .visibility(IDENTIFIER_2_VISIBILITY) + .created(IDENTIFIER_2_CREATED) + .lastModified(IDENTIFIER_2_MODIFIED) + .execution(IDENTIFIER_2_EXECUTION) + .publicationDay(IDENTIFIER_2_PUBLICATION_DAY) + .publicationMonth(IDENTIFIER_2_PUBLICATION_MONTH) + .publicationYear(IDENTIFIER_2_PUBLICATION_YEAR) + .queryHash(IDENTIFIER_2_QUERY_HASH) + .resultHash(IDENTIFIER_2_RESULT_HASH) + .query(IDENTIFIER_2_QUERY) + .queryNormalized(IDENTIFIER_2_NORMALIZED) + .resultNumber(IDENTIFIER_2_RESULT_NUMBER) + .publisher(IDENTIFIER_2_PUBLISHER) + .type(IDENTIFIER_2_TYPE) + .creator(null /* for jpa */) + .creators(List.of() /* for jpa */) + .build(); + public final static IdentifierDto IDENTIFIER_2_DTO = IdentifierDto.builder() .id(IDENTIFIER_2_ID) .containerId(IDENTIFIER_2_CONTAINER_ID) @@ -4247,6 +4330,7 @@ public abstract class BaseTest { public final static IdentifierCreateDto IDENTIFIER_2_DTO_REQUEST = IdentifierCreateDto.builder() .qid(IDENTIFIER_2_QUERY_ID) .cid(IDENTIFIER_2_CONTAINER_ID) + .qid(IDENTIFIER_2_QUERY_ID) .dbid(IDENTIFIER_2_DATABASE_ID) .description(IDENTIFIER_2_DESCRIPTION) .title(IDENTIFIER_2_TITLE) @@ -4360,6 +4444,32 @@ public abstract class BaseTest { .creators(List.of(IDENTIFIER_3_CREATOR_1, IDENTIFIER_3_CREATOR_2, IDENTIFIER_3_CREATOR_3)) .build(); + public final static Identifier IDENTIFIER_3_SIMPLE = Identifier.builder() + .id(IDENTIFIER_3_ID) + .containerId(IDENTIFIER_3_CONTAINER_ID) + .databaseId(IDENTIFIER_3_DATABASE_ID) + .queryId(IDENTIFIER_3_QUERY_ID) + .description(IDENTIFIER_3_DESCRIPTION) + .title(IDENTIFIER_3_TITLE) + .doi(IDENTIFIER_3_DOI) + .visibility(IDENTIFIER_3_VISIBILITY) + .created(IDENTIFIER_3_CREATED) + .lastModified(IDENTIFIER_3_MODIFIED) + .execution(IDENTIFIER_3_EXECUTION) + .publicationDay(IDENTIFIER_3_PUBLICATION_DAY) + .publicationMonth(IDENTIFIER_3_PUBLICATION_MONTH) + .publicationYear(IDENTIFIER_3_PUBLICATION_YEAR) + .queryHash(IDENTIFIER_3_QUERY_HASH) + .resultHash(IDENTIFIER_3_RESULT_HASH) + .query(IDENTIFIER_3_QUERY) + .queryNormalized(IDENTIFIER_3_NORMALIZED) + .resultNumber(IDENTIFIER_3_RESULT_NUMBER) + .publisher(IDENTIFIER_3_PUBLISHER) + .type(IDENTIFIER_3_TYPE) + .creator(null /* for jpa */) + .creators(List.of() /* for jpa */) + .build(); + public final static IdentifierDto IDENTIFIER_3_DTO = IdentifierDto.builder() .id(IDENTIFIER_3_ID) .containerId(IDENTIFIER_3_CONTAINER_ID) @@ -4389,6 +4499,7 @@ public abstract class BaseTest { public final static IdentifierCreateDto IDENTIFIER_3_DTO_REQUEST = IdentifierCreateDto.builder() .cid(IDENTIFIER_3_CONTAINER_ID) .dbid(IDENTIFIER_3_DATABASE_ID) + .qid(IDENTIFIER_3_QUERY_ID) .description(IDENTIFIER_3_DESCRIPTION) .title(IDENTIFIER_3_TITLE) .relatedIdentifiers(List.of()) @@ -4471,6 +4582,31 @@ public abstract class BaseTest { .creators(List.of()) .build(); + public final static Identifier IDENTIFIER_4_SIMPLE = Identifier.builder() + .id(IDENTIFIER_4_ID) + .containerId(IDENTIFIER_4_CONTAINER_ID) + .databaseId(IDENTIFIER_4_DATABASE_ID) + .description(IDENTIFIER_4_DESCRIPTION) + .title(IDENTIFIER_4_TITLE) + .doi(IDENTIFIER_4_DOI) + .visibility(IDENTIFIER_4_VISIBILITY) + .created(IDENTIFIER_4_CREATED) + .lastModified(IDENTIFIER_4_MODIFIED) + .execution(IDENTIFIER_4_EXECUTION) + .publicationDay(IDENTIFIER_4_PUBLICATION_DAY) + .publicationMonth(IDENTIFIER_4_PUBLICATION_MONTH) + .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR) + .queryHash(IDENTIFIER_4_QUERY_HASH) + .resultHash(IDENTIFIER_4_RESULT_HASH) + .query(IDENTIFIER_4_QUERY) + .queryNormalized(IDENTIFIER_4_NORMALIZED) + .resultNumber(IDENTIFIER_4_RESULT_NUMBER) + .publisher(IDENTIFIER_4_PUBLISHER) + .type(IDENTIFIER_4_TYPE) + .creator(null /* for jpa */) + .creators(List.of() /* for jpa */) + .build(); + public final static String VIRTUAL_HOST_NAME = "fda"; public final static String VIRTUAL_HOST_DESCRIPTION = "FAIR Data Austria"; public final static String VIRTUAL_HOST_TAGS = "";