Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 452-create-table-with-sequence
  • 463-reduce-metadata-for-database-api
  • 468-hotfix-redirect-pid
  • 470-hotfix-admin-not-in-sync-on-first-install
  • 474-refactor-basetest-java-to-have-readonly-complete-objects
  • 476-hotfix-query-execution
  • 479-review-private-database-behavior
  • 482-search-service-displays-private-databases-when-not-having-sufficient-access
  • 483-boto3-large-data
  • 484-pipeline-checks
  • 485-fixity-checks
  • 486-test-python-library-through-swagger-api
  • 488-integrate-oidc-into-ui
  • 491-update-sequential-ids-to-non-guessable-ids
  • 494-configure-brute-force-login-detection-in-keycloak
  • 495-improve-password-policy-in-keycloak
  • 497-create-and-update-timestamp-table
  • 497-create-and-update-timestamp-table-2
  • 499-standalone-compute-service
  • 499-standalone-compute-service-2
  • 508-refactor-to-use-username-as-identity
  • 510-refactor-test-dtos-into-a-separate-library-light
  • 518-spark-doesn-t-map-the-headers-correct
  • 521-collect-more-metadata-for-publication
  • 522-integrate-the-new-ui
  • 523-multiarch-builds-in-pipeline-2
  • 530-various-schema-problems-with-subsets
  • 533-integrate-semantic-recommendation
  • 534-bug-when-adding-access-to-user-that-is-not-registered-at-dashboard-service
  • 539-load-tests
  • 545-saving-multiple-times-breaks-pid-metadata
  • 549-test-oai-pmh
  • 551-init-broker-service-permissions
  • archiving
  • backtrack/entities
  • bug/ui
  • coverage/library
  • dev
  • feature/497-create-and-update-timestamp-table
  • feature/openshift
  • feature/semantic-service
  • feature/so-mapper-service
  • feature/soMapper-service
  • feature/sso
  • fix/auth-service
  • fix/composite-keys
  • fix/pid-list
  • hotfix/access
  • hotfix/docs
  • hotfix/helm
  • hotfix/helm-chart
  • hotfix/helm-data-db
  • hotfix/mandatory-arguments
  • hotfix/metadata-service
  • hotfix/openldap
  • hotfix/ui
  • hotfix/ui-view
  • luca_ba_new_interface
  • master
  • release-1.10
  • release-1.3.0
  • release-1.4.0
  • release-1.4.1
  • release-1.4.2
  • release-1.4.3
  • release-1.4.4
  • release-1.4.5
  • release-1.4.6
  • release-1.5
  • release-1.6
  • release-1.7
  • release-1.8
  • release-1.9
  • release-latest
  • release-v1.3
  • replication_test
  • storage-job
  • health_check
  • v1.0.0-alpha
  • v1.1.0-alpha
  • v1.1.1-alpha
  • v1.10.0
  • v1.10.0-rc10
  • v1.10.0-rc11
  • v1.10.0-rc12
  • v1.10.0-rc13
  • v1.10.0-rc2
  • v1.10.0-rc3
  • v1.10.0-rc4
  • v1.10.0-rc5
  • v1.10.0-rc6
  • v1.10.0-rc7
  • v1.10.0-rc8
  • v1.10.0-rc9
  • v1.10.0rc0
  • v1.10.0rc1
  • v1.10.1
  • v1.10.2
  • v1.3.0
  • v1.4.0
  • v1.4.1
  • v1.4.2
  • v1.4.3
  • v1.4.4
  • v1.4.5
  • v1.4.6
  • v1.5.0
  • v1.5.1
  • v1.5.3
  • v1.6.0
  • v1.6.1
  • v1.6.2
  • v1.6.3
  • v1.6.4
  • v1.7.0
  • v1.7.0-rc0
  • v1.7.0-rc1
  • v1.7.1
  • v1.7.2
  • v1.7.3
  • v1.7.3-fix
  • v1.7.3-fix10
  • v1.7.3-fix11
  • v1.7.3-fix12
  • v1.7.3-fix13
  • v1.7.3-fix14
  • v1.7.3-fix15
  • v1.7.3-fix16
  • v1.7.3-fix17
  • v1.7.3-fix18
  • v1.7.3-fix19
  • v1.7.3-fix2
  • v1.7.3-fix20
  • v1.7.3-fix21
  • v1.7.3-fix3
  • v1.7.3-fix4
  • v1.7.3-fix5
  • v1.7.3-fix6
  • v1.7.3-fix7
  • v1.7.3-fix8
  • v1.7.3-fix9
  • v1.8.0
  • v1.8.1
  • v1.8.2
  • v1.8.2-fix
  • v1.8.2-fix2
  • v1.8.2-fix3
  • v1.8.2-fix4
  • v1.9.0
  • v1.9.0-rc0
  • v1.9.0-rc1
  • v1.9.1
  • v1.9.2
  • v1.9.2-rc0
  • v1.9.3
155 results

Target

Select target project
  • fair-data-austria-db-repository/fda-services
1 result
Select Git revision
  • 452-create-table-with-sequence
  • 463-reduce-metadata-for-database-api
  • 468-hotfix-redirect-pid
  • 470-hotfix-admin-not-in-sync-on-first-install
  • 474-refactor-basetest-java-to-have-readonly-complete-objects
  • 476-hotfix-query-execution
  • 479-review-private-database-behavior
  • 482-search-service-displays-private-databases-when-not-having-sufficient-access
  • 483-boto3-large-data
  • 484-pipeline-checks
  • 485-fixity-checks
  • 486-test-python-library-through-swagger-api
  • 488-integrate-oidc-into-ui
  • 491-update-sequential-ids-to-non-guessable-ids
  • 494-configure-brute-force-login-detection-in-keycloak
  • 495-improve-password-policy-in-keycloak
  • 497-create-and-update-timestamp-table
  • 497-create-and-update-timestamp-table-2
  • 499-standalone-compute-service
  • 499-standalone-compute-service-2
  • 508-refactor-to-use-username-as-identity
  • 510-refactor-test-dtos-into-a-separate-library-light
  • 518-spark-doesn-t-map-the-headers-correct
  • 521-collect-more-metadata-for-publication
  • 522-integrate-the-new-ui
  • 523-multiarch-builds-in-pipeline-2
  • 530-various-schema-problems-with-subsets
  • 533-integrate-semantic-recommendation
  • 534-bug-when-adding-access-to-user-that-is-not-registered-at-dashboard-service
  • 539-load-tests
  • 545-saving-multiple-times-breaks-pid-metadata
  • 549-test-oai-pmh
  • 551-init-broker-service-permissions
  • archiving
  • backtrack/entities
  • bug/ui
  • coverage/library
  • dev
  • feature/497-create-and-update-timestamp-table
  • feature/openshift
  • feature/semantic-service
  • feature/so-mapper-service
  • feature/soMapper-service
  • feature/sso
  • fix/auth-service
  • fix/composite-keys
  • fix/pid-list
  • hotfix/access
  • hotfix/docs
  • hotfix/helm
  • hotfix/helm-chart
  • hotfix/helm-data-db
  • hotfix/mandatory-arguments
  • hotfix/metadata-service
  • hotfix/openldap
  • hotfix/ui
  • hotfix/ui-view
  • luca_ba_new_interface
  • master
  • release-1.10
  • release-1.3.0
  • release-1.4.0
  • release-1.4.1
  • release-1.4.2
  • release-1.4.3
  • release-1.4.4
  • release-1.4.5
  • release-1.4.6
  • release-1.5
  • release-1.6
  • release-1.7
  • release-1.8
  • release-1.9
  • release-latest
  • release-v1.3
  • replication_test
  • storage-job
  • health_check
  • v1.0.0-alpha
  • v1.1.0-alpha
  • v1.1.1-alpha
  • v1.10.0
  • v1.10.0-rc10
  • v1.10.0-rc11
  • v1.10.0-rc12
  • v1.10.0-rc13
  • v1.10.0-rc2
  • v1.10.0-rc3
  • v1.10.0-rc4
  • v1.10.0-rc5
  • v1.10.0-rc6
  • v1.10.0-rc7
  • v1.10.0-rc8
  • v1.10.0-rc9
  • v1.10.0rc0
  • v1.10.0rc1
  • v1.10.1
  • v1.10.2
  • v1.3.0
  • v1.4.0
  • v1.4.1
  • v1.4.2
  • v1.4.3
  • v1.4.4
  • v1.4.5
  • v1.4.6
  • v1.5.0
  • v1.5.1
  • v1.5.3
  • v1.6.0
  • v1.6.1
  • v1.6.2
  • v1.6.3
  • v1.6.4
  • v1.7.0
  • v1.7.0-rc0
  • v1.7.0-rc1
  • v1.7.1
  • v1.7.2
  • v1.7.3
  • v1.7.3-fix
  • v1.7.3-fix10
  • v1.7.3-fix11
  • v1.7.3-fix12
  • v1.7.3-fix13
  • v1.7.3-fix14
  • v1.7.3-fix15
  • v1.7.3-fix16
  • v1.7.3-fix17
  • v1.7.3-fix18
  • v1.7.3-fix19
  • v1.7.3-fix2
  • v1.7.3-fix20
  • v1.7.3-fix21
  • v1.7.3-fix3
  • v1.7.3-fix4
  • v1.7.3-fix5
  • v1.7.3-fix6
  • v1.7.3-fix7
  • v1.7.3-fix8
  • v1.7.3-fix9
  • v1.8.0
  • v1.8.1
  • v1.8.2
  • v1.8.2-fix
  • v1.8.2-fix2
  • v1.8.2-fix3
  • v1.8.2-fix4
  • v1.9.0
  • v1.9.0-rc0
  • v1.9.0-rc1
  • v1.9.1
  • v1.9.2
  • v1.9.2-rc0
  • v1.9.3
