blob: 2af5234a7329fae3497520fdcd9330ee5281b441 [file] [log] [blame]
margaretha4edc70e2018-03-14 22:34:29 +01001package de.ids_mannheim.korap.web.controller;
2
3import static org.junit.Assert.assertEquals;
4
margarethacf4b26f2018-03-19 21:42:06 +01005import javax.ws.rs.core.MediaType;
margaretha18533fd2018-03-28 16:01:06 +02006import javax.ws.rs.core.MultivaluedHashMap;
7import javax.ws.rs.core.MultivaluedMap;
margarethacf4b26f2018-03-19 21:42:06 +01008
margaretha4edc70e2018-03-14 22:34:29 +01009import org.junit.Test;
10import org.springframework.beans.factory.annotation.Autowired;
11
12import com.fasterxml.jackson.databind.JsonNode;
13import com.google.common.net.HttpHeaders;
14import com.sun.jersey.api.client.ClientHandlerException;
15import com.sun.jersey.api.client.ClientResponse;
16import com.sun.jersey.api.client.ClientResponse.Status;
17import com.sun.jersey.api.client.UniformInterfaceException;
margarethab1081b12018-07-03 23:35:01 +020018import com.sun.jersey.core.util.MultivaluedMapImpl;
margaretha4edc70e2018-03-14 22:34:29 +010019
20import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
21import de.ids_mannheim.korap.config.Attributes;
22import de.ids_mannheim.korap.config.SpringJerseyTest;
margarethacf4b26f2018-03-19 21:42:06 +010023import de.ids_mannheim.korap.constant.GroupMemberStatus;
24import de.ids_mannheim.korap.constant.PredefinedRole;
margaretha4edc70e2018-03-14 22:34:29 +010025import de.ids_mannheim.korap.exceptions.KustvaktException;
26import de.ids_mannheim.korap.utils.JsonUtils;
margarethacf4b26f2018-03-19 21:42:06 +010027import de.ids_mannheim.korap.web.input.UserGroupJson;
margaretha4edc70e2018-03-14 22:34:29 +010028
margarethaa0486272018-04-12 19:59:31 +020029/**
30 * @author margaretha
31 *
32 */
margaretha4edc70e2018-03-14 22:34:29 +010033public class UserGroupControllerAdminTest extends SpringJerseyTest {
34 @Autowired
35 private HttpAuthorizationHandler handler;
36
margarethacf4b26f2018-03-19 21:42:06 +010037 private String adminUsername = "admin";
38 private String testUsername = "UserGroupControllerAdminTest";
39
40 private JsonNode listGroup (String username)
41 throws UniformInterfaceException, ClientHandlerException,
42 KustvaktException {
margaretha4edc70e2018-03-14 22:34:29 +010043 ClientResponse response = resource().path("group").path("list")
margarethacf4b26f2018-03-19 21:42:06 +010044 .queryParam("username", username)
margaretha4edc70e2018-03-14 22:34:29 +010045 .header(Attributes.AUTHORIZATION,
margarethacf4b26f2018-03-19 21:42:06 +010046 handler.createBasicAuthorizationHeaderValue(
margaretha293ee032018-03-20 20:11:52 +010047 testUsername, "pass"))
48 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
49 .get(ClientResponse.class);
50
51 assertEquals(Status.OK.getStatusCode(), response.getStatus());
52 String entity = response.getEntity(String.class);
53 JsonNode node = JsonUtils.readTree(entity);
54 return node;
55 }
56
57 @Test
58 public void testListDoryGroups () throws KustvaktException {
59 ClientResponse response = resource().path("group").path("list")
60 .path("system-admin").queryParam("username", "dory")
61 .header(Attributes.AUTHORIZATION,
62 handler.createBasicAuthorizationHeaderValue(
margarethacf4b26f2018-03-19 21:42:06 +010063 adminUsername, "pass"))
margaretha4edc70e2018-03-14 22:34:29 +010064 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
65 .get(ClientResponse.class);
66
67 assertEquals(Status.OK.getStatusCode(), response.getStatus());
68 String entity = response.getEntity(String.class);
margarethab1081b12018-07-03 23:35:01 +020069 // System.out.println(entity);
margaretha4edc70e2018-03-14 22:34:29 +010070 JsonNode node = JsonUtils.readTree(entity);
margaretha293ee032018-03-20 20:11:52 +010071 assertEquals(3, node.size());
margarethacf4b26f2018-03-19 21:42:06 +010072 }
73
74 @Test
margaretha293ee032018-03-20 20:11:52 +010075 public void testListDoryActiveGroups () throws KustvaktException {
76 ClientResponse response = resource().path("group").path("list")
77 .path("system-admin").queryParam("username", "dory")
78 .queryParam("status", "ACTIVE")
79 .header(Attributes.AUTHORIZATION,
80 handler.createBasicAuthorizationHeaderValue(
81 adminUsername, "pass"))
82 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
83 .get(ClientResponse.class);
margaretha4edc70e2018-03-14 22:34:29 +010084
margaretha293ee032018-03-20 20:11:52 +010085 assertEquals(Status.OK.getStatusCode(), response.getStatus());
86 String entity = response.getEntity(String.class);
margarethab1081b12018-07-03 23:35:01 +020087 // System.out.println(entity);
margaretha293ee032018-03-20 20:11:52 +010088 JsonNode node = JsonUtils.readTree(entity);
89 assertEquals(2, node.size());
90 }
margaretha18533fd2018-03-28 16:01:06 +020091
92
margarethacf4b26f2018-03-19 21:42:06 +010093 // same as list user-groups of the admin
margaretha4edc70e2018-03-14 22:34:29 +010094 @Test
95 public void testListWithoutUsername () throws UniformInterfaceException,
96 ClientHandlerException, KustvaktException {
97 ClientResponse response = resource().path("group").path("list")
98 .header(Attributes.AUTHORIZATION,
margarethacf4b26f2018-03-19 21:42:06 +010099 handler.createBasicAuthorizationHeaderValue(
100 adminUsername, "pass"))
margaretha4edc70e2018-03-14 22:34:29 +0100101 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
102 .get(ClientResponse.class);
103
104 assertEquals(Status.OK.getStatusCode(), response.getStatus());
105 String entity = response.getEntity(String.class);
106 assertEquals("[]", entity);
107 }
108
margarethacf4b26f2018-03-19 21:42:06 +0100109 @Test
margaretha293ee032018-03-20 20:11:52 +0100110 public void testListByStatusAll () throws UniformInterfaceException,
111 ClientHandlerException, KustvaktException {
112 ClientResponse response =
113 resource().path("group").path("list").path("system-admin")
114 .header(Attributes.AUTHORIZATION,
115 handler.createBasicAuthorizationHeaderValue(
116 adminUsername, "pass"))
117 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
118 .get(ClientResponse.class);
119
120 assertEquals(Status.OK.getStatusCode(), response.getStatus());
121 String entity = response.getEntity(String.class);
margaretha293ee032018-03-20 20:11:52 +0100122 JsonNode node = JsonUtils.readTree(entity);
margaretha49cb6882018-07-04 04:19:54 +0200123 assertEquals(4, node.size());
124
margarethab1081b12018-07-03 23:35:01 +0200125 boolean containsHiddenStatus = false;
126 for (int i = 0; i < node.size(); i++) {
127 if (node.get(i).at("/status").asText().equals("HIDDEN")) {
128 containsHiddenStatus = true;
129 }
130 }
131 assertEquals(true, containsHiddenStatus);
margaretha293ee032018-03-20 20:11:52 +0100132 }
133
134 @Test
135 public void testListByStatusHidden () throws UniformInterfaceException,
136 ClientHandlerException, KustvaktException {
137 ClientResponse response = resource().path("group").path("list")
138 .path("system-admin").queryParam("status", "HIDDEN")
139 .header(Attributes.AUTHORIZATION,
140 handler.createBasicAuthorizationHeaderValue(
141 adminUsername, "pass"))
142 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
143 .get(ClientResponse.class);
144
145 assertEquals(Status.OK.getStatusCode(), response.getStatus());
146 String entity = response.getEntity(String.class);
147 JsonNode node = JsonUtils.readTree(entity);
148 assertEquals(1, node.size());
149 assertEquals(3, node.at("/0/id").asInt());
150 }
151
152 @Test
153 public void testUserGroup () throws UniformInterfaceException,
margarethacf4b26f2018-03-19 21:42:06 +0100154 ClientHandlerException, KustvaktException {
155
156 UserGroupJson json = new UserGroupJson();
157 json.setName("admin test group");
158 json.setMembers(new String[] { "marlin", "nemo" });
159
160 ClientResponse response = resource().path("group").path("create")
161 .type(MediaType.APPLICATION_JSON)
162 .header(Attributes.AUTHORIZATION,
163 handler.createBasicAuthorizationHeaderValue(
164 testUsername, "password"))
165 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").entity(json)
166 .post(ClientResponse.class);
167
168 assertEquals(Status.OK.getStatusCode(), response.getStatus());
169
170 // list user group
171 JsonNode node = listGroup(testUsername);
172 assertEquals(1, node.size());
173 node = node.get(0);
174 assertEquals("admin test group", node.get("name").asText());
175
176 String groupId = node.get("id").asText();
margaretha18533fd2018-03-28 16:01:06 +0200177 testMemberRole("marlin", groupId);
margaretha293ee032018-03-20 20:11:52 +0100178 testInviteMember(groupId);
179 testDeleteMember(groupId);
margarethacf4b26f2018-03-19 21:42:06 +0100180 testDeleteGroup(groupId);
181 }
182
margaretha18533fd2018-03-28 16:01:06 +0200183 private void testMemberRole (String memberUsername, String groupId)
184 throws UniformInterfaceException, ClientHandlerException,
185 KustvaktException {
186
187 // accept invitation
188 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
189 form.add("groupId", groupId);
190
191 ClientResponse response = resource().path("group").path("subscribe")
192 .type(MediaType.APPLICATION_FORM_URLENCODED)
193 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
194 .header(Attributes.AUTHORIZATION,
195 handler.createBasicAuthorizationHeaderValue("marlin",
196 "pass"))
197 .entity(form).post(ClientResponse.class);
198
199 assertEquals(Status.OK.getStatusCode(), response.getStatus());
200
201 testAddMemberRoles(groupId, memberUsername);
202 testDeleteMemberRoles(groupId, memberUsername);
203 }
204
205 private void testAddMemberRoles (String groupId, String memberUsername)
206 throws UniformInterfaceException, ClientHandlerException,
207 KustvaktException {
208 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
209 map.add("groupId", groupId.toString());
210 map.add("memberUsername", memberUsername);
211 map.add("roleIds", "1"); // USER_GROUP_ADMIN
212 map.add("roleIds", "2"); // USER_GROUP_MEMBER
213
214 ClientResponse response =
215 resource().path("group").path("member").path("role").path("add")
216 .type(MediaType.APPLICATION_FORM_URLENCODED)
217 .header(Attributes.AUTHORIZATION,
218 handler.createBasicAuthorizationHeaderValue(
219 adminUsername, "password"))
220 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
221 .entity(map).post(ClientResponse.class);
222
223 assertEquals(Status.OK.getStatusCode(), response.getStatus());
224
225 JsonNode node = retrieveGroup(groupId).at("/members");
226 JsonNode member;
227 for (int i = 0; i < node.size(); i++) {
228 member = node.get(i);
229 if (member.at("/userId").asText().equals(memberUsername)) {
230 assertEquals(3, member.at("/roles").size());
231 assertEquals(PredefinedRole.USER_GROUP_ADMIN.name(),
232 member.at("/roles/0").asText());
233 break;
234 }
235 }
236 }
237
238 private void testDeleteMemberRoles (String groupId, String memberUsername)
239 throws UniformInterfaceException, ClientHandlerException,
240 KustvaktException {
241 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
242 map.add("groupId", groupId.toString());
243 map.add("memberUsername", memberUsername);
244 map.add("roleIds", "1"); // USER_GROUP_ADMIN
245
246 ClientResponse response = resource().path("group").path("member")
247 .path("role").path("delete")
248 .type(MediaType.APPLICATION_FORM_URLENCODED)
249 .header(Attributes.AUTHORIZATION,
250 handler.createBasicAuthorizationHeaderValue(
251 adminUsername, "password"))
252 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").entity(map)
253 .post(ClientResponse.class);
254
255 assertEquals(Status.OK.getStatusCode(), response.getStatus());
256
257 JsonNode node = retrieveGroup(groupId).at("/members");
258 JsonNode member;
259 for (int i = 0; i < node.size(); i++) {
260 member = node.get(i);
261 if (member.at("/userId").asText().equals(memberUsername)) {
262 assertEquals(2, member.at("/roles").size());
263 break;
264 }
265 }
266 }
267
268 private JsonNode retrieveGroup (String groupId)
269 throws UniformInterfaceException, ClientHandlerException,
270 KustvaktException {
271 ClientResponse response = resource().path("group").path(groupId)
272 .header(Attributes.AUTHORIZATION,
273 handler.createBasicAuthorizationHeaderValue(
274 adminUsername, "pass"))
275 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
276 .get(ClientResponse.class);
277
278 assertEquals(Status.OK.getStatusCode(), response.getStatus());
279
280 String entity = response.getEntity(String.class);
281 JsonNode node = JsonUtils.readTree(entity);
282 return node;
283 }
284
margarethacf4b26f2018-03-19 21:42:06 +0100285 private void testDeleteGroup (String groupId)
286 throws UniformInterfaceException, ClientHandlerException,
287 KustvaktException {
margarethab1081b12018-07-03 23:35:01 +0200288 // delete group
margarethacf4b26f2018-03-19 21:42:06 +0100289 ClientResponse response = resource().path("group").path("delete")
290 .queryParam("groupId", groupId)
291 .header(Attributes.AUTHORIZATION,
292 handler.createBasicAuthorizationHeaderValue(
293 adminUsername, "pass"))
294 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
295 .delete(ClientResponse.class);
296
297 assertEquals(Status.OK.getStatusCode(), response.getStatus());
298
299 // check group
margaretha293ee032018-03-20 20:11:52 +0100300 JsonNode node = listGroup(testUsername);
301 assertEquals(0, node.size());
margarethacf4b26f2018-03-19 21:42:06 +0100302 }
303
304 private void testDeleteMember (String groupId)
305 throws UniformInterfaceException, ClientHandlerException,
306 KustvaktException {
307 // delete marlin from group
308 ClientResponse response = resource().path("group").path("member")
309 .path("delete").queryParam("memberId", "marlin")
310 .queryParam("groupId", groupId)
311 .header(Attributes.AUTHORIZATION,
312 handler.createBasicAuthorizationHeaderValue(
313 adminUsername, "pass"))
314 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
315 .delete(ClientResponse.class);
316
margarethae68021a2018-04-09 16:13:12 +0200317 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margarethab1081b12018-07-03 23:35:01 +0200318
margarethacf4b26f2018-03-19 21:42:06 +0100319 // check group member
320 JsonNode node = listGroup(testUsername);
321 node = node.get(0);
322 assertEquals(3, node.get("members").size());
323 assertEquals("nemo", node.at("/members/1/userId").asText());
324 assertEquals(GroupMemberStatus.PENDING.name(),
325 node.at("/members/1/status").asText());
326 }
327
328 private void testInviteMember (String groupId)
329 throws UniformInterfaceException, ClientHandlerException,
330 KustvaktException {
331 String[] members = new String[] { "darla" };
332
333 UserGroupJson userGroup = new UserGroupJson();
334 userGroup.setMembers(members);
335 userGroup.setId(Integer.parseInt(groupId));
336
337 ClientResponse response = resource().path("group").path("member")
338 .path("invite").type(MediaType.APPLICATION_JSON)
339 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
340 .header(Attributes.AUTHORIZATION,
341 handler.createBasicAuthorizationHeaderValue(
342 adminUsername, "pass"))
343 .entity(userGroup).post(ClientResponse.class);
344
345 assertEquals(Status.OK.getStatusCode(), response.getStatus());
346
347 // list group
348 JsonNode node = listGroup(testUsername);
349 node = node.get(0);
350 assertEquals(4, node.get("members").size());
351
352 assertEquals("darla", node.at("/members/3/userId").asText());
353 assertEquals(GroupMemberStatus.PENDING.name(),
354 node.at("/members/3/status").asText());
margaretha18533fd2018-03-28 16:01:06 +0200355 assertEquals(0, node.at("/members/3/roles").size());
margarethacf4b26f2018-03-19 21:42:06 +0100356 }
margaretha4edc70e2018-03-14 22:34:29 +0100357
358}