From b90dcd354dd62c3f9f088c74110d43b8ad3b8d81 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 14 Nov 2024 14:01:59 +0100
Subject: [PATCH] OZG-7062 Tests auf Keycloak Testcontainer umgestellt

---
 user-manager-server/pom.xml                   | 64 +++++++++----------
 .../user/keycloak/KeycloakTestProfile.java    | 28 +++-----
 .../KeycloakUserRemoteServiceITCase.java      | 48 +++++++++-----
 .../test/resources/keycloak/realm-export.json | 21 +++++-
 4 files changed, 91 insertions(+), 70 deletions(-)

diff --git a/user-manager-server/pom.xml b/user-manager-server/pom.xml
index 938455fd..4390f334 100644
--- a/user-manager-server/pom.xml
+++ b/user-manager-server/pom.xml
@@ -1,30 +1,29 @@
 <?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.
-
--->
-<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">
+  ~ 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">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
@@ -41,11 +40,11 @@
 	</properties>
 
 	<dependencies>
-			<dependency>
-            <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-admin-client</artifactId>
-            <version>24.0.5</version> 
-        </dependency>
+		<dependency>
+			<groupId>org.keycloak</groupId>
+			<artifactId>keycloak-admin-client</artifactId>
+			<version>24.0.5</version>
+		</dependency>
 		<dependency>
 			<groupId>de.ozgcloud.user</groupId>
 			<artifactId>user-manager-interface</artifactId>
@@ -242,7 +241,7 @@
 		<dependency>
 			<groupId>com.github.dasniko</groupId>
 			<artifactId>testcontainers-keycloak</artifactId>
-			<version>3.5.1</version>
+			<version>3.1.0</version>
 		</dependency>
 	</dependencies>
 
@@ -325,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>
diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakTestProfile.java b/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakTestProfile.java
index 27e2596e..e1b8eac4 100644
--- a/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakTestProfile.java
+++ b/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakTestProfile.java
@@ -1,5 +1,5 @@
 /*
- * 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
@@ -30,32 +30,22 @@ 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 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 = "localhost:9999";
-
 	private final KeycloakContainer keycloak;
 
 	public KeycloakTestProfile() {
 		keycloak = new KeycloakContainer("quay.io/keycloak/keycloak:24.0.5")
-				.withRealmImportFile("keycloak/realm-export.json")
-				.withVerboseOutput();
+		  .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, "administrationApiUser",
-				passwordKey, "administrationApiUser",
-				realmKey, realmValue,
-				urlKey, keycloak.getAuthServerUrl());
+		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
diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakUserRemoteServiceITCase.java b/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakUserRemoteServiceITCase.java
index 0a38413d..50423d6b 100644
--- a/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakUserRemoteServiceITCase.java
+++ b/user-manager-server/src/test/java/de/ozgcloud/user/keycloak/KeycloakUserRemoteServiceITCase.java
@@ -32,15 +32,14 @@ import java.util.List;
 import jakarta.inject.Inject;
 
 import org.bson.types.ObjectId;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
 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.keycloak.admin.client.Keycloak;
+import org.junit.jupiter.api.TestMethodOrder;
 import org.keycloak.admin.client.resource.RealmResource;
 
-import dasniko.testcontainers.keycloak.KeycloakContainer;
 import de.ozgcloud.user.User;
 import de.ozgcloud.user.UserTestFactory;
 import io.quarkus.test.junit.QuarkusTest;
@@ -66,13 +65,15 @@ class KeycloakUserRemoteServiceITCase {
 	}
 
 	@Nested
+	@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 	class TestUpdateOzgCloudUserId {
 
 		private static final String KEYCLOAK_USER_ID = "90748555-7894-4854-8292-1f6106826962";
 
-		@DisplayName("Update ozgCloudUserId attribute in keycloak")
+		@DisplayName("Set ozgCloudUserId attribute in keycloak on new user")
 		@Test
-		void shouldUpdateOzgCloudUserId() {
+		@Order(1)
+		void shouldSetOzgCloudUserId() {
 			User user = prepareUser();
 			service.updateOzgCloudUserId(user);
 
@@ -81,19 +82,32 @@ class KeycloakUserRemoteServiceITCase {
 			assertThat(user.getId().toString()).isEqualTo(ozgCloudUserId);
 		}
 
+		@DisplayName("Update ozgCloudUserId attribute in keycloak on new user")
+		@Test
+		@Order(2)
+		void shouldUpdateOzgCloudUserId() {
+			User user = prepareUser();
+			var oldCloudUserId = getOzgCloudUserIdFromKeycloak();
+			service.updateOzgCloudUserId(user);
+
+			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("testerozg+dorothea@gmail.com")
-					.firstName("Dorothea")
-					.lastName("Doe")
-					.fullName("Dorothea Doe")
-					.fullNameReversed("Doe Dorothea")
-					.username("dorothea")
-					.organisationsEinheitIds(List.of("248240886", "9030229", "10363455"))
-					.build();
+			  .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() {
diff --git a/user-manager-server/src/test/resources/keycloak/realm-export.json b/user-manager-server/src/test/resources/keycloak/realm-export.json
index 9f3c4805..57020609 100755
--- a/user-manager-server/src/test/resources/keycloak/realm-export.json
+++ b/user-manager-server/src/test/resources/keycloak/realm-export.json
@@ -2615,9 +2615,26 @@
           "value": "administrationApiUser"
         }
       ],
-      "clientRoles" : {
-        "realm-management" : [ "view-users", "manage-users" ]
+      "clientRoles": {
+        "realm-management": [
+          "view-users",
+          "manage-users"
+        ]
       }
+    },
+    {
+      "id": "90748555-7894-4854-8292-1f6106826962",
+      "username": "dorothea",
+      "firstName": "Dorothea",
+      "lastName": "Doe",
+      "email": "dorothea@test.local",
+      "enabled": true,
+      "credentials": [
+        {
+          "type": "password",
+          "value": "localTestUser"
+        }
+      ]
     }
   ]
 }
\ No newline at end of file
-- 
GitLab