blob: be39d02141488900e40d4dbbe2a403b771e23b0d [file] [log] [blame]
margaretha541b8cc2018-01-10 13:02:46 +01001package de.ids_mannheim.korap.web.controller;
margaretha0b63de42017-12-20 18:48:09 +01002
3import static org.junit.Assert.assertEquals;
4
margaretha9d3eb042017-12-22 11:02:30 +01005import javax.ws.rs.core.MediaType;
6import javax.ws.rs.core.MultivaluedMap;
7
margaretha0b63de42017-12-20 18:48:09 +01008import org.junit.Test;
9import org.springframework.beans.factory.annotation.Autowired;
10
11import com.fasterxml.jackson.databind.JsonNode;
margaretha58e18632018-02-15 13:04:42 +010012import com.google.common.net.HttpHeaders;
margaretha45667922018-01-25 21:23:03 +010013import com.sun.jersey.api.client.ClientHandlerException;
margaretha0b63de42017-12-20 18:48:09 +010014import com.sun.jersey.api.client.ClientResponse;
margaretha0b63de42017-12-20 18:48:09 +010015import com.sun.jersey.api.client.ClientResponse.Status;
margaretha45667922018-01-25 21:23:03 +010016import com.sun.jersey.api.client.UniformInterfaceException;
margaretha9d3eb042017-12-22 11:02:30 +010017import com.sun.jersey.core.util.MultivaluedMapImpl;
margaretha0b63de42017-12-20 18:48:09 +010018
19import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
20import de.ids_mannheim.korap.config.Attributes;
21import de.ids_mannheim.korap.config.SpringJerseyTest;
margaretha45667922018-01-25 21:23:03 +010022import de.ids_mannheim.korap.constant.GroupMemberStatus;
23import de.ids_mannheim.korap.constant.PredefinedRole;
margaretha0b63de42017-12-20 18:48:09 +010024import de.ids_mannheim.korap.exceptions.KustvaktException;
25import de.ids_mannheim.korap.exceptions.StatusCodes;
26import de.ids_mannheim.korap.utils.JsonUtils;
margarethab874ef52018-01-23 20:26:31 +010027import de.ids_mannheim.korap.web.input.UserGroupJson;
margaretha0b63de42017-12-20 18:48:09 +010028
margaretha541b8cc2018-01-10 13:02:46 +010029public class UserGroupControllerTest extends SpringJerseyTest {
margaretha0b63de42017-12-20 18:48:09 +010030
31 @Autowired
32 private HttpAuthorizationHandler handler;
margaretha45667922018-01-25 21:23:03 +010033 private String username = "UserGroupControllerTest";
margaretha0b63de42017-12-20 18:48:09 +010034
margaretha2c019fa2018-02-01 19:50:51 +010035 private JsonNode retrieveUserGroups (String username)
36 throws UniformInterfaceException, ClientHandlerException,
37 KustvaktException {
38 ClientResponse response = resource().path("group").path("list")
39 .header(Attributes.AUTHORIZATION,
40 handler.createBasicAuthorizationHeaderValue(username,
41 "pass"))
42 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
43 .get(ClientResponse.class);
44 String entity = response.getEntity(String.class);
45
46 assertEquals(Status.OK.getStatusCode(), response.getStatus());
47
48 return JsonUtils.readTree(entity);
49 }
50
margaretha0b63de42017-12-20 18:48:09 +010051 // dory is a group admin in dory group
52 @Test
margaretha45667922018-01-25 21:23:03 +010053 public void testListDoryGroups () throws KustvaktException {
margaretha9d3eb042017-12-22 11:02:30 +010054 ClientResponse response = resource().path("group").path("list")
margaretha0b63de42017-12-20 18:48:09 +010055 .header(Attributes.AUTHORIZATION,
56 handler.createBasicAuthorizationHeaderValue("dory",
57 "pass"))
58 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
59 .get(ClientResponse.class);
60 String entity = response.getEntity(String.class);
61 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margaretha9d3eb042017-12-22 11:02:30 +010062 // System.out.println(entity);
margaretha0b63de42017-12-20 18:48:09 +010063 JsonNode node = JsonUtils.readTree(entity);
margaretha9d3eb042017-12-22 11:02:30 +010064
margarethab874ef52018-01-23 20:26:31 +010065 JsonNode group = node.get(1);
66 assertEquals(2, group.at("/id").asInt());
67 assertEquals("dory group", group.at("/name").asText());
68 assertEquals("dory", group.at("/owner").asText());
69 assertEquals(3, group.at("/members").size());
margaretha0b63de42017-12-20 18:48:09 +010070 }
margaretha9d3eb042017-12-22 11:02:30 +010071
margaretha0b63de42017-12-20 18:48:09 +010072 // nemo is a group member in dory group
73 @Test
margaretha45667922018-01-25 21:23:03 +010074 public void testListNemoGroups () throws KustvaktException {
margaretha9d3eb042017-12-22 11:02:30 +010075 ClientResponse response = resource().path("group").path("list")
margaretha0b63de42017-12-20 18:48:09 +010076 .header(Attributes.AUTHORIZATION,
77 handler.createBasicAuthorizationHeaderValue("nemo",
78 "pass"))
79 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
80 .get(ClientResponse.class);
81 String entity = response.getEntity(String.class);
82 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margaretha9d3eb042017-12-22 11:02:30 +010083 // System.out.println(entity);
margaretha0b63de42017-12-20 18:48:09 +010084 JsonNode node = JsonUtils.readTree(entity);
margaretha9d3eb042017-12-22 11:02:30 +010085
margaretha45dde682018-01-04 21:33:46 +010086 assertEquals(2, node.at("/0/id").asInt());
margaretha9d3eb042017-12-22 11:02:30 +010087 assertEquals("dory group", node.at("/0/name").asText());
88 assertEquals("dory", node.at("/0/owner").asText());
89 // group members are not allowed to see other members
90 assertEquals(0, node.at("/0/members").size());
91 }
92
margaretha45667922018-01-25 21:23:03 +010093 // marlin has 2 groups
margaretha9d3eb042017-12-22 11:02:30 +010094 @Test
margaretha45667922018-01-25 21:23:03 +010095 public void testListMarlinGroups () throws KustvaktException {
margaretha9d3eb042017-12-22 11:02:30 +010096 ClientResponse response = resource().path("group").path("list")
97 .header(Attributes.AUTHORIZATION,
98 handler.createBasicAuthorizationHeaderValue("marlin",
99 "pass"))
100 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
101 .get(ClientResponse.class);
102 String entity = response.getEntity(String.class);
103 assertEquals(Status.OK.getStatusCode(), response.getStatus());
104 JsonNode node = JsonUtils.readTree(entity);
margaretha45667922018-01-25 21:23:03 +0100105 assertEquals(2, node.size());
margaretha9d3eb042017-12-22 11:02:30 +0100106 }
107
margaretha98ec15b2018-01-22 17:14:02 +0100108
margaretha9d3eb042017-12-22 11:02:30 +0100109 @Test
margaretha45667922018-01-25 21:23:03 +0100110 public void testListUserGroupUnauthorized () throws KustvaktException {
margaretha9d3eb042017-12-22 11:02:30 +0100111 ClientResponse response = resource().path("group").path("list")
112 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
113 .get(ClientResponse.class);
114 String entity = response.getEntity(String.class);
margaretha98ec15b2018-01-22 17:14:02 +0100115 // System.out.println(entity);
margaretha9d3eb042017-12-22 11:02:30 +0100116 JsonNode node = JsonUtils.readTree(entity);
117
118 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
119 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
120 node.at("/errors/0/0").asInt());
margaretha45667922018-01-25 21:23:03 +0100121 assertEquals("Unauthorized operation for user: guest",
margaretha9d3eb042017-12-22 11:02:30 +0100122 node.at("/errors/0/1").asText());
123 }
124
margaretha45667922018-01-25 21:23:03 +0100125 @Test
126 public void testCreateUserGroup () throws UniformInterfaceException,
127 ClientHandlerException, KustvaktException {
margarethab874ef52018-01-23 20:26:31 +0100128
margaretha45667922018-01-25 21:23:03 +0100129 UserGroupJson json = new UserGroupJson();
130 json.setName("new user group");
131 json.setMembers(new String[] { "marlin", "nemo" });
margarethab874ef52018-01-23 20:26:31 +0100132
margaretha45667922018-01-25 21:23:03 +0100133 ClientResponse response = resource().path("group").path("create")
134 .type(MediaType.APPLICATION_JSON)
135 .header(Attributes.AUTHORIZATION,
136 handler.createBasicAuthorizationHeaderValue(username,
137 "pass"))
138 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").entity(json)
139 .post(ClientResponse.class);
140
141 assertEquals(Status.OK.getStatusCode(), response.getStatus());
142
143 // list user group
144 response = resource().path("group").path("list")
145 .header(Attributes.AUTHORIZATION,
146 handler.createBasicAuthorizationHeaderValue(username,
147 "pass"))
148 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
149 .get(ClientResponse.class);
150
151 String entity = response.getEntity(String.class);
152 // System.out.println(entity);
153 JsonNode node = JsonUtils.readTree(entity);
154 assertEquals(1, node.size());
155 node = node.get(0);
156 assertEquals("new user group", node.get("name").asText());
157 String groupId = node.get("id").asText();
158
159 assertEquals(username, node.get("owner").asText());
160 assertEquals(3, node.get("members").size());
161 assertEquals(username, node.at("/members/0/userId").asText());
162 assertEquals(GroupMemberStatus.ACTIVE.name(),
163 node.at("/members/0/status").asText());
164 assertEquals(PredefinedRole.USER_GROUP_ADMIN.name(),
165 node.at("/members/0/roles/0").asText());
166 assertEquals(PredefinedRole.VC_ACCESS_ADMIN.name(),
167 node.at("/members/0/roles/1").asText());
168
169 assertEquals("marlin", node.at("/members/1/userId").asText());
170 assertEquals(GroupMemberStatus.PENDING.name(),
171 node.at("/members/1/status").asText());
172 assertEquals(PredefinedRole.USER_GROUP_MEMBER.name(),
173 node.at("/members/1/roles/0").asText());
174 assertEquals(PredefinedRole.VC_ACCESS_MEMBER.name(),
175 node.at("/members/1/roles/1").asText());
176
margaretha2c019fa2018-02-01 19:50:51 +0100177
178 testInviteMember(groupId);
179
180 testDeleteMemberUnauthorized(groupId);
181 testDeleteMember(groupId);
margaretha45667922018-01-25 21:23:03 +0100182 testDeleteGroup(groupId);
183 }
184
margaretha45667922018-01-25 21:23:03 +0100185
margaretha2c019fa2018-02-01 19:50:51 +0100186 private void testDeleteMember (String groupId)
margaretha45667922018-01-25 21:23:03 +0100187 throws UniformInterfaceException, ClientHandlerException,
188 KustvaktException {
189 // delete marlin from group
190 ClientResponse response = resource().path("group").path("member")
191 .path("delete").queryParam("memberId", "marlin")
192 .queryParam("groupId", groupId)
193 .header(Attributes.AUTHORIZATION,
194 handler.createBasicAuthorizationHeaderValue(username,
195 "pass"))
196 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
197 .delete(ClientResponse.class);
198
199 // check group member
200 response = resource().path("group").path("list")
201 .header(Attributes.AUTHORIZATION,
202 handler.createBasicAuthorizationHeaderValue(username,
203 "pass"))
204 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
205 .get(ClientResponse.class);
206 String entity = response.getEntity(String.class);
207 JsonNode node = JsonUtils.readTree(entity);
208 node = node.get(0);
margaretha2c019fa2018-02-01 19:50:51 +0100209 assertEquals(3, node.get("members").size());
margaretha45667922018-01-25 21:23:03 +0100210 assertEquals("nemo", node.at("/members/1/userId").asText());
211 assertEquals(GroupMemberStatus.PENDING.name(),
212 node.at("/members/1/status").asText());
213
214 }
215
margaretha2c019fa2018-02-01 19:50:51 +0100216 private void testDeleteMemberUnauthorized (String groupId)
217 throws UniformInterfaceException, ClientHandlerException,
218 KustvaktException {
219 // nemo is a group member
220 ClientResponse response = resource().path("group").path("member")
221 .path("delete").queryParam("memberId", "marlin")
222 .queryParam("groupId", groupId)
223 .header(Attributes.AUTHORIZATION,
224 handler.createBasicAuthorizationHeaderValue("nemo",
225 "pass"))
226 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
227 .delete(ClientResponse.class);
228
229 String entity = response.getEntity(String.class);
230 // System.out.println(entity);
231 JsonNode node = JsonUtils.readTree(entity);
232 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
233 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
234 node.at("/errors/0/0").asInt());
235 assertEquals("Unauthorized operation for user: nemo",
236 node.at("/errors/0/1").asText());
237 }
238
margarethae6c711b2018-02-06 21:55:04 +0100239 // EM: same as cancel invitation
margaretha2c019fa2018-02-01 19:50:51 +0100240 private void testDeletePendingMember () throws UniformInterfaceException,
241 ClientHandlerException, KustvaktException {
242 // dory delete pearl
243 ClientResponse response = resource().path("group").path("member")
244 .path("delete").queryParam("memberId", "pearl")
245 // dory group
246 .queryParam("groupId", "2")
247 .header(Attributes.AUTHORIZATION,
248 handler.createBasicAuthorizationHeaderValue("dory",
249 "pass"))
250 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
251 .delete(ClientResponse.class);
252
253 assertEquals(Status.OK.getStatusCode(), response.getStatus());
254
255 // check member
256 JsonNode node = retrieveUserGroups("pearl");
257 assertEquals(0, node.size());
258 }
259
260 @Test
261 public void testDeleteDeletedMember () throws UniformInterfaceException,
262 ClientHandlerException, KustvaktException {
263 ClientResponse response = resource().path("group").path("member")
264 .path("delete").queryParam("memberId", "pearl")
265 // dory group
266 .queryParam("groupId", "2")
267 .header(Attributes.AUTHORIZATION,
268 handler.createBasicAuthorizationHeaderValue("dory",
269 "pass"))
270 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
271 .delete(ClientResponse.class);
272
273 String entity = response.getEntity(String.class);
margarethae6c711b2018-02-06 21:55:04 +0100274 // System.out.println(entity);
margaretha2c019fa2018-02-01 19:50:51 +0100275 JsonNode node = JsonUtils.readTree(entity);
276 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethae6c711b2018-02-06 21:55:04 +0100277 assertEquals(StatusCodes.GROUP_MEMBER_DELETED,
margaretha2c019fa2018-02-01 19:50:51 +0100278 node.at("/errors/0/0").asInt());
margarethae6c711b2018-02-06 21:55:04 +0100279 assertEquals("pearl has already been deleted from the group dory group",
margaretha2c019fa2018-02-01 19:50:51 +0100280 node.at("/errors/0/1").asText());
margarethae6c711b2018-02-06 21:55:04 +0100281 assertEquals("[pearl, dory group]", node.at("/errors/0/2").asText());
margaretha2c019fa2018-02-01 19:50:51 +0100282 }
283
margaretha45667922018-01-25 21:23:03 +0100284 private void testDeleteGroup (String groupId)
285 throws UniformInterfaceException, ClientHandlerException,
286 KustvaktException {
287 //delete group
288 ClientResponse response = resource().path("group").path("delete")
289 .queryParam("groupId", groupId)
290 .header(Attributes.AUTHORIZATION,
291 handler.createBasicAuthorizationHeaderValue(username,
292 "pass"))
293 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
294 .delete(ClientResponse.class);
295
296 assertEquals(Status.OK.getStatusCode(), response.getStatus());
297
298 // check group
299 response = resource().path("group").path("list")
300 .header(Attributes.AUTHORIZATION,
301 handler.createBasicAuthorizationHeaderValue(username,
302 "pass"))
303 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
304 .get(ClientResponse.class);
305 String entity = response.getEntity(String.class);
306 assertEquals("[]", entity);
307 }
308
309 @Test
margaretha2c019fa2018-02-01 19:50:51 +0100310 public void testDeleteGroupUnauthorized () throws UniformInterfaceException,
311 ClientHandlerException, KustvaktException {
312 // dory is a group admin in marlin group
313 ClientResponse response = resource().path("group").path("delete")
314 .queryParam("groupId", "1")
315 .header(Attributes.AUTHORIZATION,
316 handler.createBasicAuthorizationHeaderValue("dory",
317 "pass"))
318 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
319 .delete(ClientResponse.class);
320
321 String entity = response.getEntity(String.class);
322 // System.out.println(entity);
323 JsonNode node = JsonUtils.readTree(entity);
324 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
325 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
326 node.at("/errors/0/0").asInt());
327 assertEquals("Unauthorized operation for user: dory",
328 node.at("/errors/0/1").asText());
329 }
330
331 @Test
margaretha45667922018-01-25 21:23:03 +0100332 public void testDeleteGroupOwner () throws UniformInterfaceException,
333 ClientHandlerException, KustvaktException {
334 // delete marlin from marlin group
margaretha2c019fa2018-02-01 19:50:51 +0100335 // dory is a group admin in marlin group
margaretha45667922018-01-25 21:23:03 +0100336 ClientResponse response = resource().path("group").path("member")
337 .path("delete").queryParam("memberId", "marlin")
338 .queryParam("groupId", "1")
339 .header(Attributes.AUTHORIZATION,
340 handler.createBasicAuthorizationHeaderValue("dory",
341 "pass"))
342 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
343 .delete(ClientResponse.class);
344
345 String entity = response.getEntity(String.class);
346 // System.out.println(entity);
347 JsonNode node = JsonUtils.readTree(entity);
348 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
349 assertEquals(StatusCodes.NOT_ALLOWED, node.at("/errors/0/0").asInt());
350 assertEquals("Operation 'delete group owner'is not allowed.",
351 node.at("/errors/0/1").asText());
margaretha45667922018-01-25 21:23:03 +0100352 }
353
margaretha2c019fa2018-02-01 19:50:51 +0100354 private void testInviteMember (String groupId)
355 throws UniformInterfaceException, ClientHandlerException,
356 KustvaktException {
357 String[] members = new String[] { "darla" };
margaretha45667922018-01-25 21:23:03 +0100358
margaretha2c019fa2018-02-01 19:50:51 +0100359 UserGroupJson userGroup = new UserGroupJson();
360 userGroup.setMembers(members);
361 userGroup.setId(Integer.parseInt(groupId));
margaretha45667922018-01-25 21:23:03 +0100362
margaretha2c019fa2018-02-01 19:50:51 +0100363 ClientResponse response = resource().path("group").path("member")
364 .path("invite").type(MediaType.APPLICATION_JSON)
margaretha9d3eb042017-12-22 11:02:30 +0100365 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
366 .header(Attributes.AUTHORIZATION,
margaretha2c019fa2018-02-01 19:50:51 +0100367 handler.createBasicAuthorizationHeaderValue(username,
margaretha9d3eb042017-12-22 11:02:30 +0100368 "pass"))
margaretha2c019fa2018-02-01 19:50:51 +0100369 .entity(userGroup).post(ClientResponse.class);
margaretha98ec15b2018-01-22 17:14:02 +0100370
371 assertEquals(Status.OK.getStatusCode(), response.getStatus());
372
margaretha2c019fa2018-02-01 19:50:51 +0100373 // list group
374 response = resource().path("group").path("list")
margaretha45667922018-01-25 21:23:03 +0100375 .header(Attributes.AUTHORIZATION,
margaretha2c019fa2018-02-01 19:50:51 +0100376 handler.createBasicAuthorizationHeaderValue(username,
margaretha45667922018-01-25 21:23:03 +0100377 "pass"))
378 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
379 .get(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100380
margaretha45667922018-01-25 21:23:03 +0100381 String entity = response.getEntity(String.class);
382
margaretha2c019fa2018-02-01 19:50:51 +0100383 JsonNode node = JsonUtils.readTree(entity);
384 node = node.get(0);
385 assertEquals(4, node.get("members").size());
margaretha45667922018-01-25 21:23:03 +0100386
margaretha2c019fa2018-02-01 19:50:51 +0100387 assertEquals("darla", node.at("/members/3/userId").asText());
388 assertEquals(GroupMemberStatus.PENDING.name(),
389 node.at("/members/3/status").asText());
390 assertEquals(PredefinedRole.USER_GROUP_MEMBER.name(),
391 node.at("/members/3/roles/0").asText());
392 assertEquals(PredefinedRole.VC_ACCESS_MEMBER.name(),
393 node.at("/members/3/roles/1").asText());
margaretha45667922018-01-25 21:23:03 +0100394 }
395
margaretha2c019fa2018-02-01 19:50:51 +0100396 private void testInviteDeletedMember () throws UniformInterfaceException,
margaretha45667922018-01-25 21:23:03 +0100397 ClientHandlerException, KustvaktException {
398 String[] members = new String[] { "marlin" };
margarethab874ef52018-01-23 20:26:31 +0100399
400 UserGroupJson userGroup = new UserGroupJson();
401 userGroup.setMembers(members);
402 // dory group
403 userGroup.setId(2);
404
margaretha45667922018-01-25 21:23:03 +0100405 ClientResponse response = resource().path("group").path("member")
406 .path("invite").type(MediaType.APPLICATION_JSON)
margarethab874ef52018-01-23 20:26:31 +0100407 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
408 .header(Attributes.AUTHORIZATION,
409 handler.createBasicAuthorizationHeaderValue("dory",
410 "pass"))
411 .entity(userGroup).post(ClientResponse.class);
margaretha45667922018-01-25 21:23:03 +0100412
413 assertEquals(Status.OK.getStatusCode(), response.getStatus());
414
415 // check member
margaretha2c019fa2018-02-01 19:50:51 +0100416 JsonNode node = retrieveUserGroups("marlin");
margaretha45667922018-01-25 21:23:03 +0100417 assertEquals(2, node.size());
418 JsonNode group = node.get(1);
419 assertEquals(GroupMemberStatus.PENDING.name(),
420 group.at("/userMemberStatus").asText());
421
margaretha0b63de42017-12-20 18:48:09 +0100422 }
margaretha98ec15b2018-01-22 17:14:02 +0100423
margaretha2c019fa2018-02-01 19:50:51 +0100424 @Test
425 public void testInvitePendingMember () throws UniformInterfaceException,
426 ClientHandlerException, KustvaktException {
427 // marlin has status PENDING in dory group
428 String[] members = new String[] { "marlin" };
429
430 UserGroupJson userGroup = new UserGroupJson();
431 userGroup.setMembers(members);
432 // dory group
433 userGroup.setId(2);
434
435 ClientResponse response = resource().path("group").path("member")
436 .path("invite").type(MediaType.APPLICATION_JSON)
437 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
438 .header(Attributes.AUTHORIZATION,
439 handler.createBasicAuthorizationHeaderValue("dory",
440 "pass"))
441 .entity(userGroup).post(ClientResponse.class);
442 String entity = response.getEntity(String.class);
443 // System.out.println(entity);
444 JsonNode node = JsonUtils.readTree(entity);
445 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethae6c711b2018-02-06 21:55:04 +0100446 assertEquals(StatusCodes.GROUP_MEMBER_EXISTS,
margaretha2c019fa2018-02-01 19:50:51 +0100447 node.at("/errors/0/0").asInt());
margaretha7f0a4d42018-02-20 19:16:44 +0100448 assertEquals(
449 "Username marlin with status PENDING exists in the user-group "
450 + "dory group",
451 node.at("/errors/0/1").asText());
margaretha2c019fa2018-02-01 19:50:51 +0100452 assertEquals("[marlin, PENDING, dory group]",
453 node.at("/errors/0/2").asText());
454 }
455
456 @Test
457 public void testInviteDeletedMember2 () throws UniformInterfaceException,
458 ClientHandlerException, KustvaktException {
459 // pearl has status deleted in dory group
460 String[] members = new String[] { "pearl" };
461
462 UserGroupJson userGroup = new UserGroupJson();
463 userGroup.setMembers(members);
464 // dory group
465 userGroup.setId(2);
466
467 ClientResponse response = resource().path("group").path("member")
468 .path("invite").type(MediaType.APPLICATION_JSON)
469 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
470 .header(Attributes.AUTHORIZATION,
471 handler.createBasicAuthorizationHeaderValue("dory",
472 "pass"))
473 .entity(userGroup).post(ClientResponse.class);
474
margaretha7f0a4d42018-02-20 19:16:44 +0100475 String entity = response.getEntity(String.class);
margaretha2c019fa2018-02-01 19:50:51 +0100476 assertEquals(Status.OK.getStatusCode(), response.getStatus());
477
478 // check member
479 JsonNode node = retrieveUserGroups("pearl");
480 assertEquals(1, node.size());
481 JsonNode group = node.get(0);
482 assertEquals(GroupMemberStatus.PENDING.name(),
483 group.at("/userMemberStatus").asText());
484
485 testDeletePendingMember();
486 }
487
488
489 // marlin has GroupMemberStatus.PENDING in dory group
490 @Test
491 public void testSubscribePendingMember () throws KustvaktException {
492 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
493 form.add("groupId", "2");
494
495 ClientResponse response = resource().path("group").path("subscribe")
496 .type(MediaType.APPLICATION_FORM_URLENCODED)
497 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
498 .header(Attributes.AUTHORIZATION,
499 handler.createBasicAuthorizationHeaderValue("marlin",
500 "pass"))
501 .entity(form).post(ClientResponse.class);
502
503 assertEquals(Status.OK.getStatusCode(), response.getStatus());
504
505 // retrieve marlin group
506 JsonNode node = retrieveUserGroups("marlin");
507 // System.out.println(node);
508 assertEquals(2, node.size());
509
510 JsonNode group = node.get(1);
511 assertEquals(2, group.at("/id").asInt());
512 assertEquals("dory group", group.at("/name").asText());
513 assertEquals("dory", group.at("/owner").asText());
514 // group members are not allowed to see other members
515 assertEquals(0, group.at("/members").size());
516 assertEquals(GroupMemberStatus.ACTIVE.name(),
517 group.at("/userMemberStatus").asText());
518
519 // unsubscribe marlin from dory group
520 testUnsubscribeActiveMember(form);
521
522 // invite marlin to dory group to set back the GroupMemberStatus.PENDING
523 testInviteDeletedMember();
524 }
525
margaretha9d3eb042017-12-22 11:02:30 +0100526 // pearl has GroupMemberStatus.DELETED in dory group
margaretha0b63de42017-12-20 18:48:09 +0100527 @Test
margaretha2c019fa2018-02-01 19:50:51 +0100528 public void testSubscribeDeletedMember () throws KustvaktException {
margaretha9d3eb042017-12-22 11:02:30 +0100529 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
margaretha45dde682018-01-04 21:33:46 +0100530 form.add("groupId", "2");
margaretha9d3eb042017-12-22 11:02:30 +0100531
532 ClientResponse response = resource().path("group").path("subscribe")
533 .type(MediaType.APPLICATION_FORM_URLENCODED)
margaretha0b63de42017-12-20 18:48:09 +0100534 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha9d3eb042017-12-22 11:02:30 +0100535 .header(Attributes.AUTHORIZATION,
536 handler.createBasicAuthorizationHeaderValue("pearl",
537 "pass"))
538 .entity(form).post(ClientResponse.class);
539 String entity = response.getEntity(String.class);
540 JsonNode node = JsonUtils.readTree(entity);
margaretha98ec15b2018-01-22 17:14:02 +0100541
margaretha9d3eb042017-12-22 11:02:30 +0100542 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethac9f1dfa2018-02-07 17:50:33 +0100543 assertEquals(StatusCodes.GROUP_MEMBER_DELETED,
margaretha9d3eb042017-12-22 11:02:30 +0100544 node.at("/errors/0/0").asInt());
margarethac9f1dfa2018-02-07 17:50:33 +0100545 assertEquals("pearl has already been deleted from the group dory group",
margaretha9d3eb042017-12-22 11:02:30 +0100546 node.at("/errors/0/1").asText());
547 }
margaretha98ec15b2018-01-22 17:14:02 +0100548
margaretha9d3eb042017-12-22 11:02:30 +0100549 @Test
550 public void testSubscribeMissingGroupId () throws KustvaktException {
551 ClientResponse response = resource().path("group").path("subscribe")
552 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
553 .header(Attributes.AUTHORIZATION, handler
554 .createBasicAuthorizationHeaderValue("bruce", "pass"))
555 .post(ClientResponse.class);
556 String entity = response.getEntity(String.class);
557 JsonNode node = JsonUtils.readTree(entity);
558
559 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethafc7d7772018-01-16 17:48:17 +0100560 assertEquals(StatusCodes.MISSING_ARGUMENT,
margaretha9d3eb042017-12-22 11:02:30 +0100561 node.at("/errors/0/0").asInt());
562 assertEquals("groupId", node.at("/errors/0/1").asText());
563 assertEquals("0", node.at("/errors/0/2").asText());
564 }
565
566 @Test
567 public void testSubscribeNonExistentMember () throws KustvaktException {
568 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
margaretha45dde682018-01-04 21:33:46 +0100569 form.add("groupId", "2");
margaretha9d3eb042017-12-22 11:02:30 +0100570
571 ClientResponse response = resource().path("group").path("subscribe")
572 .type(MediaType.APPLICATION_FORM_URLENCODED)
573 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
574 .header(Attributes.AUTHORIZATION,
575 handler.createBasicAuthorizationHeaderValue("bruce",
576 "pass"))
577 .entity(form).post(ClientResponse.class);
margaretha0b63de42017-12-20 18:48:09 +0100578 String entity = response.getEntity(String.class);
margaretha98ec15b2018-01-22 17:14:02 +0100579 // System.out.println(entity);
margaretha0b63de42017-12-20 18:48:09 +0100580 JsonNode node = JsonUtils.readTree(entity);
margaretha9d3eb042017-12-22 11:02:30 +0100581
582 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethac9f1dfa2018-02-07 17:50:33 +0100583 assertEquals(StatusCodes.GROUP_MEMBER_NOT_FOUND,
margaretha0b63de42017-12-20 18:48:09 +0100584 node.at("/errors/0/0").asInt());
margarethac9f1dfa2018-02-07 17:50:33 +0100585 assertEquals("bruce is not found in the group",
margaretha0b63de42017-12-20 18:48:09 +0100586 node.at("/errors/0/1").asText());
margaretha0b63de42017-12-20 18:48:09 +0100587 }
margaretha9d3eb042017-12-22 11:02:30 +0100588
589 @Test
590 public void testSubscribeToNonExistentGroup () throws KustvaktException {
591 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
592 form.add("groupId", "100");
593
594 ClientResponse response = resource().path("group").path("subscribe")
595 .type(MediaType.APPLICATION_FORM_URLENCODED)
596 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
597 .header(Attributes.AUTHORIZATION,
598 handler.createBasicAuthorizationHeaderValue("pearl",
599 "pass"))
600 .entity(form).post(ClientResponse.class);
601 String entity = response.getEntity(String.class);
margaretha98ec15b2018-01-22 17:14:02 +0100602 // System.out.println(entity);
margaretha9d3eb042017-12-22 11:02:30 +0100603 JsonNode node = JsonUtils.readTree(entity);
604
605 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethac9f1dfa2018-02-07 17:50:33 +0100606 assertEquals(StatusCodes.GROUP_NOT_FOUND,
margaretha9d3eb042017-12-22 11:02:30 +0100607 node.at("/errors/0/0").asInt());
margarethac9f1dfa2018-02-07 17:50:33 +0100608 assertEquals("Group with id 100 is not found",
margaretha9d3eb042017-12-22 11:02:30 +0100609 node.at("/errors/0/1").asText());
610 }
611
margaretha2c019fa2018-02-01 19:50:51 +0100612 private void testUnsubscribeActiveMember (
613 MultivaluedMap<String, String> form)
614 throws UniformInterfaceException, ClientHandlerException,
615 KustvaktException {
616 ClientResponse response = resource().path("group").path("unsubscribe")
617 .type(MediaType.APPLICATION_FORM_URLENCODED)
618 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
619 .header(Attributes.AUTHORIZATION,
620 handler.createBasicAuthorizationHeaderValue("marlin",
621 "pass"))
622 .entity(form).post(ClientResponse.class);
623
624 assertEquals(Status.OK.getStatusCode(), response.getStatus());
625
626 JsonNode node = retrieveUserGroups("marlin");
627 assertEquals(1, node.size());
628 }
629
margarethae6c711b2018-02-06 21:55:04 +0100630 @Test
631 public void testUnsubscribeDeletedMember ()
632 throws UniformInterfaceException, ClientHandlerException,
633 KustvaktException {
634 // pearl unsubscribes from dory group
635 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
636 // dory group
637 form.add("groupId", "2");
638
639 ClientResponse response = resource().path("group").path("unsubscribe")
640 .type(MediaType.APPLICATION_FORM_URLENCODED)
641 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
642 .header(Attributes.AUTHORIZATION,
643 handler.createBasicAuthorizationHeaderValue("pearl",
644 "pass"))
645 .entity(form).post(ClientResponse.class);
646
647 String entity = response.getEntity(String.class);
648 // System.out.println(entity);
649 JsonNode node = JsonUtils.readTree(entity);
650 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
651 assertEquals(StatusCodes.GROUP_MEMBER_DELETED,
652 node.at("/errors/0/0").asInt());
653 assertEquals("pearl has already been deleted from the group dory group",
654 node.at("/errors/0/1").asText());
655 assertEquals("[pearl, dory group]", node.at("/errors/0/2").asText());
656 }
margaretha7f0a4d42018-02-20 19:16:44 +0100657
margarethae6c711b2018-02-06 21:55:04 +0100658 @Test
659 public void testUnsubscribePendingMember ()
660 throws UniformInterfaceException, ClientHandlerException,
661 KustvaktException {
662
663 JsonNode node = retrieveUserGroups("marlin");
664 assertEquals(2, node.size());
margaretha7f0a4d42018-02-20 19:16:44 +0100665
margarethae6c711b2018-02-06 21:55:04 +0100666 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
667 // dory group
668 form.add("groupId", "2");
669
670 ClientResponse response = resource().path("group").path("unsubscribe")
671 .type(MediaType.APPLICATION_FORM_URLENCODED)
672 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
673 .header(Attributes.AUTHORIZATION,
674 handler.createBasicAuthorizationHeaderValue("marlin",
675 "pass"))
676 .entity(form).post(ClientResponse.class);
677
678 String entity = response.getEntity(String.class);
679 // System.out.println(entity);
680 assertEquals(Status.OK.getStatusCode(), response.getStatus());
681
margaretha7f0a4d42018-02-20 19:16:44 +0100682 node = retrieveUserGroups("marlin");
margarethae6c711b2018-02-06 21:55:04 +0100683 assertEquals(1, node.size());
margaretha7f0a4d42018-02-20 19:16:44 +0100684
margarethae6c711b2018-02-06 21:55:04 +0100685 // invite marlin to dory group to set back the GroupMemberStatus.PENDING
686 testInviteDeletedMember();
687 }
margaretha0b63de42017-12-20 18:48:09 +0100688}