blob: 7cedc2bfe05e821c4ed6e1d845458da0c5c10938 [file] [log] [blame]
margaretha845f22f2024-07-18 12:33:00 +02001package de.ids_mannheim.korap.web.controller.usergroup;
margaretha4edc70e2018-03-14 22:34:29 +01002
Marc Kupietzd43a98d2023-09-22 17:11:46 +02003import static org.junit.jupiter.api.Assertions.assertEquals;
margaretha4edc70e2018-03-14 22:34:29 +01004
Marc Kupietzd43a98d2023-09-22 17:11:46 +02005import org.junit.jupiter.api.Test;
margaretha845f22f2024-07-18 12:33:00 +02006
margaretha4edc70e2018-03-14 22:34:29 +01007import com.fasterxml.jackson.databind.JsonNode;
8import com.google.common.net.HttpHeaders;
margaretha4edc70e2018-03-14 22:34:29 +01009
10import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
11import de.ids_mannheim.korap.config.Attributes;
margarethacf4b26f2018-03-19 21:42:06 +010012import de.ids_mannheim.korap.constant.PredefinedRole;
margaretha4edc70e2018-03-14 22:34:29 +010013import de.ids_mannheim.korap.exceptions.KustvaktException;
margarethabdde7f42023-02-10 08:24:03 +010014import de.ids_mannheim.korap.exceptions.StatusCodes;
15import de.ids_mannheim.korap.service.UserGroupService;
margaretha4edc70e2018-03-14 22:34:29 +010016import de.ids_mannheim.korap.utils.JsonUtils;
margaretha845f22f2024-07-18 12:33:00 +020017import jakarta.ws.rs.ProcessingException;
18import jakarta.ws.rs.client.Entity;
19import jakarta.ws.rs.core.Form;
20import jakarta.ws.rs.core.MediaType;
21import jakarta.ws.rs.core.Response;
22import jakarta.ws.rs.core.Response.Status;
margaretha4edc70e2018-03-14 22:34:29 +010023
margarethaa0486272018-04-12 19:59:31 +020024/**
25 * @author margaretha
margarethaa0486272018-04-12 19:59:31 +020026 */
margaretha845f22f2024-07-18 12:33:00 +020027public class UserGroupControllerAdminTest extends UserGroupTestBase {
margaretha4edc70e2018-03-14 22:34:29 +010028
margarethabdde7f42023-02-10 08:24:03 +010029 private String testUser = "group-admin";
margarethacf4b26f2018-03-19 21:42:06 +010030
margaretha35e1ca22023-11-16 22:00:01 +010031 private JsonNode listGroup (String username)
32 throws ProcessingException, KustvaktException {
33 Response response = target().path(API_VERSION).path("group").request()
34 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
35 .createBasicAuthorizationHeaderValue(testUser, "pass"))
36 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").get();
margaretha293ee032018-03-20 20:11:52 +010037 assertEquals(Status.OK.getStatusCode(), response.getStatus());
abcpro173fe8f22022-11-08 19:56:52 +000038 String entity = response.readEntity(String.class);
margaretha293ee032018-03-20 20:11:52 +010039 JsonNode node = JsonUtils.readTree(entity);
40 return node;
41 }
42
43 @Test
margaretha35e1ca22023-11-16 22:00:01 +010044 public void testListUserGroupsUsingAdminToken () throws KustvaktException {
margaretha845f22f2024-07-18 12:33:00 +020045 createDoryGroup();
46
47 createMarlinGroup();
48 inviteMember(marlinGroupName, "marlin", "dory");
49 subscribe(marlinGroupName, "dory");
50
51 String testGroup = "test-group";
52 createUserGroup("test-group", "Test group to be deleted.", "marlin");
53 inviteMember(testGroup, "marlin", "dory");
54 subscribe(testGroup, "dory");
55 deleteGroupByName("test-group", "marlin");
56
57
margarethabdde7f42023-02-10 08:24:03 +010058 Form f = new Form();
59 f.param("username", "dory");
60 f.param("token", "secret");
margaretha35e1ca22023-11-16 22:00:01 +010061 Response response = target().path(API_VERSION).path("admin")
62 .path("group").path("list").request()
63 .header(HttpHeaders.CONTENT_TYPE,
64 MediaType.APPLICATION_FORM_URLENCODED)
65 .post(Entity.form(f));
margaretha4edc70e2018-03-14 22:34:29 +010066 assertEquals(Status.OK.getStatusCode(), response.getStatus());
abcpro173fe8f22022-11-08 19:56:52 +000067 String entity = response.readEntity(String.class);
margaretha4edc70e2018-03-14 22:34:29 +010068 JsonNode node = JsonUtils.readTree(entity);
margaretha845f22f2024-07-18 12:33:00 +020069 assertEquals(2, node.size());
70
71 testListUserGroupsWithStatus();
72
73 deleteGroupByName(doryGroupName, "dory");
74 deleteGroupByName(marlinGroupName, "marlin");
margarethacf4b26f2018-03-19 21:42:06 +010075 }
Marc Kupietzd43a98d2023-09-22 17:11:46 +020076
margarethabdde7f42023-02-10 08:24:03 +010077 /**
78 * Cannot use admin token
79 * see
Marc Kupietzd43a98d2023-09-22 17:11:46 +020080 * {@link UserGroupService#retrieveUserGroupByStatus(String,
margarethabdde7f42023-02-10 08:24:03 +010081 * String, de.ids_mannheim.korap.constant.UserGroupStatus)}
Marc Kupietzd43a98d2023-09-22 17:11:46 +020082 *
margarethabdde7f42023-02-10 08:24:03 +010083 * @throws KustvaktException
84 */
Marc Kupietzd43a98d2023-09-22 17:11:46 +020085 // @Test
86 // public void testListUserGroupsWithAdminToken () throws KustvaktException {
87 // Response response = target().path(API_VERSION).path("group")
88 // .path("list").path("system-admin")
89 // .queryParam("username", "dory")
90 // .queryParam("token", "secret")
91 // .request()
92 // .get();
93 //
94 // assertEquals(Status.OK.getStatusCode(), response.getStatus());
95 // String entity = response.readEntity(String.class);
96 // JsonNode node = JsonUtils.readTree(entity);
97 // assertEquals(3, node.size());
98 // }
margarethabdde7f42023-02-10 08:24:03 +010099 @Test
margaretha35e1ca22023-11-16 22:00:01 +0100100 public void testListUserGroupsUnauthorized () throws KustvaktException {
margarethabdde7f42023-02-10 08:24:03 +0100101 Form f = new Form();
102 f.param("username", "dory");
margaretha35e1ca22023-11-16 22:00:01 +0100103 Response response = target().path(API_VERSION).path("admin")
104 .path("group").path("list").request()
105 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
106 .createBasicAuthorizationHeaderValue(testUser, "pass"))
107 .header(HttpHeaders.CONTENT_TYPE,
108 MediaType.APPLICATION_FORM_URLENCODED)
109 .post(Entity.form(f));
margarethabdde7f42023-02-10 08:24:03 +0100110 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
111 String entity = response.readEntity(String.class);
112 JsonNode node = JsonUtils.readTree(entity);
margaretha35e1ca22023-11-16 22:00:01 +0100113 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
114 node.at("/errors/0/0").asInt());
margarethabdde7f42023-02-10 08:24:03 +0100115 }
margarethacf4b26f2018-03-19 21:42:06 +0100116
margaretha845f22f2024-07-18 12:33:00 +0200117 private void testListUserGroupsWithStatus () throws KustvaktException {
margarethabdde7f42023-02-10 08:24:03 +0100118 Form f = new Form();
119 f.param("username", "dory");
120 f.param("status", "ACTIVE");
margaretha845f22f2024-07-18 12:33:00 +0200121
margaretha35e1ca22023-11-16 22:00:01 +0100122 Response response = target().path(API_VERSION).path("admin")
123 .path("group").path("list").queryParam("username", "dory")
124 .queryParam("status", "ACTIVE").request()
125 .header(Attributes.AUTHORIZATION,
126 HttpAuthorizationHandler
127 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200128 admin, "pass"))
margaretha35e1ca22023-11-16 22:00:01 +0100129 .header(HttpHeaders.CONTENT_TYPE,
130 MediaType.APPLICATION_FORM_URLENCODED)
131 .post(Entity.form(f));
margaretha293ee032018-03-20 20:11:52 +0100132 assertEquals(Status.OK.getStatusCode(), response.getStatus());
abcpro173fe8f22022-11-08 19:56:52 +0000133 String entity = response.readEntity(String.class);
margaretha293ee032018-03-20 20:11:52 +0100134 JsonNode node = JsonUtils.readTree(entity);
135 assertEquals(2, node.size());
136 }
margaretha18533fd2018-03-28 16:01:06 +0200137
margarethacf4b26f2018-03-19 21:42:06 +0100138 // same as list user-groups of the admin
margaretha4edc70e2018-03-14 22:34:29 +0100139 @Test
margaretha35e1ca22023-11-16 22:00:01 +0100140 public void testListWithoutUsername ()
141 throws ProcessingException, KustvaktException {
142 Response response = target().path(API_VERSION).path("group").request()
143 .header(Attributes.AUTHORIZATION,
144 HttpAuthorizationHandler
145 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200146 admin, "pass"))
margaretha35e1ca22023-11-16 22:00:01 +0100147 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").get();
margaretha4edc70e2018-03-14 22:34:29 +0100148 assertEquals(Status.OK.getStatusCode(), response.getStatus());
abcpro173fe8f22022-11-08 19:56:52 +0000149 String entity = response.readEntity(String.class);
Marc Kupietzd43a98d2023-09-22 17:11:46 +0200150 assertEquals(entity, "[]");
margaretha4edc70e2018-03-14 22:34:29 +0100151 }
152
margarethacf4b26f2018-03-19 21:42:06 +0100153 @Test
margaretha35e1ca22023-11-16 22:00:01 +0100154 public void testListByStatusAll ()
155 throws ProcessingException, KustvaktException {
156 Response response = target().path(API_VERSION).path("admin")
157 .path("group").path("list").request()
158 .header(Attributes.AUTHORIZATION,
159 HttpAuthorizationHandler
160 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200161 admin, "pass"))
margaretha35e1ca22023-11-16 22:00:01 +0100162 .header(HttpHeaders.CONTENT_TYPE,
163 MediaType.APPLICATION_FORM_URLENCODED)
164 .post(null);
margaretha293ee032018-03-20 20:11:52 +0100165 assertEquals(Status.OK.getStatusCode(), response.getStatus());
abcpro173fe8f22022-11-08 19:56:52 +0000166 String entity = response.readEntity(String.class);
margaretha293ee032018-03-20 20:11:52 +0100167 JsonNode node = JsonUtils.readTree(entity);
margarethab1081b12018-07-03 23:35:01 +0200168 boolean containsHiddenStatus = false;
169 for (int i = 0; i < node.size(); i++) {
170 if (node.get(i).at("/status").asText().equals("HIDDEN")) {
171 containsHiddenStatus = true;
172 }
173 }
174 assertEquals(true, containsHiddenStatus);
margaretha293ee032018-03-20 20:11:52 +0100175 }
176
177 @Test
margaretha7568f782024-07-25 09:55:39 +0200178 public void testListHiddenGroups ()
margaretha35e1ca22023-11-16 22:00:01 +0100179 throws ProcessingException, KustvaktException {
margaretha7568f782024-07-25 09:55:39 +0200180 JsonNode node = listHiddenGroup();
margaretha293ee032018-03-20 20:11:52 +0100181 assertEquals(1, node.size());
margaretha293ee032018-03-20 20:11:52 +0100182 }
183
184 @Test
margaretha35e1ca22023-11-16 22:00:01 +0100185 public void testUserGroupAdmin ()
186 throws ProcessingException, KustvaktException {
margarethada5a6ab2019-11-08 10:06:05 +0100187 String groupName = "admin-test-group";
margaretha845f22f2024-07-18 12:33:00 +0200188 Response response = createUserGroup(groupName, "test group", testUser);
margarethaca7cff82019-11-12 12:06:37 +0100189 assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
margarethacf4b26f2018-03-19 21:42:06 +0100190 // list user group
margaretha03b195a2019-11-12 14:57:15 +0100191 JsonNode node = listGroup(testUser);
margarethacf4b26f2018-03-19 21:42:06 +0100192 assertEquals(1, node.size());
193 node = node.get(0);
margarethada5a6ab2019-11-08 10:06:05 +0100194 assertEquals(groupName, node.get("name").asText());
margarethaa18ab2b2019-11-11 12:55:26 +0100195 testInviteMember(groupName);
margaretha845f22f2024-07-18 12:33:00 +0200196 subscribe(groupName, "marlin");
margaretha58995292024-07-31 12:02:45 +0200197 testAddAdminRole(groupName, "marlin");
margaretha845f22f2024-07-18 12:33:00 +0200198 testDeleteMemberRoles(groupName, "marlin");
margarethaa18ab2b2019-11-11 12:55:26 +0100199 testDeleteMember(groupName);
margaretha845f22f2024-07-18 12:33:00 +0200200
201 // delete group
margaretha58995292024-07-31 12:02:45 +0200202 deleteGroupByName(groupName, admin);
margaretha845f22f2024-07-18 12:33:00 +0200203 // check group
204 node = listGroup(testUser);
205 assertEquals(0, node.size());
margarethacf4b26f2018-03-19 21:42:06 +0100206 }
207
margaretha18533fd2018-03-28 16:01:06 +0200208
margaretha58995292024-07-31 12:02:45 +0200209 private void testAddAdminRole (String groupName, String memberUsername)
margaretha35e1ca22023-11-16 22:00:01 +0100210 throws ProcessingException, KustvaktException {
margaretha58995292024-07-31 12:02:45 +0200211 Response response = addAdminRole(groupName, memberUsername, admin);
212 assertEquals(Status.OK.getStatusCode(), response.getStatus());
213
margarethaa18ab2b2019-11-11 12:55:26 +0100214 JsonNode node = retrieveGroup(groupName).at("/members");
margaretha18533fd2018-03-28 16:01:06 +0200215 JsonNode member;
216 for (int i = 0; i < node.size(); i++) {
217 member = node.get(i);
218 if (member.at("/userId").asText().equals(memberUsername)) {
margaretha2b533302024-07-31 13:49:15 +0200219 assertEquals(6, member.at("/privileges").size());
margaretha18533fd2018-03-28 16:01:06 +0200220 break;
221 }
222 }
223 }
224
margaretha35e1ca22023-11-16 22:00:01 +0100225 private void testDeleteMemberRoles (String groupName, String memberUsername)
226 throws ProcessingException, KustvaktException {
abcpro173fe8f22022-11-08 19:56:52 +0000227 Form form = new Form();
228 form.param("memberUsername", memberUsername);
Marc Kupietzd43a98d2023-09-22 17:11:46 +0200229 // USER_GROUP_ADMIN
margaretha777ef102024-07-22 10:10:50 +0200230 form.param("role", PredefinedRole.GROUP_ADMIN.name());
margaretha35e1ca22023-11-16 22:00:01 +0100231 Response response = target().path(API_VERSION).path("group")
232 .path("@" + groupName).path("role").path("delete").request()
233 .header(Attributes.AUTHORIZATION,
234 HttpAuthorizationHandler
235 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200236 admin, "password"))
margaretha35e1ca22023-11-16 22:00:01 +0100237 .post(Entity.form(form));
margaretha18533fd2018-03-28 16:01:06 +0200238 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margarethaa18ab2b2019-11-11 12:55:26 +0100239 JsonNode node = retrieveGroup(groupName).at("/members");
margaretha18533fd2018-03-28 16:01:06 +0200240 JsonNode member;
241 for (int i = 0; i < node.size(); i++) {
242 member = node.get(i);
243 if (member.at("/userId").asText().equals(memberUsername)) {
margaretha2b533302024-07-31 13:49:15 +0200244 assertEquals(1, member.at("/privileges").size());
margaretha18533fd2018-03-28 16:01:06 +0200245 break;
246 }
247 }
248 }
249
margaretha35e1ca22023-11-16 22:00:01 +0100250 private JsonNode retrieveGroup (String groupName)
251 throws ProcessingException, KustvaktException {
252 Response response = target().path(API_VERSION).path("admin")
253 .path("group").path("@" + groupName).request()
254 .header(Attributes.AUTHORIZATION,
255 HttpAuthorizationHandler
256 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200257 admin, "pass"))
margaretha35e1ca22023-11-16 22:00:01 +0100258 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").post(null);
margaretha18533fd2018-03-28 16:01:06 +0200259 assertEquals(Status.OK.getStatusCode(), response.getStatus());
abcpro173fe8f22022-11-08 19:56:52 +0000260 String entity = response.readEntity(String.class);
margaretha18533fd2018-03-28 16:01:06 +0200261 JsonNode node = JsonUtils.readTree(entity);
262 return node;
263 }
264
margaretha35e1ca22023-11-16 22:00:01 +0100265 private void testDeleteMember (String groupName)
266 throws ProcessingException, KustvaktException {
margarethacf4b26f2018-03-19 21:42:06 +0100267 // delete marlin from group
margaretha35e1ca22023-11-16 22:00:01 +0100268 Response response = target().path(API_VERSION).path("group")
269 .path("@" + groupName).path("~marlin").request()
270 .header(Attributes.AUTHORIZATION,
271 HttpAuthorizationHandler
272 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200273 admin, "pass"))
margaretha35e1ca22023-11-16 22:00:01 +0100274 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").delete();
margarethae68021a2018-04-09 16:13:12 +0200275 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margarethacf4b26f2018-03-19 21:42:06 +0100276 // check group member
margaretha03b195a2019-11-12 14:57:15 +0100277 JsonNode node = listGroup(testUser);
margarethacf4b26f2018-03-19 21:42:06 +0100278 node = node.get(0);
279 assertEquals(3, node.get("members").size());
Marc Kupietzd43a98d2023-09-22 17:11:46 +0200280 assertEquals(node.at("/members/1/userId").asText(), "nemo");
margarethacf4b26f2018-03-19 21:42:06 +0100281 }
282
margaretha35e1ca22023-11-16 22:00:01 +0100283 private void testInviteMember (String groupName)
284 throws ProcessingException, KustvaktException {
abcpro173fe8f22022-11-08 19:56:52 +0000285 Form form = new Form();
286 form.param("members", "marlin,nemo,darla");
margaretha35e1ca22023-11-16 22:00:01 +0100287 Response response = target().path(API_VERSION).path("group")
288 .path("@" + groupName).path("invite").request()
289 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
290 .header(Attributes.AUTHORIZATION,
291 HttpAuthorizationHandler
292 .createBasicAuthorizationHeaderValue(
margaretha58995292024-07-31 12:02:45 +0200293 admin, "pass"))
margaretha35e1ca22023-11-16 22:00:01 +0100294 .post(Entity.form(form));
margarethacf4b26f2018-03-19 21:42:06 +0100295 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margarethacf4b26f2018-03-19 21:42:06 +0100296 // list group
margaretha03b195a2019-11-12 14:57:15 +0100297 JsonNode node = listGroup(testUser);
margarethacf4b26f2018-03-19 21:42:06 +0100298 node = node.get(0);
299 assertEquals(4, node.get("members").size());
Marc Kupietzd43a98d2023-09-22 17:11:46 +0200300 assertEquals(node.at("/members/3/userId").asText(), "darla");
margaretha2b533302024-07-31 13:49:15 +0200301 assertEquals(0, node.at("/members/1/privileges").size());
margarethacf4b26f2018-03-19 21:42:06 +0100302 }
margaretha4edc70e2018-03-14 22:34:29 +0100303}