From 17c2f165386ec686c7667f0d50e192248c02b0d5 Mon Sep 17 00:00:00 2001 From: sadilchamishka Date: Sun, 30 Mar 2025 13:09:22 +0530 Subject: [PATCH 1/4] Add integration test for efficient filtering multivalued attributes --- .../management/v1/model/LocalClaimRes.java | 13 +++++++ .../test/scim2/SCIM2BaseTestCase.java | 2 + .../test/scim2/SCIM2UserTestCase.java | 38 +++++++++++++++++++ pom.xml | 2 +- 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java index 6e36b444afe..0d5d37f6811 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java @@ -40,6 +40,7 @@ public class LocalClaimRes { private String regEx = null; private Boolean required = null; private Boolean supportedByDefault = null; + private Boolean multiValued = null; public enum UniquenessScopeEnum { NONE, WITHIN_USERSTORE, ACROSS_USERSTORES, @@ -209,6 +210,18 @@ public void setSupportedByDefault(Boolean supportedByDefault) { this.supportedByDefault = supportedByDefault; } + /** + * Specifies if the claim can hold multiple values. + **/ + @ApiModelProperty(value = "Specifies if the claim can hold multiple values.") + @JsonProperty("multiValued") + public Boolean getMultiValued() { + return multiValued; + } + public void setMultiValued(Boolean multiValued) { + this.multiValued = multiValued; + } + /** * Specifies the scope of uniqueness validation for the claim value. **/ diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java index aa839a65a78..753afc8bcab 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java @@ -42,6 +42,7 @@ public class SCIM2BaseTestCase extends ISIntegrationTest { public static final String GIVEN_NAME_ATTRIBUTE = "givenName"; public static final String EMAIL_TYPE_WORK_ATTRIBUTE = "work"; public static final String EMAIL_TYPE_HOME_ATTRIBUTE = "home"; + public static final String EMAIL_ADDRESSES_ATTRIBUTE = "emailAddresses"; public static final String ID_ATTRIBUTE = "id"; public static final String PASSWORD_ATTRIBUTE = "password"; public static final String EMAILS_ATTRIBUTE = "emails"; @@ -59,6 +60,7 @@ public class SCIM2BaseTestCase extends ISIntegrationTest { public static final String LIST_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:ListResponse"; public static final String RESOURCE_TYPE_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:ResourceType"; public static final String ERROR_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:Error"; + public static final String USER_SYSTEM_SCHEMA_ATTRIBUTE ="urn:scim:wso2:schema"; private ServerConfigurationManager serverConfigurationManager; diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java index c1e3dfddc7a..ed8fa441fc1 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java @@ -51,7 +51,9 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.EMAILS_ATTRIBUTE; +import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.EMAIL_ADDRESSES_ATTRIBUTE; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.EMAIL_TYPE_HOME_ATTRIBUTE; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.EMAIL_TYPE_WORK_ATTRIBUTE; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.ERROR_SCHEMA; @@ -69,6 +71,7 @@ import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.SERVER_URL; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.TYPE_PARAM; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.USER_NAME_ATTRIBUTE; +import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.USER_SYSTEM_SCHEMA_ATTRIBUTE; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.VALUE_PARAM; public class SCIM2UserTestCase extends ISIntegrationTest { @@ -160,6 +163,13 @@ public void testCreateUser() throws Exception { rootObject.put(PASSWORD_ATTRIBUTE, PASSWORD); + JSONArray emailAddresses = new JSONArray(); + emailAddresses.add(EMAIL_TYPE_WORK_CLAIM_VALUE); + emailAddresses.add(EMAIL_TYPE_HOME_CLAIM_VALUE); + JSONObject emailAddressesObject = new JSONObject(); + emailAddressesObject.put(EMAIL_ADDRESSES_ATTRIBUTE, emailAddresses); + rootObject.put(USER_SYSTEM_SCHEMA_ATTRIBUTE, emailAddressesObject); + StringEntity entity = new StringEntity(rootObject.toString()); request.setEntity(entity); @@ -301,6 +311,7 @@ public void testFilterUser() throws Exception { validateFilteredUser(USER_NAME_ATTRIBUTE, CONTAINS, USERNAME.substring(2, 4)); validateFilteredUser(USER_NAME_ATTRIBUTE, STARTWITH, USERNAME.substring(0, 3)); validateFilteredUser(USER_NAME_ATTRIBUTE, ENDWITH, USERNAME.substring(4, USERNAME.length())); + validateFilteredUserByEmailAddresses(EMAIL_ADDRESSES_ATTRIBUTE, CONTAINS, EMAIL_TYPE_WORK_CLAIM_VALUE); } private void validateFilteredUser(String attributeName, String operator, String attributeValue) throws IOException { @@ -325,6 +336,33 @@ private void validateFilteredUser(String attributeName, String operator, String assertEquals(userId, this.userId); } + private void validateFilteredUserByEmailAddresses(String attributeName, String operator, String attributeValue) + throws IOException { + + String userResourcePath = getPath() + "?filter=" + USER_SYSTEM_SCHEMA_ATTRIBUTE + ":" + attributeName + operator + + attributeValue; + HttpGet request = new HttpGet(userResourcePath); + request.addHeader(HttpHeaders.AUTHORIZATION, getAuthzHeader()); + request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + request.addHeader(HttpHeaders.ACCEPT, "application/scim+json"); + HttpResponse response = client.execute(request); + assertEquals(response.getStatusLine().getStatusCode(), 200, "User " + + "has not been retrieved successfully"); + + Object responseObj = JSONValue.parse(EntityUtils.toString(response.getEntity())); + EntityUtils.consume(response.getEntity()); + + JSONArray emailsArray = ((JSONArray)((JSONObject)((JSONObject) ((JSONArray) ((JSONObject) responseObj) + .get("Resources")).get(0)).get(USER_SYSTEM_SCHEMA_ATTRIBUTE)).get(attributeName)); + + for (Object email : emailsArray) { + if (email.equals(attributeValue)) { + return; + } + } + fail(); + } + @Test(dependsOnMethods = "testFilterUser") public void testDeleteUser() throws Exception { String userResourcePath = getPath() + "/" + userId; diff --git a/pom.xml b/pom.xml index bfd207b9a39..b88b642c738 100755 --- a/pom.xml +++ b/pom.xml @@ -2574,7 +2574,7 @@ 2.0.17 - 1.3.94 + 1.3.95-SNAPSHOT 1.3.61 5.5.9 From a2d5552a38a6186e6aa121797edb17b7eeeb0a3c Mon Sep 17 00:00:00 2001 From: sadilchamishka Date: Sun, 30 Mar 2025 15:28:59 +0530 Subject: [PATCH 2/4] Address review comments --- .../integration/test/scim2/SCIM2BaseTestCase.java | 2 +- .../integration/test/scim2/SCIM2UserTestCase.java | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java index 753afc8bcab..e28a53ec9c2 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2BaseTestCase.java @@ -60,7 +60,7 @@ public class SCIM2BaseTestCase extends ISIntegrationTest { public static final String LIST_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:ListResponse"; public static final String RESOURCE_TYPE_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:ResourceType"; public static final String ERROR_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:Error"; - public static final String USER_SYSTEM_SCHEMA_ATTRIBUTE ="urn:scim:wso2:schema"; + public static final String USER_SYSTEM_SCHEMA = "urn:scim:wso2:schema"; private ServerConfigurationManager serverConfigurationManager; diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java index ed8fa441fc1..a1f5589500d 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java @@ -25,7 +25,6 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPatch; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; @@ -41,7 +40,6 @@ import org.testng.annotations.Test; import org.wso2.carbon.automation.engine.context.AutomationContext; import org.wso2.carbon.automation.engine.context.TestUserMode; -import org.wso2.carbon.integration.common.utils.LoginLogoutClient; import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import org.wso2.identity.integration.common.clients.claim.metadata.mgt.ClaimMetadataManagementServiceClient; import org.wso2.identity.integration.common.utils.ISIntegrationTest; @@ -71,7 +69,7 @@ import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.SERVER_URL; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.TYPE_PARAM; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.USER_NAME_ATTRIBUTE; -import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.USER_SYSTEM_SCHEMA_ATTRIBUTE; +import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.USER_SYSTEM_SCHEMA; import static org.wso2.identity.integration.test.scim2.SCIM2BaseTestCase.VALUE_PARAM; public class SCIM2UserTestCase extends ISIntegrationTest { @@ -168,7 +166,7 @@ public void testCreateUser() throws Exception { emailAddresses.add(EMAIL_TYPE_HOME_CLAIM_VALUE); JSONObject emailAddressesObject = new JSONObject(); emailAddressesObject.put(EMAIL_ADDRESSES_ATTRIBUTE, emailAddresses); - rootObject.put(USER_SYSTEM_SCHEMA_ATTRIBUTE, emailAddressesObject); + rootObject.put(USER_SYSTEM_SCHEMA, emailAddressesObject); StringEntity entity = new StringEntity(rootObject.toString()); request.setEntity(entity); @@ -339,7 +337,7 @@ private void validateFilteredUser(String attributeName, String operator, String private void validateFilteredUserByEmailAddresses(String attributeName, String operator, String attributeValue) throws IOException { - String userResourcePath = getPath() + "?filter=" + USER_SYSTEM_SCHEMA_ATTRIBUTE + ":" + attributeName + operator + String userResourcePath = getPath() + "?filter=" + USER_SYSTEM_SCHEMA + ":" + attributeName + operator + attributeValue; HttpGet request = new HttpGet(userResourcePath); request.addHeader(HttpHeaders.AUTHORIZATION, getAuthzHeader()); @@ -352,8 +350,9 @@ private void validateFilteredUserByEmailAddresses(String attributeName, String o Object responseObj = JSONValue.parse(EntityUtils.toString(response.getEntity())); EntityUtils.consume(response.getEntity()); - JSONArray emailsArray = ((JSONArray)((JSONObject)((JSONObject) ((JSONArray) ((JSONObject) responseObj) - .get("Resources")).get(0)).get(USER_SYSTEM_SCHEMA_ATTRIBUTE)).get(attributeName)); + JSONObject userResources = ((JSONObject) ((JSONArray) ((JSONObject) responseObj) + .get("Resources")).get(0)); + JSONArray emailsArray = (JSONArray) ((JSONObject) userResources.get(USER_SYSTEM_SCHEMA)).get(attributeName); for (Object email : emailsArray) { if (email.equals(attributeValue)) { From 274d8fc475fe5078d145b7c994b86f00b8467367 Mon Sep 17 00:00:00 2001 From: sadilchamishka Date: Sun, 30 Mar 2025 15:33:02 +0530 Subject: [PATCH 3/4] Address review comments --- .../api/server/claim/management/v1/model/LocalClaimRes.java | 1 + .../wso2/identity/integration/test/scim2/SCIM2UserTestCase.java | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java index 0d5d37f6811..a578a609493 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/claim/management/v1/model/LocalClaimRes.java @@ -218,6 +218,7 @@ public void setSupportedByDefault(Boolean supportedByDefault) { public Boolean getMultiValued() { return multiValued; } + public void setMultiValued(Boolean multiValued) { this.multiValued = multiValued; } diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java index a1f5589500d..b16224aedd7 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java @@ -354,7 +354,7 @@ private void validateFilteredUserByEmailAddresses(String attributeName, String o .get("Resources")).get(0)); JSONArray emailsArray = (JSONArray) ((JSONObject) userResources.get(USER_SYSTEM_SCHEMA)).get(attributeName); - for (Object email : emailsArray) { + for (Object email: emailsArray) { if (email.equals(attributeValue)) { return; } diff --git a/pom.xml b/pom.xml index b88b642c738..bfd207b9a39 100755 --- a/pom.xml +++ b/pom.xml @@ -2574,7 +2574,7 @@ 2.0.17 - 1.3.95-SNAPSHOT + 1.3.94 1.3.61 5.5.9 From a9c1141535abf1a8157e1281fc821cddbcca1866 Mon Sep 17 00:00:00 2001 From: sadilchamishka Date: Thu, 17 Apr 2025 00:15:00 +0530 Subject: [PATCH 4/4] Update test case --- .../wso2/identity/integration/test/scim2/SCIM2UserTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java index b16224aedd7..a60ef3ca576 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/scim2/SCIM2UserTestCase.java @@ -309,7 +309,7 @@ public void testFilterUser() throws Exception { validateFilteredUser(USER_NAME_ATTRIBUTE, CONTAINS, USERNAME.substring(2, 4)); validateFilteredUser(USER_NAME_ATTRIBUTE, STARTWITH, USERNAME.substring(0, 3)); validateFilteredUser(USER_NAME_ATTRIBUTE, ENDWITH, USERNAME.substring(4, USERNAME.length())); - validateFilteredUserByEmailAddresses(EMAIL_ADDRESSES_ATTRIBUTE, CONTAINS, EMAIL_TYPE_WORK_CLAIM_VALUE); + validateFilteredUserByEmailAddresses(EMAIL_ADDRESSES_ATTRIBUTE, CONTAINS, EMAIL_TYPE_HOME_CLAIM_VALUE); } private void validateFilteredUser(String attributeName, String operator, String attributeValue) throws IOException {