diff --git a/components/identity-mgt/org.wso2.carbon.identity.mgt/pom.xml b/components/identity-mgt/org.wso2.carbon.identity.mgt/pom.xml
index 6fd1b028a9e7..3f93dfa5214a 100644
--- a/components/identity-mgt/org.wso2.carbon.identity.mgt/pom.xml
+++ b/components/identity-mgt/org.wso2.carbon.identity.mgt/pom.xml
@@ -105,6 +105,16 @@
org.wso2.orbit.javax.xml.bind
jaxb-api
+
+ org.mockito
+ mockito-core
+ test
+
+
+ org.mockito
+ mockito-testng
+ test
+
org.testng
testng
diff --git a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/services/UserInformationRecoveryService.java b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/services/UserInformationRecoveryService.java
index 2a1f91aa84d6..9431dbb80190 100644
--- a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/services/UserInformationRecoveryService.java
+++ b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/services/UserInformationRecoveryService.java
@@ -206,7 +206,8 @@ private VerificationBean sendNotification(String username, String key, String no
return bean;
}
} catch (IdentityException e1) {
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e1, username);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e1, username);
if (bean.getError() == null) {
bean = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " Invalid confirmation code for user : "
+ username, e1);
@@ -244,7 +245,8 @@ private VerificationBean sendNotification(String username, String key, String no
} catch (IdentityException e) {
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e, username);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e, username);
if (bean.getError() == null) {
bean = handleError(VerificationBean.ERROR_CODE_RECOVERY_NOTIFICATION_FAILURE + ": " + VerificationBean.
ERROR_CODE_UNEXPECTED + " Error when sending recovery message for " +
@@ -319,7 +321,8 @@ public VerificationBean verifyConfirmationCode(String username, String code,
log.error(bean.getError());
}
} catch (IdentityException e) {
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e, username);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e, username);
if (bean.getError() == null) {
bean = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " Error verifying confirmation code for " +
"user : " + username, e);
@@ -397,7 +400,8 @@ public VerificationBean updatePassword(String username, String confirmationCode,
}
} catch (IdentityException e) {
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e, username);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e, username);
if (bean.getError() == null) {
bean = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " Error while updating credential " +
"for user: " + username, e);
@@ -696,7 +700,8 @@ public VerificationBean verifyUserChallengeAnswer(String userName, String confir
bean.setVerified(false);
}
} catch (IdentityException e) {
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e, userName);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e, userName);
if (bean == null) {
bean = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " " +
" Error verifying confirmation code for user : " + userName, e);
@@ -788,7 +793,8 @@ public VerificationBean verifyUserChallengeAnswers(String userName, String confi
}
} catch (IdentityException e) {
log.error("Error while verifying confirmation code.", e);
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e, userName);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e, userName);
if (bean == null) {
bean = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " " +
" Error verifying confirmation code for user : " + userName, e);
@@ -1089,14 +1095,15 @@ public VerificationBean registerUser(String userName, String password,
vBean.setVerified(true);
}
} catch (UserStoreException | IdentityException e) {
- vBean = UserIdentityManagementUtil.getCustomErrorMessagesWhenRegistering(e, userName);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ vBean = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(e, userName);
//Rollback if user exists
try {
if (!e.getMessage().contains(IdentityCoreConstants.EXISTING_USER) && userStoreManager.isExistingUser(userName)) {
userStoreManager.deleteUser(userName);
}
} catch (UserStoreException e1) {
- vBean = UserIdentityManagementUtil.getCustomErrorMessagesWhenRegistering(e1, userName);
+ vBean = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(e1, userName);
}
return vBean;
@@ -1213,7 +1220,8 @@ public VerificationBean resendSignUpConfiramtionCode(String userName, String cod
vBean.setVerified(true);
}
} catch (IdentityException e) {
- vBean = UserIdentityManagementUtil.getCustomErrorMessagesWhenRegistering(e, userName);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ vBean = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(e, userName);
return vBean;
}
} finally {
@@ -1321,7 +1329,8 @@ public VerificationBean confirmUserSelfRegistration(String username, String code
log.error("User verification failed against the given confirmation code");
}
} catch (IdentityException e) {
- bean = UserIdentityManagementUtil.getCustomErrorMessagesToVerifyCode(e, username);
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ bean = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(e, username);
if (bean.getError() == null) {
bean = handleError("Error while validating confirmation code for user : " + username, e);
}
diff --git a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/util/UserIdentityManagementUtil.java b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/util/UserIdentityManagementUtil.java
index 31b219b6dc31..8929bd7d5033 100644
--- a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/util/UserIdentityManagementUtil.java
+++ b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/main/java/org/wso2/carbon/identity/mgt/util/UserIdentityManagementUtil.java
@@ -85,8 +85,7 @@ public class UserIdentityManagementUtil {
private static UserChallengesCollectionDTO userChallengesCollectionDTO = new UserChallengesCollectionDTO();
private static Log log = LogFactory.getLog(UserIdentityManagementUtil.class);
- private UserIdentityManagementUtil() {
- }
+ private VerificationBean vBeanInstance = new VerificationBean();
/**
* Returns the registration information such as the temporary password or
@@ -631,6 +630,10 @@ private static String[] getUserList(int tenantId, String claim, String value, St
}
}
+ /**
+ * @deprecated Use {@link #retrieveCustomErrorMessagesForRegistration} instead.
+ */
+ @Deprecated
public static VerificationBean getCustomErrorMessagesWhenRegistering(Exception e, String userName) {
if (e.getMessage() != null) {
if (e.getMessage().contains(PASSWORD_INVALID)) {
@@ -688,6 +691,68 @@ public static VerificationBean getCustomErrorMessagesWhenRegistering(Exception e
}
}
+ public VerificationBean retrieveCustomErrorMessagesForRegistration(Exception e, String userName) {
+
+ if (e.getMessage() != null) {
+ if (e.getMessage().contains(PASSWORD_INVALID)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_CREDENTIALS +
+ " Credential not valid. Credential must be a non null for the user : " + userName, e);
+ } else if (e.getMessage().contains(EXISTING_USER)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_USER +
+ " Username '" + userName + "' already exists in the system. Please enter another username.", e);
+ } else if (e.getMessage().contains(INVALID_CLAIM_URL)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " Invalid claim uri has been provided.", e);
+ } else if (e.getMessage().contains(INVALID_USER_NAME)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_USER +
+ " Username " + userName + " is not valid. User name must be a non null", e);
+ } else if (e.getMessage().contains(READ_ONLY_STORE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " Read-only UserStoreManager. Roles cannot be added or modified.", e);
+ } else if (e.getMessage().contains(READ_ONLY_PRIMARY_STORE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " Cannot add role to Read Only user store unless it is primary.", e);
+ } else if (e.getMessage().contains(INVALID_ROLE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " Invalid role name. Role name must be a non null string.", e);
+ } else if (e.getMessage().contains(NO_READ_WRITE_PERMISSIONS)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " Role cannot be added. User store is read only or cannot write groups.", e);
+ } else if (e.getMessage().contains(EXISTING_ROLE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " Role already exists in the system. Please enter another role name.", e);
+ } else if (e.getMessage().contains(SHARED_USER_ROLES)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " User store doesn't support shared user roles functionality.", e);
+ } else if (e.getMessage().contains(REMOVE_ADMIN_USER)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " Cannot remove Admin user from Admin role.", e);
+ } else if (e.getMessage().contains(LOGGED_IN_USER)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " Cannot remove Admin user from Admin role.", e);
+ } else if (e.getMessage().contains(ADMIN_USER)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " Cannot remove Admin user from Admin role.", e);
+ } else if (e.getMessage().contains(ANONYMOUS_USER)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED +
+ " Cannot delete anonymous user.", e);
+ } else if (e.getMessage().contains(INVALID_OPERATION)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " Invalid operation. User store is read only.", e);
+ } else if (e.getMessage().contains(PASSWORD_POLICY_VIOLATION)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_UNEXPECTED + " " + e.getMessage(), e);
+ } else {
+ vBeanInstance = handleError(
+ VerificationBean.ERROR_CODE_UNEXPECTED + " Error occurred while adding user : " + userName, e);
+ return vBeanInstance;
+ }
+ return vBeanInstance;
+ } else {
+ vBeanInstance = handleError(
+ VerificationBean.ERROR_CODE_UNEXPECTED + " Error occurred while adding user : " + userName, e);
+ return vBeanInstance;
+ }
+ }
+
+ /**
+ * @deprecated Use {@link #getCustomErrorMessagesForCodeVerification} instead.
+ */
+ @Deprecated
public static VerificationBean getCustomErrorMessagesToVerifyCode(IdentityException e, String userName) {
if (e.getMessage() != null) {
if (e.getMessage().contains(VerificationBean.ERROR_CODE_EXPIRED_CODE)) {
@@ -726,6 +791,45 @@ public static VerificationBean getCustomErrorMessagesToVerifyCode(IdentityExcept
}
}
+ public VerificationBean getCustomErrorMessagesForCodeVerification(IdentityException e, String userName) {
+
+ if (e.getMessage() != null) {
+ if (e.getMessage().contains(VerificationBean.ERROR_CODE_EXPIRED_CODE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_EXPIRED_CODE + " The code is " + "expired", e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.INVALID_CONFIRMATION_CODE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " " +
+ IdentityMgtConstants.ErrorHandling.INVALID_CONFIRMATION_CODE, e);
+ } else if (e.getMessage().contains(VerificationBean.ERROR_CODE_LOADING_DATA_FAILURE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_LOADING_DATA_FAILURE + " Error" +
+ " loading data for user : " + userName, e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.EXTERNAL_CODE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " " +
+ IdentityMgtConstants.ErrorHandling.EXTERNAL_CODE + ": " + userName, e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.NOTIFICATION_FAILURE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_RECOVERY_NOTIFICATION_FAILURE + " " + IdentityMgtConstants.
+ ErrorHandling.NOTIFICATION_FAILURE + ": " + userName, e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.ERROR_LOADING_EMAIL_TEMP)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_RECOVERY_NOTIFICATION_FAILURE + ": " + IdentityMgtConstants.
+ ErrorHandling.ERROR_LOADING_EMAIL_TEMP + " " + userName, e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.EXTERNAL_CODE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + ": " + IdentityMgtConstants.
+ ErrorHandling.EXTERNAL_CODE + " " + userName, e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.CREATING_NOTIFICATION_ERROR)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_RECOVERY_NOTIFICATION_FAILURE + ": " + IdentityMgtConstants.
+ ErrorHandling.CREATING_NOTIFICATION_ERROR + " " + userName, e);
+ } else if (e.getMessage().contains(VerificationBean.ERROR_CODE_LOADING_DATA_FAILURE)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_LOADING_DATA_FAILURE + " Error" +
+ " loading data for user : " + userName, e);
+ } else if (e.getMessage().contains(IdentityMgtConstants.ErrorHandling.USER_ACCOUNT)) {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " No user account found for user", e);
+ }
+ return vBeanInstance;
+ } else {
+ vBeanInstance = handleError(VerificationBean.ERROR_CODE_INVALID_CODE + " No user account found for user", e);
+ return vBeanInstance;
+ }
+ }
+
public static ChallengeQuestionIdsDTO getCustomErrorMessagesForChallengeQuestionIds(Exception e, String userName) {
if (e.getMessage() != null) {
if (e.getMessage().contains(VerificationBean.ERROR_CODE_EXPIRED_CODE)) {
diff --git a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/java/services/UserInformationRecoveryServiceTest.java b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/java/services/UserInformationRecoveryServiceTest.java
new file mode 100644
index 000000000000..5501c0bacf05
--- /dev/null
+++ b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/java/services/UserInformationRecoveryServiceTest.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com).
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import org.mockito.MockedStatic;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.wso2.carbon.identity.base.IdentityException;
+import org.wso2.carbon.identity.mgt.IdentityMgtConfig;
+import org.wso2.carbon.identity.mgt.RecoveryProcessor;
+import org.wso2.carbon.identity.mgt.beans.VerificationBean;
+import org.wso2.carbon.identity.mgt.constants.IdentityMgtConstants;
+import org.wso2.carbon.identity.mgt.dto.UserChallengesDTO;
+import org.wso2.carbon.identity.mgt.dto.UserDTO;
+import org.wso2.carbon.identity.mgt.internal.IdentityMgtServiceComponent;
+import org.wso2.carbon.identity.mgt.services.UserInformationRecoveryService;
+import org.wso2.carbon.identity.mgt.util.UserIdentityManagementUtil;
+import org.wso2.carbon.identity.mgt.util.Utils;
+import org.wso2.carbon.user.api.UserStoreException;
+import org.wso2.carbon.user.core.service.RealmService;
+import org.wso2.carbon.user.core.tenant.TenantManager;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
+
+public class UserInformationRecoveryServiceTest {
+
+ private static final String EXISTING_USER = "Username already exists in the system";
+ private static final String INVALID_CLAIM_URL = "InvalidClaimUrl";
+ private static final String EXISTING_ROLE = "RoleExisting";
+ private static final String READ_ONLY_STORE = "User store is read only";
+ private static final String READ_ONLY_PRIMARY_STORE = "ReadOnlyPrimaryUserStoreManager";
+ private static final String INVALID_ROLE = "InvalidRole";
+ private static final String NO_READ_WRITE_PERMISSIONS = "NoReadWritePermission";
+ private static final String PASSWORD_INVALID = "Credential must be a non null string";
+ private static final String INVALID_USER_NAME = "InvalidUserName";
+ private static final String PASSWORD_POLICY_VIOLATION = "Password at least should have";;
+
+ private UserIdentityManagementUtil userIdentityManagementUtil;
+ private IdentityException mockIdentityException;
+ private Exception mockException;
+
+ @BeforeMethod
+ public void init() {
+
+ userIdentityManagementUtil = new UserIdentityManagementUtil();
+ mockIdentityException = mock(IdentityException.class);
+ mockException = mock(Exception.class);
+
+ }
+
+ @Test
+ public void testVerifyConfirmationCodeFailure() throws IdentityException, UserStoreException {
+
+ try (MockedStatic mockIdentityMgtConfig = mockStatic(IdentityMgtConfig.class);
+ MockedStatic utils = mockStatic(Utils.class);
+ MockedStatic identityMgtServiceComponent = mockStatic(IdentityMgtServiceComponent.class)) {
+
+ IdentityMgtConfig identityMgtConfig = mock(IdentityMgtConfig.class);
+ RealmService realmService = mock(RealmService.class);
+ RecoveryProcessor recoveryProcessor = mock(RecoveryProcessor.class);
+ TenantManager tenantManager = mock(TenantManager.class);
+
+ mockIdentityMgtConfig.when(IdentityMgtConfig::getInstance).thenReturn(identityMgtConfig);
+ utils.when(() -> Utils.processUserId(anyString())).thenReturn(new UserDTO(""));
+ identityMgtServiceComponent.when(IdentityMgtServiceComponent::getRealmService).thenReturn(realmService);
+ identityMgtServiceComponent.when(IdentityMgtServiceComponent::getRecoveryProcessor).thenReturn(recoveryProcessor);
+
+
+ when(realmService.getTenantManager()).thenReturn(tenantManager);
+ when(tenantManager.getTenantId(anyString())).thenReturn(-1234);
+ when(recoveryProcessor.verifyConfirmationCode(anyInt(), anyString(), anyString())).thenThrow(new IdentityException(""));
+
+ UserInformationRecoveryService userInformationRecoveryService = new UserInformationRecoveryService();
+ userInformationRecoveryService.verifyConfirmationCode("", "", null);
+ userInformationRecoveryService.updatePassword("", "", "");
+ userInformationRecoveryService.getUserChallengeQuestionIds("", "");
+ userInformationRecoveryService.getUserChallengeQuestion("", "", "");
+ userInformationRecoveryService.getUserChallengeQuestions("", "");
+ userInformationRecoveryService.verifyUserChallengeAnswer("", "", "", "");
+
+ UserChallengesDTO[] userChallengesDTOs = { new UserChallengesDTO() };
+ userInformationRecoveryService.verifyUserChallengeAnswers("", "", userChallengesDTOs);
+ }
+ }
+
+ @Test
+ public void testExpiredCode() {
+
+ when(mockIdentityException.getMessage()).thenReturn(VerificationBean.ERROR_CODE_EXPIRED_CODE);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18002 The code is expired", result.getError());
+ }
+
+ @Test
+ public void testInvalidConfirmationCode() {
+
+ when(mockIdentityException.getMessage()).thenReturn(IdentityMgtConstants.ErrorHandling.INVALID_CONFIRMATION_CODE);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18001 Invalid confirmation code ", result.getError());
+ }
+
+ @Test
+ public void testLoadingDataFailureCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(VerificationBean.ERROR_CODE_LOADING_DATA_FAILURE);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18014 Error loading data for user : testUser", result.getError());
+ }
+
+ @Test
+ public void testExternalCodeErrorCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(IdentityMgtConstants.ErrorHandling.EXTERNAL_CODE);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18001 Error occurred while getting external code for user : : testUser", result.getError());
+ }
+
+ @Test
+ public void testNotificationFailureCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(IdentityMgtConstants.ErrorHandling.NOTIFICATION_FAILURE);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18015 Notification sending failure. Notification address is not defined for user:: testUser", result.getError());
+ }
+
+ @Test
+ public void testErrorLoadingEmailTemplateCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(IdentityMgtConstants.ErrorHandling.ERROR_LOADING_EMAIL_TEMP);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18015: Error occurred while loading email templates for user : testUser", result.getError());
+ }
+
+ @Test
+ public void testCreatingNotificationErrorCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(IdentityMgtConstants.ErrorHandling.CREATING_NOTIFICATION_ERROR);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18015: Error occurred while creating notification for user : testUser", result.getError());
+ }
+
+ @Test
+ public void testNoUserAccountFoundCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(IdentityMgtConstants.ErrorHandling.USER_ACCOUNT);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18001 No user account found for user", result.getError());
+ }
+
+ @Test
+ public void testNullExceptionMessageCodeVerification() {
+
+ when(mockIdentityException.getMessage()).thenReturn(null);
+ VerificationBean result = userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(mockIdentityException, "testUser");
+ assertNotNull(result);
+ assertEquals("18001 No user account found for user", result.getError());
+ }
+
+ @Test
+ public void testInvalidPasswordRegistration() {
+
+ when(mockException.getMessage()).thenReturn(PASSWORD_INVALID);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("17002 Credential not valid. Credential must be a non null for the user : testUser", result.getError());
+ }
+
+ @Test
+ public void testExistingUserRegistration() {
+
+ when(mockException.getMessage()).thenReturn(EXISTING_USER);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18003 Username 'testUser' already exists in the system. Please enter another username.", result.getError());
+ }
+
+ @Test
+ public void testInvalidClaimUrlRegistration() {
+
+ when(mockException.getMessage()).thenReturn(INVALID_CLAIM_URL);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Invalid claim uri has been provided.", result.getError());
+ }
+
+ @Test
+ public void testInvalidUserNameRegistration() {
+
+ when(mockException.getMessage()).thenReturn(INVALID_USER_NAME);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18003 Username testUser is not valid. User name must be a non null", result.getError());
+ }
+
+ @Test
+ public void testReadOnlyStoreRegistration() {
+
+ when(mockException.getMessage()).thenReturn(READ_ONLY_STORE);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Read-only UserStoreManager. Roles cannot be added or modified.", result.getError());
+ }
+
+ @Test
+ public void testReadOnlyPrimaryStoreRegistration() {
+
+ when(mockException.getMessage()).thenReturn(READ_ONLY_PRIMARY_STORE);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Cannot add role to Read Only user store unless it is primary.", result.getError());
+ }
+
+ @Test
+ public void testInvalidRoleRegistration() {
+
+ when(mockException.getMessage()).thenReturn(INVALID_ROLE);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Invalid role name. Role name must be a non null string.", result.getError());
+ }
+
+ @Test
+ public void testNoReadWritePermissionsRegistration() {
+
+ when(mockException.getMessage()).thenReturn(NO_READ_WRITE_PERMISSIONS);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Role cannot be added. User store is read only or cannot write groups.", result.getError());
+ }
+
+ @Test
+ public void testExistingRoleRegistration() {
+
+ when(mockException.getMessage()).thenReturn(EXISTING_ROLE);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Role already exists in the system. Please enter another role name.", result.getError());
+ }
+
+ @Test
+ public void testPasswordPolicyViolationRegistration() {
+
+ when(mockException.getMessage()).thenReturn(PASSWORD_POLICY_VIOLATION);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 " + PASSWORD_POLICY_VIOLATION, result.getError());
+ }
+
+ @Test
+ public void testUnexpectedErrorRegistration() {
+
+ when(mockException.getMessage()).thenReturn("Some unexpected error");
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Error occurred while adding user : testUser", result.getError());
+ }
+
+ @Test
+ public void testNullExceptionMessageRegistration() {
+
+ when(mockException.getMessage()).thenReturn(null);
+ VerificationBean result = userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(mockException, "testUser");
+ assertNotNull(result);
+ assertEquals("18013 Error occurred while adding user : testUser", result.getError());
+ }
+}
diff --git a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/java/util/UserIdentityManagementUtilTest.java b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/java/util/UserIdentityManagementUtilTest.java
new file mode 100644
index 000000000000..a6b80bc1e1ea
--- /dev/null
+++ b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/java/util/UserIdentityManagementUtilTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com).
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package util;
+
+import org.testng.annotations.Test;
+import org.wso2.carbon.identity.base.IdentityException;
+import org.wso2.carbon.identity.mgt.util.UserIdentityManagementUtil;
+
+public class UserIdentityManagementUtilTest {
+
+ private static final String MOCK_USER = "john";
+
+ @Test
+ public void testRetrieveCustomErrorMessagesForRegistration() {
+
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ userIdentityManagementUtil.retrieveCustomErrorMessagesForRegistration(new Exception(), MOCK_USER);
+ }
+
+ @Test
+ public void testGetCustomErrorMessagesForCodeVerification() {
+
+ UserIdentityManagementUtil userIdentityManagementUtil = new UserIdentityManagementUtil();
+ userIdentityManagementUtil.getCustomErrorMessagesForCodeVerification(new IdentityException(""), MOCK_USER);
+ }
+}
diff --git a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/resources/testng.xml b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/resources/testng.xml
index c0347e5f7599..260ded681d7f 100644
--- a/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/resources/testng.xml
+++ b/components/identity-mgt/org.wso2.carbon.identity.mgt/src/test/resources/testng.xml
@@ -24,6 +24,8 @@
+
+