From 15a1223fcc379bac0e47a281630c40f8847582dd Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Mon, 18 Dec 2023 14:40:53 +0100
Subject: [PATCH] OZG-4453 move request handling to remote service

---
 .../OzgCloudElasticsearchRemoteService.java   | 63 ++++++++++++++---
 .../OzgCloudElasticsearchService.java         | 40 +++--------
 .../operator/user/PutRoleRequestData.java     | 23 +++++++
 .../operator/user/PutUserRequestData.java     | 15 ++++
 ...loudElasticsearchRemoteServiceITCase.java} |  2 +-
 .../OzgCloudElasticsearchServiceTest.java     | 68 +++++++++----------
 .../IndicesPrivilegesDataTestFactory.java     | 21 ++++++
 .../user/PutRoleRequestDataTestFactory.java   | 18 +++++
 .../user/PutUserRequestDataTestFactory.java   | 21 ++++++
 pom.xml                                       | 11 +++
 10 files changed, 207 insertions(+), 75 deletions(-)
 create mode 100644 ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java
 create mode 100644 ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java
 rename ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/{OzgCloudElasticsearchRemoteServiceTest.java => OzgCloudElasticsearchRemoteServiceITCase.java} (97%)
 create mode 100644 ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java
 create mode 100644 ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java
 create mode 100644 ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java

diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java
index 1868fbe..5dc245d 100644
--- a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java
+++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteService.java
@@ -10,8 +10,11 @@ import co.elastic.clients.elasticsearch._types.ElasticsearchException;
 import co.elastic.clients.elasticsearch.indices.ExistsRequest;
 import co.elastic.clients.elasticsearch.security.GetRoleRequest;
 import co.elastic.clients.elasticsearch.security.GetUserRequest;
+import co.elastic.clients.elasticsearch.security.IndicesPrivileges;
 import co.elastic.clients.elasticsearch.security.PutRoleRequest;
 import co.elastic.clients.elasticsearch.security.PutUserRequest;
