diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java index 4a406700902da42d9f6150e9337319f52def6079..5829cacba9f23de8c68a53ecf9667835453df742 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java @@ -29,7 +29,6 @@ import java.util.Optional; import org.keycloak.admin.client.Keycloak; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.RoleRepresentation; -import org.keycloak.representations.idm.RolesRepresentation; import org.springframework.stereotype.Component; import de.ozgcloud.operator.keycloak.KeycloakException; @@ -53,16 +52,15 @@ class KeycloakRealmRemoteService { keycloak.realm(realm.getRealm()).update(realm); } - public Optional<RoleRepresentation> getRealmRole(String roleName, String realmName) { - return Optional.ofNullable(keycloak.realm(realmName).roles()) + return Optional.ofNullable(keycloak.realm(realmName)) .orElseThrow(() -> new KeycloakException("Realm with Name " + realmName + " not found.")) + .roles() .list() .stream().filter(role -> Objects.equals(roleName, role.getName())) .findFirst(); } - public void updateRealmRole(RoleRepresentation role, String realm) { keycloak.realm(realm).roles().get(role.getName()).update(role); } diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java index d475d195c55f75b7c6284f5fc61c9715f03bc219..e3677e8e1c55509af87bf796eafbe121e5fa4e19 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java @@ -62,7 +62,6 @@ class KeycloakRealmService { try { LOG.debug("{}: Updating existing realm...", existingRealm); var realmRepresentation = mapper.update(existingRealm, spec); - //LOG.info(realmRepresentation.getRoles() + "realm Spec with roles"); remoteService.updateRealm(realmRepresentation); } catch (Exception e) { LOG.warn(existingRealm + ": Updating existing realm failed: ", e); diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java index 41087f58d366d15bbfe4de8be9dabea6e8314012..e2de78c1cdbf9fbd5f34933ec95bb28899b45572 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java @@ -27,13 +27,10 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.RealmRepresentation; import org.mapstruct.factory.Mappers; import org.mockito.Spy; -import de.ozgcloud.operator.keycloak.client.OzgCloudKeycloakClientSpecTestFactory; - class KeycloakRealmMapperTest { @Spy @@ -144,12 +141,105 @@ class KeycloakRealmMapperTest { class TestUpdate { @Test - void shouldMapBaseUrl() { - var realm = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + void shouldMapDisplayName() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getDisplayName()).isEqualTo(OzgCloudKeycloakRealmSpecTestFactory.DISPLAY_NAME); + } + + @Test + void shouldBeEnabled() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.isEnabled()).isTrue(); + } + + @Test + void shouldBeResetPasswordAllowed() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.isResetPasswordAllowed()).isTrue(); + } + + @Test + void shouldBeSupportedLocaleDe() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getSupportedLocales()).containsExactly("de"); + } + + @Test + void shouldBeDefaultLocaleDe() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getDefaultLocale()).isEqualTo("de"); + } + + @Test + void shouldBeInternationalizationEnabled() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.isInternationalizationEnabled()).isTrue(); + } + + @Test + void checkPasswordPolicy() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getPasswordPolicy()).isEqualTo("upperCase(1) and lowerCase(1) and length(8) and notUsername"); + } + + @Test + void shouldSetActionTokenGeneratedByUserLifespan() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getActionTokenGeneratedByUserLifespan()).isEqualTo(900); + } + + @Test + void shouldMapSmtpServer() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getSmtpServer()).hasSize(8); + } + + @Test + void shouldContainSmtpServerKeysValues() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getSmtpServer()) + .containsEntry("user", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_USER) + .containsEntry("password", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_PASSWORD) + .containsEntry("host", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_HOST) + .containsEntry("port", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_PORT) + .containsEntry("starttls", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_STARTTLS) + .containsEntry("auth", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_AUTH) + .containsEntry("from", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_FROM) + .containsEntry("fromDisplayName", KeycloakRealmSmtpServerTestFactory.SMTP_SERVER_FROM_DISPLAY_NAME); + } + + @Test + void shouldMapWhenSmtpServerIsNull() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.createBuilder().smtpServer(null).build()); + + assertThat(mapped.getSmtpServer()).isEmpty(); + } + + @Test + void shouldMapRealmRoles() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getRoles().getRealm()).hasSize(2); + } + + @Test + void shouldContainRealmRolesValues() { + var mapped = mapper.update(new RealmRepresentation(), OzgCloudKeycloakRealmSpecTestFactory.create()); + var mappedRealmRoles = mapped.getRoles(); - assertThat(realm.getDisplayName()).isEqualTo(OzgCloudKeycloakRealmSpecTestFactory.DISPLAY_NAME); + assertThat(mappedRealmRoles.getRealm().get(0).getName()).isEqualTo(OzgCloudKeycloakRealmSpecTestFactory.ROLE_NAME_1); + assertThat(mappedRealmRoles.getRealm().get(1).getName()).isEqualTo(OzgCloudKeycloakRealmSpecTestFactory.ROLE_NAME_2); } - } } diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java index 53e1ceb43786d4d931dbf1e1f011e527c2d7990b..06e758f079a0e46cf2b1ceba00381683a700258f 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java @@ -23,8 +23,11 @@ */ package de.ozgcloud.operator.keycloak.realm; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java index 3c0bc0491639216714a5515e6677f2a87ea7cb0e..de184ed14a5c5daff65afb5370b5645bb851a680 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteServiceTest.java @@ -23,7 +23,13 @@ */ package de.ozgcloud.operator.keycloak.realm; -import static org.mockito.Mockito.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -31,10 +37,15 @@ import org.junit.jupiter.api.Test; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.resource.RealmResource; import org.keycloak.admin.client.resource.RealmsResource; +import org.keycloak.admin.client.resource.RoleResource; +import org.keycloak.admin.client.resource.RolesResource; +import org.keycloak.representations.idm.RoleRepresentation; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import de.ozgcloud.operator.keycloak.KeycloakException; + class KeycloakRealmRemoteServiceTest { @Spy @@ -50,6 +61,18 @@ class KeycloakRealmRemoteServiceTest { @Mock private RealmResource realmResource; + @Mock + private RolesResource rolesResource; + + @Mock + private RoleResource roleResource; + + @Mock + private RoleRepresentation roleRepresentation; + + private static final String REALM_NAME = "TestRealmName"; + private static final String ROLE_NAME = "RoleName"; + @Nested class TestCreateRealm { @@ -71,8 +94,6 @@ class KeycloakRealmRemoteServiceTest { @Nested class TestDeleteRealm { - private static final String REALM_NAME = "TestRealmName"; - @Test void shouldDeleteRealm() { when(keycloak.realm(REALM_NAME)).thenReturn(realmResource); @@ -82,4 +103,75 @@ class KeycloakRealmRemoteServiceTest { verify(realmResource).remove(); } } + + @Nested + class TestRealmRoles { + + @Nested + class TestAddClientRole { + + @BeforeEach + void init() { + when(keycloak.realm(REALM_NAME)).thenReturn(realmResource); + when(realmResource.roles()).thenReturn(rolesResource); + } + + @Test + void shouldAddClientRole() { + remoteService.addRealmRole(roleRepresentation, REALM_NAME); + + verify(rolesResource).create(roleRepresentation); + } + } + + @Nested + class TestUpdateRealmRole { + + @BeforeEach + void init() { + when(keycloak.realm(REALM_NAME)).thenReturn(realmResource); + when(realmResource.roles()).thenReturn(rolesResource); + when(rolesResource.get(ROLE_NAME)).thenReturn(roleResource); + + when(roleRepresentation.getName()).thenReturn(ROLE_NAME); + + } + + @Test + void shouldUpdateRealmRole() { + remoteService.updateRealmRole(roleRepresentation, REALM_NAME); + + verify(roleResource).update(roleRepresentation); + } + } + + @Nested + class TestGetRealmRole { + + @BeforeEach + void init() { + when(keycloak.realm(REALM_NAME)).thenReturn(realmResource); + + } + + @Test + void shouldReturnRealmRole() { + when(realmResource.roles()).thenReturn(rolesResource); + when(rolesResource.list()).thenReturn(List.of(roleRepresentation)); + when(roleRepresentation.getName()).thenReturn(ROLE_NAME); + + Optional<RoleRepresentation> role = remoteService.getRealmRole(ROLE_NAME, REALM_NAME); + + assertThat(role).isPresent().contains(roleRepresentation); + } + + @Test + void shouldThrowOnRealmNotFound() { + when(keycloak.realm(REALM_NAME)).thenReturn(null); + + assertThrows(KeycloakException.class, + () -> remoteService.getRealmRole(ROLE_NAME, REALM_NAME)); + } + } + } }