155 results
Show changes
Showing
with 327 additions and 273 deletions
...@@ -51,23 +51,14 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { ...@@ -51,23 +51,14 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
@Test @Test
public void getTableById_succeeds() throws TableNotFoundException, RemoteUnavailableException, public void getTableById_succeeds() throws TableNotFoundException, RemoteUnavailableException,
MetadataServiceException { MetadataServiceException {
final HttpHeaders headers = new HttpHeaders();
headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
/* mock */ /* mock */
when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class))) when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
.thenReturn(ResponseEntity.status(HttpStatus.OK) .thenReturn(ResponseEntity.status(HttpStatus.OK)
.headers(headers) .body(TABLE_1_DTO));
.body(TABLE_1_PRIVILEGED_DTO));
/* test */ /* test */
final TableDto response = metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID); final TableDto response = metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID);
assertEquals(IMAGE_1_JDBC, response.getDatabase().getContainer().getImage().getJdbcMethod());
assertEquals(CONTAINER_1_HOST, response.getDatabase().getContainer().getHost());
assertEquals(CONTAINER_1_PORT, response.getDatabase().getContainer().getPort());
assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getDatabase().getContainer().getUsername());
assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getDatabase().getContainer().getPassword());
assertEquals(TABLE_1_INTERNAL_NAME, response.getInternalName()); assertEquals(TABLE_1_INTERNAL_NAME, response.getInternalName());
} }
...@@ -105,7 +96,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { ...@@ -105,7 +96,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class))) when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
.thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT) .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
.body(TABLE_1_PRIVILEGED_DTO)); .body(TABLE_1_DTO));
/* test */ /* test */
assertThrows(MetadataServiceException.class, () -> { assertThrows(MetadataServiceException.class, () -> {
...@@ -113,27 +104,6 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { ...@@ -113,27 +104,6 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
}); });
} }
@Test
public void getTableById_headerMissing_fails() {
final List<String> customHeaders = List.of("X-Username", "X-Password");
for (int i = 0; i < customHeaders.size(); i++) {
final HttpHeaders headers = new HttpHeaders();
for (int j = 0; j < i; j++) {
headers.add(customHeaders.get(j), "");
}
/* mock */
when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
.thenReturn(ResponseEntity.status(HttpStatus.OK)
.headers(headers)
.body(TABLE_1_PRIVILEGED_DTO));
/* test */
assertThrows(MetadataServiceException.class, () -> {
metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID);
});
}
}
@Test @Test
public void getTableById_emptyBody_fails() { public void getTableById_emptyBody_fails() {
final HttpHeaders headers = new HttpHeaders(); final HttpHeaders headers = new HttpHeaders();
...@@ -156,8 +126,12 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { ...@@ -156,8 +126,12 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
public void getDatabaseById_succeeds() throws RemoteUnavailableException, MetadataServiceException, public void getDatabaseById_succeeds() throws RemoteUnavailableException, MetadataServiceException,
DatabaseNotFoundException { DatabaseNotFoundException {
final HttpHeaders headers = new HttpHeaders(); final HttpHeaders headers = new HttpHeaders();
headers.set("X-Host", CONTAINER_1_HOST);
headers.set("X-Port", "" + CONTAINER_1_PORT);
headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
headers.set("X-Jdbc-Method", IMAGE_1_JDBC);
headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Jdbc-Method X-Host X-Port");
/* mock */ /* mock */
when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseDto.class))) when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseDto.class)))
...@@ -254,8 +228,12 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { ...@@ -254,8 +228,12 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
@Test @Test
public void getContainerById_succeeds() throws RemoteUnavailableException, ContainerNotFoundException, MetadataServiceException { public void getContainerById_succeeds() throws RemoteUnavailableException, ContainerNotFoundException, MetadataServiceException {
final HttpHeaders headers = new HttpHeaders(); final HttpHeaders headers = new HttpHeaders();
headers.set("X-Host", CONTAINER_1_HOST);
headers.set("X-Port", "" + CONTAINER_1_PORT);
headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
headers.set("X-Jdbc-Method", IMAGE_1_JDBC);
headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Jdbc-Method X-Host X-Port");
/* mock */ /* mock */
when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class))) when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
...@@ -351,15 +329,11 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { ...@@ -351,15 +329,11 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
@Test @Test
public void getViewById_succeeds() throws RemoteUnavailableException, ViewNotFoundException, MetadataServiceException { public void getViewById_succeeds() throws RemoteUnavailableException, ViewNotFoundException, MetadataServiceException {
final HttpHeaders headers = new HttpHeaders();
headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
/* mock */ /* mock */
when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(ViewDto.class))) when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(ViewDto.class)))
.thenReturn(ResponseEntity.ok() .thenReturn(ResponseEntity.ok()
.headers(headers) .body(VIEW_1_DTO));
.body(VIEW_1_PRIVILEGED_DTO));
/* test */ /* test */
final ViewDto response = metadataServiceGateway.getViewById(CONTAINER_1_ID, VIEW_1_ID); final ViewDto response = metadataServiceGateway.getViewById(CONTAINER_1_ID, VIEW_1_ID);
......
...@@ -2,10 +2,11 @@ package at.tuwien.listener; ...@@ -2,10 +2,11 @@ package at.tuwien.listener;
import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbConfig;
import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.config.MariaDbContainerConfig;
import at.tuwien.exception.DatabaseNotFoundException;
import at.tuwien.exception.MetadataServiceException; import at.tuwien.exception.MetadataServiceException;
import at.tuwien.exception.RemoteUnavailableException; import at.tuwien.exception.RemoteUnavailableException;
import at.tuwien.exception.TableNotFoundException; import at.tuwien.exception.TableNotFoundException;
import at.tuwien.service.CredentialService; import at.tuwien.service.CacheService;
import at.tuwien.test.AbstractUnitTest; import at.tuwien.test.AbstractUnitTest;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
...@@ -42,7 +43,7 @@ import static org.mockito.Mockito.when; ...@@ -42,7 +43,7 @@ import static org.mockito.Mockito.when;
public class DefaultListenerIntegrationTest extends AbstractUnitTest { public class DefaultListenerIntegrationTest extends AbstractUnitTest {
@MockBean @MockBean
private CredentialService credentialService; private CacheService credentialService;
@Autowired @Autowired
private DefaultListener defaultListener; private DefaultListener defaultListener;
...@@ -58,17 +59,19 @@ public class DefaultListenerIntegrationTest extends AbstractUnitTest { ...@@ -58,17 +59,19 @@ public class DefaultListenerIntegrationTest extends AbstractUnitTest {
genesis(); genesis();
/* database */ /* database */
MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO); MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
} }
@Test @Test
public void onMessage_succeeds(CapturedOutput output) throws TableNotFoundException, RemoteUnavailableException, public void onMessage_succeeds(CapturedOutput output) throws TableNotFoundException, RemoteUnavailableException,
MetadataServiceException { MetadataServiceException, DatabaseNotFoundException {
final Message request = buildMessage("dbrepo." + DATABASE_1_ID + "." + TABLE_1_ID, "{\"id\":4,\"date\":\"2023-10-03\",\"mintemp\":15.0,\"rainfall\":0.2}", new HashMap<>()); final Message request = buildMessage("dbrepo." + DATABASE_1_ID + "." + TABLE_1_ID, "{\"id\":4,\"date\":\"2023-10-03\",\"mintemp\":15.0,\"rainfall\":0.2}", new HashMap<>());
/* mock */ /* mock */
when(credentialService.getTable(DATABASE_1_ID, TABLE_1_ID)) when(credentialService.getTable(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_1_PRIVILEGED_DTO); .thenReturn(TABLE_1_DTO);
when(credentialService.getDatabase(DATABASE_1_ID))
.thenReturn(DATABASE_1_PRIVILEGED_DTO);
/* test */ /* test */
defaultListener.onMessage(request); defaultListener.onMessage(request);
......
...@@ -2,10 +2,11 @@ package at.tuwien.listener; ...@@ -2,10 +2,11 @@ package at.tuwien.listener;
import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbConfig;
import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.config.MariaDbContainerConfig;
import at.tuwien.exception.DatabaseNotFoundException;
import at.tuwien.exception.MetadataServiceException; import at.tuwien.exception.MetadataServiceException;
import at.tuwien.exception.RemoteUnavailableException; import at.tuwien.exception.RemoteUnavailableException;
import at.tuwien.exception.TableNotFoundException; import at.tuwien.exception.TableNotFoundException;
import at.tuwien.service.CredentialService; import at.tuwien.service.CacheService;
import at.tuwien.test.AbstractUnitTest; import at.tuwien.test.AbstractUnitTest;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
...@@ -38,7 +39,7 @@ import static org.mockito.Mockito.when; ...@@ -38,7 +39,7 @@ import static org.mockito.Mockito.when;
public class DefaultListenerUnitTest extends AbstractUnitTest { public class DefaultListenerUnitTest extends AbstractUnitTest {
@MockBean @MockBean
private CredentialService credentialService; private CacheService credentialService;
@Autowired @Autowired
private DefaultListener defaultListener; private DefaultListener defaultListener;
...@@ -54,7 +55,7 @@ public class DefaultListenerUnitTest extends AbstractUnitTest { ...@@ -54,7 +55,7 @@ public class DefaultListenerUnitTest extends AbstractUnitTest {
genesis(); genesis();
/* metadata database */ /* metadata database */
MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO); MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
} }
@Test @Test
...@@ -77,12 +78,14 @@ public class DefaultListenerUnitTest extends AbstractUnitTest { ...@@ -77,12 +78,14 @@ public class DefaultListenerUnitTest extends AbstractUnitTest {
@Test @Test
public void onMessage_messageMalformed_fails(CapturedOutput output) throws TableNotFoundException, public void onMessage_messageMalformed_fails(CapturedOutput output) throws TableNotFoundException,
RemoteUnavailableException, MetadataServiceException { RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException {
final Message request = buildMessage("dbrepo.1.1", "{,}", new HashMap<>()); final Message request = buildMessage(TABLE_1_ROUTING_KEY, "{,}", new HashMap<>());
/* mock */ /* mock */
when(credentialService.getTable(DATABASE_1_ID, TABLE_1_ID)) when(credentialService.getTable(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_1_PRIVILEGED_DTO); .thenReturn(TABLE_1_DTO);
when(credentialService.getDatabase(DATABASE_1_ID))
.thenReturn(DATABASE_1_PRIVILEGED_DTO);
/* test */ /* test */
defaultListener.onMessage(request); defaultListener.onMessage(request);
...@@ -92,7 +95,7 @@ public class DefaultListenerUnitTest extends AbstractUnitTest { ...@@ -92,7 +95,7 @@ public class DefaultListenerUnitTest extends AbstractUnitTest {
@Test @Test
public void onMessage_tableNotFound_fails(CapturedOutput output) throws TableNotFoundException, public void onMessage_tableNotFound_fails(CapturedOutput output) throws TableNotFoundException,
RemoteUnavailableException, MetadataServiceException { RemoteUnavailableException, MetadataServiceException {
final Message request = buildMessage("dbrepo.1.1", "{\"id\":1}", new HashMap<>()); final Message request = buildMessage(TABLE_1_ROUTING_KEY, "{\"id\": 1}", new HashMap<>());
/* mock */ /* mock */
doThrow(TableNotFoundException.class) doThrow(TableNotFoundException.class)
......
...@@ -2,22 +2,20 @@ package at.tuwien.mvc; ...@@ -2,22 +2,20 @@ package at.tuwien.mvc;
import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.ExecuteStatementDto;
import at.tuwien.api.database.query.ImportDto; import at.tuwien.api.database.query.ImportDto;
import at.tuwien.api.database.query.QueryDto;
import at.tuwien.api.database.query.QueryPersistDto; import at.tuwien.api.database.query.QueryPersistDto;
import at.tuwien.api.database.table.TupleDeleteDto; import at.tuwien.api.database.table.TupleDeleteDto;
import at.tuwien.api.database.table.TupleDto; import at.tuwien.api.database.table.TupleDto;
import at.tuwien.api.database.table.TupleUpdateDto; import at.tuwien.api.database.table.TupleUpdateDto;
import at.tuwien.config.MetricsConfig; import at.tuwien.config.MetricsConfig;
import at.tuwien.endpoints.*; import at.tuwien.endpoints.SubsetEndpoint;
import at.tuwien.endpoints.TableEndpoint;
import at.tuwien.endpoints.ViewEndpoint;
import at.tuwien.listener.DefaultListener; import at.tuwien.listener.DefaultListener;
import at.tuwien.test.AbstractUnitTest; import at.tuwien.test.AbstractUnitTest;
import io.micrometer.observation.annotation.Observed;
import io.micrometer.observation.tck.TestObservationRegistry; import io.micrometer.observation.tck.TestObservationRegistry;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -31,14 +29,11 @@ import org.springframework.security.test.context.support.WithMockUser; ...@@ -31,14 +29,11 @@ import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import java.io.File; import java.util.HashMap;
import java.io.IOException; import java.util.List;
import java.lang.reflect.Method;
import java.util.*;
import static at.tuwien.utils.RabbitMqUtils.buildMessage; import static at.tuwien.utils.RabbitMqUtils.buildMessage;
import static io.micrometer.observation.tck.TestObservationRegistryAssert.assertThat; import static io.micrometer.observation.tck.TestObservationRegistryAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
...@@ -63,12 +58,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -63,12 +58,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
@Autowired @Autowired
private HttpServletRequest httpServletRequest; private HttpServletRequest httpServletRequest;
@Autowired
private AccessEndpoint accessEndpoint; /* no metrics */
@Autowired
private DatabaseEndpoint databaseEndpoint; /* no metrics */
@Autowired @Autowired
private SubsetEndpoint subsetEndpoint; private SubsetEndpoint subsetEndpoint;
...@@ -78,8 +67,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -78,8 +67,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
@Autowired @Autowired
private ViewEndpoint viewEndpoint; private ViewEndpoint viewEndpoint;
private static final Map<String, String> metrics = new TreeMap<>(); /* sorted */
@TestConfiguration @TestConfiguration
static class ObservationTestConfiguration { static class ObservationTestConfiguration {
...@@ -89,16 +76,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -89,16 +76,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
} }
} }
@BeforeAll
public static void beforeAll() {
FileUtils.deleteQuietly(new File("../metrics.txt"));
}
@AfterAll
public static void afterAll() throws IOException {
saveObservedMetrics(metrics);
}
@Test @Test
public void prometheus_succeeds() throws Exception { public void prometheus_succeeds() throws Exception {
...@@ -121,7 +98,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -121,7 +98,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
/* test */ /* test */
assertThat(registry) assertThat(registry)
.hasObservationWithNameEqualTo("dbrepo_message_receive"); .hasObservationWithNameEqualTo("dbrepo_message_receive");
generic_openApiDocs(DefaultListener.class);
} }
@Test @Test
...@@ -135,7 +111,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -135,7 +111,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
/* ignore */ /* ignore */
} }
try { try {
subsetEndpoint.create(DATABASE_1_ID, ExecuteStatementDto.builder().statement(QUERY_5_STATEMENT).build(), USER_1_PRINCIPAL, httpServletRequest, null, 0L, 10L); subsetEndpoint.create(DATABASE_1_ID, QUERY_1_SUBSET_DTO, USER_1_PRINCIPAL, httpServletRequest, null, 0L, 10L);
} catch (Exception e) { } catch (Exception e) {
/* ignore */ /* ignore */
} }
...@@ -161,7 +137,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -161,7 +137,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
assertThat(registry) assertThat(registry)
.hasObservationWithNameEqualTo(metric); .hasObservationWithNameEqualTo(metric);
} }
generic_openApiDocs(SubsetEndpoint.class);
} }
@Test @Test
...@@ -212,7 +187,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -212,7 +187,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
assertThat(registry) assertThat(registry)
.hasObservationWithNameEqualTo(metric); .hasObservationWithNameEqualTo(metric);
} }
generic_openApiDocs(TableEndpoint.class);
} }
@Test @Test
...@@ -229,21 +203,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { ...@@ -229,21 +203,6 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
/* test */ /* test */
assertThat(registry) assertThat(registry)
.hasObservationWithNameEqualTo("dbrepo_view_data"); .hasObservationWithNameEqualTo("dbrepo_view_data");
generic_openApiDocs(ViewEndpoint.class);
}
private static void generic_openApiDocs(Class<?> endpoint) {
final List<Method> methods = Arrays.stream(endpoint.getMethods())
.filter(m -> m.getDeclaringClass().equals(endpoint))
.toList();
methods.forEach(m -> {
final Observed observed = m.getDeclaredAnnotation(Observed.class);
final Operation operation = m.getDeclaredAnnotation(Operation.class);
if (observed != null) {
assertNotNull(operation);
metrics.put(observed.name(), operation.summary());
}
});
} }
} }
...@@ -45,7 +45,7 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest { ...@@ -45,7 +45,7 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
genesis(); genesis();
/* metadata database */ /* metadata database */
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
} }
@Test @Test
......
...@@ -79,7 +79,7 @@ public class ContainerServiceIntegrationTest extends AbstractUnitTest { ...@@ -79,7 +79,7 @@ public class ContainerServiceIntegrationTest extends AbstractUnitTest {
} }
@Test @Test
public void createQueryStore_succeeds() throws SQLException, QueryStoreCreateException, InterruptedException { public void createQueryStore_succeeds() throws SQLException, QueryStoreCreateException {
/* test */ /* test */
createQueryStore_generic(DATABASE_1_INTERNALNAME); createQueryStore_generic(DATABASE_1_INTERNALNAME);
......
...@@ -8,7 +8,7 @@ import at.tuwien.api.database.table.TableDto; ...@@ -8,7 +8,7 @@ import at.tuwien.api.database.table.TableDto;
import at.tuwien.api.user.UserDto; import at.tuwien.api.user.UserDto;
import at.tuwien.exception.*; import at.tuwien.exception.*;
import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.gateway.MetadataServiceGateway;
import at.tuwien.service.impl.CredentialServiceImpl; import at.tuwien.service.impl.CacheServiceImpl;
import at.tuwien.test.AbstractUnitTest; import at.tuwien.test.AbstractUnitTest;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
...@@ -30,7 +30,7 @@ import static org.mockito.Mockito.when; ...@@ -30,7 +30,7 @@ import static org.mockito.Mockito.when;
public class CredentialServiceUnitTest extends AbstractUnitTest { public class CredentialServiceUnitTest extends AbstractUnitTest {
@Autowired @Autowired
private CredentialServiceImpl credentialService; private CacheServiceImpl credentialService;
@MockBean @MockBean
private MetadataServiceGateway metadataServiceGateway; private MetadataServiceGateway metadataServiceGateway;
...@@ -48,7 +48,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -48,7 +48,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
.thenReturn(DATABASE_1_PRIVILEGED_DTO); .thenReturn(DATABASE_1_DTO);
/* test */ /* test */
final DatabaseDto response = credentialService.getDatabase(DATABASE_1_ID); final DatabaseDto response = credentialService.getDatabase(DATABASE_1_ID);
...@@ -62,7 +62,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -62,7 +62,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
.thenReturn(DATABASE_1_PRIVILEGED_DTO) .thenReturn(DATABASE_1_DTO)
.thenThrow(RuntimeException.class) /* should never be thrown */; .thenThrow(RuntimeException.class) /* should never be thrown */;
credentialService.getDatabase(DATABASE_1_ID); credentialService.getDatabase(DATABASE_1_ID);
...@@ -78,8 +78,8 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -78,8 +78,8 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
.thenReturn(DATABASE_2_PRIVILEGED_DTO) /* needs to be different id for test case */ .thenReturn(DATABASE_2_DTO) /* needs to be different id for test case */
.thenReturn(DATABASE_1_PRIVILEGED_DTO); .thenReturn(DATABASE_1_DTO);
/* pre-condition */ /* pre-condition */
final DatabaseDto tmp = credentialService.getDatabase(DATABASE_1_ID); final DatabaseDto tmp = credentialService.getDatabase(DATABASE_1_ID);
...@@ -98,7 +98,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -98,7 +98,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getContainerById(CONTAINER_1_ID)) when(metadataServiceGateway.getContainerById(CONTAINER_1_ID))
.thenReturn(CONTAINER_1_PRIVILEGED_DTO); .thenReturn(CONTAINER_1_DTO);
/* test */ /* test */
final ContainerDto response = credentialService.getContainer(CONTAINER_1_ID); final ContainerDto response = credentialService.getContainer(CONTAINER_1_ID);
...@@ -127,9 +127,9 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -127,9 +127,9 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
InterruptedException, ContainerNotFoundException { InterruptedException, ContainerNotFoundException {
/* mock */ /* mock */
when(metadataServiceGateway.getContainerById(DATABASE_1_ID)) when(metadataServiceGateway.getContainerById(CONTAINER_1_ID))
.thenReturn(CONTAINER_2_PRIVILEGED_DTO) /* needs to be different id for test case */ .thenReturn(CONTAINER_2_DTO) /* needs to be different id for test case */
.thenReturn(CONTAINER_1_PRIVILEGED_DTO); .thenReturn(CONTAINER_1_DTO);
/* pre-condition */ /* pre-condition */
final ContainerDto tmp = credentialService.getContainer(CONTAINER_1_ID); final ContainerDto tmp = credentialService.getContainer(CONTAINER_1_ID);
...@@ -251,7 +251,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -251,7 +251,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_1_PRIVILEGED_DTO); .thenReturn(TABLE_1_DTO);
/* test */ /* test */
final TableDto response = credentialService.getTable(DATABASE_1_ID, TABLE_1_ID); final TableDto response = credentialService.getTable(DATABASE_1_ID, TABLE_1_ID);
...@@ -265,7 +265,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -265,7 +265,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_1_PRIVILEGED_DTO) .thenReturn(TABLE_1_DTO)
.thenThrow(RuntimeException.class) /* should never be thrown */; .thenThrow(RuntimeException.class) /* should never be thrown */;
credentialService.getTable(DATABASE_1_ID, TABLE_1_ID); credentialService.getTable(DATABASE_1_ID, TABLE_1_ID);
...@@ -281,8 +281,8 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -281,8 +281,8 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_2_PRIVILEGED_DTO) /* needs to be different id for test case */ .thenReturn(TABLE_2_DTO) /* needs to be different id for test case */
.thenReturn(TABLE_1_PRIVILEGED_DTO); .thenReturn(TABLE_1_DTO);
/* pre-condition */ /* pre-condition */
final TableDto tmp = credentialService.getTable(DATABASE_1_ID, TABLE_1_ID); final TableDto tmp = credentialService.getTable(DATABASE_1_ID, TABLE_1_ID);
...@@ -301,7 +301,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -301,7 +301,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID))
.thenReturn(VIEW_1_PRIVILEGED_DTO); .thenReturn(VIEW_1_DTO);
/* test */ /* test */
final ViewDto response = credentialService.getView(DATABASE_1_ID, VIEW_1_ID); final ViewDto response = credentialService.getView(DATABASE_1_ID, VIEW_1_ID);
...@@ -314,7 +314,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -314,7 +314,7 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID))
.thenReturn(VIEW_1_PRIVILEGED_DTO) .thenReturn(VIEW_1_DTO)
.thenThrow(RuntimeException.class) /* should never be thrown */; .thenThrow(RuntimeException.class) /* should never be thrown */;
credentialService.getView(DATABASE_1_ID, VIEW_1_ID); credentialService.getView(DATABASE_1_ID, VIEW_1_ID);
...@@ -330,8 +330,8 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -330,8 +330,8 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID))
.thenReturn(VIEW_2_PRIVILEGED_DTO) /* needs to be different id for test case */ .thenReturn(VIEW_2_DTO) /* needs to be different id for test case */
.thenReturn(VIEW_1_PRIVILEGED_DTO); .thenReturn(VIEW_1_DTO);
/* pre-condition */ /* pre-condition */
final ViewDto tmp = credentialService.getView(DATABASE_1_ID, VIEW_1_ID); final ViewDto tmp = credentialService.getView(DATABASE_1_ID, VIEW_1_ID);
...@@ -344,26 +344,4 @@ public class CredentialServiceUnitTest extends AbstractUnitTest { ...@@ -344,26 +344,4 @@ public class CredentialServiceUnitTest extends AbstractUnitTest {
assertEquals(VIEW_1_ID, response.getId()); assertEquals(VIEW_1_ID, response.getId());
} }
@Test
public void invalidateAccess_succeeds() throws NotAllowedException, RemoteUnavailableException,
MetadataServiceException {
/* mock */
when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID))
.thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO)
.thenThrow(RuntimeException.class);
/* pre-condition */
final DatabaseAccessDto response = credentialService.getAccess(DATABASE_1_ID, USER_1_ID);
assertNotNull(response);
/* test */
credentialService.invalidateAccess(DATABASE_1_ID);
/* post-condition */
assertThrows(RuntimeException.class, () -> {
credentialService.getAccess(DATABASE_1_ID, USER_1_ID);
});
}
} }
...@@ -4,9 +4,7 @@ import at.tuwien.api.database.ViewColumnDto; ...@@ -4,9 +4,7 @@ import at.tuwien.api.database.ViewColumnDto;
import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.ViewDto;
import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableBriefDto;
import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.TableDto;
import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.*;
import at.tuwien.api.database.table.columns.ColumnTypeDto;
import at.tuwien.api.database.table.columns.CreateTableColumnDto;
import at.tuwien.api.database.table.constraints.ConstraintsDto; import at.tuwien.api.database.table.constraints.ConstraintsDto;
import at.tuwien.api.database.table.constraints.CreateTableConstraintsDto; import at.tuwien.api.database.table.constraints.CreateTableConstraintsDto;
import at.tuwien.api.database.table.constraints.foreign.CreateForeignKeyDto; import at.tuwien.api.database.table.constraints.foreign.CreateForeignKeyDto;
...@@ -39,6 +37,7 @@ import java.sql.SQLException; ...@@ -39,6 +37,7 @@ import java.sql.SQLException;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
...@@ -64,9 +63,9 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -64,9 +63,9 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
genesis(); genesis();
/* metadata database */ /* metadata database */
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_DTO); MariaDbConfig.createInitDatabase(DATABASE_2_PRIVILEGED_DTO);
Thread.sleep(1000) /* wait for test container some more */; Thread.sleep(1000) /* wait for test container some more */;
} }
...@@ -74,7 +73,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -74,7 +73,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
public void createView_succeeds() throws SQLException, ViewMalformedException { public void createView_succeeds() throws SQLException, ViewMalformedException {
/* test */ /* test */
databaseService.createView(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO); databaseService.createView(DATABASE_1_PRIVILEGED_DTO, VIEW_1_NAME, VIEW_1_QUERY);
} }
@Test @Test
...@@ -85,7 +84,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -85,7 +84,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final ViewDto view0 = response.get(0); final ViewDto view0 = response.get(0);
assertEquals("not_in_metadata_db2", view0.getName()); assertEquals("not_in_metadata_db2", view0.getName());
assertEquals("not_in_metadata_db2", view0.getInternalName()); assertEquals("not_in_metadata_db2", view0.getInternalName());
assertEquals(DATABASE_1_ID, view0.getVdbid()); assertEquals(DATABASE_1_ID, view0.getDatabaseId());
assertEquals(USER_1_BRIEF_DTO, view0.getOwner()); assertEquals(USER_1_BRIEF_DTO, view0.getOwner());
assertFalse(view0.getIsInitialView()); assertFalse(view0.getIsInitialView());
assertEquals(DATABASE_1_PUBLIC, view0.getIsPublic()); assertEquals(DATABASE_1_PUBLIC, view0.getIsPublic());
...@@ -150,7 +149,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -150,7 +149,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto response = databaseService.inspectTable(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db"); final TableDto response = databaseService.inspectTable(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db");
assertEquals("not_in_metadata_db", response.getInternalName()); assertEquals("not_in_metadata_db", response.getInternalName());
assertEquals("not_in_metadata_db", response.getName()); assertEquals("not_in_metadata_db", response.getName());
assertEquals(DATABASE_1_ID, response.getTdbid()); assertEquals(DATABASE_1_ID, response.getDatabaseId());
assertTrue(response.getIsVersioned()); assertTrue(response.getIsVersioned());
assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
final List<ColumnDto> columns = response.getColumns(); final List<ColumnDto> columns = response.getColumns();
...@@ -186,7 +185,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -186,7 +185,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto response = databaseService.inspectTable(DATABASE_2_PRIVILEGED_DTO, "experiments"); final TableDto response = databaseService.inspectTable(DATABASE_2_PRIVILEGED_DTO, "experiments");
assertEquals("experiments", response.getInternalName()); assertEquals("experiments", response.getInternalName());
assertEquals("experiments", response.getName()); assertEquals("experiments", response.getName());
assertEquals(DATABASE_2_ID, response.getTdbid()); assertEquals(DATABASE_2_ID, response.getDatabaseId());
assertTrue(response.getIsVersioned()); assertTrue(response.getIsVersioned());
assertEquals(DATABASE_2_PUBLIC, response.getIsPublic()); assertEquals(DATABASE_2_PUBLIC, response.getIsPublic());
assertNotNull(response.getOwner()); assertNotNull(response.getOwner());
...@@ -205,10 +204,10 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -205,10 +204,10 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
assertColumn(columns.get(0), null, null, DATABASE_2_ID, "id", "id", ColumnTypeDto.BIGINT, 19L, 0L, false, null); assertColumn(columns.get(0), null, null, DATABASE_2_ID, "id", "id", ColumnTypeDto.BIGINT, 19L, 0L, false, null);
assertColumn(columns.get(1), null, null, DATABASE_2_ID, "mode", "mode", ColumnTypeDto.ENUM, 3L, null, false, null); assertColumn(columns.get(1), null, null, DATABASE_2_ID, "mode", "mode", ColumnTypeDto.ENUM, 3L, null, false, null);
assertEquals(2, columns.get(1).getEnums().size()); assertEquals(2, columns.get(1).getEnums().size());
assertEquals(List.of("ABC", "DEF"), columns.get(1).getEnums()); assertEquals(List.of("ABC", "DEF"), columns.get(1).getEnums().stream().map(EnumDto::getValue).toList());
assertColumn(columns.get(2), null, null, DATABASE_2_ID, "seq", "seq", ColumnTypeDto.SET, 5L, null, true, null); assertColumn(columns.get(2), null, null, DATABASE_2_ID, "seq", "seq", ColumnTypeDto.SET, 5L, null, true, null);
assertEquals(3, columns.get(2).getSets().size()); assertEquals(3, columns.get(2).getSets().size());
assertEquals(List.of("1", "2", "3"), columns.get(2).getSets()); assertEquals(List.of("1", "2", "3"), columns.get(2).getSets().stream().map(SetDto::getValue).toList());
/* ignore rest (constraints) */ /* ignore rest (constraints) */
} }
...@@ -219,7 +218,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -219,7 +218,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto response = databaseService.inspectTable(DATABASE_1_PRIVILEGED_DTO, "weather_aus"); final TableDto response = databaseService.inspectTable(DATABASE_1_PRIVILEGED_DTO, "weather_aus");
assertEquals("weather_aus", response.getInternalName()); assertEquals("weather_aus", response.getInternalName());
assertEquals("weather_aus", response.getName()); assertEquals("weather_aus", response.getName());
assertEquals(DATABASE_1_ID, response.getTdbid()); assertEquals(DATABASE_1_ID, response.getDatabaseId());
assertTrue(response.getIsVersioned()); assertTrue(response.getIsVersioned());
assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
assertNotNull(response.getOwner()); assertNotNull(response.getOwner());
...@@ -439,7 +438,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -439,7 +438,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final ViewDto response = databaseService.inspectView(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db2"); final ViewDto response = databaseService.inspectView(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db2");
assertEquals("not_in_metadata_db2", response.getInternalName()); assertEquals("not_in_metadata_db2", response.getInternalName());
assertEquals("not_in_metadata_db2", response.getName()); assertEquals("not_in_metadata_db2", response.getName());
assertEquals(DATABASE_1_ID, response.getVdbid()); assertEquals(DATABASE_1_ID, response.getDatabaseId());
assertEquals(USER_1_BRIEF_DTO, response.getOwner()); assertEquals(USER_1_BRIEF_DTO, response.getOwner());
assertFalse(response.getIsInitialView()); assertFalse(response.getIsInitialView());
assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
...@@ -473,7 +472,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -473,7 +472,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto table0 = response.get(0); final TableDto table0 = response.get(0);
Assertions.assertEquals("complex_foreign_keys", table0.getInternalName()); Assertions.assertEquals("complex_foreign_keys", table0.getInternalName());
Assertions.assertEquals("complex_foreign_keys", table0.getName()); Assertions.assertEquals("complex_foreign_keys", table0.getName());
Assertions.assertEquals(DATABASE_1_ID, table0.getTdbid()); Assertions.assertEquals(DATABASE_1_ID, table0.getDatabaseId());
assertTrue(table0.getIsVersioned()); assertTrue(table0.getIsVersioned());
Assertions.assertEquals(DATABASE_1_PUBLIC, table0.getIsPublic()); Assertions.assertEquals(DATABASE_1_PUBLIC, table0.getIsPublic());
final List<ColumnDto> columns0 = table0.getColumns(); final List<ColumnDto> columns0 = table0.getColumns();
...@@ -520,7 +519,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -520,7 +519,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto table1 = response.get(1); final TableDto table1 = response.get(1);
Assertions.assertEquals("complex_primary_key", table1.getInternalName()); Assertions.assertEquals("complex_primary_key", table1.getInternalName());
Assertions.assertEquals("complex_primary_key", table1.getName()); Assertions.assertEquals("complex_primary_key", table1.getName());
Assertions.assertEquals(DATABASE_1_ID, table1.getTdbid()); Assertions.assertEquals(DATABASE_1_ID, table1.getDatabaseId());
assertTrue(table1.getIsVersioned()); assertTrue(table1.getIsVersioned());
Assertions.assertEquals(DATABASE_1_PUBLIC, table1.getIsPublic()); Assertions.assertEquals(DATABASE_1_PUBLIC, table1.getIsPublic());
final List<ColumnDto> columns1 = table1.getColumns(); final List<ColumnDto> columns1 = table1.getColumns();
...@@ -548,7 +547,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -548,7 +547,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto table2 = response.get(2); final TableDto table2 = response.get(2);
Assertions.assertEquals("exotic_boolean", table2.getInternalName()); Assertions.assertEquals("exotic_boolean", table2.getInternalName());
Assertions.assertEquals("exotic_boolean", table2.getName()); Assertions.assertEquals("exotic_boolean", table2.getName());
Assertions.assertEquals(DATABASE_1_ID, table2.getTdbid()); Assertions.assertEquals(DATABASE_1_ID, table2.getDatabaseId());
assertTrue(table2.getIsVersioned()); assertTrue(table2.getIsVersioned());
Assertions.assertEquals(DATABASE_1_PUBLIC, table2.getIsPublic()); Assertions.assertEquals(DATABASE_1_PUBLIC, table2.getIsPublic());
final List<ColumnDto> columns2 = table2.getColumns(); final List<ColumnDto> columns2 = table2.getColumns();
...@@ -569,7 +568,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -569,7 +568,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
final TableDto table3 = response.get(3); final TableDto table3 = response.get(3);
Assertions.assertEquals("not_in_metadata_db", table3.getInternalName()); Assertions.assertEquals("not_in_metadata_db", table3.getInternalName());
Assertions.assertEquals("not_in_metadata_db", table3.getName()); Assertions.assertEquals("not_in_metadata_db", table3.getName());
Assertions.assertEquals(DATABASE_1_ID, table3.getTdbid()); Assertions.assertEquals(DATABASE_1_ID, table3.getDatabaseId());
assertTrue(table3.getIsVersioned()); assertTrue(table3.getIsVersioned());
Assertions.assertEquals(DATABASE_1_PUBLIC, table3.getIsPublic()); Assertions.assertEquals(DATABASE_1_PUBLIC, table3.getIsPublic());
final List<ColumnDto> columns3 = table3.getColumns(); final List<ColumnDto> columns3 = table3.getColumns();
...@@ -709,21 +708,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { ...@@ -709,21 +708,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
assertEquals(TABLE_1_COLUMNS.size(), response.getColumns().size()); assertEquals(TABLE_1_COLUMNS.size(), response.getColumns().size());
} }
protected static void assertViewColumn(ViewColumnDto column, ViewColumnDto other) { protected static void assertColumn(ColumnDto column, UUID id, UUID tableId, UUID databaseId, String name,
assertNotNull(column);
assertNotNull(other);
assertEquals(column.getId(), other.getId());
assertEquals(column.getDatabaseId(), other.getDatabaseId());
assertEquals(column.getName(), other.getName());
assertEquals(column.getInternalName(), other.getInternalName());
assertEquals(column.getColumnType(), other.getColumnType());
assertEquals(column.getSize(), other.getSize());
assertEquals(column.getD(), other.getD());
assertEquals(column.getIsNullAllowed(), other.getIsNullAllowed());
assertEquals(column.getDescription(), other.getDescription());
}
protected static void assertColumn(ColumnDto column, Long id, Long tableId, Long databaseId, String name,
String internalName, ColumnTypeDto type, Long size, Long d, Boolean nullAllowed, String internalName, ColumnTypeDto type, Long size, Long d, Boolean nullAllowed,
String description) { String description) {
log.trace("assert column: {}", internalName); log.trace("assert column: {}", internalName);
......
...@@ -2,7 +2,7 @@ package at.tuwien.service; ...@@ -2,7 +2,7 @@ package at.tuwien.service;
import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbConfig;
import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.config.MariaDbContainerConfig;
import at.tuwien.exception.ContainerNotFoundException; import at.tuwien.exception.DatabaseNotFoundException;
import at.tuwien.exception.MetadataServiceException; import at.tuwien.exception.MetadataServiceException;
import at.tuwien.exception.RemoteUnavailableException; import at.tuwien.exception.RemoteUnavailableException;
import at.tuwien.exception.TableNotFoundException; import at.tuwien.exception.TableNotFoundException;
...@@ -53,12 +53,12 @@ public class QueueServiceIntegrationTest extends AbstractUnitTest { ...@@ -53,12 +53,12 @@ public class QueueServiceIntegrationTest extends AbstractUnitTest {
genesis(); genesis();
/* metadata database */ /* metadata database */
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
} }
@Test @Test
public void insert_succeeds() throws SQLException, RemoteUnavailableException, ContainerNotFoundException, public void insert_succeeds() throws SQLException, RemoteUnavailableException, TableNotFoundException,
TableNotFoundException, MetadataServiceException { MetadataServiceException, DatabaseNotFoundException {
final Map<String, Object> request = new HashMap<>() {{ final Map<String, Object> request = new HashMap<>() {{
put("id", 4L); put("id", 4L);
put("date", "2023-10-03"); put("date", "2023-10-03");
...@@ -68,29 +68,31 @@ public class QueueServiceIntegrationTest extends AbstractUnitTest { ...@@ -68,29 +68,31 @@ public class QueueServiceIntegrationTest extends AbstractUnitTest {
}}; }};
/* mock */ /* mock */
when(metadataServiceGateway.getContainerById(CONTAINER_1_ID)) when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
.thenReturn(CONTAINER_1_PRIVILEGED_DTO); .thenReturn(DATABASE_1_PRIVILEGED_DTO);
when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_1_PRIVILEGED_DTO); .thenReturn(TABLE_1_DTO);
/* test */ /* test */
queueService.insert(TABLE_1_PRIVILEGED_DTO, request); queueService.insert(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
} }
@Test @Test
public void insert_onlyMandatoryFields_succeeds() throws SQLException, RemoteUnavailableException, public void insert_onlyMandatoryFields_succeeds() throws SQLException, RemoteUnavailableException,
TableNotFoundException, MetadataServiceException { TableNotFoundException, MetadataServiceException, DatabaseNotFoundException {
final Map<String, Object> request = new HashMap<>() {{ final Map<String, Object> request = new HashMap<>() {{
put("id", 5L); put("id", 5L);
put("date", "2023-10-04"); put("date", "2023-10-04");
}}; }};
/* mock */ /* mock */
when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
.thenReturn(DATABASE_1_PRIVILEGED_DTO);
when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID))
.thenReturn(TABLE_1_PRIVILEGED_DTO); .thenReturn(TABLE_1_DTO);
/* test */ /* test */
queueService.insert(TABLE_1_PRIVILEGED_DTO, request); queueService.insert(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
} }
} }
package at.tuwien.service; package at.tuwien.service;
import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.query.*;
import at.tuwien.api.identifier.IdentifierBriefDto; import at.tuwien.api.identifier.IdentifierBriefDto;
import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbConfig;
import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.config.MariaDbContainerConfig;
...@@ -8,9 +8,14 @@ import at.tuwien.exception.*; ...@@ -8,9 +8,14 @@ import at.tuwien.exception.*;
import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.gateway.MetadataServiceGateway;
import at.tuwien.test.AbstractUnitTest; import at.tuwien.test.AbstractUnitTest;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
...@@ -20,7 +25,12 @@ import org.testcontainers.junit.jupiter.Container; ...@@ -20,7 +25,12 @@ import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.junit.jupiter.Testcontainers;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.Instant;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
...@@ -32,11 +42,19 @@ import static org.mockito.Mockito.when; ...@@ -32,11 +42,19 @@ import static org.mockito.Mockito.when;
public class SubsetServiceIntegrationTest extends AbstractUnitTest { public class SubsetServiceIntegrationTest extends AbstractUnitTest {
@Autowired @Autowired
private SubsetService queryService; private SubsetService subsetService;
@MockBean @MockBean
private MetadataServiceGateway metadataServiceGateway; private MetadataServiceGateway metadataServiceGateway;
public static Stream<Arguments> create_arguments() {
return Stream.of(
Arguments.arguments("singleQuote", "' DROP TABLE `weather_location`; --"),
Arguments.arguments("singleQuoteEscaped", "\' DROP TABLE `weather_location`; --"),
Arguments.arguments("doubleQuote", "\" DROP TABLE `weather_location`; --")
);
}
@Container @Container
private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer(); private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer();
...@@ -45,7 +63,7 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -45,7 +63,7 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
genesis(); genesis();
/* metadata database */ /* metadata database */
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
} }
@Test @Test
...@@ -55,8 +73,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -55,8 +73,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
final List<QueryDto> response = findAll_generic(null); final List<QueryDto> response = findAll_generic(null);
assertEquals(2, response.size()); assertEquals(2, response.size());
assertEquals(1L, response.get(0).getId()); assertNotNull(response.get(0).getId());
assertEquals(2L, response.get(1).getId()); assertNotNull(response.get(1).getId());
} }
@Test @Test
...@@ -66,7 +84,7 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -66,7 +84,7 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
final List<QueryDto> response = findAll_generic(true); final List<QueryDto> response = findAll_generic(true);
assertEquals(1, response.size()); assertEquals(1, response.size());
assertEquals(1L, response.get(0).getId()); assertNotNull(response.get(0).getId());
} }
@Test @Test
...@@ -76,15 +94,18 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -76,15 +94,18 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
final List<QueryDto> response = findAll_generic(false); final List<QueryDto> response = findAll_generic(false);
assertEquals(1, response.size()); assertEquals(1, response.size());
assertEquals(2L, response.get(0).getId()); assertNotNull(response.get(0).getId());
} }
@Test @Test
public void findById_succeeds() throws SQLException, QueryNotFoundException, UserNotFoundException, public void findById_succeeds() throws SQLException, QueryNotFoundException, UserNotFoundException,
RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException {
/* mock */
final UUID queryId = MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, USER_1_ID);
/* test */ /* test */
findById_generic(QUERY_1_ID); findById_generic(queryId);
} }
@Test @Test
...@@ -92,7 +113,7 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -92,7 +113,7 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
assertThrows(QueryNotFoundException.class, () -> { assertThrows(QueryNotFoundException.class, () -> {
findById_generic(9999L); findById_generic(UUID.randomUUID());
}); });
} }
...@@ -102,13 +123,14 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -102,13 +123,14 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
InterruptedException { InterruptedException {
/* mock */ /* mock */
final UUID queryId2 = MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_2_DTO, USER_1_ID);
when(metadataServiceGateway.getUserById(USER_1_ID)) when(metadataServiceGateway.getUserById(USER_1_ID))
.thenReturn(USER_1_DTO); .thenReturn(USER_1_DTO);
/* test */ /* test */
persist_generic(QUERY_2_ID, List.of(IDENTIFIER_5_BRIEF_DTO), true); persist_generic(queryId2, List.of(IDENTIFIER_5_BRIEF_DTO), true);
final QueryDto response = queryService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_2_ID); final QueryDto response = subsetService.findById(DATABASE_1_PRIVILEGED_DTO, queryId2);
assertEquals(2L, response.getId()); assertEquals(queryId2, response.getId());
assertTrue(response.getIsPersisted()); assertTrue(response.getIsPersisted());
} }
...@@ -118,17 +140,150 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -118,17 +140,150 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
InterruptedException { InterruptedException {
/* mock */ /* mock */
final UUID queryId1 = MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, USER_1_ID);
when(metadataServiceGateway.getUserById(USER_1_ID)) when(metadataServiceGateway.getUserById(USER_1_ID))
.thenReturn(USER_1_DTO); .thenReturn(USER_1_DTO);
/* test */ /* test */
persist_generic(QUERY_1_ID, List.of(IDENTIFIER_2_BRIEF_DTO), false); persist_generic(queryId1, List.of(IDENTIFIER_2_BRIEF_DTO), false);
final QueryDto response = queryService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID); final QueryDto response = subsetService.findById(DATABASE_1_PRIVILEGED_DTO, queryId1);
assertEquals(1L, response.getId()); assertEquals(queryId1, response.getId());
assertFalse(response.getIsPersisted()); assertFalse(response.getIsPersisted());
} }
protected void findById_generic(Long queryId) throws RemoteUnavailableException, SQLException, @Test
public void getData_succeeds() throws QueryMalformedException, TableNotFoundException {
final List<List<String>> expected = List.of(
List.of("1", "2008-12-01", "Albury", "13.4", "0.6"),
List.of("2", "2008-12-02", "Albury", "7.4", "0.0"),
List.of("3", "2008-12-03", "Albury", "12.9", "0.0"));
/* test */
final Dataset<Row> response = subsetService.getData(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT);
assertNotNull(response);
final List<List<String>> mapped = response.collectAsList()
.stream()
.map(row -> {
final List<String> map = new LinkedList<>();
for (int i = 0; i < response.columns().length; i++) {
map.add(row.get(i) != null ? String.valueOf(row.get(i)) : "");
}
return map;
})
.toList();
assertEquals(expected, mapped);
}
@Test
public void getData_notFound_fails() {
/* test */
assertThrows(TableNotFoundException.class, () -> {
subsetService.getData(DATABASE_1_PRIVILEGED_DTO, "SELECT 1 FROM i_do_not_exist");
});
}
@Test
public void reExecuteCount_succeeds() throws SQLException, QueryMalformedException {
/* test */
final Long response = subsetService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO);
assertNotNull(response);
}
@Test
public void reExecuteCount_malformed_fails() {
final QueryDto request = QueryDto.builder()
.execution(Instant.now())
.databaseId(DATABASE_1_ID)
.query("SELECT") // <<<
.build();
/* test */
assertThrows(QueryMalformedException.class, () -> {
subsetService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, request);
});
}
@Test
public void executeCountNonPersistent_succeeds() throws SQLException, QueryMalformedException {
/* test */
final Long response = subsetService.executeCountNonPersistent(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, QUERY_1_CREATED);
assertNotNull(response);
}
@Test
public void executeCountNonPersistent_malformed_fails() {
/* test */
assertThrows(QueryMalformedException.class, () -> {
subsetService.executeCountNonPersistent(DATABASE_1_PRIVILEGED_DTO, "SELECT", QUERY_1_CREATED);
});
}
@Test
public void executeCountNonPersistent_illegalQuery_fails() {
/* test */
assertThrows(QueryMalformedException.class, () -> {
subsetService.executeCountNonPersistent(DATABASE_1_PRIVILEGED_DTO, "DROP DATABASE `weather`", QUERY_1_CREATED);
});
}
@Test
public void storeQuery_succeeds() throws SQLException, QueryStoreInsertException, ViewMalformedException {
/* test */
final UUID response = subsetService.storeQuery(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, QUERY_1_CREATED, USER_1_ID);
assertNotNull(response);
}
@Test
public void create_succeeds() throws SQLException, QueryStoreInsertException, ViewMalformedException,
TableNotFoundException, QueryMalformedException, ImageNotFoundException {
/* test */
final UUID response = subsetService.create(DATABASE_1_PRIVILEGED_DTO, QUERY_1_SUBSET_DTO, QUERY_1_CREATED, USER_1_ID);
assertNotNull(response);
}
@ParameterizedTest
@MethodSource("create_arguments")
public void create_illegalQuery_succeeds(String name, String injection) throws TableNotFoundException,
QueryStoreInsertException, ViewMalformedException, SQLException, QueryMalformedException,
ImageNotFoundException {
final SubsetDto request = SubsetDto.builder()
.tableId(TABLE_1_ID)
.columns(new LinkedList<>(List.of(COLUMN_1_1_ID, COLUMN_1_2_ID, COLUMN_1_3_ID, COLUMN_1_4_ID, COLUMN_1_5_ID)))
.filter(new LinkedList<>(List.of(FilterDto.builder()
.type(FilterTypeDto.WHERE)
.columnId(COLUMN_1_1_ID)
.operatorId(IMAGE_1_OPERATORS_2_ID)
.value(injection)
.build())))
.order(new LinkedList<>(List.of(OrderDto.builder()
.columnId(COLUMN_1_1_ID)
.direction(OrderTypeDto.ASC)
.build())))
.build();
/* test */
subsetService.create(DATABASE_1_PRIVILEGED_DTO, request, QUERY_1_CREATED, USER_1_ID);
assertEquals(1, MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT 1 WHERE EXISTS (SELECT * FROM `weather_location`)", Set.of()).size());
}
@Test
public void storeQuery_fails() {
/* test */
assertThrows(QueryStoreInsertException.class, () -> {
subsetService.storeQuery(DATABASE_1_PRIVILEGED_DTO, "DROP DATABASE `weather`", QUERY_1_CREATED, USER_1_ID);
});
}
protected void findById_generic(UUID queryId) throws RemoteUnavailableException, SQLException,
UserNotFoundException, QueryNotFoundException, MetadataServiceException, DatabaseNotFoundException, UserNotFoundException, QueryNotFoundException, MetadataServiceException, DatabaseNotFoundException,
InterruptedException { InterruptedException {
...@@ -136,15 +291,14 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -136,15 +291,14 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
Thread.sleep(1000) /* wait for test container some more */; Thread.sleep(1000) /* wait for test container some more */;
/* mock */ /* mock */
when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, QUERY_1_ID)) when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, queryId))
.thenReturn(List.of(IDENTIFIER_2_BRIEF_DTO)); .thenReturn(List.of(IDENTIFIER_2_BRIEF_DTO));
when(metadataServiceGateway.getUserById(USER_1_ID)) when(metadataServiceGateway.getUserById(USER_1_ID))
.thenReturn(USER_1_DTO); .thenReturn(USER_1_DTO);
MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, USER_1_ID);
/* test */ /* test */
final QueryDto response = queryService.findById(DATABASE_1_PRIVILEGED_DTO, queryId); final QueryDto response = subsetService.findById(DATABASE_1_PRIVILEGED_DTO, queryId);
assertEquals(QUERY_1_ID, response.getId()); assertEquals(queryId, response.getId());
} }
protected List<QueryDto> findAll_generic(Boolean filterPersisted) throws SQLException, QueryNotFoundException, protected List<QueryDto> findAll_generic(Boolean filterPersisted) throws SQLException, QueryNotFoundException,
...@@ -161,10 +315,10 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -161,10 +315,10 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
.thenReturn(List.of(IDENTIFIER_2_BRIEF_DTO, IDENTIFIER_5_BRIEF_DTO)); .thenReturn(List.of(IDENTIFIER_2_BRIEF_DTO, IDENTIFIER_5_BRIEF_DTO));
/* test */ /* test */
return queryService.findAll(DATABASE_1_PRIVILEGED_DTO, filterPersisted); return subsetService.findAll(DATABASE_1_PRIVILEGED_DTO, filterPersisted);
} }
protected void persist_generic(Long queryId, List<IdentifierBriefDto> identifiers, Boolean persist) protected void persist_generic(UUID queryId, List<IdentifierBriefDto> identifiers, Boolean persist)
throws RemoteUnavailableException, SQLException, QueryStorePersistException, MetadataServiceException, throws RemoteUnavailableException, SQLException, QueryStorePersistException, MetadataServiceException,
DatabaseNotFoundException, InterruptedException { DatabaseNotFoundException, InterruptedException {
...@@ -174,11 +328,9 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { ...@@ -174,11 +328,9 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
/* mock */ /* mock */
when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, queryId)) when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, queryId))
.thenReturn(identifiers); .thenReturn(identifiers);
MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, USER_1_ID);
MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_2_DTO, USER_1_ID);
/* test */ /* test */
queryService.persist(DATABASE_1_PRIVILEGED_DTO, queryId, persist); subsetService.persist(DATABASE_1_PRIVILEGED_DTO, queryId, persist);
} }
} }
...@@ -79,8 +79,8 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -79,8 +79,8 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME);
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_3_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_3_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_3_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_3_PRIVILEGED_DTO);
/* s3 */ /* s3 */
if (s3Client.listBuckets().buckets().stream().noneMatch(b -> b.name().equals(s3Config.getS3Bucket()))) { if (s3Client.listBuckets().buckets().stream().noneMatch(b -> b.name().equals(s3Config.getS3Bucket()))) {
s3Client.createBucket(CreateBucketRequest.builder() s3Client.createBucket(CreateBucketRequest.builder()
...@@ -110,7 +110,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -110,7 +110,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.updateTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.updateTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 1", Set.of("id", "date", "location", "mintemp", "rainfall")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 1", Set.of("id", "date", "location", "mintemp", "rainfall"));
assertEquals("1", result.get(0).get("id")); assertEquals("1", result.get(0).get("id"));
assertEquals("2023-10-03", result.get(0).get("date")); // <<< assertEquals("2023-10-03", result.get(0).get("date")); // <<<
...@@ -137,7 +137,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -137,7 +137,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.updateTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.updateTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 4", Set.of("id", "date", "location", "mintemp", "rainfall")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 4", Set.of("id", "date", "location", "mintemp", "rainfall"));
assertEquals("4", result.get(0).get("id")); assertEquals("4", result.get(0).get("id"));
assertEquals("2023-10-03", result.get(0).get("date")); // <<< assertEquals("2023-10-03", result.get(0).get("date")); // <<<
...@@ -163,7 +163,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -163,7 +163,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.updateTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.updateTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 1", Set.of("id", "date", "location", "mintemp", "rainfall")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 1", Set.of("id", "date", "location", "mintemp", "rainfall"));
assertEquals("1", result.get(0).get("id")); assertEquals("1", result.get(0).get("id"));
assertEquals("2023-10-03", result.get(0).get("date")); // <<< assertEquals("2023-10-03", result.get(0).get("date")); // <<<
...@@ -189,7 +189,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -189,7 +189,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.updateTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.updateTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 1", Set.of("id", "date", "location", "mintemp", "rainfall")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 1", Set.of("id", "date", "location", "mintemp", "rainfall"));
assertEquals("1", result.get(0).get("id")); assertEquals("1", result.get(0).get("id"));
assertEquals("2023-10-03", result.get(0).get("date")); // <<< assertEquals("2023-10-03", result.get(0).get("date")); // <<<
...@@ -213,7 +213,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -213,7 +213,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.createTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.createTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 4", Set.of("id", "date", "location", "mintemp", "rainfall")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 4", Set.of("id", "date", "location", "mintemp", "rainfall"));
assertEquals("4", result.get(0).get("id")); assertEquals("4", result.get(0).get("id"));
assertEquals("2023-10-03", result.get(0).get("date")); assertEquals("2023-10-03", result.get(0).get("date"));
...@@ -240,7 +240,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -240,7 +240,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(), RequestBody.fromFile(new File("src/test/resources/csv/keyboard.csv"))); .build(), RequestBody.fromFile(new File("src/test/resources/csv/keyboard.csv")));
/* test */ /* test */
tableService.createTuple(TABLE_8_PRIVILEGED_DTO, request); tableService.createTuple(DATABASE_3_PRIVILEGED_DTO, TABLE_8_DTO, request);
final List<Map<String, byte[]>> result = MariaDbConfig.selectQueryByteArr(DATABASE_3_PRIVILEGED_DTO, "SELECT raw FROM mfcc WHERE raw IS NOT NULL", Set.of("raw")); final List<Map<String, byte[]>> result = MariaDbConfig.selectQueryByteArr(DATABASE_3_PRIVILEGED_DTO, "SELECT raw FROM mfcc WHERE raw IS NOT NULL", Set.of("raw"));
assertNotNull(result.get(0).get("raw")); assertNotNull(result.get(0).get("raw"));
assertArrayEquals(Files.toByteArray(new File("src/test/resources/csv/keyboard.csv")), result.get(0).get("raw")); assertArrayEquals(Files.toByteArray(new File("src/test/resources/csv/keyboard.csv")), result.get(0).get("raw"));
...@@ -261,7 +261,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -261,7 +261,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.createTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.createTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 4", Set.of("id", "date", "location", "mintemp", "rainfall")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id, `date`, location, mintemp, rainfall FROM weather_aus WHERE id = 4", Set.of("id", "date", "location", "mintemp", "rainfall"));
assertEquals("4", result.get(0).get("id")); assertEquals("4", result.get(0).get("id"));
assertEquals("2023-10-03", result.get(0).get("date")); assertEquals("2023-10-03", result.get(0).get("date"));
...@@ -280,7 +280,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -280,7 +280,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.deleteTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.deleteTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id FROM weather_aus WHERE id = 1", Set.of("id")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id FROM weather_aus WHERE id = 1", Set.of("id"));
assertEquals(0, result.size()); assertEquals(0, result.size());
} }
...@@ -297,7 +297,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -297,7 +297,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(); .build();
/* test */ /* test */
tableService.deleteTuple(TABLE_1_PRIVILEGED_DTO, request); tableService.deleteTuple(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id FROM weather_aus WHERE id = 1", Set.of("id")); final List<Map<String, String>> result = MariaDbConfig.selectQuery(DATABASE_1_PRIVILEGED_DTO, "SELECT id FROM weather_aus WHERE id = 1", Set.of("id"));
assertEquals(0, result.size()); assertEquals(0, result.size());
} }
...@@ -307,7 +307,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -307,7 +307,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
public void getStatistics_succeeds() throws TableMalformedException, SQLException, TableNotFoundException { public void getStatistics_succeeds() throws TableMalformedException, SQLException, TableNotFoundException {
/* test */ /* test */
final TableStatisticDto response = tableService.getStatistics(TABLE_2_PRIVILEGED_DTO); final TableStatisticDto response = tableService.getStatistics(DATABASE_1_PRIVILEGED_DTO, TABLE_2_DTO);
assertEquals(TABLE_2_COLUMNS.size(), response.getColumns().size()); assertEquals(TABLE_2_COLUMNS.size(), response.getColumns().size());
log.trace("response rows: {}", response.getRows()); log.trace("response rows: {}", response.getRows());
assertEquals(3L, response.getRows()); assertEquals(3L, response.getRows());
...@@ -336,7 +336,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -336,7 +336,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
public void delete_succeeds() throws SQLException, QueryMalformedException { public void delete_succeeds() throws SQLException, QueryMalformedException {
/* test */ /* test */
tableService.delete(TABLE_1_PRIVILEGED_DTO); tableService.delete(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO);
} }
@Test @Test
...@@ -347,7 +347,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -347,7 +347,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
assertThrows(QueryMalformedException.class, () -> { assertThrows(QueryMalformedException.class, () -> {
tableService.delete(TABLE_5_PRIVILEGED_DTO); tableService.delete(DATABASE_2_PRIVILEGED_DTO, TABLE_5_DTO);
}); });
} }
...@@ -355,7 +355,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -355,7 +355,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
public void getCount_succeeds() throws SQLException, QueryMalformedException { public void getCount_succeeds() throws SQLException, QueryMalformedException {
/* test */ /* test */
final Long response = tableService.getCount(TABLE_1_PRIVILEGED_DTO, null); final Long response = tableService.getCount(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, null);
assertEquals(3, response); assertEquals(3, response);
} }
...@@ -363,7 +363,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -363,7 +363,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
public void getCount_timestamp_succeeds() throws SQLException, QueryMalformedException { public void getCount_timestamp_succeeds() throws SQLException, QueryMalformedException {
/* test */ /* test */
final Long response = tableService.getCount(TABLE_1_PRIVILEGED_DTO, Instant.ofEpochSecond(0)); final Long response = tableService.getCount(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, Instant.ofEpochSecond(0));
assertEquals(0, response); assertEquals(0, response);
} }
...@@ -375,7 +375,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -375,7 +375,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
assertThrows(QueryMalformedException.class, () -> { assertThrows(QueryMalformedException.class, () -> {
tableService.getCount(TABLE_5_PRIVILEGED_DTO, null); tableService.getCount(DATABASE_2_PRIVILEGED_DTO, TABLE_5_DTO, null);
}); });
} }
...@@ -383,11 +383,11 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -383,11 +383,11 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
public void history_succeeds() throws SQLException, TableNotFoundException { public void history_succeeds() throws SQLException, TableNotFoundException {
/* test */ /* test */
final List<TableHistoryDto> response = tableService.history(TABLE_1_PRIVILEGED_DTO, 1000L); final List<TableHistoryDto> response = tableService.history(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, 1000L);
assertEquals(1, response.size()); assertEquals(1, response.size());
final TableHistoryDto history0 = response.get(0); final TableHistoryDto history0 = response.get(0);
assertNotNull(history0.getTimestamp()); assertNotNull(history0.getTimestamp());
assertEquals("INSERT", history0.getEvent()); assertEquals(HistoryEventTypeDto.INSERT, history0.getEvent());
assertEquals(3, history0.getTotal()); assertEquals(3, history0.getTotal());
} }
...@@ -399,7 +399,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -399,7 +399,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
assertThrows(TableNotFoundException.class, () -> { assertThrows(TableNotFoundException.class, () -> {
tableService.history(TABLE_5_PRIVILEGED_DTO, null); tableService.history(DATABASE_2_PRIVILEGED_DTO, TABLE_5_DTO, null);
}); });
} }
...@@ -421,7 +421,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -421,7 +421,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
.build(), RequestBody.fromFile(new File("src/test/resources/csv/weather_aus.csv"))); .build(), RequestBody.fromFile(new File("src/test/resources/csv/weather_aus.csv")));
/* test */ /* test */
tableService.importDataset(TABLE_1_PRIVILEGED_DTO, request); tableService.importDataset(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
} }
@Test @Test
...@@ -442,7 +442,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -442,7 +442,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
assertThrows(TableMalformedException.class, () -> { assertThrows(TableMalformedException.class, () -> {
tableService.importDataset(TABLE_1_PRIVILEGED_DTO, request); tableService.importDataset(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
}); });
} }
...@@ -464,7 +464,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { ...@@ -464,7 +464,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
/* test */ /* test */
assertThrows(MalformedException.class, () -> { assertThrows(MalformedException.class, () -> {
tableService.importDataset(TABLE_1_PRIVILEGED_DTO, request); tableService.importDataset(DATABASE_1_PRIVILEGED_DTO, TABLE_1_DTO, request);
}); });
} }
......
...@@ -34,14 +34,14 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest { ...@@ -34,14 +34,14 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest {
genesis(); genesis();
/* metadata database */ /* metadata database */
MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
} }
@Test @Test
public void delete_succeeds() throws SQLException, ViewMalformedException { public void delete_succeeds() throws SQLException, ViewMalformedException {
/* test */ /* test */
viewService.delete(VIEW_1_PRIVILEGED_DTO); viewService.delete(DATABASE_1_PRIVILEGED_DTO, VIEW_1_DTO);
} }
} }
CREATE SEQUENCE `qs_queries_seq` NOCACHE; CREATE SEQUENCE `qs_queries_seq` NOCACHE;
CREATE TABLE `qs_queries` ( `id` bigint not null primary key default nextval(`qs_queries_seq`), `created` datetime not null default now(), `executed` datetime not null default now(), `created_by` varchar(36), `query` text not null, `query_normalized` text not null, `is_persisted` boolean not null, `query_hash` varchar(255) not null, `result_hash` varchar(255), `result_number` bigint ) WITH SYSTEM VERSIONING; CREATE TABLE `qs_queries` ( `id` varchar(36) not null primary key default uuid(), `created` datetime not null default now(), `executed` datetime not null default now(), `created_by` varchar(36), `query` text not null, `query_normalized` text not null, `is_persisted` boolean not null, `query_hash` varchar(255) not null, `result_hash` varchar(255), `result_number` bigint ) WITH SYSTEM VERSIONING;
CREATE PROCEDURE hash_table(IN name VARCHAR(255), OUT hash VARCHAR(255), OUT count BIGINT) BEGIN DECLARE _sql TEXT; SELECT CONCAT('SELECT SHA2(GROUP_CONCAT(CONCAT_WS(\'\',', GROUP_CONCAT(CONCAT('`', column_name, '`') ORDER BY column_name), ') SEPARATOR \',\'), 256) AS hash, COUNT(*) AS count FROM `', name, '` INTO @hash, @count;') FROM `information_schema`.`columns` WHERE `table_schema` = DATABASE() AND `table_name` = name INTO _sql; PREPARE stmt FROM _sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET hash = @hash; SET count = @count; END; CREATE PROCEDURE hash_table(IN name VARCHAR(255), OUT hash VARCHAR(255), OUT count BIGINT) BEGIN DECLARE _sql TEXT; SELECT CONCAT('SELECT SHA2(GROUP_CONCAT(CONCAT_WS(\'\',', GROUP_CONCAT(CONCAT('`', column_name, '`') ORDER BY column_name), ') SEPARATOR \',\'), 256) AS hash, COUNT(*) AS count FROM `', name, '` INTO @hash, @count;') FROM `information_schema`.`columns` WHERE `table_schema` = DATABASE() AND `table_name` = name INTO _sql; PREPARE stmt FROM _sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET hash = @hash; SET count = @count; END;
CREATE PROCEDURE store_query(IN query TEXT, IN executed DATETIME, OUT queryId BIGINT) BEGIN DECLARE _queryhash varchar(255) DEFAULT SHA2(query, 256); DECLARE _username varchar(255) DEFAULT REGEXP_REPLACE(current_user(), '@.*', ''); DECLARE _query TEXT DEFAULT CONCAT('CREATE OR REPLACE TABLE _tmp AS (', query, ')'); PREPARE stmt FROM _query; EXECUTE stmt; DEALLOCATE PREPARE stmt; CALL hash_table('_tmp', @hash, @count); DROP TABLE IF EXISTS `_tmp`; IF @hash IS NULL THEN INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); ELSE INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); END IF; END; CREATE PROCEDURE store_query(IN query TEXT, IN executed DATETIME, OUT queryId varchar(36)) BEGIN DECLARE _queryhash varchar(255) DEFAULT SHA2(query, 256); DECLARE _username varchar(255) DEFAULT REGEXP_REPLACE(current_user(), '@.*', ''); DECLARE _query TEXT DEFAULT CONCAT('CREATE OR REPLACE TABLE _tmp AS (', query, ')'); PREPARE stmt FROM _query; EXECUTE stmt; DEALLOCATE PREPARE stmt; CALL hash_table('_tmp', @hash, @count); DROP TABLE IF EXISTS `_tmp`; IF @hash IS NULL THEN INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); ELSE INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); END IF; END;
CREATE DEFINER = 'root' PROCEDURE _store_query(IN _username VARCHAR(255), IN query TEXT, IN executed DATETIME, OUT queryId BIGINT) BEGIN DECLARE _queryhash varchar(255) DEFAULT SHA2(query, 256); DECLARE _query TEXT DEFAULT CONCAT('CREATE OR REPLACE TABLE _tmp AS (', query, ')'); PREPARE stmt FROM _query; EXECUTE stmt; DEALLOCATE PREPARE stmt; CALL hash_table('_tmp', @hash, @count); DROP TABLE IF EXISTS `_tmp`; IF @hash IS NULL THEN INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); ELSE INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); END IF; END; CREATE DEFINER = 'root' PROCEDURE _store_query(IN _username VARCHAR(255), IN query TEXT, IN executed DATETIME, OUT queryId varchar(36)) BEGIN DECLARE _queryhash varchar(255) DEFAULT SHA2(query, 256); DECLARE _query TEXT DEFAULT CONCAT('CREATE OR REPLACE TABLE _tmp AS (', query, ')'); PREPARE stmt FROM _query; EXECUTE stmt; DEALLOCATE PREPARE stmt; CALL hash_table('_tmp', @hash, @count); DROP TABLE IF EXISTS `_tmp`; IF @hash IS NULL THEN INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` IS NULL); ELSE INSERT INTO `qs_queries` (`created_by`, `query`, `query_normalized`, `is_persisted`, `query_hash`, `result_hash`, `result_number`, `executed`) SELECT _username, query, query, false, _queryhash, @hash, @count, executed WHERE NOT EXISTS (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); SET queryId = (SELECT `id` FROM `qs_queries` WHERE `query_hash` = _queryhash AND `result_hash` = @hash); END IF; END;
\ No newline at end of file \ No newline at end of file
...@@ -6,18 +6,18 @@ ...@@ -6,18 +6,18 @@
<parent> <parent>
<groupId>at.tuwien</groupId> <groupId>at.tuwien</groupId>
<artifactId>dbrepo-data-service</artifactId> <artifactId>dbrepo-data-service</artifactId>
<version>1.6.5</version> <version>1.7.0</version>
</parent> </parent>
<artifactId>services</artifactId> <artifactId>services</artifactId>
<name>dbrepo-data-service-services</name> <name>dbrepo-data-service-services</name>
<version>1.6.5</version> <version>1.7.0</version>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>at.tuwien</groupId> <groupId>at.tuwien</groupId>
<artifactId>dbrepo-data-service-querystore</artifactId> <artifactId>dbrepo-data-service-querystore</artifactId>
<version>1.6.5</version> <version>1.7.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
...@@ -13,6 +13,7 @@ import jakarta.servlet.http.HttpServletRequest; ...@@ -13,6 +13,7 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
...@@ -52,13 +53,13 @@ public class AuthTokenFilter extends OncePerRequestFilter { ...@@ -52,13 +53,13 @@ public class AuthTokenFilter extends OncePerRequestFilter {
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
} }
public UserDetails verifyJwt(String token) throws ServletException { public UserDetails verifyJwt(String token) throws BadCredentialsException {
final KeyFactory kf; final KeyFactory kf;
try { try {
kf = KeyFactory.getInstance("RSA"); kf = KeyFactory.getInstance("RSA");
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
log.error("Failed to find RSA algorithm"); log.error("Failed to find RSA algorithm");
throw new ServletException("Failed to find RSA algorithm", e); throw new BadCredentialsException("Failed to find RSA algorithm", e);
} }
final X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)); final X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
final RSAPublicKey pubKey; final RSAPublicKey pubKey;
...@@ -66,7 +67,7 @@ public class AuthTokenFilter extends OncePerRequestFilter { ...@@ -66,7 +67,7 @@ public class AuthTokenFilter extends OncePerRequestFilter {
pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509); pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
} catch (InvalidKeySpecException e) { } catch (InvalidKeySpecException e) {
log.error("Provided public key is invalid"); log.error("Provided public key is invalid");
throw new ServletException("Provided public key is invalid", e); throw new BadCredentialsException("Provided public key is invalid", e);
} }
final Algorithm algorithm = Algorithm.RSA256(pubKey, null); final Algorithm algorithm = Algorithm.RSA256(pubKey, null);
final Verification verification = JWT.require(algorithm); final Verification verification = JWT.require(algorithm);
......
package at.tuwien.auth; package at.tuwien.auth;
import at.tuwien.api.keycloak.TokenDto; import at.tuwien.api.keycloak.TokenDto;
import at.tuwien.exception.*;
import at.tuwien.gateway.KeycloakGateway; import at.tuwien.gateway.KeycloakGateway;
import jakarta.servlet.ServletException;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
...@@ -29,13 +26,8 @@ public class BasicAuthenticationProvider implements AuthenticationManager { ...@@ -29,13 +26,8 @@ public class BasicAuthenticationProvider implements AuthenticationManager {
@Override @Override
public Authentication authenticate(Authentication auth) throws AuthenticationException { public Authentication authenticate(Authentication auth) throws AuthenticationException {
try {
final TokenDto tokenDto = keycloakGateway.obtainUserToken(auth.getName(), auth.getCredentials().toString()); final TokenDto tokenDto = keycloakGateway.obtainUserToken(auth.getName(), auth.getCredentials().toString());
final UserDetails userDetails = authTokenFilter.verifyJwt(tokenDto.getAccessToken()); final UserDetails userDetails = authTokenFilter.verifyJwt(tokenDto.getAccessToken());
return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
} catch (ServletException | CredentialsInvalidException | AccountNotSetupException |
AuthServiceConnectionException e) {
throw new BadCredentialsException("Failed to authenticate with authentication service", e);
}
} }
} }
...@@ -2,7 +2,6 @@ package at.tuwien.auth; ...@@ -2,7 +2,6 @@ package at.tuwien.auth;
import at.tuwien.api.keycloak.TokenDto; import at.tuwien.api.keycloak.TokenDto;
import at.tuwien.config.GatewayConfig; import at.tuwien.config.GatewayConfig;
import at.tuwien.exception.*;
import at.tuwien.gateway.KeycloakGateway; import at.tuwien.gateway.KeycloakGateway;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
...@@ -31,15 +30,10 @@ public class InternalRequestInterceptor implements ClientHttpRequestInterceptor ...@@ -31,15 +30,10 @@ public class InternalRequestInterceptor implements ClientHttpRequestInterceptor
throws IOException { throws IOException {
final HttpHeaders headers = request.getHeaders(); final HttpHeaders headers = request.getHeaders();
headers.setAccept(List.of(MediaType.APPLICATION_JSON)); headers.setAccept(List.of(MediaType.APPLICATION_JSON));
try {
final TokenDto token = keycloakGateway.obtainUserToken(gatewayConfig.getSystemUsername(), final TokenDto token = keycloakGateway.obtainUserToken(gatewayConfig.getSystemUsername(),
gatewayConfig.getSystemPassword()); gatewayConfig.getSystemPassword());
headers.setBearerAuth(token.getAccessToken()); headers.setBearerAuth(token.getAccessToken());
log.trace("set bearer token for internal user: {}", gatewayConfig.getSystemUsername()); log.trace("set bearer token for internal user: {}", gatewayConfig.getSystemUsername());
} catch (AuthServiceConnectionException | CredentialsInvalidException | AccountNotSetupException e) {
log.error("Failed to obtain token for internal user: {}", gatewayConfig.getSystemUsername());
throw new IOException("Failed to obtain token for internal user", e);
}
return execution.execute(request, body); return execution.execute(request, body);
} }
} }
...@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; ...@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
public class CacheConfig { public class CacheConfig {
@Value("${dbrepo.credentialCacheTimeout}") @Value("${dbrepo.credentialCacheTimeout}")
private Long credentialCacheTimeout; private Integer credentialCacheTimeout;
@Bean @Bean
public Cache<UUID, UserDto> userCache() { public Cache<UUID, UserDto> userCache() {
...@@ -27,28 +27,28 @@ public class CacheConfig { ...@@ -27,28 +27,28 @@ public class CacheConfig {
} }
@Bean @Bean
public Cache<Long, ViewDto> viewCache() { public Cache<UUID, ViewDto> viewCache() {
return new ExpiryCache<Long, ViewDto>().build(); return new ExpiryCache<UUID, ViewDto>().build();
} }
@Bean @Bean
public Cache<Long, DatabaseAccessDto> accessCache() { public Cache<UUID, DatabaseAccessDto> accessCache() {
return new ExpiryCache<Long, DatabaseAccessDto>().build(); return new ExpiryCache<UUID, DatabaseAccessDto>().build();
} }
@Bean @Bean
public Cache<Long, TableDto> tableCache() { public Cache<UUID, TableDto> tableCache() {
return new ExpiryCache<Long, TableDto>().build(); return new ExpiryCache<UUID, TableDto>().build();
} }
@Bean @Bean
public Cache<Long, DatabaseDto> databaseCache() { public Cache<UUID, DatabaseDto> databaseCache() {
return new ExpiryCache<Long, DatabaseDto>().build(); return new ExpiryCache<UUID, DatabaseDto>().build();
} }
@Bean @Bean
public Cache<Long, ContainerDto> containerCache() { public Cache<UUID, ContainerDto> containerCache() {
return new ExpiryCache<Long, ContainerDto>().build(); return new ExpiryCache<UUID, ContainerDto>().build();
} }
class ExpiryCache<K, T> { class ExpiryCache<K, T> {
......
...@@ -5,6 +5,7 @@ import at.tuwien.gateway.KeycloakGateway; ...@@ -5,6 +5,7 @@ import at.tuwien.gateway.KeycloakGateway;
import lombok.Getter; import lombok.Getter;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
......
package at.tuwien.config; package at.tuwien.config;
import lombok.Getter; import lombok.Getter;
import org.keycloak.admin.client.Keycloak;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Getter @Getter
@Configuration @Configuration
...@@ -22,4 +25,11 @@ public class KeycloakConfig { ...@@ -22,4 +25,11 @@ public class KeycloakConfig {
@Value("${dbrepo.keycloak.clientSecret}") @Value("${dbrepo.keycloak.clientSecret}")
private String keycloakClientSecret; private String keycloakClientSecret;
private final String realm = "dbrepo";
@Bean
public Keycloak keycloak() {
return Keycloak.getInstance(keycloakEndpoint, "master", keycloakUsername, keycloakPassword, "admin-cli");
}
} }