+import de.ozgcloud.operator.user.PutRoleRequestData;
+import de.ozgcloud.operator.user.PutUserRequestData;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
@@ -25,7 +28,7 @@ class OzgCloudElasticsearchRemoteService {
 	public boolean existsIndex(String index) throws Exception {
 		try {
 			log.info("Exists index " + index + "...");
-			var exists = client.indices().exists(ExistsRequest.of(builder -> builder.index(index))).value();
+			var exists = client.indices().exists(createExistsRequestOf(index)).value();
 			log.info("Exists index: " + exists);
 			return exists;
 		} catch (ElasticsearchException | IOException e) {
@@ -34,6 +37,10 @@ class OzgCloudElasticsearchRemoteService {
 		}
 	}
 	
+	private ExistsRequest createExistsRequestOf(String index) {
+		return ExistsRequest.of(builder -> builder.index(index));
+	}
+	
 	public void createIndex(String indexName) throws Exception {
 		try {
 			log.info("Create index " + indexName + "...");
@@ -46,14 +53,18 @@ class OzgCloudElasticsearchRemoteService {
 	}
 	
 	public boolean existsSecurityRole(String roleName) throws Exception {
-		var role = client.security().getRole(GetRoleRequest.of(builder -> builder.name(roleName)));
+		var role = client.security().getRole(createGetRoleRequestOf(roleName));
 		return !role.result().isEmpty();                  
 	}
 	
-	public void createSecurityRole(PutRoleRequest request) throws Exception {
+	private GetRoleRequest createGetRoleRequestOf(String name) {
+		return GetRoleRequest.of(builder -> builder.name(name));
+	}
+	
+	public void createSecurityRole(PutRoleRequestData requestData) throws Exception {
 		try {
-			log.info("Create SecurityRole " + request.name() + "...");
-			client.security().putRole(request);
+			log.info("Create SecurityRole " + requestData.getName() + "...");
+			client.security().putRole(createPutRoleRequestOf(requestData));
 			log.info("Create SecurityRole successful.");
 		} catch(Exception e) {
 			log.log(Level.SEVERE, "Create SecurityRole failed." + e);
@@ -61,19 +72,53 @@ class OzgCloudElasticsearchRemoteService {
 		}
 	}
 	
+	PutRoleRequest createPutRoleRequestOf(PutRoleRequestData requestData) {
+		return PutRoleRequest.of(requestBuilder -> buildRequest(requestBuilder, requestData));
+	}
+	
+	private PutRoleRequest.Builder buildRequest(PutRoleRequest.Builder requestBuilder, PutRoleRequestData requestData) {
+		requestBuilder.name(requestData.getName());
+		requestBuilder.indices(builder -> buildIndicesPrivilegesRequest(builder, requestData));
+		
+		return requestBuilder;
+	}
+	
+	private IndicesPrivileges.Builder buildIndicesPrivilegesRequest(IndicesPrivileges.Builder builder, PutRoleRequestData requestData) {
+		builder.names(requestData.getIndivesPrivilegesData().getNames());
+		builder.privileges(requestData.getIndivesPrivilegesData().getPrivileges());
+		
+		return builder;
+	}
+		
 	public boolean existsSecurityUser(String userName) throws Exception {
-		var user = client.security().getUser(GetUserRequest.of(builder -> builder.username(userName)));
+		var user = client.security().getUser(createGetUserRequestOf(userName));
 		return !user.result().isEmpty();       
 	}
 	
-	public void createSecurityUser(PutUserRequest request) throws Exception {
+	private GetUserRequest createGetUserRequestOf(String userName) {
+		return GetUserRequest.of(builder -> builder.username(userName));
+	}
+	
+	public void createSecurityUser(PutUserRequestData requestData) throws Exception {
 		try {
-			log.info("Create SecurityUser " + request.username() + "...");
-			client.security().putUser(request);
+			log.info("Create SecurityUser " + requestData.getUsername() + "...");
+			client.security().putUser(createPutUserRequestOf(requestData));
 			log.info("Create SecurityUser successful.");
 		} catch(Exception e) {
 			log.log(Level.SEVERE, "Create SecurityUser failed." + e);
 			throw e;
 		}
 	}
+	
+	PutUserRequest createPutUserRequestOf(PutUserRequestData requestData) {
+		return PutUserRequest.of(requestBuilder -> buildPutUserRequest(requestBuilder, requestData));
+	}
+	
+	private PutUserRequest.Builder buildPutUserRequest(PutUserRequest.Builder builder, PutUserRequestData requestData) {
+		builder.username(requestData.getUsername());
+		builder.roles(requestData.getRoles());
+		builder.password(requestData.getPassword());
+		
+		return builder;
+	}
 }
\ No newline at end of file
diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java
index 8b4730d..06982f7 100644
--- a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java
+++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchService.java
@@ -2,9 +2,9 @@ package de.ozgcloud.operator.common.elasticsearch;
 
 import org.springframework.stereotype.Component;
 
-import co.elastic.clients.elasticsearch.security.IndicesPrivileges;
-import co.elastic.clients.elasticsearch.security.PutRoleRequest;
-import co.elastic.clients.elasticsearch.security.PutUserRequest;
+import de.ozgcloud.operator.user.PutRoleRequestData;
+import de.ozgcloud.operator.user.PutRoleRequestData.IndicesPrivilegesData;
+import de.ozgcloud.operator.user.PutUserRequestData;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
@@ -31,27 +31,17 @@ public class OzgCloudElasticsearchService {
 	public void checkSecurityRole(String namespace) throws Exception {
 		log.info("Check security role...");
 		if(!remoteService.existsSecurityRole(namespace)) {
-			remoteService.createSecurityRole(createPutRoleRequest(namespace));
+			remoteService.createSecurityRole(buildPutRoleRequestData(namespace));
 		}
 		log.info("Check security role successful.");
 	}
 	
-	PutRoleRequest createPutRoleRequest(String namespace) {
-		return PutRoleRequest.of(requestBuilder -> buildRequest(requestBuilder, namespace));
+	PutRoleRequestData buildPutRoleRequestData(String namespace){
+		return PutRoleRequestData.builder().name(namespace).indivesPrivilegesData(buildIndicesPrivilegesData(namespace)).build();
 	}
 	
-	private PutRoleRequest.Builder buildRequest(PutRoleRequest.Builder requestBuilder, String namespace) {
-		requestBuilder.name(namespace);
-		requestBuilder.indices(builder -> buildIndicesPrivilegesRequest(builder, namespace));
-		
-		return requestBuilder;
-	}
-	
-	private IndicesPrivileges.Builder buildIndicesPrivilegesRequest(IndicesPrivileges.Builder builder, String namespace) {
-		builder.names(namespace);
-		builder.privileges(PRIVILEGES_ALL);
-		
-		return builder;
+	private IndicesPrivilegesData buildIndicesPrivilegesData(String namespace) {
+		return IndicesPrivilegesData.builder().names(namespace).privileges(PRIVILEGES_ALL).build();
 	}
 	
 //	 curl -k -X POST -u elastic:$ELASTICSEARCH_PASSWORD -H 'Content-Type: application/json' 
@@ -59,20 +49,12 @@ public class OzgCloudElasticsearchService {
 	public void checkSecurityUser(String namespace, String password) throws Exception {
 		log.info("Check security user...");
 		if(!remoteService.existsSecurityUser(namespace)) {
-			remoteService.createSecurityUser(createPutUserRequest(namespace, password));
+			remoteService.createSecurityUser(buildPutUserRequestData(namespace, password));
 		}
 		log.info("Check security user successful.");
 	}
 	
-	PutUserRequest createPutUserRequest(String namespace, String password) {
-		return PutUserRequest.of(requestBuilder -> buildPutUserRequest(requestBuilder, namespace, password));
-	}
-	
-	private PutUserRequest.Builder buildPutUserRequest(PutUserRequest.Builder requestBuilder, String namespace, String password) {
-		requestBuilder.username(namespace);
-		requestBuilder.roles(namespace);
-		requestBuilder.password(password);
-		
-		return requestBuilder;
+	PutUserRequestData buildPutUserRequestData(String namespace, String password){
+		return PutUserRequestData.builder().username(namespace).roles(namespace).password(password).build();
 	}
 }
\ No newline at end of file
diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java
new file mode 100644
index 0000000..05dfbc6
--- /dev/null
+++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutRoleRequestData.java
@@ -0,0 +1,23 @@
+package de.ozgcloud.operator.user;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Builder
+@Getter
+@Setter
+public class PutRoleRequestData {
+	
+	private String name;
+	private IndicesPrivilegesData indivesPrivilegesData;
+	
+	@Builder
+	@Getter
+	@Setter
+	public static class IndicesPrivilegesData {
+		
+		private String names;
+		private String privileges;
+	}
+}
\ No newline at end of file
diff --git a/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java
new file mode 100644
index 0000000..73d60a6
--- /dev/null
+++ b/ozgcloud-elasticsearch-operator/src/main/java/de/ozgcloud/operator/user/PutUserRequestData.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.operator.user;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Builder
+@Getter
+@Setter
+public class PutUserRequestData {
+	
+	private String username;
+	private String roles;
+	private String password;
+}
diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceTest.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceITCase.java
similarity index 97%
rename from ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceTest.java
rename to ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceITCase.java
index 62c092c..7493298 100644
--- a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceTest.java
+++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchRemoteServiceITCase.java
@@ -17,7 +17,7 @@ import org.testcontainers.elasticsearch.ElasticsearchContainer;
 import de.ozgcloud.operator.common.kubernetes.KubernetesService;
 import lombok.SneakyThrows;
 
-class OzgCloudElasticsearchRemoteServiceTest {
+class OzgCloudElasticsearchRemoteServiceITCase {
 
 	@Spy
 	@InjectMocks
diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java
index f44a9ba..e3d6045 100644
--- a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java
+++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/common/elasticsearch/OzgCloudElasticsearchServiceTest.java
@@ -12,8 +12,10 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
-import co.elastic.clients.elasticsearch.security.PutRoleRequest;
-import co.elastic.clients.elasticsearch.security.PutUserRequest;
+import de.ozgcloud.operator.user.PutRoleRequestData;
+import de.ozgcloud.operator.user.PutRoleRequestDataTestFactory;
+import de.ozgcloud.operator.user.PutUserRequestData;
+import de.ozgcloud.operator.user.PutUserRequestDataTestFactory;
 import lombok.SneakyThrows;
 
 class OzgCloudElasticsearchServiceTest {
@@ -51,7 +53,7 @@ class OzgCloudElasticsearchServiceTest {
 	@Nested
 	class TestCheckSecurityRole {
 		
-		private final PutRoleRequest putRoleRequest = PutRoleRequest.of(b -> b.name("DummyName"));
+		private final PutRoleRequestData putRoleRequest = PutRoleRequestDataTestFactory.create();
 		
 		@SneakyThrows
 		@Test
@@ -60,52 +62,45 @@ class OzgCloudElasticsearchServiceTest {
 			
 			verify(remoteService).existsSecurityRole(NAMESPACE);
 		}
+		
 		@SneakyThrows
 		@Test
 		void shouldCreateSecurityRoleIfMissing() {
 			when(remoteService.existsSecurityRole(any())).thenReturn(false);
-			doReturn(putRoleRequest).when(service).createPutRoleRequest(any());
+			doReturn(putRoleRequest).when(service).buildPutRoleRequestData(any());
 			
 			service.checkSecurityRole(NAMESPACE);
 			
 			verify(remoteService).createSecurityRole(putRoleRequest);
 		}
 		
-		
-		@DisplayName("create put role request")
+		@DisplayName("create put role request data")
 		@Nested
-		class TestCreatePutRoleRequest {
+		class TestCreatePutRoleRequestData {
 			
 			@Test
 			void shouldContainName() {
-				var request = service.createPutRoleRequest(NAMESPACE);
+				var requestData = service.buildPutRoleRequestData(NAMESPACE);
 				
-				assertThat(request.name()).isEqualTo(NAMESPACE);
+				assertThat(requestData.getName()).isEqualTo(NAMESPACE);
 			}
 			
-			@DisplayName("indices")
+			@DisplayName("indices privileges data")
 			@Nested
-			class TestIndices {
-				
-				@Test
-				void shouldHaveSize() {
-					var request = service.createPutRoleRequest(NAMESPACE);
-					
-					assertThat(request.indices()).hasSize(1);
-				}
+			class TestIndicesPrivilegesData {
 				
 				@Test
 				void shouldContainName() {
-					var request = service.createPutRoleRequest(NAMESPACE);
+					var request = service.buildPutRoleRequestData(NAMESPACE);
 					
-					assertThat(request.indices().get(0).names()).containsExactly(NAMESPACE);					
+					assertThat(request.getIndivesPrivilegesData().getNames()).isEqualTo(NAMESPACE);					
 				}
 				
 				@Test
 				void shouldContainPrivileges() {
-					var request = service.createPutRoleRequest(NAMESPACE);
+					var request = service.buildPutRoleRequestData(NAMESPACE);
 					
-					assertThat(request.indices().get(0).privileges()).containsExactly(OzgCloudElasticsearchService.PRIVILEGES_ALL);					
+					assertThat(request.getIndivesPrivilegesData().getPrivileges()).isEqualTo(OzgCloudElasticsearchService.PRIVILEGES_ALL);					
 				}
 			}
 		}
@@ -116,7 +111,7 @@ class OzgCloudElasticsearchServiceTest {
 	class TestCheckSecurityUser {
 		
 		private final static String PASSWORD = "DummyPassword";
-		private final PutUserRequest putUserRequest = PutUserRequest.of(b -> b.username("DummyName"));
+		private final PutUserRequestData putUserRequestData = PutUserRequestDataTestFactory.create();
 		
 		@SneakyThrows
 		@Test
@@ -125,41 +120,42 @@ class OzgCloudElasticsearchServiceTest {
 			
 			verify(remoteService).existsSecurityUser(NAMESPACE);
 		}
+		
 		@SneakyThrows
 		@Test
 		void shouldCreateSecurityUserIfMissing() {
 			when(remoteService.existsSecurityUser(any())).thenReturn(false);
-			doReturn(putUserRequest).when(service).createPutUserRequest(any(), any());
+			doReturn(putUserRequestData).when(service).buildPutUserRequestData(any(), any());
 			
 			service.checkSecurityUser(NAMESPACE, PASSWORD);
 			
-			verify(remoteService).createSecurityUser(putUserRequest);
+			verify(remoteService).createSecurityUser(putUserRequestData);
 		}
 		
-		@DisplayName("create put user request")
+		@DisplayName("create put user request data")
 		@Nested
-		class TestCreatePutUserRequest {
+		class TestCreatePutUserRequestData {
 			
 			@Test
-			void shouldContainUser() {
-				var request = service.createPutUserRequest(NAMESPACE, PASSWORD);
+			void shouldContainUsername() {
+				var request = service.buildPutUserRequestData(NAMESPACE, PASSWORD);
 				
-				assertThat(request.username()).isEqualTo(NAMESPACE);
+				assertThat(request.getUsername()).isEqualTo(NAMESPACE);
 			}
 			
 			@Test
-			void shouldContainRole() {
-				var request = service.createPutUserRequest(NAMESPACE, PASSWORD);
+			void shouldContainRoles() {
+				var request = service.buildPutUserRequestData(NAMESPACE, PASSWORD);
 				
-				assertThat(request.roles()).containsExactly(NAMESPACE);
+				assertThat(request.getRoles()).isEqualTo(NAMESPACE);
 			}
 			
 			@Test
 			void shouldContainPassword() {
-				var request = service.createPutUserRequest(NAMESPACE, PASSWORD);
+				var request = service.buildPutUserRequestData(NAMESPACE, PASSWORD);
 				
-				assertThat(request.password()).isEqualTo(PASSWORD);
+				assertThat(request.getPassword()).isEqualTo(PASSWORD);
 			}
 		}
 	}
-}
+}
\ No newline at end of file
diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java
new file mode 100644
index 0000000..e6056bb
--- /dev/null
+++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/IndicesPrivilegesDataTestFactory.java
@@ -0,0 +1,21 @@
+package de.ozgcloud.operator.user;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+import de.ozgcloud.operator.user.PutRoleRequestData.IndicesPrivilegesData;
+
+public class IndicesPrivilegesDataTestFactory {
+
+	public static final String NAME = LoremIpsum.getInstance().getFirstName();
+	public static final String PRIVILEGES = "all";
+	
+	public static IndicesPrivilegesData  create() {
+		return createBuilder().build();
+	}
+	
+	public static IndicesPrivilegesData.IndicesPrivilegesDataBuilder createBuilder(){
+		return IndicesPrivilegesData.builder()
+				.names(NAME)
+				.privileges(PRIVILEGES);
+	}
+}
diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java
new file mode 100644
index 0000000..a8fe8c7
--- /dev/null
+++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutRoleRequestDataTestFactory.java
@@ -0,0 +1,18 @@
+package de.ozgcloud.operator.user;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+public class PutRoleRequestDataTestFactory {
+	
+	public static final String NAME = LoremIpsum.getInstance().getFirstName();
+
+	public static PutRoleRequestData  create() {
+		return createBuilder().build();
+	}
+	
+	public static PutRoleRequestData.PutRoleRequestDataBuilder createBuilder(){
+		return PutRoleRequestData.builder()
+				.name(NAME)
+				.indivesPrivilegesData(IndicesPrivilegesDataTestFactory.create());
+	}
+}
diff --git a/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java
new file mode 100644
index 0000000..bb4ce94
--- /dev/null
+++ b/ozgcloud-elasticsearch-operator/src/test/java/de/ozgcloud/operator/user/PutUserRequestDataTestFactory.java
@@ -0,0 +1,21 @@
+package de.ozgcloud.operator.user;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+public class PutUserRequestDataTestFactory {
+	
+	public static final String USERNAME = LoremIpsum.getInstance().getFirstName();
+	public static final String ROLES = LoremIpsum.getInstance().getWords(1);
+	public static final String PASSWORD = LoremIpsum.getInstance().getWords(1);
+
+	public static PutUserRequestData  create() {
+		return createBuilder().build();
+	}
+	
+	public static PutUserRequestData.PutUserRequestDataBuilder createBuilder(){
+		return PutUserRequestData.builder()
+				.username(USERNAME)
+				.roles(ROLES)
+				.password(PASSWORD);
+	}
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a1ebe49..abf8d35 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,7 @@
 		<keycloak-adapter.version>20.0.5</keycloak-adapter.version>
 		<reflections.version>0.10.2</reflections.version>
 		<validation-api.version>2.0.1.Final</validation-api.version>
+		<lorem.version>2.2</lorem.version>
 
 		<!-- test -->
 		<junit-jupiter.version>5.9.3</junit-jupiter.version>
@@ -61,6 +62,11 @@
 			<groupId>commons-beanutils</groupId>
 			<artifactId>commons-beanutils</artifactId>
 		</dependency>
+		<dependency>
+		    <groupId>com.thedeanda</groupId>
+		    <artifactId>lorem</artifactId>
+		</dependency>
+		
 
 		<!-- test -->
 		<dependency>
@@ -139,6 +145,11 @@
 				<artifactId>commons-beanutils</artifactId>
 				<version>${commons-beanutils.version}</version>
 			</dependency>
+			<dependency>
+			    <groupId>com.thedeanda</groupId>
+			    <artifactId>lorem</artifactId>
+			    <version>${lorem.version}</version>
+			</dependency>
 
 			<!-- javax -->
 			<dependency>
-- 
GitLab