Skip to content

Commit 849265c

Browse files
complete user sharing integration tests for success and failure scenarios.
1 parent 8b5022c commit 849265c

File tree

6 files changed

+2969
-374
lines changed

6 files changed

+2969
-374
lines changed

modules/integration/tests-integration/tests-backend/pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,12 @@
986986
<artifactId>swagger-request-validator-restassured</artifactId>
987987
<scope>test</scope>
988988
</dependency>
989+
<dependency>
990+
<groupId>org.awaitility</groupId>
991+
<artifactId>awaitility</artifactId>
992+
<version>4.2.0</version>
993+
<scope>test</scope>
994+
</dependency>
989995
<dependency>
990996
<groupId>org.apache.logging.log4j</groupId>
991997
<artifactId>log4j-jul</artifactId>

modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/user/sharing/management/v1/UserSharingBaseTest.java

+866-148
Large diffs are not rendered by default.

modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/user/sharing/management/v1/UserSharingFailureTest.java

+1,233
Large diffs are not rendered by default.

modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/user/sharing/management/v1/UserSharingSuccessTest.java

+599-217
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
/*
2+
* Copyright (c) 2025, WSO2 LLC. (http://www.wso2.com).
3+
*
4+
* WSO2 LLC. licenses this file to you under the Apache License,
5+
* Version 2.0 (the "License"); you may not use this file except
6+
* in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing,
12+
* software distributed under the License is distributed on an
13+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
* KIND, either express or implied. See the License for the
15+
* specific language governing permissions and limitations
16+
* under the License.
17+
*/
18+
19+
package org.wso2.identity.integration.test.rest.api.server.user.sharing.management.v1.constant;
20+
21+
/**
22+
* Constants for organization user sharing.
23+
*/
24+
public class UserSharingConstants {
25+
26+
public static final String API_DEFINITION_NAME = "organization-user-share.yaml";
27+
public static final String AUTHORIZED_APIS_JSON = "user-sharing-apis.json";
28+
public static final String API_VERSION = "v1";
29+
public static final String API_PACKAGE_NAME =
30+
"org.wso2.carbon.identity.api.server.organization.user.sharing.management.v1";
31+
32+
public static final String API_SERVER_V1_BASE_PATH = "/api/server/v1";
33+
public static final String ORGANIZATION_API_PATH = "/o";
34+
public static final String USER_SHARING_API_BASE_PATH = "/users";
35+
public static final String SHARE_PATH = "/share";
36+
public static final String SHARE_WITH_ALL_PATH = "/share-with-all";
37+
public static final String UNSHARE_PATH = "/unshare";
38+
public static final String UNSHARE_WITH_ALL_PATH = "/unshare-with-all";
39+
public static final String SHARED_ORGANIZATIONS_PATH = "/shared-organizations";
40+
public static final String SHARED_ROLES_PATH = "/shared-roles";
41+
42+
public static final String PATH_SEPARATOR = "/";
43+
public static final String QUERY_PARAM_SEPARATOR = "?";
44+
public static final String QUERY_PARAM_VALUE_SEPARATOR = "=";
45+
public static final String UNDERSCORE = "_";
46+
47+
public static final String HEADER_AUTHORIZATION = "Authorization";
48+
public static final String HEADER_AUTHORIZATION_VALUE_BEARER = "Bearer ";
49+
public static final String HEADER_CONTENT_TYPE = "Content-Type";
50+
51+
public static final String SHARED_TYPE_SHARED = "SHARED";
52+
public static final String SHARED_TYPE_OWNER = "OWNER";
53+
public static final String SHARED_TYPE_INVITED = "INVITED";
54+
55+
public static final String PATH_PARAM_USER_ID = "userId";
56+
public static final String QUERY_PARAM_ORG_ID = "orgId";
57+
public static final String QUERY_PARAM_LIMIT = "limit";
58+
public static final String QUERY_PARAM_AFTER = "after";
59+
public static final String QUERY_PARAM_BEFORE = "before";
60+
public static final String QUERY_PARAM_FILTER = "filter";
61+
public static final String QUERY_PARAM_RECURSIVE = "recursive";
62+
63+
public static final String ERROR_CODE_BAD_REQUEST = "UE-10000";
64+
public static final String ERROR_CODE_INVALID_PAGINATION_CURSOR = "ORG-60026";
65+
public static final String ERROR_CODE_SERVER_ERROR = "SE-50000";
66+
67+
public static final String ROOT_ORG_NAME = "Super";
68+
public static final String L1_ORG_1_NAME = "L1 - Organization 1";
69+
public static final String L1_ORG_2_NAME = "L1 - Organization 2";
70+
public static final String L1_ORG_3_NAME = "L1 - Organization 3";
71+
public static final String L2_ORG_1_NAME = "L2 - Organization 1";
72+
public static final String L2_ORG_2_NAME = "L2 - Organization 2";
73+
public static final String L2_ORG_3_NAME = "L2 - Organization 3";
74+
public static final String L3_ORG_1_NAME = "L3 - Organization 1";
75+
76+
public static final String ROOT_ORG_ID = "10084a8d-113f-4211-a0d5-efe36b082211";
77+
78+
public static final String APP_1_NAME = "App 1";
79+
public static final String APP_2_NAME = "App 2";
80+
81+
public static final String APPLICATION_AUDIENCE = "application";
82+
public static final String ORGANIZATION_AUDIENCE = "organization";
83+
84+
public static final String APP_ROLE_1 = "app-role-1";
85+
public static final String APP_ROLE_2 = "app-role-2";
86+
public static final String APP_ROLE_3 = "app-role-3";
87+
public static final String ORG_ROLE_1 = "org-role-1";
88+
public static final String ORG_ROLE_2 = "org-role-2";
89+
public static final String ORG_ROLE_3 = "org-role-3";
90+
91+
public static final String USER_DOMAIN_PRIMARY = "PRIMARY";
92+
93+
public static final String ROOT_ORG_USER_1_USERNAME = "rootUser1";
94+
public static final String ROOT_ORG_USER_2_USERNAME = "rootUser2";
95+
public static final String ROOT_ORG_USER_3_USERNAME = "rootUser3";
96+
public static final String L1_ORG_1_USER_1_USERNAME = "l1Org1User1";
97+
public static final String L1_ORG_1_USER_2_USERNAME = "l1Org1User2";
98+
public static final String L1_ORG_1_USER_3_USERNAME = "l1Org1User3";
99+
public static final String ROOT_ORG_USER_DUPLICATED_USERNAME = "rootUserDuplicated";
100+
101+
public static final String MAP_KEY_SELECTIVE_ORG_ID = "orgId";
102+
public static final String MAP_KEY_SELECTIVE_ORG_NAME = "orgName";
103+
public static final String MAP_KEY_SELECTIVE_POLICY = "selectivePolicy";
104+
public static final String MAP_KEY_SELECTIVE_ROLES = "selectiveRoles";
105+
106+
public static final String MAP_KEY_GENERAL_POLICY = "generalPolicy";
107+
public static final String MAP_KEY_GENERAL_ROLES = "generalRoles";
108+
109+
public static final String MAP_KEY_EXPECTED_ORG_COUNT = "expectedOrgCount";
110+
public static final String MAP_KEY_EXPECTED_ORG_IDS = "expectedOrgIds";
111+
public static final String MAP_KEY_EXPECTED_ORG_NAMES = "expectedOrgNames";
112+
public static final String MAP_KEY_EXPECTED_ROLES_PER_EXPECTED_ORG = "expectedRolesPerExpectedOrg";
113+
114+
public static final String MAP_ORG_DETAILS_KEY_ORG_NAME = "orgName";
115+
public static final String MAP_ORG_DETAILS_KEY_ORG_ID = "orgId";
116+
public static final String MAP_ORG_DETAILS_KEY_PARENT_ORG_ID = "parentOrgId";
117+
public static final String MAP_ORG_DETAILS_KEY_ORG_SWITCH_TOKEN = "orgSwitchToken";
118+
public static final String MAP_ORG_DETAILS_KEY_ORG_LEVEL = "orgLevel";
119+
120+
public static final String MAP_APP_DETAILS_KEY_APP_NAME = "appName";
121+
public static final String MAP_APP_DETAILS_KEY_APP_ID = "appId";
122+
public static final String MAP_APP_DETAILS_KEY_APP_AUDIENCE = "appAudience";
123+
public static final String MAP_APP_DETAILS_KEY_CLIENT_ID = "clientId";
124+
public static final String MAP_APP_DETAILS_KEY_CLIENT_SECRET = "clientSecret";
125+
public static final String MAP_APP_DETAILS_KEY_ROLE_NAMES = "roleNames";
126+
public static final String MAP_APP_DETAILS_KEY_ROLE_IDS_BY_NAME = "roleIdsByName";
127+
public static final String MAP_APP_DETAILS_KEY_APP_DETAILS_OF_SUB_ORGS = "appDetailsOfSubOrgs";
128+
public static final String MAP_APP_DETAILS_KEY_APP_SUB_ORG_NAME = "subOrgName";
129+
130+
public static final String MAP_USER_DETAILS_KEY_DOMAIN_QUALIFIED_USER_NAME = "domainQualifiedUserName";
131+
public static final String MAP_USER_DETAILS_KEY_USER_NAME = "userName";
132+
public static final String MAP_USER_DETAILS_KEY_USER_ID = "userId";
133+
public static final String MAP_USER_DETAILS_KEY_USER_DOMAIN = "userDomain";
134+
public static final String MAP_USER_DETAILS_KEY_USER_ORG_NAME = "userOrgName";
135+
public static final String MAP_USER_DETAILS_KEY_USER_ORG_ID = "userOrgId";
136+
public static final String MAP_USER_DETAILS_KEY_USER_ORG_LEVEL = "userOrgLevel";
137+
public static final String MAP_USER_DETAILS_KEY_IS_ROOT_ORG_USER = "isRootOrgUser";
138+
139+
public static final String MAP_USER_DOMAIN_QUALIFIED_USER_NAME_USER_NAME = "userName";
140+
public static final String MAP_USER_DOMAIN_QUALIFIED_USER_NAME_USER_DOMAIN = "userDomain";
141+
142+
public static final String SCOPE_INTERNAL_USER_SHARE = "internal_user_share";
143+
public static final String SCOPE_INTERNAL_USER_UNSHARE = "internal_user_unshare";
144+
public static final String SCOPE_INTERNAL_USER_SHARED_ACCESS_VIEW = "internal_user_shared_access_view";
145+
public static final String SCOPE_INTERNAL_ORG_USER_SHARE = "internal_org_user_share";
146+
public static final String SCOPE_INTERNAL_ORG_USER_UNSHARE = "internal_org_user_unshare";
147+
public static final String SCOPE_INTERNAL_ORG_USER_SHARED_ACCESS_VIEW = "internal_org_user_shared_access_view";
148+
149+
public static final String GRANT_AUTHORIZATION_CODE = "authorization_code";
150+
public static final String GRANT_IMPLICIT = "implicit";
151+
public static final String GRANT_PASSWORD = "password";
152+
public static final String GRANT_CLIENT_CREDENTIALS = "client_credentials";
153+
public static final String GRANT_REFRESH_TOKEN = "refresh_token";
154+
public static final String GRANT_ORGANIZATION_SWITCH = "organization_switch";
155+
156+
public static final String CLAIM_EMAIL_URI = "http://wso2.org/claims/emailaddress";
157+
public static final String CLAIM_COUNTRY_URI = "http://wso2.org/claims/country";
158+
public static final String CLAIM_ROLES_URI = "http://wso2.org/claims/roles";
159+
public static final String CLAIM_GROUPS_URI = "http://wso2.org/claims/groups";
160+
161+
public static final String ATTRIBUTE_USER_PASSWORD = "Admin123";
162+
public static final String ATTRIBUTE_USER_EMAIL_DOMAIN = "@gmail.com";
163+
public static final String ATTRIBUTE_USER_SCHEMA_SCIM2_USER = "urn:ietf:params:scim:schemas:core:2.0:User";
164+
165+
public static final String RESPONSE_STATUS = "status";
166+
public static final String RESPONSE_DETAILS = "details";
167+
public static final String RESPONSE_STATUS_VALUE = "Processing";
168+
public static final String RESPONSE_DETAIL_VALUE_SHARING = "User sharing process triggered successfully.";
169+
public static final String RESPONSE_DETAIL_VALUE_UNSHARING = "User unsharing process triggered successfully.";
170+
171+
public static final String RESPONSE_LINKS_SIZE = "links.size()";
172+
public static final String RESPONSE_LINKS_EMPTY = "links[0].isEmpty()";
173+
public static final String RESPONSE_LINKS_SHARED_ORGS = "sharedOrganizations";
174+
public static final String RESPONSE_LINKS_SHARED_ORGS_SIZE = "sharedOrganizations.size()";
175+
public static final String RESPONSE_LINKS_SHARED_ORGS_ID = "sharedOrganizations.orgId";
176+
public static final String RESPONSE_LINKS_SHARED_ORGS_NAME = "sharedOrganizations.orgName";
177+
public static final String RESPONSE_LINKS_SHARED_ORGS_SHARED_USER_ID = "sharedOrganizations.sharedUserId";
178+
public static final String RESPONSE_LINKS_SHARED_ORGS_SHARED_TYPE = "sharedOrganizations.sharedType";
179+
public static final String RESPONSE_LINKS_SHARED_ORGS_ROLES_REF = "sharedOrganizations.rolesRef";
180+
public static final String RESPONSE_LINKS_SHARED_ORGS_ROLES = "roles";
181+
public static final String RESPONSE_LINKS_SHARED_ORGS_ROLES_SIZE = "roles.size()";
182+
public static final String RESPONSE_LINKS_SHARED_ORGS_ROLES_NAME = "roles.displayName";
183+
public static final String RESPONSE_LINKS_SHARED_ORGS_ROLES_AUDIENCE_NAME = "roles.audience.display";
184+
public static final String RESPONSE_LINKS_SHARED_ORGS_ROLES_AUDIENCE_TYPE = "roles.audience.type";
185+
186+
public static final String ERROR_SETUP_SWAGGER_DEFINITION = "Unable to read the swagger definition %s from %s";
187+
public static final String SHARED_USER_ID_JSON_PATH =
188+
"sharedOrganizations.find { it.orgName == '%s' }.sharedUserId";
189+
}

modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/restclients/UserSharingRestClient.java

+76-9
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import org.apache.http.client.methods.CloseableHttpResponse;
2525
import org.apache.http.message.BasicHeader;
2626
import org.testng.Assert;
27-
import org.wso2.carbon.automation.engine.context.TestUserMode;
2827
import org.wso2.carbon.automation.engine.context.beans.Tenant;
2928
import org.wso2.identity.integration.common.utils.ISIntegrationTest;
29+
import org.wso2.identity.integration.test.rest.api.server.user.sharing.management.v1.model.UserShareRequestBody;
3030
import org.wso2.identity.integration.test.rest.api.server.user.sharing.management.v1.model.UserShareWithAllRequestBody;
31+
import org.wso2.identity.integration.test.rest.api.server.user.sharing.management.v1.model.UserUnshareRequestBody;
32+
import org.wso2.identity.integration.test.rest.api.server.user.sharing.management.v1.model.UserUnshareWithAllRequestBody;
3133

3234
import java.io.IOException;
3335

@@ -39,13 +41,25 @@
3941
public class UserSharingRestClient extends RestBaseClient {
4042

4143
private static final String API_SERVER_BASE_PATH = "/api/server/v1";
42-
public static final String USER_SHARE_WITH_ALL_ENDPOINT_URI = "/users/share-with-all";
44+
static final String USER_SHARING_API_BASE_PATH = "/users";
45+
static final String SHARE_PATH = "/share";
46+
static final String SHARE_WITH_ALL_PATH = "/share-with-all";
47+
static final String UNSHARE_PATH = "/unshare";
48+
static final String UNSHARE_WITH_ALL_PATH = "/unshare-with-all";
49+
static final String SHARED_ORGANIZATIONS_PATH = "/shared-organizations";
50+
static final String SHARED_ROLES_PATH = "/shared-roles";
51+
4352
public static final String PATH_SEPARATOR = "/";
53+
4454
private final String serverUrl;
4555
private final String tenantDomain;
4656
private final String username;
4757
private final String password;
48-
private final String userShareWithAllBasePath;
58+
59+
private final String selectiveUserShareEndpoint;
60+
private final String generalUserShareEndpoint;
61+
private final String selectiveUserUnshareEndpoint;
62+
private final String generalUserUnshareEndpoint;
4963

5064
public UserSharingRestClient(String serverUrl, Tenant tenantInfo) {
5165

@@ -54,24 +68,77 @@ public UserSharingRestClient(String serverUrl, Tenant tenantInfo) {
5468
this.username = tenantInfo.getContextUser().getUserName();
5569
this.password = tenantInfo.getContextUser().getPassword();
5670

57-
userShareWithAllBasePath = serverUrl +
58-
ISIntegrationTest.getTenantedRelativePath(API_SERVER_BASE_PATH + USER_SHARE_WITH_ALL_ENDPOINT_URI,
59-
tenantDomain);
71+
selectiveUserShareEndpoint = serverUrl + ISIntegrationTest.getTenantedRelativePath(
72+
API_SERVER_BASE_PATH + USER_SHARING_API_BASE_PATH + SHARE_PATH, tenantDomain);
73+
generalUserShareEndpoint = serverUrl + ISIntegrationTest.getTenantedRelativePath(
74+
API_SERVER_BASE_PATH + USER_SHARING_API_BASE_PATH + SHARE_WITH_ALL_PATH, tenantDomain);
75+
selectiveUserUnshareEndpoint = serverUrl + ISIntegrationTest.getTenantedRelativePath(
76+
API_SERVER_BASE_PATH + USER_SHARING_API_BASE_PATH + UNSHARE_PATH, tenantDomain);
77+
generalUserUnshareEndpoint = serverUrl + ISIntegrationTest.getTenantedRelativePath(
78+
API_SERVER_BASE_PATH + USER_SHARING_API_BASE_PATH + UNSHARE_WITH_ALL_PATH, tenantDomain);
79+
}
80+
81+
/**
82+
* Share users selectively.
83+
*
84+
* @param userShareRequestBody Selective User Share request body.
85+
* @throws Exception If an error occurs while sharing users selectively.
86+
*/
87+
public void shareUsers(UserShareRequestBody userShareRequestBody) throws Exception {
88+
89+
String jsonRequest = toJSONString(userShareRequestBody);
90+
try (CloseableHttpResponse response = getResponseOfHttpPost(selectiveUserShareEndpoint, jsonRequest,
91+
getHeaders())) {
92+
Assert.assertEquals(response.getStatusLine().getStatusCode(), HttpServletResponse.SC_ACCEPTED,
93+
"Selective User Sharing request accepted.");
94+
}
6095
}
6196

6297
/**
6398
* Share users with all.
6499
*
65-
* @param userShareWithAllRequestBody User share with all request body.
100+
* @param userShareWithAllRequestBody General User Share request body.
66101
* @throws Exception If an error occurs while sharing users with all.
67102
*/
68103
public void shareUsersWithAll(UserShareWithAllRequestBody userShareWithAllRequestBody) throws Exception {
69104

70105
String jsonRequest = toJSONString(userShareWithAllRequestBody);
71-
try (CloseableHttpResponse response = getResponseOfHttpPost(userShareWithAllBasePath, jsonRequest,
106+
try (CloseableHttpResponse response = getResponseOfHttpPost(generalUserShareEndpoint, jsonRequest,
107+
getHeaders())) {
108+
Assert.assertEquals(response.getStatusLine().getStatusCode(), HttpServletResponse.SC_ACCEPTED,
109+
"General User Sharing request accepted.");
110+
}
111+
}
112+
113+
/**
114+
* Unshare users selectively.
115+
*
116+
* @param userUnshareRequestBody Selective User Unshare request body.
117+
* @throws Exception If an error occurs while unsharing users selectively.
118+
*/
119+
public void unshareUsers(UserUnshareRequestBody userUnshareRequestBody) throws Exception {
120+
121+
String jsonRequest = toJSONString(userUnshareRequestBody);
122+
try (CloseableHttpResponse response = getResponseOfHttpPost(selectiveUserUnshareEndpoint, jsonRequest,
123+
getHeaders())) {
124+
Assert.assertEquals(response.getStatusLine().getStatusCode(), HttpServletResponse.SC_ACCEPTED,
125+
"Selective User Unsharing request accepted.");
126+
}
127+
}
128+
129+
/**
130+
* Unshare users with all.
131+
*
132+
* @param userUnshareWithAllRequestBody General User Unshare request body.
133+
* @throws Exception If an error occurs while unsharing users with all.
134+
*/
135+
public void unshareUsersWithAll(UserUnshareWithAllRequestBody userUnshareWithAllRequestBody) throws Exception {
136+
137+
String jsonRequest = toJSONString(userUnshareWithAllRequestBody);
138+
try (CloseableHttpResponse response = getResponseOfHttpPost(generalUserUnshareEndpoint, jsonRequest,
72139
getHeaders())) {
73140
Assert.assertEquals(response.getStatusLine().getStatusCode(), HttpServletResponse.SC_ACCEPTED,
74-
"User sharing request accepted.");
141+
"General User Unsharing request accepted.");
75142
}
76143
}
77144

0 commit comments

Comments
 (0)