diff --git a/Jenkinsfile b/Jenkinsfile index 2c55b3a51a189f5cdd52c7a99f839df4d7661021..12edbbf46e724df8640cdec02de2d86aea39bedd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -137,7 +137,7 @@ pipeline { FAILED_STAGE=env.STAGE_NAME HELM_CHART_VERSION = generateHelmChartVersion() - //sh "./run_helm_test.sh" + sh "./run_helm_test.sh" dir('src/main/helm') { @@ -175,23 +175,20 @@ pipeline { } } } - - stage ('OWASP Dependency-Check Vulnerabilities') { + stage ('Deploy SBOM to DependencyTrack') { steps { - dependencyCheck additionalArguments: ''' - -o "./" - -s "./" - -f "ALL" - -d /dependency-check-data - --suppression dependency-check-supressions.xml - --disableKnownExploited - --noupdate - --disableArchive - --prettyPrint''', odcInstallation: 'dependency-check-owasp' - - dependencyCheckPublisher( - pattern: 'dependency-check-report.xml' - ) + script { + IMAGE_TAG = generateImageTag() + + configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { + withCredentials([string(credentialsId: 'dependency-track-api-key', variable: 'API_KEY')]) { + + catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { + sh "mvn --no-transfer-progress -s $MAVEN_SETTINGS io.github.pmckeown:dependency-track-maven-plugin:upload-bom -Ddependency-track.apiKey=$API_KEY -Ddependency-track.projectVersion=${IMAGE_TAG} -Ddependency-track.dependencyTrackBaseUrl=https://dependency-track.ozg-sh.de" + } + } + } + } } } } diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/ConfigMapUserList.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/ConfigMapUserList.java index 10dfb0b03ba03073628347cb2d6c43b6a0c0a47c..f0e1b13d4cedc1fdcb25034126ba44befd8deb68 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/ConfigMapUserList.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/ConfigMapUserList.java @@ -1,18 +1,23 @@ package de.ozgcloud.operator.elstertransfer.user; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Builder public class ConfigMapUserList { private List<Map<String, Object>> usersList; public ConfigMapUserList(List<Map<String, Object>> usersList) { - this.usersList = usersList; + this.usersList = usersList; } - boolean existsUser(String login){ for (Map<String, Object> existingUser : usersList) { if (login.equals(existingUser.get("login"))) { diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java index 155d807796803bb6a1f58c929c85db1306366168..404c701c6e4770f8c0bddd22ef561eb49120dc42 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java @@ -20,11 +20,7 @@ import lombok.extern.log4j.Log4j2; public class OzgCloudElsterTransferUserReconciler implements Reconciler<OzgCloudElsterTransferUser>, Cleaner<OzgCloudElsterTransferUser> { private final OzgCloudElsterTransferUserService elsterTransferUserService; - private static final String CONFIG_MAP_NAME = "etr-user-config"; - private static final String ETR_DEPLOYMENT_NAME = "elster-transfer"; - // todo - private static final String ETR_NAMESPACE = "etr-user-creation"; - + @Override public UpdateControl<OzgCloudElsterTransferUser> reconcile(OzgCloudElsterTransferUser elsterTransferUser, Context<OzgCloudElsterTransferUser> context) { diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java index 2ca1b1372a0b3091983950c38ad1e2cbe6de4519..d87e27004cafd5f2f9f09c2b4c1ad5b44c35daa5 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java @@ -9,7 +9,6 @@ import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; import io.fabric8.kubernetes.api.model.ConfigMap; -import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -20,6 +19,7 @@ public class OzgCloudElsterTransferUserService { private final OzgCloudElsterTransferUserRemoteService remoteService; private static final String USERS_KEY = "users.yaml"; + // todo private static final String ETR_NAMESPACE = "etr-user-creation"; public static final String USER_ROLE = "USER"; private static final String CONFIG_MAP_NAME = "etr-user-config"; @@ -28,15 +28,11 @@ public class OzgCloudElsterTransferUserService { public void updateConfigMapAndRestartDeploymentAndCreateSecret(String namespace) { LOG.info("Updating Configmap"); - String userPassword = updateConfigMap(namespace, ETR_NAMESPACE, CONFIG_MAP_NAME); - - // userPassword will not be generated if the user "login" already exist in configmap - if (!userPassword.isEmpty()) { - LOG.info("Restarting Deployment"); - restartDeployment(ETR_NAMESPACE, ETR_DEPLOYMENT_NAME); - LOG.info("Creating Secret"); - createOrUpdateSecret(namespace, userPassword,MUK_USER_SECRET_NAME); - } + String userPassword = generateUsersYamlAndUpdateConfigMap(namespace, ETR_NAMESPACE, CONFIG_MAP_NAME); + LOG.info("Restarting Deployment"); + restartDeployment(ETR_NAMESPACE, ETR_DEPLOYMENT_NAME); + LOG.info("Creating Secret"); + createOrUpdateSecret(namespace, userPassword, MUK_USER_SECRET_NAME); } public void deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(OzgCloudElsterTransferUser user) { @@ -51,36 +47,40 @@ public class OzgCloudElsterTransferUserService { } LOG.info("{} do cleanup...", user.getMetadata()); deleteUser(user.getMetadata().getNamespace(), CONFIG_MAP_NAME); - restartDeployment(ETR_NAMESPACE,ETR_DEPLOYMENT_NAME); + restartDeployment(ETR_NAMESPACE, ETR_DEPLOYMENT_NAME); } - - String updateConfigMap(String namespace, String configmapNamespace, String configMapName) { - String userPassword = ""; + String generateUsersYamlAndUpdateConfigMap(String namespace, String configmapNamespace, String configMapName) { + String userPassword = generatePassword(); ConfigMap configMap = remoteService.getConfigMap(configmapNamespace, configMapName); - if (configMap == null) { - LOG.debug("Creating ConfigMap '{}' in namespace '{}'", configMapName, namespace); - configMap = remoteService.createConfigMap(configmapNamespace, configMapName); - } + String usersYaml = addUserToUserYaml(namespace, configMap, userPassword); - ConfigMapUserList users = getUsersFromYaml(configMap); + createOrUpdateConfigMap(configmapNamespace, configMapName, configMap, usersYaml); + return userPassword; + } + + String addUserToUserYaml(String namespace, ConfigMap configMap, String userPassword) { + String usersYaml = ""; + ConfigMapUserList users = getUsersFromConfigMap(configMap); // use namespace as user "login" and "group" if (userExistsInList(users, namespace)) { - LOG.warn("User with login '{}' already exists in ConfigMap '{}'.", namespace, configMapName); + LOG.warn("User with login '{}' already exists in ConfigMap.", namespace); } else { - userPassword = generatePassword(); - String passwordHash = hashPassword(userPassword); - addUserToList(users, namespace, passwordHash); - - String usersYaml = constructYamlEntries(users); - - remoteService.updateConfigMapData(configMap, USERS_KEY, usersYaml); - LOG.debug("ConfigMap updated successfully: {}", configMapName); + addNewUserToList(users, namespace, hashPassword(userPassword)); + usersYaml = constructYamlEntries(users); + } + return usersYaml; + } + void createOrUpdateConfigMap(String configmapNamespace, String configMapName, ConfigMap configMap, String usersYaml) { + if (configMap == null) { + LOG.debug("Creating ConfigMap '{}' in namespace '{}'", configMapName, configmapNamespace); + configMap = remoteService.createConfigMap(configmapNamespace, configMapName); } - return userPassword; + remoteService.updateConfigMapData(configMap, USERS_KEY, usersYaml); + LOG.debug("ConfigMap updated successfully: {}", configMapName); } void restartDeployment(String etrNamespace, String deploymentName) { @@ -90,48 +90,21 @@ public class OzgCloudElsterTransferUserService { boolean userExists(String userLogin, String configMapNamespace, String configMapName) { ConfigMap configMap = remoteService.getConfigMap(configMapNamespace, configMapName); - - if (configMap == null) { - LOG.warn("ConfigMap '{}' not found", configMapName); - return false; - } - - if (!configMap.getData().containsKey(USERS_KEY)) { - LOG.warn("Key '{}' not found in ConfigMap '{}'", USERS_KEY, configMapName); - return false; - } - - ConfigMapUserList users1 = getUsersFromYaml(configMap); - boolean userExists = users1.existsUser(userLogin); + ConfigMapUserList users = getUsersFromConfigMap(configMap); + boolean userExists = users.existsUser(userLogin); LOG.info("User with login '{}' exists in ConfigMap '{}'", userLogin, configMapName); return userExists; - } void deleteUser(String userLogin, String configMapName) { - try { - ConfigMap configMap = remoteService.getConfigMap(ETR_NAMESPACE, configMapName); + ConfigMap configMap = remoteService.getConfigMap(ETR_NAMESPACE, configMapName); - if (configMap == null) { - LOG.debug("ConfigMap '{}' not found in namespace '{}'", configMapName, ETR_NAMESPACE); - return; - } + ConfigMapUserList usersList = getUsersFromConfigMap(configMap); + usersList.removeDeleted(userLogin); + String updatedUsersYaml = constructYamlEntries(usersList); - if (!configMap.getData().containsKey(USERS_KEY)) { - LOG.warn("Key '{}' not found in ConfigMap '{}'", USERS_KEY, configMapName); - return; - } - - ConfigMapUserList usersList = getUsersFromYaml(configMap); - usersList.removeDeleted(userLogin); - String updatedUsersYaml = constructYamlEntries(usersList); - - remoteService.updateConfigMapData(configMap, USERS_KEY, updatedUsersYaml); - LOG.info("User with login '{}' removed from configmap successfully", userLogin); - - } catch (Exception e) { - LOG.error("Error while deleting user", e); - } + remoteService.updateConfigMapData(configMap, USERS_KEY, updatedUsersYaml); + LOG.info("User with login '{}' removed from configmap successfully", userLogin); } void createOrUpdateSecret(String namespace, String userPassword, String secretName) { @@ -139,8 +112,7 @@ public class OzgCloudElsterTransferUserService { LOG.info("Secret for user in namespace '{}' created successfully", namespace); } - - ConfigMapUserList getUsersFromYaml(ConfigMap configMap) { + ConfigMapUserList getUsersFromConfigMap(ConfigMap configMap) { String usersYaml = configMap.getData().get(USERS_KEY); Map<String, Object> load = new Yaml().load(usersYaml); List<Map<String, Object>> usersList = (List<Map<String, Object>>) load.get("users"); @@ -151,18 +123,10 @@ public class OzgCloudElsterTransferUserService { return usersList.existsUser(login); } - void addUserToList(ConfigMapUserList usersList, String login, String passwordHash) { + void addNewUserToList(ConfigMapUserList usersList, String login, String passwordHash) { usersList.addUserToList(login, passwordHash, USER_ROLE); } - private String generatePassword() { - return UUID.randomUUID().toString(); - } - - private String hashPassword(String password) { - return BCrypt.hashpw(password, BCrypt.gensalt()); - } - String constructYamlEntries(ConfigMapUserList userList) { List<Map<String, Object>> usersList = userList.getUsersList(); StringBuilder usersYaml = new StringBuilder(); @@ -184,4 +148,12 @@ public class OzgCloudElsterTransferUserService { return sb.toString(); } + private String generatePassword() { + return UUID.randomUUID().toString(); + } + + private String hashPassword(String password) { + return BCrypt.hashpw(password, BCrypt.gensalt()); + } + } diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java index 9688d94036ba21e8a9cc8eedf06d68bb8a5437bc..b30da1b02c1ba34af33ffbefba1260357da7c547 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java @@ -1,6 +1,5 @@ package de.ozgcloud.operator.elstertransfer.user; -import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -72,6 +71,7 @@ class OzgCloudElsterTransferUserRemoteServiceTest { private static final String configMapName = OzgCloudElsterTransferUserTestFactory.CONFIG_MAP_NAME; private static final String deploymentName = OzgCloudElsterTransferUserTestFactory.ETR_DEPLOYMENT_NAME; private static final String secretName = OzgCloudElsterTransferUserTestFactory.MUK_USER_SECRET_NAME; + //todo private static final String configmapNamespace = "etr-user-creation"; @DisplayName("test ConfigMap") diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java index ad2e148edbd93bfb8bdcd4396c3bfba37a78bf16..ebcfd0cdb9e9400b27e91779293468f45edf19c0 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java @@ -1,5 +1,577 @@ package de.ozgcloud.operator.elstertransfer.user; -public class OzgCloudElsterTransferUserServiceTest { - +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import io.fabric8.kubernetes.api.model.ConfigMap; + +class OzgCloudElsterTransferUserServiceTest { + + @Mock + private OzgCloudElsterTransferUserRemoteService remoteService; + + @Spy + @InjectMocks + private OzgCloudElsterTransferUserService service; + + @Mock + private ConfigMap configMap; + + @Mock + private ConfigMapUserList users; + + private static final String namespace = OzgCloudElsterTransferUserTestFactory.METADATA_NAMESPACE; + private static final String configMapName = OzgCloudElsterTransferUserTestFactory.CONFIG_MAP_NAME; + private static final String deploymentName = OzgCloudElsterTransferUserTestFactory.ETR_DEPLOYMENT_NAME; + private static final String secretName = OzgCloudElsterTransferUserTestFactory.MUK_USER_SECRET_NAME; + private static final String configMapNamespace = "etr-user-creation"; + private static final String usersKey = "users.yaml"; + + @Nested + class TestUpdateConfigMapAndRestartDeploymentAndCreateSecret { + + @BeforeEach + void setUp() { + String mockedUsersYaml = "fileFormat: 1\nusers:\n - login: testUser\n"; + when(configMap.getData()).thenReturn(Map.of(usersKey, mockedUsersYaml)); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + when(users.getUsersList()).thenReturn(List.of(Map.of( + "login", "testUser", + "rolle", "USER", + "credentials", Map.of("passwortHash", "hashedPassword"), + "gruppe", "testGroup"))); + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + } + + @Test + void shouldCallGenerateUsersYamlAndUpdateConfigMap() { + + service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); + + verify(service).generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + } + + @Test + void shouldCallRestartDeployment() { + + service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); + + verify(service).restartDeployment(configMapNamespace, deploymentName); + } + + @Test + void shouldCallCreateOrUpdateSecret() { + String psw = "password"; + when(service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName)).thenReturn(psw); + + service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); + + verify(service).createOrUpdateSecret(namespace, psw, secretName); + } + + } + + @Nested + class TestDeleteUserAndRestartDeploymentIfNotKeepUserAndUserExists { + + @Test + void keepAfterDeleteShouldReturnFalseAsDefault() { + + String mockedUsersYaml = "fileFormat: 1\nusers:\n - login: testUser\n"; + when(configMap.getData()).thenReturn(Map.of("users.yaml", mockedUsersYaml)); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + assertFalse(user.getSpec().isKeepAfterDelete()); + + } + + @Test + void shouldCallUserExists() { + String mockedUsersYaml = "fileFormat: 1\nusers:\n - login: testUser\n"; + when(configMap.getData()).thenReturn(Map.of("users.yaml", mockedUsersYaml)); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + verify(service).userExists(namespace, configMapNamespace, configMapName); + + } + + @Test + void shouldNotCallUserExists() { + + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + user.getSpec().setKeepAfterDelete(true); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + verify(service, never()).userExists(any(), any(), any()); + + } + + @Test + void shouldCallDeleteUser() { + String mockedUsersYaml = "fileFormat: 1\nusers:\n - login: testUser\n"; + when(configMap.getData()).thenReturn(Map.of("users.yaml", mockedUsersYaml)); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + + when(users.getUsersList()).thenReturn(List.of(Map.of( + "login", "testUser", + "rolle", "USER", + "credentials", Map.of("passwortHash", "hashedPassword"), + "gruppe", "testGroup"))); + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + when(service.userExists(namespace, configMapNamespace, configMapName)).thenReturn(true); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + verify(service).deleteUser(user.getMetadata().getNamespace(), configMapName); + } + + @Test + void shouldNotCallDeleteUserOrRestartDeploymentIfKeepAfterDelete() { + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + user.getSpec().setKeepAfterDelete(true); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + verify(service, never()).deleteUser(any(), any()); + verify(service, never()).restartDeployment(any(), any()); + } + + @Test + void shouldNotCallDeleteUserOrRestartDeploymentIfUserNotExists() { + String mockedUsersYaml = "fileFormat: 1\nusers:\n - login: testUser\n"; + when(configMap.getData()).thenReturn(Map.of("users.yaml", mockedUsersYaml)); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + when(service.userExists(namespace, configMapNamespace, configMapName)).thenReturn(false); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + verify(service, never()).deleteUser(any(), any()); + verify(service, never()).restartDeployment(any(), any()); + } + + @Test + void shouldCallRestartDeployment() { + String mockedUsersYaml = "fileFormat: 1\nusers:\n - login: testUser\n"; + when(configMap.getData()).thenReturn(Map.of("users.yaml", mockedUsersYaml)); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + + when(users.getUsersList()).thenReturn(List.of(Map.of( + "login", "testUser", + "rolle", "USER", + "credentials", Map.of("passwortHash", "hashedPassword"), + "gruppe", "testGroup"))); + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + when(service.userExists(namespace, configMapNamespace, configMapName)).thenReturn(true); + + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + + verify(service).restartDeployment(configMapNamespace, deploymentName); + } + } + + @Nested + @DisplayName("generateUsersYamlAndUpdateConfigMap") + class TestGenerateUsersYamlAndUpdateConfigMap { + + @BeforeEach + public void setUp() { + Map<String, String> mockData = new HashMap<>(); + mockData.put("users.yaml", "users: []"); + when(configMap.getData()).thenReturn(mockData); + when(remoteService.getConfigMap(anyString(), anyString())).thenReturn(configMap); + } + + @Test + void shouldCallGetConfigMap() { + service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + + verify(remoteService).getConfigMap(configMapNamespace, configMapName); + } + + @Test + void shouldReturnGeneratedPassword() { + String userPassword = service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + + assertNotNull(userPassword); + } + + @Test + void shouldCallCreateOrUpdateConfigMap() { + service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + + verify(service).createOrUpdateConfigMap(eq(configMapNamespace), eq(configMapName), eq(configMap), anyString()); + } + + @Test + void shouldCalladdUserToUserYaml() { + service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + + verify(service).addUserToUserYaml(eq(namespace), eq(configMap), anyString()); + } + + } + + @Nested + class addUserToUserYamlTests { + + @BeforeEach + public void setUp() { + Map<String, String> mockData = new HashMap<>(); + mockData.put("users.yaml", "users: []"); + when(configMap.getData()).thenReturn(mockData); + } + + @Test + void shouldCallgetUsersFromConfigMap() { + service.addUserToUserYaml(namespace, configMap, "password"); + + verify(service).getUsersFromConfigMap(configMap); + } + + @Test + void shouldCallUserExistsInList() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + when(users.getUsersList()).thenReturn(List.of(Map.of( + "login", "testUser", + "rolle", "USER", + "credentials", Map.of("passwortHash", "hashedPassword"), + "gruppe", "testGroup"))); + + service.addUserToUserYaml(namespace, configMap, "password"); + + verify(service).userExistsInList(users, namespace); + } + + @Test + void shouldCallAddNewUserToListWhenUserNotExists() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + service.addUserToUserYaml(namespace, configMap, "password"); + + verify(service).addNewUserToList(eq(users), eq(namespace), anyString()); + } + + @Test + void shouldCallconstructYamlEntries() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + service.addUserToUserYaml(namespace, configMap, "password"); + + verify(service).constructYamlEntries(users); + } + + @Test + void TestUserYamlShouldNotBeEmpty() { + // when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + String userYaml = service.addUserToUserYaml(namespace, configMap, "password"); + + assertFalse(userYaml.isEmpty()); + } + + @Test + void TestUserYamlShouldBeEmpty() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + when(service.userExistsInList(users, namespace)).thenReturn(true); + + String userYaml = service.addUserToUserYaml(namespace, configMap, "password"); + + assertTrue(userYaml.isEmpty()); + } + } + + @Nested + class CreateOrUpdateConfigMapTests { + + @Test + void shouldCallCreateConfigMap() { + ConfigMap configMap = null; + + service.createOrUpdateConfigMap(configMapNamespace, configMapName, configMap, "mockedUsersYaml"); + + verify(remoteService).createConfigMap(configMapNamespace, configMapName); + } + + @Test + void shouldCallUpdateConfigMapData() { + service.createOrUpdateConfigMap(configMapNamespace, configMapName, configMap, "mockedUsersYaml"); + + verify(remoteService).updateConfigMapData(configMap, usersKey, "mockedUsersYaml"); + verify(remoteService, never()).createConfigMap(any(), any()); + } + + } + + @Nested + class RestartDeploymentTests { + @Test + void shouldCallCreateConfigMap() { + service.restartDeployment(configMapNamespace, deploymentName); + + verify(remoteService).restartDeployment(configMapNamespace, deploymentName); + } + } + + @Nested + class UserExistsTests { + + @BeforeEach + public void setUp() { + Map<String, String> mockData = new HashMap<>(); + mockData.put("users.yaml", "users: []"); + when(configMap.getData()).thenReturn(mockData); + when(remoteService.getConfigMap(configMapNamespace, configMapName)).thenReturn(configMap); + } + + @Test + void shouldCallGetConfigMap() { + // + service.userExists(namespace, configMapNamespace, configMapName); + + verify(remoteService).getConfigMap(configMapNamespace, configMapName); + } + + @Test + void shouldReturnUserExistsTrueIfUserExists() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + when(users.existsUser(namespace)).thenReturn(true); + + boolean userExists = service.userExists(namespace, configMapNamespace, configMapName); + + assertTrue(userExists); + } + + @Test + void shouldReturnUserExistsTrueIfUserNotExists() { + boolean userExists = service.userExists(namespace, configMapNamespace, configMapName); + + assertFalse(userExists); + } + + @Test + void shouldCallgetUsersFromConfigMap() { + service.userExists(namespace, configMapNamespace, configMapName); + + verify(service).getUsersFromConfigMap(configMap); + } + + @Test + void shouldCallExistsUser() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + service.userExists(namespace, configMapNamespace, configMapName); + + verify(users).existsUser(namespace); + } + + } + + @Nested + class DeleteUserTests { + @BeforeEach + public void setUp() { + Map<String, String> mockData = new HashMap<>(); + mockData.put("users.yaml", "users: []"); + when(configMap.getData()).thenReturn(mockData); + when(remoteService.getConfigMap(configMapNamespace, configMapName)).thenReturn(configMap); + } + + @Test + void shouldCallGetConfigMap() { + service.deleteUser(namespace, configMapName); + + verify(remoteService).getConfigMap(configMapNamespace, configMapName); + } + + @Test + void shouldCallGetUsersFromConfigMap() { + service.deleteUser(namespace, configMapName); + + verify(service).getUsersFromConfigMap(configMap); + } + + @Test + void shouldCallremoveDeleted() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + service.deleteUser(namespace, configMapName); + + verify(users).removeDeleted(namespace); + } + + @Test + void ShouldCallConstructYamlEntries() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + + service.deleteUser(namespace, configMapName); + + verify(service).constructYamlEntries(users); + } + + @Test + void ShouldCallUpdateConfigMapData() { + when(service.getUsersFromConfigMap(configMap)).thenReturn(users); + when(service.constructYamlEntries(users)).thenReturn("updatedUsersYaml"); + + service.deleteUser(namespace, configMapName); + + verify(remoteService).updateConfigMapData(configMap, usersKey, "updatedUsersYaml"); + } + } + + @Nested + class CreateOrUpdateSecretTests { + @Test + void shouldCallCreateOrUpdateSecret() { + service.createOrUpdateSecret(namespace, "psw", secretName); + + verify(remoteService).createOrUpdateSecret(namespace, "psw", secretName); + } + + } + + @Nested + class GetUsersFromConfigMapTests { + @BeforeEach + public void setUp() { + String usersYaml = "fileFormat: 1\n" + + "users:\n" + + " - login: \"admin\"\n" + + " rolle: \"ADMIN\"\n" + + " credentials:\n" + + " passwortHash: \"$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a\"\n" + + " gruppe: \"Administratoren\"\n"; + + Map<String, String> mockData = new HashMap<>(); + mockData.put(usersKey, usersYaml); + when(configMap.getData()).thenReturn(mockData); + } + + @Test + void shouldReturnObjectConfigMapUserList() { + + ConfigMapUserList result = service.getUsersFromConfigMap(configMap); + + assertNotNull(result); + assertInstanceOf(ConfigMapUserList.class, result); + } + + @Test + void shouldReturnConfigMapUserListWithContent() { + + ConfigMapUserList result = service.getUsersFromConfigMap(configMap); + + List<Map<String, Object>> usersList = result.getUsersList(); + assertEquals(1, usersList.size()); + } + + } + + @Nested + class UserExistsInListTests { + @Test + void shouldCallExistsUser() { + service.userExistsInList(users, namespace); + + verify(users).existsUser(namespace); + } + + } + + @Nested + class AddNewUserToListTests { + @Test + void shouldCallAddUserToList() { + service.addNewUserToList(users, namespace, "pswHash"); + + verify(users).addUserToList(namespace, "pswHash", "USER"); + } + + } + + @Nested + class ConstructYamlEntriesTests { + @Test + void shouldHaveResultWithCorrectContentStart() { + String result = service.constructYamlEntries(users); + + assertTrue(result.startsWith("fileFormat: 1\nusers:\n")); + } + + @Test + void shouldHaveResultWithCorrectContent() { + Map<String, Object> user1 = new HashMap<>(); + user1.put("login", "admin"); + user1.put("rolle", "ADMIN"); + Map<String, Object> user2 = new HashMap<>(); + user2.put("login", "user"); + user2.put("rolle", "USER"); + + List<Map<String, Object>> usersList = Arrays.asList(user1, user2); + when(users.getUsersList()).thenReturn(usersList); + doReturn(" - login: admin\n rolle: ADMIN\n").when(service).getYamlForUser(user1); + doReturn(" - login: user\n rolle: USER\n").when(service).getYamlForUser(user2); + + String result = service.constructYamlEntries(users); + + String expectedYaml = "fileFormat: 1\n" + + "users:\n" + + " - login: admin\n" + + " rolle: ADMIN\n" + + " - login: user\n" + + " rolle: USER\n"; + + assertEquals(expectedYaml, result); + } + } + + @Nested + class GetYamlForUserTests { + @Test + void shouldReturnExpectedYamlForUser() { + Map<String, Object> userEntry = new HashMap<>(); + userEntry.put("login", "admin"); + userEntry.put("rolle", "ADMIN"); + userEntry.put("gruppe", "Administratoren"); + Map<String, String> credentials = new HashMap<>(); + credentials.put("passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a"); + userEntry.put("credentials", credentials); + + String result = service.getYamlForUser(userEntry); + + String expectedYaml = " - { login: \"admin\", rolle: \"ADMIN\", credentials: { passwortHash: \"$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a\" }, gruppe: \"Administratoren\" }\n"; + + assertEquals(expectedYaml, result); + } + + } }