From faf04b1fdcc232592e2110ab24c917a38328314e Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Mon, 9 Dec 2024 14:45:03 +0100 Subject: [PATCH] OZG-7303: Remove code which processes namespace name. Introduce 'bundesland' field in Spec and mappers in order to use this field. --- .../keycloak/realm/KeycloakRealmMapper.java | 5 + .../keycloak/realm/KeycloakRealmService.java | 34 --- .../realm/OzgCloudKeycloakRealmSpec.java | 2 + .../realm/KeycloakRealmMapperTest.java | 7 + .../realm/KeycloakRealmServiceThemeTest.java | 205 ------------------ .../OzgCloudKeycloakRealmSpecTestFactory.java | 2 + 6 files changed, 16 insertions(+), 239 deletions(-) delete mode 100644 ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceThemeTest.java diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java index 1c93aa3..177747c 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java @@ -56,6 +56,7 @@ interface KeycloakRealmMapper { @Mapping(target = "actionTokenGeneratedByUserLifespan", constant = ACTION_TOKEN_GENERATED_BY_USER_LIFE_SPAN) @Mapping(target = "smtpServer", source = "smtpServer", qualifiedByName = "smtpServer") @Mapping(target = "roles.realm", source = "realmRoles") + @Mapping(target = "loginTheme", source = ".", qualifiedByName = "bundeslandToTheme") public RealmRepresentation map(OzgCloudKeycloakRealmSpec realm); @Mapping(target = "enabled", constant = ENABLED) @@ -67,11 +68,15 @@ interface KeycloakRealmMapper { @Mapping(target = "actionTokenGeneratedByUserLifespan", constant = ACTION_TOKEN_GENERATED_BY_USER_LIFE_SPAN) @Mapping(target = "smtpServer", source = "smtpServer", qualifiedByName = "smtpServer") @Mapping(target = "roles.realm", source = "realmRoles") + @Mapping(target = "loginTheme", source = ".", qualifiedByName = "bundeslandToTheme") RealmRepresentation update(@MappingTarget RealmRepresentation existingRealm, OzgCloudKeycloakRealmSpec spec); @Mapping(target = "name", source = "name") RoleRepresentation map(OzgCloudKeycloakRealmSpec.RealmRole role); + @Named("bundeslandToTheme") + default String mapBundeslandToTheme(OzgCloudKeycloakRealmSpec spec) { return "ozg-" + spec.getBundesland(); } + @Named("supportedLocales") default Set<String> mapPassword(OzgCloudKeycloakRealmSpec spec) { return Set.of("de"); 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 43cff34..6eb9892 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 @@ -25,10 +25,7 @@ package de.ozgcloud.operator.keycloak.realm; import java.util.Optional; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.lang3.StringUtils; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.userprofile.config.UPAttribute; import org.keycloak.representations.userprofile.config.UPAttributePermissions; @@ -45,8 +42,6 @@ import lombok.extern.log4j.Log4j2; class KeycloakRealmService { public static final String USER_PROFILE_CONFIG_OZGCLOUD_ATTRIBUTE_NAME = "ozgCloudUserId"; - public static final String LOGIN_THEME_PREFIX = "ozg-"; - public static final Pattern STANDARD_OZGCLOUD_NAMESPACE_PATTERN = Pattern.compile("^([a-zA-Z]{2})-.*$"); private final KeycloakRealmRemoteService remoteService; @@ -65,7 +60,6 @@ class KeycloakRealmService { try { LOG.debug("{}: Updating existing realm...", existingRealm); var realmRepresentation = mapper.update(existingRealm, spec); - addRealmTheme(realmRepresentation); remoteService.updateRealm(realmRepresentation); addUserProfileAttributes(realmRepresentation); } catch (Exception e) { @@ -79,7 +73,6 @@ class KeycloakRealmService { Optional.of(realm) .map(mapper::map) .map(realmRepresentation -> addRealmName(realmRepresentation, realmName)) - .map(realmRepresentation -> addRealmTheme(realmRepresentation)) .ifPresent(realmRepresentation -> { remoteService.createRealm(realmRepresentation); addUserProfileAttributes(realmRepresentation); @@ -99,33 +92,6 @@ class KeycloakRealmService { return realm; } - RealmRepresentation addRealmTheme(RealmRepresentation realm) { - if (realm == null || StringUtils.isEmpty(realm.getRealm())) { - LOG.warn("Realm has no valid value to resolve theme"); - } else { - String realmName = realm.getRealm(); - realm.setLoginTheme(createRealmLoginThemeName(getBundesland(realmName))); - } - return realm; - } - - String getBundesland(String realmName) { - if (realmName != null) { - Matcher matcher = STANDARD_OZGCLOUD_NAMESPACE_PATTERN.matcher(realmName); - if (matcher.matches()) { - return matcher.group(1); - } - } - return ""; - } - - String createRealmLoginThemeName(String bundesland) { - if (!StringUtils.isEmpty(bundesland)) { - return LOGIN_THEME_PREFIX + bundesland; - } - return ""; - } - public void deleteRealm(String realmName) { remoteService.deleteRealm(realmName); } diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java index d133281..b3d1eef 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java @@ -48,6 +48,8 @@ class OzgCloudKeycloakRealmSpec { private String displayName; + private String bundesland; + private KeycloakRealmSMTPServer smtpServer; @Getter 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 bd951e0..80cb9c1 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 @@ -78,6 +78,13 @@ class KeycloakRealmMapperTest { assertThat(mapped.getDefaultLocale()).isEqualTo("de"); } + @Test + void shouldHaveLoginTheme() { + var mapped = mapRealm(); + + assertThat(mapped.getLoginTheme()).isEqualTo("ozg-sh"); + } + @Test void shouldBeInternationalizationEnabled() { var mapped = mapRealm(); diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceThemeTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceThemeTest.java deleted file mode 100644 index ee49812..0000000 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmServiceThemeTest.java +++ /dev/null @@ -1,205 +0,0 @@ -package de.ozgcloud.operator.keycloak.realm; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.keycloak.representations.idm.RealmRepresentation; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import com.thedeanda.lorem.LoremIpsum; - -public class KeycloakRealmServiceThemeTest { - - public static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance(); - private static final String TARGET_BUNDESLAND = "by"; - private static final String BUNDESLAND_NAMESPACE_NAME = TARGET_BUNDESLAND + "-" + LOREM_IPSUM.getWords(1); - private static final String RESOLVED_THEME_NAME = "ozg-" + TARGET_BUNDESLAND; - - @Spy - @InjectMocks - private KeycloakRealmService service; - - @Mock - private KeycloakRealmRemoteService remoteService; - - @Mock - private KeycloakRealmMapper mapper; - - private RealmRepresentation realm; - - private final OzgCloudKeycloakRealmSpec spec = OzgCloudKeycloakRealmSpecTestFactory.create(); - - public static final String REALM_FIELD_LOGIN_THEME = "loginTheme"; - - @Nested - class CreateRealmWithThemeTest { - - @Test - void shouldCreateRealmUseAddTheme() { - prepareMocksWithRealm(BUNDESLAND_NAMESPACE_NAME); - - callCreateRealm(BUNDESLAND_NAMESPACE_NAME); - - verify(service).addRealmTheme(realm); - } - - @Test - void shouldRealmHaveTheme() { - prepareMocksWithRealm(BUNDESLAND_NAMESPACE_NAME); - - callCreateRealm(BUNDESLAND_NAMESPACE_NAME); - - assertThat(realm).extracting(REALM_FIELD_LOGIN_THEME).isEqualTo(RESOLVED_THEME_NAME); - } - - @Test - void shouldHaveNoThemeForAnyName(){ - String nonBundeslandNamespaceName = LOREM_IPSUM.getWords(1); - prepareMocksWithRealm(nonBundeslandNamespaceName); - - callCreateRealm(nonBundeslandNamespaceName); - - assertThat(realm).extracting(REALM_FIELD_LOGIN_THEME).isEqualTo(""); - } - - void prepareMocksWithRealm(String namespaceName) { - realm = RealmRepresentationTestFactory.create(namespaceName); - when(mapper.map(spec)).thenReturn(realm); - doNothing().when(remoteService).createRealm(realm); - doNothing().when(service).addUserProfileAttributes(realm); - } - - void callCreateRealm(String namespaceName) { - service.createRealm(spec, namespaceName); - } - } - - @Nested - class UpdateRealmWithThemeTest { - @Test - void shouldCallAddRealmTheme() { - prepareMocksWithRealm(); - - callService(); - - verify(service).addRealmTheme(realm); - } - - @Test - void shouldRealmHaveTheme() { - prepareMocksWithRealm(); - - callService(); - - assertThat(realm).extracting(REALM_FIELD_LOGIN_THEME).isEqualTo(RESOLVED_THEME_NAME); - } - - void prepareMocksWithRealm() { - realm = RealmRepresentationTestFactory.create(BUNDESLAND_NAMESPACE_NAME); - when(mapper.update(realm, spec)).thenReturn(realm); - doNothing().when(remoteService).updateRealm(realm); - doNothing().when(service).addUserProfileAttributes(realm); - } - - void callService() { - service.updateRealm(realm, spec); - } - - } - - @Nested - class CreateThemeTest { - @Test - void shouldReturnSameObject() { - RealmRepresentation mock = mock(RealmRepresentation.class); - - var result = callService(mock); - - assertThat(result).isSameAs(mock); - } - - @Test - void shouldCallGetBundesland() { - realm = RealmRepresentationTestFactory.create(BUNDESLAND_NAMESPACE_NAME); - - callService(realm); - - verify(service).getBundesland(BUNDESLAND_NAMESPACE_NAME); - } - - @Test - void shouldCallCreateRealmLoginTheme() { - realm = RealmRepresentationTestFactory.create(BUNDESLAND_NAMESPACE_NAME); - - callService(realm); - - verify(service).createRealmLoginThemeName(TARGET_BUNDESLAND); - } - - RealmRepresentation callService(RealmRepresentation realm) { - return service.addRealmTheme(realm); - } - } - - @Nested - class GetBundeslandThemeTest { - @Test - void shouldReturnTheme() { - var result = service.getBundesland(BUNDESLAND_NAMESPACE_NAME); - - assertThat(result).isEqualTo(TARGET_BUNDESLAND); - } - - @Test - void shouldReturnEmptyThemeIfNull() { - var result = service.getBundesland(null); - - assertThat(result).isEqualTo(""); - } - - @Test - void shouldReturnEmptyThemeIfEmpty() { - var result = service.getBundesland(""); - - assertThat(result).isEqualTo(""); - } - - @Test - void shouldReturnEmptyThemeIfGarbage() { - var result = service.getBundesland(LOREM_IPSUM.getWords(20)); - - assertThat(result).isEqualTo(""); - } - - } - - @Nested - class CreateRealmLoginThemeNameTest { - - @Test - void shouldCreateRealmLoginTheme() { - var realmLoginThemeName = service.createRealmLoginThemeName(TARGET_BUNDESLAND); - - assertThat(realmLoginThemeName).isEqualTo(RESOLVED_THEME_NAME); - } - - @Test - void shouldReturnEmptyThemeIfEmpty() { - var realmLoginThemeName = service.createRealmLoginThemeName(""); - - assertThat(realmLoginThemeName).isEqualTo(""); - } - - @Test - void shouldReturnEmptyThemeIfNull() { - var realmLoginThemeName = service.createRealmLoginThemeName(null); - - assertThat(realmLoginThemeName).isEqualTo(""); - } - } - -} diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java index 5c27b29..9d7ec9a 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java @@ -30,6 +30,7 @@ import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmSpec.RealmRole; public class OzgCloudKeycloakRealmSpecTestFactory { public final static String DISPLAY_NAME = "TestDisplayName"; + public final static String BUNDESLAND = "sh"; public final static boolean KEEP_AFTER_DELETE = false; public static final String ROLE_NAME_1 = "RoleName1"; @@ -46,6 +47,7 @@ public class OzgCloudKeycloakRealmSpecTestFactory { return OzgCloudKeycloakRealmSpec.builder() .keepAfterDelete(KEEP_AFTER_DELETE) .displayName(DISPLAY_NAME) + .bundesland(BUNDESLAND) .smtpServer(KeycloakRealmSmtpServerTestFactory.create()) .realmRoles(ROLES); } -- GitLab