Skip to content
Snippets Groups Projects
Commit b4df20c0 authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-7062-test-quarkus-update-test-containers' (#137) from...

Merge pull request 'OZG-7062-test-quarkus-update-test-containers' (#137) from OZG-7062-test-quarkus-update-test-containers into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/user-manager/pulls/137


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents fb5d0c65 2e09cc06
Branches
Tags
No related merge requests found
Showing
with 2909 additions and 86 deletions
<?xml version="1.0"?>
<!--
Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
Ministerpräsidenten des Landes Schleswig-Holstein
Staatskanzlei
Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
Lizenziert unter der EUPL, Version 1.2 oder - sobald
diese von der Europäischen Kommission genehmigt wurden -
Folgeversionen der EUPL ("Lizenz");
Sie dürfen dieses Werk ausschließlich gemäß
dieser Lizenz nutzen.
Eine Kopie der Lizenz finden Sie hier:
https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
Sofern nicht durch anwendbare Rechtsvorschriften
gefordert oder in schriftlicher Form vereinbart, wird
die unter der Lizenz verbreitete Software "so wie sie
ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
ausdrücklich oder stillschweigend - verbreitet.
Die sprachspezifischen Genehmigungen und Beschränkungen
unter der Lizenz sind dem Lizenztext zu entnehmen.
~ Copyright (c) 2022-2024. Das Land Schleswig-Holstein vertreten durch den
~ Ministerpräsidenten des Landes Schleswig-Holstein
~ Staatskanzlei
~ Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
~
~ Lizenziert unter der EUPL, Version 1.2 oder - sobald
~ diese von der Europäischen Kommission genehmigt wurden -
~ Folgeversionen der EUPL ("Lizenz");
~ Sie dürfen dieses Werk ausschließlich gemäß
~ dieser Lizenz nutzen.
~ Eine Kopie der Lizenz finden Sie hier:
~
~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
~
~ Sofern nicht durch anwendbare Rechtsvorschriften
~ gefordert oder in schriftlicher Form vereinbart, wird
~ die unter der Lizenz verbreitete Software "so wie sie
~ ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
~ ausdrücklich oder stillschweigend - verbreitet.
~ Die sprachspezifischen Genehmigungen und Beschränkungen
~ unter der Lizenz sind dem Lizenztext zu entnehmen.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
......@@ -239,6 +238,11 @@
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.dasniko</groupId>
<artifactId>testcontainers-keycloak</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
......@@ -320,7 +324,8 @@
</goals>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner
</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
......
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2022-2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -31,10 +31,10 @@ import jakarta.enterprise.context.ApplicationScoped;
import org.apache.commons.lang3.StringUtils;
import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.user.common.errorhandling.FunctionalException;
import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException;
import de.ozgcloud.user.common.errorhandling.TechnicalException;
import de.ozgcloud.user.common.logging.OzgCloudLogging;
import de.ozgcloud.user.keycloak.KeycloakUserRemoteService;
import de.ozgcloud.user.settings.UserSettings;
import io.smallrye.mutiny.Uni;
......@@ -155,4 +155,5 @@ public class UserService {
}
return repository.findAllActiveByOrganisationsEinheitId(organisationsEinheitId);
}
}
\ No newline at end of file
/*
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.user.common.logging;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import jakarta.interceptor.InterceptorBinding;
@Target({ TYPE, METHOD })
@Retention(RUNTIME)
@Documented
@InterceptorBinding
public @interface OzgCloudLogging {
}
/*
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.user.common.logging;
import jakarta.annotation.Priority;
import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.Interceptor;
import jakarta.interceptor.InvocationContext;
import de.ozgcloud.common.logging.AspectLoggingUtils;
@OzgCloudLogging
@Priority(10)
@Interceptor
public class OzgCloudLoggingInterceptor {
@AroundInvoke
Object logging(InvocationContext context) throws Exception {
try {
AspectLoggingUtils.log(context);
var nextChainMethod = context.proceed();
AspectLoggingUtils.logReturnValue(context, nextChainMethod);
return nextChainMethod;
} catch (Exception e) {
AspectLoggingUtils.logException(context, e);
throw e;
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2022-2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -29,23 +29,24 @@ import java.util.function.Supplier;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.BadRequestException;
import jakarta.ws.rs.ClientErrorException;
import jakarta.ws.rs.NotFoundException;
import jakarta.ws.rs.ProcessingException;
import org.apache.commons.lang3.ObjectUtils;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.representations.idm.UserRepresentation;
import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.user.RemoteUserIterator;
import de.ozgcloud.user.User;
import de.ozgcloud.user.UserResourceMapper;
import de.ozgcloud.user.common.errorhandling.KeycloakUnavailableException;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.BadRequestException;
import jakarta.ws.rs.ClientErrorException;
import jakarta.ws.rs.NotFoundException;
import jakarta.ws.rs.ProcessingException;
import de.ozgcloud.user.common.logging.OzgCloudLogging;
import lombok.extern.log4j.Log4j2;
@ApplicationScoped
......@@ -113,4 +114,5 @@ class KeycloakApiService {
LOG.warn("Could not update user attribute {} in Keycloak.", attributeName, e);
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -26,16 +26,17 @@ package de.ozgcloud.user.keycloak;
import java.util.Optional;
import java.util.stream.Stream;
import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.user.User;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import de.ozgcloud.user.User;
import de.ozgcloud.user.common.logging.OzgCloudLogging;
@ApplicationScoped
@OzgCloudLogging
public class KeycloakUserRemoteService {
static final String ATTRIBUTE_NAME_OZG_CLOUD_USER_ID = "ozgCloudUserId";
public static final String ATTRIBUTE_NAME_OZG_CLOUD_USER_ID = "ozgCloudUserId";
@Inject
KeycloakApiService apiService;
......@@ -51,4 +52,5 @@ public class KeycloakUserRemoteService {
public Optional<User> findUserById(String id) {
return apiService.findUserById(id);
}
}
\ No newline at end of file
/*
* Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2023-2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -28,6 +28,9 @@ import java.util.Collection;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import de.ozgcloud.user.common.logging.OzgCloudLogging;
@OzgCloudLogging
@ApplicationScoped
class OrganisationsEinheitService {
......@@ -37,4 +40,5 @@ class OrganisationsEinheitService {
public Collection<String> findAllOrganisationsEinheitIds() {
return repository.findAllOrganisationsEinheitIds();
}
}
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2022-2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -30,7 +30,9 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import de.ozgcloud.user.UserService;
import de.ozgcloud.user.common.logging.OzgCloudLogging;
@OzgCloudLogging
@ApplicationScoped
class UserSettingsService {
......@@ -58,4 +60,5 @@ class UserSettingsService {
private UserSettings buildInitialUserSettings() {
return UserSettings.builder().notificationsSendFor(NotificationsSendFor.NONE).build();
}
}
/*
* Copyright (C) 2022-2023 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2022-2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -25,14 +25,15 @@ package de.ozgcloud.user.sync;
import java.util.function.Predicate;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.commons.collections4.CollectionUtils;
import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.user.User;
import de.ozgcloud.user.UserService;
import de.ozgcloud.user.common.logging.OzgCloudLogging;
import de.ozgcloud.user.keycloak.KeycloakUserRemoteService;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@ApplicationScoped
@OzgCloudLogging
......
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -25,27 +25,27 @@ package de.ozgcloud.user.keycloak;
import java.util.Map;
import dasniko.testcontainers.keycloak.KeycloakContainer;
import io.quarkus.test.junit.QuarkusTestProfile;
public class KeycloakTestProfile implements QuarkusTestProfile {
private final String userKey = "ozgcloud.keycloak.api.user";
private final String userValue = "userManagerApiUser";
private final KeycloakContainer keycloak;
private final String passwordKey = "ozgcloud.keycloak.api.password";
private final String passwordValue = "hlc_j1I1Ji0trC0";
private final String realmKey = "ozgcloud.keycloak.api.realm";
private final String realmValue = "by-kiel-dev";
private final String urlKey = "keycloak.url";
private final String urlValue = "https://sso.dev.by.ozg-cloud.de";
public KeycloakTestProfile() {
keycloak = new KeycloakContainer("quay.io/keycloak/keycloak:24.0.5")
.withEnv(Map.of("KEYCLOAK_ADMIN", "admin", "KEYCLOAK_ADMIN_PASSWORD", "admin"))
.withRealmImportFile("keycloak/realm-export.json");
keycloak.start();
}
@Override
public Map<String, String> getConfigOverrides() {
return Map.of(userKey, userValue,
passwordKey, passwordValue,
realmKey, realmValue,
urlKey, urlValue);
return Map.of(
"ozgcloud.keycloak.api.password", "administrationApiUser",
"ozgcloud.keycloak.api.user", "administrationApiUser",
"ozgcloud.keycloak.api.realm", "by-kiel-dev",
"keycloak.url", keycloak.getAuthServerUrl());
}
}
\ No newline at end of file
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
......@@ -23,21 +23,39 @@
*/
package de.ozgcloud.user.keycloak;
import static de.ozgcloud.user.keycloak.KeycloakUserRemoteService.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.util.List;
import jakarta.inject.Inject;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.keycloak.admin.client.resource.RealmResource;
import io.quarkus.test.InjectMock;
import de.ozgcloud.user.User;
import de.ozgcloud.user.UserTestFactory;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import io.quarkus.test.junit.mockito.InjectSpy;
@QuarkusTest
@TestProfile(KeycloakTestProfile.class)
class KeycloakUserRemoteServiceITCase {
@InjectSpy
KeycloakUserRemoteService service;
@InjectMock
@InjectSpy
KeycloakApiService apiService;
@Inject
RealmResource realmResource;
@Test
void shouldCallGetAllUsers() {
......@@ -45,4 +63,57 @@ class KeycloakUserRemoteServiceITCase {
verify(apiService).findAllUser();
}
@Nested
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class TestUpdateOzgCloudUserId {
private static final String KEYCLOAK_USER_ID = "90748555-7894-4854-8292-1f6106826962";
@DisplayName("Set ozgCloudUserId attribute in keycloak on new user")
@Test
@Order(1)
void shouldSetOzgCloudUserId() {
User user = prepareUser();
service.updateOzgCloudUserId(user);
var ozgCloudUserId = getOzgCloudUserIdFromKeycloak();
assertThat(user.getId().toString()).isEqualTo(ozgCloudUserId);
}
@DisplayName("Update ozgCloudUserId attribute in keycloak on existing user")
@Test
@Order(2)
void shouldUpdateOzgCloudUserId() {
var oldCloudUserId = getOzgCloudUserIdFromKeycloak();
service.updateOzgCloudUserId(prepareUser());
var newCloudUserId = getOzgCloudUserIdFromKeycloak();
assertThat(oldCloudUserId).isNotEqualTo(newCloudUserId);
}
private User prepareUser() {
return UserTestFactory.createBuilder()
.id(new ObjectId())
.externalId(KEYCLOAK_USER_ID)
.keycloakUserId(KEYCLOAK_USER_ID)
.email("dorothea@test.local")
.firstName("Dorothea")
.lastName("Doe")
.fullName("Dorothea Doe")
.fullNameReversed("Doe Dorothea")
.username("dorothea")
.organisationsEinheitIds(List.of("248240886", "9030229", "10363455"))
.build();
}
private String getOzgCloudUserIdFromKeycloak() {
var userResource = realmResource.users().get(KEYCLOAK_USER_ID);
return userResource.toRepresentation().getAttributes().get(ATTRIBUTE_NAME_OZG_CLOUD_USER_ID).getFirst();
}
}
}
\ No newline at end of file
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment