blob: 8bc2a5e6a111ea67fb6032169a837fbe4a469649 [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
margarethaf7abb362018-09-18 20:09:37 +02005import java.util.Set;
6
margaretha9d3eb042017-12-22 11:02:30 +01007import javax.ws.rs.core.MediaType;
8import javax.ws.rs.core.MultivaluedMap;
9
margaretha0b63de42017-12-20 18:48:09 +010010import org.junit.Test;
margarethaf7abb362018-09-18 20:09:37 +020011import org.springframework.beans.factory.annotation.Autowired;
margaretha0b63de42017-12-20 18:48:09 +010012
13import com.fasterxml.jackson.databind.JsonNode;
margaretha58e18632018-02-15 13:04:42 +010014import com.google.common.net.HttpHeaders;
margaretha45667922018-01-25 21:23:03 +010015import com.sun.jersey.api.client.ClientHandlerException;
margaretha0b63de42017-12-20 18:48:09 +010016import com.sun.jersey.api.client.ClientResponse;
margaretha0b63de42017-12-20 18:48:09 +010017import com.sun.jersey.api.client.ClientResponse.Status;
margaretha45667922018-01-25 21:23:03 +010018import com.sun.jersey.api.client.UniformInterfaceException;
margaretha9d3eb042017-12-22 11:02:30 +010019import com.sun.jersey.core.util.MultivaluedMapImpl;
margaretha0b63de42017-12-20 18:48:09 +010020
21import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
22import de.ids_mannheim.korap.config.Attributes;
23import de.ids_mannheim.korap.config.SpringJerseyTest;
margaretha45667922018-01-25 21:23:03 +010024import de.ids_mannheim.korap.constant.GroupMemberStatus;
25import de.ids_mannheim.korap.constant.PredefinedRole;
margarethaf7abb362018-09-18 20:09:37 +020026import de.ids_mannheim.korap.dao.UserGroupMemberDao;
27import de.ids_mannheim.korap.entity.Role;
28import de.ids_mannheim.korap.entity.UserGroupMember;
margaretha0b63de42017-12-20 18:48:09 +010029import de.ids_mannheim.korap.exceptions.KustvaktException;
30import de.ids_mannheim.korap.exceptions.StatusCodes;
31import de.ids_mannheim.korap.utils.JsonUtils;
32
margarethaa0486272018-04-12 19:59:31 +020033/**
34 * @author margaretha
35 *
36 */
margaretha541b8cc2018-01-10 13:02:46 +010037public class UserGroupControllerTest extends SpringJerseyTest {
margaretha0b63de42017-12-20 18:48:09 +010038
margarethaf7abb362018-09-18 20:09:37 +020039 @Autowired
40 private UserGroupMemberDao memberDao;
41
margaretha45667922018-01-25 21:23:03 +010042 private String username = "UserGroupControllerTest";
margaretha293ee032018-03-20 20:11:52 +010043 private String admin = "admin";
margaretha0b63de42017-12-20 18:48:09 +010044
margaretha2c019fa2018-02-01 19:50:51 +010045 private JsonNode retrieveUserGroups (String username)
46 throws UniformInterfaceException, ClientHandlerException,
47 KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +020048 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha064eb6f2018-07-10 18:33:01 +020049 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
50 .createBasicAuthorizationHeaderValue(username, "pass"))
margaretha2c019fa2018-02-01 19:50:51 +010051 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
52 .get(ClientResponse.class);
53 String entity = response.getEntity(String.class);
54
55 assertEquals(Status.OK.getStatusCode(), response.getStatus());
56
57 return JsonUtils.readTree(entity);
58 }
margaretha39cec602019-02-05 19:48:49 +010059
60 private void deleteGroupByName (String groupName) throws KustvaktException{
61 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +010062 .path("@"+groupName)
margaretha39cec602019-02-05 19:48:49 +010063 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
64 .createBasicAuthorizationHeaderValue(username, "pass"))
65 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
66 .delete(ClientResponse.class);
67
68 assertEquals(Status.OK.getStatusCode(), response.getStatus());
69 }
margaretha2c019fa2018-02-01 19:50:51 +010070
margarethada5a6ab2019-11-08 10:06:05 +010071 // dory is a group admin in dory-group
margaretha0b63de42017-12-20 18:48:09 +010072 @Test
margaretha45667922018-01-25 21:23:03 +010073 public void testListDoryGroups () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +020074 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha064eb6f2018-07-10 18:33:01 +020075 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
76 .createBasicAuthorizationHeaderValue("dory", "pass"))
margaretha0b63de42017-12-20 18:48:09 +010077 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
78 .get(ClientResponse.class);
79 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +020080 // System.out.println(entity);
margaretha0b63de42017-12-20 18:48:09 +010081 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margarethac1c3f1d2018-03-13 14:39:32 +010082
margaretha0b63de42017-12-20 18:48:09 +010083 JsonNode node = JsonUtils.readTree(entity);
margarethab874ef52018-01-23 20:26:31 +010084 JsonNode group = node.get(1);
85 assertEquals(2, group.at("/id").asInt());
margarethada5a6ab2019-11-08 10:06:05 +010086 assertEquals("dory-group", group.at("/name").asText());
margarethab874ef52018-01-23 20:26:31 +010087 assertEquals("dory", group.at("/owner").asText());
88 assertEquals(3, group.at("/members").size());
margaretha0b63de42017-12-20 18:48:09 +010089 }
margaretha9d3eb042017-12-22 11:02:30 +010090
margarethada5a6ab2019-11-08 10:06:05 +010091 // nemo is a group member in dory-group
margaretha0b63de42017-12-20 18:48:09 +010092 @Test
margaretha45667922018-01-25 21:23:03 +010093 public void testListNemoGroups () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +020094 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha064eb6f2018-07-10 18:33:01 +020095 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
96 .createBasicAuthorizationHeaderValue("nemo", "pass"))
margaretha0b63de42017-12-20 18:48:09 +010097 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
98 .get(ClientResponse.class);
99 String entity = response.getEntity(String.class);
100 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margaretha226ec1e2018-07-04 15:45:59 +0200101 // System.out.println(entity);
margaretha0b63de42017-12-20 18:48:09 +0100102 JsonNode node = JsonUtils.readTree(entity);
margaretha9d3eb042017-12-22 11:02:30 +0100103
margaretha45dde682018-01-04 21:33:46 +0100104 assertEquals(2, node.at("/0/id").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100105 assertEquals("dory-group", node.at("/0/name").asText());
margaretha9d3eb042017-12-22 11:02:30 +0100106 assertEquals("dory", node.at("/0/owner").asText());
107 // group members are not allowed to see other members
108 assertEquals(0, node.at("/0/members").size());
109 }
110
margaretha45667922018-01-25 21:23:03 +0100111 // marlin has 2 groups
margaretha9d3eb042017-12-22 11:02:30 +0100112 @Test
margaretha45667922018-01-25 21:23:03 +0100113 public void testListMarlinGroups () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200114 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha064eb6f2018-07-10 18:33:01 +0200115 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
116 .createBasicAuthorizationHeaderValue("marlin", "pass"))
margaretha9d3eb042017-12-22 11:02:30 +0100117 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
118 .get(ClientResponse.class);
119 String entity = response.getEntity(String.class);
120 assertEquals(Status.OK.getStatusCode(), response.getStatus());
121 JsonNode node = JsonUtils.readTree(entity);
margaretha45667922018-01-25 21:23:03 +0100122 assertEquals(2, node.size());
margaretha9d3eb042017-12-22 11:02:30 +0100123 }
124
margaretha9d3eb042017-12-22 11:02:30 +0100125 @Test
margaretha4edc70e2018-03-14 22:34:29 +0100126 public void testListGroupGuest () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200127 ClientResponse response = resource().path(API_VERSION).path("group")
margarethaca7cff82019-11-12 12:06:37 +0100128 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha9d3eb042017-12-22 11:02:30 +0100129 .get(ClientResponse.class);
130 String entity = response.getEntity(String.class);
margaretha9d3eb042017-12-22 11:02:30 +0100131 JsonNode node = JsonUtils.readTree(entity);
132
133 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
134 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
135 node.at("/errors/0/0").asInt());
margaretha45667922018-01-25 21:23:03 +0100136 assertEquals("Unauthorized operation for user: guest",
margaretha9d3eb042017-12-22 11:02:30 +0100137 node.at("/errors/0/1").asText());
138 }
139
margaretha39cec602019-02-05 19:48:49 +0100140
margaretha45667922018-01-25 21:23:03 +0100141 @Test
margarethad8aa1352019-12-19 11:04:41 +0100142 public void testCreateGroupEmptyDescription () throws UniformInterfaceException,
margaretha39cec602019-02-05 19:48:49 +0100143 ClientHandlerException, KustvaktException {
144 String groupName = "empty_group";
margarethaca7cff82019-11-12 12:06:37 +0100145 ClientResponse response = testCreateUserGroup(groupName,"");
146 assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
147
margaretha39cec602019-02-05 19:48:49 +0100148 deleteGroupByName(groupName);
149 }
150
151
152 @Test
margarethad8aa1352019-12-19 11:04:41 +0100153 public void testCreateGroupMissingDescription () throws UniformInterfaceException,
margaretha39cec602019-02-05 19:48:49 +0100154 ClientHandlerException, KustvaktException {
margarethad8aa1352019-12-19 11:04:41 +0100155 String groupName = "missing-desc-group";
margaretha39cec602019-02-05 19:48:49 +0100156
margarethad8aa1352019-12-19 11:04:41 +0100157 ClientResponse response = testCreateGroupWithoutDescription(groupName);
margarethaca7cff82019-11-12 12:06:37 +0100158 assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
margarethada5a6ab2019-11-08 10:06:05 +0100159 deleteGroupByName(groupName);
160 }
161
margarethad8aa1352019-12-19 11:04:41 +0100162 private ClientResponse testCreateUserGroup (String groupName, String description)
margarethaca7cff82019-11-12 12:06:37 +0100163 throws UniformInterfaceException, ClientHandlerException,
164 KustvaktException {
165 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
margarethad8aa1352019-12-19 11:04:41 +0100166 form.add("description", description);
margarethaca7cff82019-11-12 12:06:37 +0100167
margaretha39cec602019-02-05 19:48:49 +0100168 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100169 .path("@"+groupName).type(MediaType.APPLICATION_FORM_URLENCODED)
margaretha39cec602019-02-05 19:48:49 +0100170 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
171 .createBasicAuthorizationHeaderValue(username, "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100172 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").entity(form)
173 .put(ClientResponse.class);
margaretha39cec602019-02-05 19:48:49 +0100174
margarethaca7cff82019-11-12 12:06:37 +0100175 return response;
margarethada5a6ab2019-11-08 10:06:05 +0100176 }
177
margarethad8aa1352019-12-19 11:04:41 +0100178 private ClientResponse testCreateGroupWithoutDescription (String groupName)
margarethada5a6ab2019-11-08 10:06:05 +0100179 throws UniformInterfaceException, ClientHandlerException,
180 KustvaktException {
181 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100182 .path("@"+groupName).type(MediaType.APPLICATION_FORM_URLENCODED)
margarethada5a6ab2019-11-08 10:06:05 +0100183 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
184 .createBasicAuthorizationHeaderValue(username, "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100185 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
186 .put(ClientResponse.class);
margarethada5a6ab2019-11-08 10:06:05 +0100187
margarethaca7cff82019-11-12 12:06:37 +0100188 return response;
margaretha39cec602019-02-05 19:48:49 +0100189 }
190
191 @Test
margarethada5a6ab2019-11-08 10:06:05 +0100192 public void testCreateGroupInvalidName () throws UniformInterfaceException,
margaretha45667922018-01-25 21:23:03 +0100193 ClientHandlerException, KustvaktException {
margarethada5a6ab2019-11-08 10:06:05 +0100194 String groupName = "invalid-group-name$";
margarethab874ef52018-01-23 20:26:31 +0100195
margarethad8aa1352019-12-19 11:04:41 +0100196 ClientResponse response = testCreateGroupWithoutDescription(groupName);
margarethada5a6ab2019-11-08 10:06:05 +0100197 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
198
199 JsonNode node = JsonUtils.readTree(response.getEntity(String.class));
200 assertEquals(StatusCodes.INVALID_ARGUMENT, node.at("/errors/0/0").asInt());
margarethaa4db3992022-03-31 12:22:17 +0200201// assertEquals("User-group name must only contains letters, numbers, "
202// + "underscores, hypens and spaces", node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100203 assertEquals("invalid-group-name$", node.at("/errors/0/2").asText());
204 }
205
206 @Test
margaretha21d32962019-11-14 17:08:15 +0100207 public void testCreateGroupNameTooShort () throws UniformInterfaceException,
208 ClientHandlerException, KustvaktException {
209 String groupName = "a";
margaretha21d32962019-11-14 17:08:15 +0100210
margarethad8aa1352019-12-19 11:04:41 +0100211 ClientResponse response = testCreateGroupWithoutDescription(groupName);
margaretha21d32962019-11-14 17:08:15 +0100212 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
213
214 JsonNode node = JsonUtils.readTree(response.getEntity(String.class));
215 assertEquals(StatusCodes.INVALID_ARGUMENT, node.at("/errors/0/0").asInt());
216 assertEquals("groupName must contain at least 3 characters",
217 node.at("/errors/0/1").asText());
218 assertEquals("groupName", node.at("/errors/0/2").asText());
219 }
220
221 @Test
margarethada5a6ab2019-11-08 10:06:05 +0100222 public void testUserGroup () throws UniformInterfaceException,
223 ClientHandlerException, KustvaktException {
margaretha45667922018-01-25 21:23:03 +0100224
margarethaca7cff82019-11-12 12:06:37 +0100225 String groupName = "new-user-group";
margarethad8aa1352019-12-19 11:04:41 +0100226 String description= "This is new-user-group.";
227
228 ClientResponse response =
229 testCreateUserGroup(groupName, description);
margarethaca7cff82019-11-12 12:06:37 +0100230 assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
231 // same name
margarethad8aa1352019-12-19 11:04:41 +0100232 response = testCreateGroupWithoutDescription(groupName);
margarethaca7cff82019-11-12 12:06:37 +0100233 assertEquals(Status.NO_CONTENT.getStatusCode(), response.getStatus());
margaretha45667922018-01-25 21:23:03 +0100234
235 // list user group
margarethad8aa1352019-12-19 11:04:41 +0100236 JsonNode node = retrieveUserGroups(username);
margaretha45667922018-01-25 21:23:03 +0100237 assertEquals(1, node.size());
238 node = node.get(0);
margarethada5a6ab2019-11-08 10:06:05 +0100239 assertEquals("new-user-group", node.get("name").asText());
margarethad8aa1352019-12-19 11:04:41 +0100240 assertEquals(description, node.get("description").asText());
margaretha45667922018-01-25 21:23:03 +0100241
242 assertEquals(username, node.get("owner").asText());
margarethad8aa1352019-12-19 11:04:41 +0100243 assertEquals(1, node.get("members").size());
margaretha45667922018-01-25 21:23:03 +0100244 assertEquals(username, node.at("/members/0/userId").asText());
245 assertEquals(GroupMemberStatus.ACTIVE.name(),
246 node.at("/members/0/status").asText());
margaretha4a1a18c2021-02-26 10:19:54 +0100247 assertEquals(PredefinedRole.VC_ACCESS_ADMIN.name(),
margaretha45667922018-01-25 21:23:03 +0100248 node.at("/members/0/roles/1").asText());
margaretha4a1a18c2021-02-26 10:19:54 +0100249 assertEquals(PredefinedRole.USER_GROUP_ADMIN.name(),
250 node.at("/members/0/roles/0").asText());
margaretha45667922018-01-25 21:23:03 +0100251
margarethad8aa1352019-12-19 11:04:41 +0100252 testUpdateUserGroup(groupName);
margarethaa18ab2b2019-11-11 12:55:26 +0100253 testInviteMember(groupName);
margaretha2c019fa2018-02-01 19:50:51 +0100254
margarethaa18ab2b2019-11-11 12:55:26 +0100255 testDeleteMemberUnauthorized(groupName);
256 testDeleteMember(groupName);
257 testDeleteGroup(groupName);
margaretha97bb3bd2018-03-14 18:41:14 +0100258
margarethaa18ab2b2019-11-11 12:55:26 +0100259 testSubscribeToDeletedGroup(groupName);
260 testUnsubscribeToDeletedGroup(groupName);
margaretha45667922018-01-25 21:23:03 +0100261 }
262
margarethad8aa1352019-12-19 11:04:41 +0100263 private void testUpdateUserGroup (String groupName)
264 throws UniformInterfaceException, ClientHandlerException,
265 KustvaktException {
266 String description = "Description is updated.";
267 ClientResponse response = testCreateUserGroup(groupName, description);
268 assertEquals(Status.NO_CONTENT.getStatusCode(), response.getStatus());
269
270 JsonNode node = retrieveUserGroups(username);
271 assertEquals(1, node.size());
272 assertEquals(description, node.get(0).get("description").asText());
273 }
274
margarethaa18ab2b2019-11-11 12:55:26 +0100275 private void testDeleteMember (String groupName)
margaretha45667922018-01-25 21:23:03 +0100276 throws UniformInterfaceException, ClientHandlerException,
277 KustvaktException {
margarethad8aa1352019-12-19 11:04:41 +0100278 // delete darla from group
margarethaf7abb362018-09-18 20:09:37 +0200279 ClientResponse response = resource().path(API_VERSION).path("group")
margarethad8aa1352019-12-19 11:04:41 +0100280 .path("@"+groupName).path("~darla")
margaretha064eb6f2018-07-10 18:33:01 +0200281 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
282 .createBasicAuthorizationHeaderValue(username, "pass"))
margaretha45667922018-01-25 21:23:03 +0100283 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
284 .delete(ClientResponse.class);
285
286 // check group member
margarethaca7cff82019-11-12 12:06:37 +0100287 response = resource().path(API_VERSION).path("group")
margaretha064eb6f2018-07-10 18:33:01 +0200288 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
289 .createBasicAuthorizationHeaderValue(username, "pass"))
margaretha45667922018-01-25 21:23:03 +0100290 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
291 .get(ClientResponse.class);
292 String entity = response.getEntity(String.class);
293 JsonNode node = JsonUtils.readTree(entity);
294 node = node.get(0);
margarethad8aa1352019-12-19 11:04:41 +0100295 assertEquals(1, node.get("members").size());
margaretha45667922018-01-25 21:23:03 +0100296 }
297
margarethaa18ab2b2019-11-11 12:55:26 +0100298 private void testDeleteMemberUnauthorized (String groupName)
margaretha2c019fa2018-02-01 19:50:51 +0100299 throws UniformInterfaceException, ClientHandlerException,
300 KustvaktException {
301 // nemo is a group member
margarethaf7abb362018-09-18 20:09:37 +0200302 ClientResponse response = resource().path(API_VERSION).path("group")
margarethad8aa1352019-12-19 11:04:41 +0100303 .path("@"+groupName).path("~darla")
margaretha064eb6f2018-07-10 18:33:01 +0200304 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
305 .createBasicAuthorizationHeaderValue("nemo", "pass"))
margaretha2c019fa2018-02-01 19:50:51 +0100306 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
307 .delete(ClientResponse.class);
308
309 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200310 // System.out.println(entity);
margaretha2c019fa2018-02-01 19:50:51 +0100311 JsonNode node = JsonUtils.readTree(entity);
312 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
313 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
314 node.at("/errors/0/0").asInt());
315 assertEquals("Unauthorized operation for user: nemo",
316 node.at("/errors/0/1").asText());
317 }
318
margarethae6c711b2018-02-06 21:55:04 +0100319 // EM: same as cancel invitation
margaretha2c019fa2018-02-01 19:50:51 +0100320 private void testDeletePendingMember () throws UniformInterfaceException,
321 ClientHandlerException, KustvaktException {
322 // dory delete pearl
margarethaf7abb362018-09-18 20:09:37 +0200323 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100324 .path("@dory-group").path("~pearl")
margaretha064eb6f2018-07-10 18:33:01 +0200325 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
326 .createBasicAuthorizationHeaderValue("dory", "pass"))
margaretha2c019fa2018-02-01 19:50:51 +0100327 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
328 .delete(ClientResponse.class);
329
330 assertEquals(Status.OK.getStatusCode(), response.getStatus());
331
332 // check member
333 JsonNode node = retrieveUserGroups("pearl");
334 assertEquals(0, node.size());
335 }
336
337 @Test
338 public void testDeleteDeletedMember () throws UniformInterfaceException,
339 ClientHandlerException, KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200340 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100341 .path("@dory-group").path("~pearl")
margaretha064eb6f2018-07-10 18:33:01 +0200342 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
343 .createBasicAuthorizationHeaderValue("dory", "pass"))
margaretha2c019fa2018-02-01 19:50:51 +0100344 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
345 .delete(ClientResponse.class);
346
347 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200348 // System.out.println(entity);
margaretha2c019fa2018-02-01 19:50:51 +0100349 JsonNode node = JsonUtils.readTree(entity);
350 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethae6c711b2018-02-06 21:55:04 +0100351 assertEquals(StatusCodes.GROUP_MEMBER_DELETED,
margaretha2c019fa2018-02-01 19:50:51 +0100352 node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100353 assertEquals("pearl has already been deleted from the group dory-group",
margaretha2c019fa2018-02-01 19:50:51 +0100354 node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100355 assertEquals("[pearl, dory-group]", node.at("/errors/0/2").asText());
margaretha2c019fa2018-02-01 19:50:51 +0100356 }
357
margarethaa18ab2b2019-11-11 12:55:26 +0100358 private void testDeleteGroup (String groupName)
margaretha45667922018-01-25 21:23:03 +0100359 throws UniformInterfaceException, ClientHandlerException,
360 KustvaktException {
margaretha226ec1e2018-07-04 15:45:59 +0200361 // delete group
margarethaf7abb362018-09-18 20:09:37 +0200362 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100363 .path("@"+groupName)
margaretha064eb6f2018-07-10 18:33:01 +0200364 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
365 .createBasicAuthorizationHeaderValue(username, "pass"))
366 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
367 .delete(ClientResponse.class);
margaretha45667922018-01-25 21:23:03 +0100368
369 assertEquals(Status.OK.getStatusCode(), response.getStatus());
370
margaretha39cec602019-02-05 19:48:49 +0100371 // EM: this is so complicated because the group retrieval are not allowed
372 // for delete groups
margaretha45667922018-01-25 21:23:03 +0100373 // check group
margarethaf7abb362018-09-18 20:09:37 +0200374 response = resource().path(API_VERSION).path("group").path("list")
375 .path("system-admin").queryParam("username", username)
margaretha293ee032018-03-20 20:11:52 +0100376 .queryParam("status", "DELETED")
margaretha064eb6f2018-07-10 18:33:01 +0200377 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
378 .createBasicAuthorizationHeaderValue(admin, "pass"))
margaretha45667922018-01-25 21:23:03 +0100379 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
380 .get(ClientResponse.class);
margaretha39cec602019-02-05 19:48:49 +0100381
382 assertEquals(Status.OK.getStatusCode(), response.getStatus());
margaretha45667922018-01-25 21:23:03 +0100383 String entity = response.getEntity(String.class);
margaretha293ee032018-03-20 20:11:52 +0100384 JsonNode node = JsonUtils.readTree(entity);
margaretha39cec602019-02-05 19:48:49 +0100385 for (int j = 0; j < node.size(); j++){
386 JsonNode group = node.get(j);
387 // check group members
388 for (int i = 0; i < group.at("/0/members").size(); i++) {
389 assertEquals(GroupMemberStatus.DELETED.name(),
390 group.at("/0/members/" + i + "/status").asText());
391 }
margaretha293ee032018-03-20 20:11:52 +0100392 }
margaretha45667922018-01-25 21:23:03 +0100393 }
394
395 @Test
margaretha2c019fa2018-02-01 19:50:51 +0100396 public void testDeleteGroupUnauthorized () throws UniformInterfaceException,
397 ClientHandlerException, KustvaktException {
margarethaa18ab2b2019-11-11 12:55:26 +0100398 // dory is a group admin in marlin-group
margarethaf7abb362018-09-18 20:09:37 +0200399 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100400 .path("@marlin-group")
margaretha064eb6f2018-07-10 18:33:01 +0200401 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
402 .createBasicAuthorizationHeaderValue("dory", "pass"))
403 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
404 .delete(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100405
406 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200407 // System.out.println(entity);
margaretha2c019fa2018-02-01 19:50:51 +0100408 JsonNode node = JsonUtils.readTree(entity);
409 assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
410 assertEquals(StatusCodes.AUTHORIZATION_FAILED,
411 node.at("/errors/0/0").asInt());
412 assertEquals("Unauthorized operation for user: dory",
413 node.at("/errors/0/1").asText());
414 }
415
416 @Test
margaretha97bb3bd2018-03-14 18:41:14 +0100417 public void testDeleteDeletedGroup () throws UniformInterfaceException,
418 ClientHandlerException, KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200419 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100420 .path("@deleted-group")
margaretha064eb6f2018-07-10 18:33:01 +0200421 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
422 .createBasicAuthorizationHeaderValue("dory", "pass"))
423 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
424 .delete(ClientResponse.class);
margaretha97bb3bd2018-03-14 18:41:14 +0100425
426 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
427
428 String entity = response.getEntity(String.class);
429 JsonNode node = JsonUtils.readTree(entity);
430 assertEquals(StatusCodes.GROUP_DELETED, node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100431 assertEquals("Group deleted-group has been deleted.",
margaretha97bb3bd2018-03-14 18:41:14 +0100432 node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100433 assertEquals("deleted-group", node.at("/errors/0/2").asText());
margaretha97bb3bd2018-03-14 18:41:14 +0100434 }
435
436 @Test
margaretha45667922018-01-25 21:23:03 +0100437 public void testDeleteGroupOwner () throws UniformInterfaceException,
438 ClientHandlerException, KustvaktException {
margarethaa18ab2b2019-11-11 12:55:26 +0100439 // delete marlin from marlin-group
440 // dory is a group admin in marlin-group
margarethaf7abb362018-09-18 20:09:37 +0200441 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100442 .path("@marlin-group").path("~marlin")
margaretha064eb6f2018-07-10 18:33:01 +0200443 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
444 .createBasicAuthorizationHeaderValue("dory", "pass"))
margaretha45667922018-01-25 21:23:03 +0100445 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
446 .delete(ClientResponse.class);
447
448 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200449 // System.out.println(entity);
margaretha45667922018-01-25 21:23:03 +0100450 JsonNode node = JsonUtils.readTree(entity);
451 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
452 assertEquals(StatusCodes.NOT_ALLOWED, node.at("/errors/0/0").asInt());
453 assertEquals("Operation 'delete group owner'is not allowed.",
454 node.at("/errors/0/1").asText());
margaretha45667922018-01-25 21:23:03 +0100455 }
456
margarethaa18ab2b2019-11-11 12:55:26 +0100457 private void testInviteMember (String groupName)
margaretha2c019fa2018-02-01 19:50:51 +0100458 throws UniformInterfaceException, ClientHandlerException,
459 KustvaktException {
margarethaca7cff82019-11-12 12:06:37 +0100460 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
461 form.add("members", "darla");
margaretha45667922018-01-25 21:23:03 +0100462
margarethaf7abb362018-09-18 20:09:37 +0200463 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100464 .path("@"+groupName).path("invite")
margarethaca7cff82019-11-12 12:06:37 +0100465 .type(MediaType.APPLICATION_FORM_URLENCODED)
margaretha9d3eb042017-12-22 11:02:30 +0100466 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200467 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
468 .createBasicAuthorizationHeaderValue(username, "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100469 .entity(form).post(ClientResponse.class);
margaretha98ec15b2018-01-22 17:14:02 +0100470
471 assertEquals(Status.OK.getStatusCode(), response.getStatus());
472
margaretha2c019fa2018-02-01 19:50:51 +0100473 // list group
margarethaca7cff82019-11-12 12:06:37 +0100474 response = resource().path(API_VERSION).path("group")
margaretha064eb6f2018-07-10 18:33:01 +0200475 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
476 .createBasicAuthorizationHeaderValue(username, "pass"))
margaretha45667922018-01-25 21:23:03 +0100477 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
478 .get(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100479
margaretha45667922018-01-25 21:23:03 +0100480 String entity = response.getEntity(String.class);
481
margaretha2c019fa2018-02-01 19:50:51 +0100482 JsonNode node = JsonUtils.readTree(entity);
483 node = node.get(0);
margarethad8aa1352019-12-19 11:04:41 +0100484 assertEquals(2, node.get("members").size());
margaretha45667922018-01-25 21:23:03 +0100485
margarethad8aa1352019-12-19 11:04:41 +0100486 assertEquals("darla", node.at("/members/1/userId").asText());
margaretha2c019fa2018-02-01 19:50:51 +0100487 assertEquals(GroupMemberStatus.PENDING.name(),
margarethad8aa1352019-12-19 11:04:41 +0100488 node.at("/members/1/status").asText());
489 assertEquals(0, node.at("/members/1/roles").size());
margaretha45667922018-01-25 21:23:03 +0100490 }
491
margaretha2c019fa2018-02-01 19:50:51 +0100492 private void testInviteDeletedMember () throws UniformInterfaceException,
margaretha45667922018-01-25 21:23:03 +0100493 ClientHandlerException, KustvaktException {
margarethaca7cff82019-11-12 12:06:37 +0100494 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
495 form.add("members", "marlin");
496
margarethaf7abb362018-09-18 20:09:37 +0200497 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100498 .path("@dory-group").path("invite")
margarethaca7cff82019-11-12 12:06:37 +0100499 .type(MediaType.APPLICATION_FORM_URLENCODED)
margarethab874ef52018-01-23 20:26:31 +0100500 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200501 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
502 .createBasicAuthorizationHeaderValue("dory", "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100503 .entity(form).post(ClientResponse.class);
margaretha45667922018-01-25 21:23:03 +0100504
505 assertEquals(Status.OK.getStatusCode(), response.getStatus());
506
507 // check member
margaretha2c019fa2018-02-01 19:50:51 +0100508 JsonNode node = retrieveUserGroups("marlin");
margaretha45667922018-01-25 21:23:03 +0100509 assertEquals(2, node.size());
510 JsonNode group = node.get(1);
511 assertEquals(GroupMemberStatus.PENDING.name(),
512 group.at("/userMemberStatus").asText());
513
margaretha0b63de42017-12-20 18:48:09 +0100514 }
margaretha98ec15b2018-01-22 17:14:02 +0100515
margaretha2c019fa2018-02-01 19:50:51 +0100516 @Test
margarethac1c3f1d2018-03-13 14:39:32 +0100517 public void testInviteDeletedMember2 () throws UniformInterfaceException,
518 ClientHandlerException, KustvaktException {
margarethada5a6ab2019-11-08 10:06:05 +0100519 // pearl has status deleted in dory-group
margarethaca7cff82019-11-12 12:06:37 +0100520 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
521 form.add("members", "pearl");
522
margarethaf7abb362018-09-18 20:09:37 +0200523 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100524 .path("@dory-group").path("invite")
margarethaca7cff82019-11-12 12:06:37 +0100525 .type(MediaType.APPLICATION_FORM_URLENCODED)
margarethac1c3f1d2018-03-13 14:39:32 +0100526 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200527 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
528 .createBasicAuthorizationHeaderValue("dory", "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100529 .entity(form).post(ClientResponse.class);
margarethac1c3f1d2018-03-13 14:39:32 +0100530
531 assertEquals(Status.OK.getStatusCode(), response.getStatus());
532
533 // check member
534 JsonNode node = retrieveUserGroups("pearl");
535 assertEquals(1, node.size());
536 JsonNode group = node.get(0);
537 assertEquals(GroupMemberStatus.PENDING.name(),
538 group.at("/userMemberStatus").asText());
539
540 testDeletePendingMember();
541 }
margaretha97bb3bd2018-03-14 18:41:14 +0100542
margarethac1c3f1d2018-03-13 14:39:32 +0100543 @Test
margaretha2c019fa2018-02-01 19:50:51 +0100544 public void testInvitePendingMember () throws UniformInterfaceException,
545 ClientHandlerException, KustvaktException {
margarethada5a6ab2019-11-08 10:06:05 +0100546 // marlin has status PENDING in dory-group
margarethaca7cff82019-11-12 12:06:37 +0100547 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
548 form.add("members", "marlin");
margaretha2c019fa2018-02-01 19:50:51 +0100549
margarethaf7abb362018-09-18 20:09:37 +0200550 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100551 .path("@dory-group").path("invite")
margarethaca7cff82019-11-12 12:06:37 +0100552 .type(MediaType.APPLICATION_FORM_URLENCODED)
margaretha2c019fa2018-02-01 19:50:51 +0100553 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200554 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
555 .createBasicAuthorizationHeaderValue("dory", "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100556 .entity(form).post(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100557 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200558 // System.out.println(entity);
margaretha2c019fa2018-02-01 19:50:51 +0100559 JsonNode node = JsonUtils.readTree(entity);
560 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethae6c711b2018-02-06 21:55:04 +0100561 assertEquals(StatusCodes.GROUP_MEMBER_EXISTS,
margaretha2c019fa2018-02-01 19:50:51 +0100562 node.at("/errors/0/0").asInt());
margaretha7f0a4d42018-02-20 19:16:44 +0100563 assertEquals(
564 "Username marlin with status PENDING exists in the user-group "
margarethada5a6ab2019-11-08 10:06:05 +0100565 + "dory-group",
margaretha7f0a4d42018-02-20 19:16:44 +0100566 node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100567 assertEquals("[marlin, PENDING, dory-group]",
margaretha2c019fa2018-02-01 19:50:51 +0100568 node.at("/errors/0/2").asText());
569 }
570
571 @Test
margarethac1c3f1d2018-03-13 14:39:32 +0100572 public void testInviteActiveMember () throws UniformInterfaceException,
margaretha2c019fa2018-02-01 19:50:51 +0100573 ClientHandlerException, KustvaktException {
margarethada5a6ab2019-11-08 10:06:05 +0100574 // nemo has status active in dory-group
margarethaca7cff82019-11-12 12:06:37 +0100575 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
576 form.add("members", "nemo");
margaretha2c019fa2018-02-01 19:50:51 +0100577
margarethaf7abb362018-09-18 20:09:37 +0200578 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100579 .path("@dory-group").path("invite")
margarethaca7cff82019-11-12 12:06:37 +0100580 .type(MediaType.APPLICATION_FORM_URLENCODED)
margaretha2c019fa2018-02-01 19:50:51 +0100581 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200582 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
583 .createBasicAuthorizationHeaderValue("dory", "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100584 .entity(form).post(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100585
margarethac1c3f1d2018-03-13 14:39:32 +0100586 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margaretha2c019fa2018-02-01 19:50:51 +0100587
margarethac1c3f1d2018-03-13 14:39:32 +0100588 String entity = response.getEntity(String.class);
589 JsonNode node = JsonUtils.readTree(entity);
590 assertEquals(StatusCodes.GROUP_MEMBER_EXISTS,
591 node.at("/errors/0/0").asInt());
592 assertEquals(
593 "Username nemo with status ACTIVE exists in the user-group "
margarethada5a6ab2019-11-08 10:06:05 +0100594 + "dory-group",
margarethac1c3f1d2018-03-13 14:39:32 +0100595 node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100596 assertEquals("[nemo, ACTIVE, dory-group]",
margarethac1c3f1d2018-03-13 14:39:32 +0100597 node.at("/errors/0/2").asText());
margaretha2c019fa2018-02-01 19:50:51 +0100598 }
599
margarethac1c3f1d2018-03-13 14:39:32 +0100600 @Test
601 public void testInviteMemberToDeletedGroup ()
margaretha97bb3bd2018-03-14 18:41:14 +0100602 throws UniformInterfaceException, ClientHandlerException,
603 KustvaktException {
margarethaca7cff82019-11-12 12:06:37 +0100604 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
605 form.add("members", "nemo");
margarethac1c3f1d2018-03-13 14:39:32 +0100606
margarethaf7abb362018-09-18 20:09:37 +0200607 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100608 .path("@deleted-group").path("invite")
margarethaca7cff82019-11-12 12:06:37 +0100609 .type(MediaType.APPLICATION_FORM_URLENCODED)
margarethac1c3f1d2018-03-13 14:39:32 +0100610 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200611 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
612 .createBasicAuthorizationHeaderValue("dory", "pass"))
margarethaca7cff82019-11-12 12:06:37 +0100613 .entity(form).post(ClientResponse.class);
margarethac1c3f1d2018-03-13 14:39:32 +0100614
615 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
616
617 String entity = response.getEntity(String.class);
618 JsonNode node = JsonUtils.readTree(entity);
margaretha97bb3bd2018-03-14 18:41:14 +0100619 assertEquals(StatusCodes.GROUP_DELETED, node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100620 assertEquals("Group deleted-group has been deleted.",
margarethac1c3f1d2018-03-13 14:39:32 +0100621 node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100622 assertEquals("deleted-group", node.at("/errors/0/2").asText());
margarethac1c3f1d2018-03-13 14:39:32 +0100623 }
margaretha97bb3bd2018-03-14 18:41:14 +0100624
margarethada5a6ab2019-11-08 10:06:05 +0100625 // marlin has GroupMemberStatus.PENDING in dory-group
margaretha2c019fa2018-02-01 19:50:51 +0100626 @Test
627 public void testSubscribePendingMember () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200628 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100629 .path("@dory-group").path("subscribe")
margaretha2c019fa2018-02-01 19:50:51 +0100630 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200631 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
632 .createBasicAuthorizationHeaderValue("marlin", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100633 .post(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100634
635 assertEquals(Status.OK.getStatusCode(), response.getStatus());
636
637 // retrieve marlin group
638 JsonNode node = retrieveUserGroups("marlin");
margaretha18533fd2018-03-28 16:01:06 +0200639 // System.out.println(node);
margaretha2c019fa2018-02-01 19:50:51 +0100640 assertEquals(2, node.size());
641
642 JsonNode group = node.get(1);
643 assertEquals(2, group.at("/id").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100644 assertEquals("dory-group", group.at("/name").asText());
margaretha2c019fa2018-02-01 19:50:51 +0100645 assertEquals("dory", group.at("/owner").asText());
646 // group members are not allowed to see other members
647 assertEquals(0, group.at("/members").size());
648 assertEquals(GroupMemberStatus.ACTIVE.name(),
649 group.at("/userMemberStatus").asText());
margaretha4a1a18c2021-02-26 10:19:54 +0100650 assertEquals(PredefinedRole.VC_ACCESS_MEMBER.name(),
margaretha18533fd2018-03-28 16:01:06 +0200651 group.at("/userRoles/1").asText());
margaretha4a1a18c2021-02-26 10:19:54 +0100652 assertEquals(PredefinedRole.USER_GROUP_MEMBER.name(),
653 group.at("/userRoles/0").asText());
margaretha18533fd2018-03-28 16:01:06 +0200654
margarethada5a6ab2019-11-08 10:06:05 +0100655 // unsubscribe marlin from dory-group
margarethaa18ab2b2019-11-11 12:55:26 +0100656 testUnsubscribeActiveMember("dory-group");
657 checkGroupMemberRole("dory-group", "marlin");
margaretha2c019fa2018-02-01 19:50:51 +0100658
margarethada5a6ab2019-11-08 10:06:05 +0100659 // invite marlin to dory-group to set back the
margaretha226ec1e2018-07-04 15:45:59 +0200660 // GroupMemberStatus.PENDING
margaretha2c019fa2018-02-01 19:50:51 +0100661 testInviteDeletedMember();
662 }
663
margarethada5a6ab2019-11-08 10:06:05 +0100664 // pearl has GroupMemberStatus.DELETED in dory-group
margaretha0b63de42017-12-20 18:48:09 +0100665 @Test
margaretha2c019fa2018-02-01 19:50:51 +0100666 public void testSubscribeDeletedMember () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200667 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100668 .path("@dory-group").path("subscribe")
margaretha0b63de42017-12-20 18:48:09 +0100669 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200670 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
671 .createBasicAuthorizationHeaderValue("pearl", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100672 .post(ClientResponse.class);
margaretha9d3eb042017-12-22 11:02:30 +0100673 String entity = response.getEntity(String.class);
674 JsonNode node = JsonUtils.readTree(entity);
margaretha98ec15b2018-01-22 17:14:02 +0100675
margaretha9d3eb042017-12-22 11:02:30 +0100676 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethac9f1dfa2018-02-07 17:50:33 +0100677 assertEquals(StatusCodes.GROUP_MEMBER_DELETED,
margaretha9d3eb042017-12-22 11:02:30 +0100678 node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100679 assertEquals("pearl has already been deleted from the group dory-group",
margaretha9d3eb042017-12-22 11:02:30 +0100680 node.at("/errors/0/1").asText());
681 }
margaretha98ec15b2018-01-22 17:14:02 +0100682
margaretha9d3eb042017-12-22 11:02:30 +0100683 @Test
margarethaa18ab2b2019-11-11 12:55:26 +0100684 public void testSubscribeMissingGroupName() throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200685 ClientResponse response = resource().path(API_VERSION).path("group")
686 .path("subscribe")
margaretha9d3eb042017-12-22 11:02:30 +0100687 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200688 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
margaretha9d3eb042017-12-22 11:02:30 +0100689 .createBasicAuthorizationHeaderValue("bruce", "pass"))
690 .post(ClientResponse.class);
margaretha03b195a2019-11-12 14:57:15 +0100691 assertEquals(Status.NOT_FOUND.getStatusCode(),
margarethaa18ab2b2019-11-11 12:55:26 +0100692 response.getStatus());
margaretha9d3eb042017-12-22 11:02:30 +0100693 }
694
695 @Test
696 public void testSubscribeNonExistentMember () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200697 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100698 .path("@dory-group").path("subscribe")
margaretha9d3eb042017-12-22 11:02:30 +0100699 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200700 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
701 .createBasicAuthorizationHeaderValue("bruce", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100702 .post(ClientResponse.class);
margaretha0b63de42017-12-20 18:48:09 +0100703 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200704 // System.out.println(entity);
margaretha0b63de42017-12-20 18:48:09 +0100705 JsonNode node = JsonUtils.readTree(entity);
margaretha9d3eb042017-12-22 11:02:30 +0100706
707 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
margarethac9f1dfa2018-02-07 17:50:33 +0100708 assertEquals(StatusCodes.GROUP_MEMBER_NOT_FOUND,
margaretha0b63de42017-12-20 18:48:09 +0100709 node.at("/errors/0/0").asInt());
margarethac9f1dfa2018-02-07 17:50:33 +0100710 assertEquals("bruce is not found in the group",
margaretha0b63de42017-12-20 18:48:09 +0100711 node.at("/errors/0/1").asText());
margaretha0b63de42017-12-20 18:48:09 +0100712 }
margaretha9d3eb042017-12-22 11:02:30 +0100713
714 @Test
715 public void testSubscribeToNonExistentGroup () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200716 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100717 .path("@non-existent").path("subscribe")
margaretha9d3eb042017-12-22 11:02:30 +0100718 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200719 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
720 .createBasicAuthorizationHeaderValue("pearl", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100721 .post(ClientResponse.class);
margaretha9d3eb042017-12-22 11:02:30 +0100722 String entity = response.getEntity(String.class);
margaretha9d3eb042017-12-22 11:02:30 +0100723 JsonNode node = JsonUtils.readTree(entity);
724
margarethaa18ab2b2019-11-11 12:55:26 +0100725 assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
726 assertEquals(StatusCodes.NO_RESOURCE_FOUND,
margaretha9d3eb042017-12-22 11:02:30 +0100727 node.at("/errors/0/0").asInt());
margarethaa18ab2b2019-11-11 12:55:26 +0100728 assertEquals("Group non-existent is not found",
margaretha9d3eb042017-12-22 11:02:30 +0100729 node.at("/errors/0/1").asText());
730 }
731
margarethaa18ab2b2019-11-11 12:55:26 +0100732 private void testSubscribeToDeletedGroup (String groupName)
margaretha97bb3bd2018-03-14 18:41:14 +0100733 throws UniformInterfaceException, ClientHandlerException,
734 KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200735 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100736 .path("@"+groupName).path("subscribe")
margaretha97bb3bd2018-03-14 18:41:14 +0100737 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200738 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
739 .createBasicAuthorizationHeaderValue("nemo", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100740 .post(ClientResponse.class);
margaretha97bb3bd2018-03-14 18:41:14 +0100741
742 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
743
744 String entity = response.getEntity(String.class);
745 JsonNode node = JsonUtils.readTree(entity);
746 assertEquals(StatusCodes.GROUP_DELETED, node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100747 assertEquals("Group new-user-group has been deleted.",
margaretha97bb3bd2018-03-14 18:41:14 +0100748 node.at("/errors/0/1").asText());
749 }
750
margarethaa18ab2b2019-11-11 12:55:26 +0100751 private void testUnsubscribeActiveMember (String groupName)
margaretha2c019fa2018-02-01 19:50:51 +0100752 throws UniformInterfaceException, ClientHandlerException,
753 KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200754 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100755 .path("@"+groupName).path("unsubscribe")
margaretha2c019fa2018-02-01 19:50:51 +0100756 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200757 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
758 .createBasicAuthorizationHeaderValue("marlin", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100759 .delete(ClientResponse.class);
margaretha2c019fa2018-02-01 19:50:51 +0100760
761 assertEquals(Status.OK.getStatusCode(), response.getStatus());
762
763 JsonNode node = retrieveUserGroups("marlin");
764 assertEquals(1, node.size());
765 }
766
margarethaa18ab2b2019-11-11 12:55:26 +0100767 private void checkGroupMemberRole (String groupName, String deletedMemberName)
margaretha18533fd2018-03-28 16:01:06 +0200768 throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200769 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100770 .path("@"+groupName)
margaretha064eb6f2018-07-10 18:33:01 +0200771 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
772 .createBasicAuthorizationHeaderValue(admin, "pass"))
margaretha18533fd2018-03-28 16:01:06 +0200773 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
774 .get(ClientResponse.class);
775 String entity = response.getEntity(String.class);
776
777 assertEquals(Status.OK.getStatusCode(), response.getStatus());
778
779 JsonNode node = JsonUtils.readTree(entity).at("/members");
780 JsonNode member;
781 for (int i = 0; i < node.size(); i++) {
782 member = node.get(i);
783 if (deletedMemberName.equals(member.at("/userId").asText())) {
784 assertEquals(0, node.at("/roles").size());
785 break;
786 }
787 }
788 }
789
margarethae6c711b2018-02-06 21:55:04 +0100790 @Test
791 public void testUnsubscribeDeletedMember ()
792 throws UniformInterfaceException, ClientHandlerException,
793 KustvaktException {
margarethada5a6ab2019-11-08 10:06:05 +0100794 // pearl unsubscribes from dory-group
margarethaf7abb362018-09-18 20:09:37 +0200795 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100796 .path("@dory-group").path("unsubscribe")
margarethae6c711b2018-02-06 21:55:04 +0100797 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200798 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
799 .createBasicAuthorizationHeaderValue("pearl", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100800 .delete(ClientResponse.class);
margarethae6c711b2018-02-06 21:55:04 +0100801
802 String entity = response.getEntity(String.class);
margaretha226ec1e2018-07-04 15:45:59 +0200803 // System.out.println(entity);
margarethae6c711b2018-02-06 21:55:04 +0100804 JsonNode node = JsonUtils.readTree(entity);
805 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
806 assertEquals(StatusCodes.GROUP_MEMBER_DELETED,
807 node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100808 assertEquals("pearl has already been deleted from the group dory-group",
margarethae6c711b2018-02-06 21:55:04 +0100809 node.at("/errors/0/1").asText());
margarethada5a6ab2019-11-08 10:06:05 +0100810 assertEquals("[pearl, dory-group]", node.at("/errors/0/2").asText());
margarethae6c711b2018-02-06 21:55:04 +0100811 }
margaretha7f0a4d42018-02-20 19:16:44 +0100812
margarethae6c711b2018-02-06 21:55:04 +0100813 @Test
814 public void testUnsubscribePendingMember ()
815 throws UniformInterfaceException, ClientHandlerException,
816 KustvaktException {
817
818 JsonNode node = retrieveUserGroups("marlin");
819 assertEquals(2, node.size());
margaretha7f0a4d42018-02-20 19:16:44 +0100820
margarethaf7abb362018-09-18 20:09:37 +0200821 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100822 .path("@dory-group").path("unsubscribe")
margarethae6c711b2018-02-06 21:55:04 +0100823 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200824 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
825 .createBasicAuthorizationHeaderValue("marlin", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100826 .delete(ClientResponse.class);
margarethae6c711b2018-02-06 21:55:04 +0100827
margarethae6c711b2018-02-06 21:55:04 +0100828 assertEquals(Status.OK.getStatusCode(), response.getStatus());
829
margaretha7f0a4d42018-02-20 19:16:44 +0100830 node = retrieveUserGroups("marlin");
margarethae6c711b2018-02-06 21:55:04 +0100831 assertEquals(1, node.size());
margaretha7f0a4d42018-02-20 19:16:44 +0100832
margarethada5a6ab2019-11-08 10:06:05 +0100833 // invite marlin to dory-group to set back the
margaretha226ec1e2018-07-04 15:45:59 +0200834 // GroupMemberStatus.PENDING
margarethae6c711b2018-02-06 21:55:04 +0100835 testInviteDeletedMember();
836 }
margaretha97bb3bd2018-03-14 18:41:14 +0100837
838 @Test
margarethaa18ab2b2019-11-11 12:55:26 +0100839 public void testUnsubscribeMissingGroupName () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200840 ClientResponse response = resource().path(API_VERSION).path("group")
margarethaa18ab2b2019-11-11 12:55:26 +0100841 .path("unsubscribe")
margaretha97bb3bd2018-03-14 18:41:14 +0100842 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200843 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
844 .createBasicAuthorizationHeaderValue("marlin", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100845 .delete(ClientResponse.class);
margaretha97bb3bd2018-03-14 18:41:14 +0100846
margarethaa18ab2b2019-11-11 12:55:26 +0100847 assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
margaretha97bb3bd2018-03-14 18:41:14 +0100848 }
849
850 @Test
851 public void testUnsubscribeNonExistentMember () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200852 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100853 .path("@dory-group").path("unsubscribe")
margaretha97bb3bd2018-03-14 18:41:14 +0100854 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200855 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
856 .createBasicAuthorizationHeaderValue("bruce", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100857 .delete(ClientResponse.class);
margaretha97bb3bd2018-03-14 18:41:14 +0100858
859 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
860
861 String entity = response.getEntity(String.class);
862 JsonNode node = JsonUtils.readTree(entity);
863
864 assertEquals(StatusCodes.GROUP_MEMBER_NOT_FOUND,
865 node.at("/errors/0/0").asInt());
866 assertEquals("bruce is not found in the group",
867 node.at("/errors/0/1").asText());
868 }
869
870 @Test
871 public void testUnsubscribeToNonExistentGroup () throws KustvaktException {
margarethaf7abb362018-09-18 20:09:37 +0200872 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100873 .path("@tralala-group").path("unsubscribe")
margaretha97bb3bd2018-03-14 18:41:14 +0100874 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200875 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
876 .createBasicAuthorizationHeaderValue("pearl", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100877 .delete(ClientResponse.class);
margaretha97bb3bd2018-03-14 18:41:14 +0100878
margarethaa18ab2b2019-11-11 12:55:26 +0100879 assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
margaretha97bb3bd2018-03-14 18:41:14 +0100880
881 String entity = response.getEntity(String.class);
882 JsonNode node = JsonUtils.readTree(entity);
883
margarethaa18ab2b2019-11-11 12:55:26 +0100884 assertEquals(StatusCodes.NO_RESOURCE_FOUND,
margaretha97bb3bd2018-03-14 18:41:14 +0100885 node.at("/errors/0/0").asInt());
margarethaa18ab2b2019-11-11 12:55:26 +0100886 assertEquals("Group tralala-group is not found",
margaretha97bb3bd2018-03-14 18:41:14 +0100887 node.at("/errors/0/1").asText());
888 }
889
margarethaa18ab2b2019-11-11 12:55:26 +0100890 private void testUnsubscribeToDeletedGroup (String groupName)
margaretha97bb3bd2018-03-14 18:41:14 +0100891 throws UniformInterfaceException, ClientHandlerException,
892 KustvaktException {
margaretha97bb3bd2018-03-14 18:41:14 +0100893
margarethaf7abb362018-09-18 20:09:37 +0200894 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100895 .path("@"+groupName).path("unsubscribe")
margaretha97bb3bd2018-03-14 18:41:14 +0100896 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
margaretha064eb6f2018-07-10 18:33:01 +0200897 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
898 .createBasicAuthorizationHeaderValue("nemo", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100899 .delete(ClientResponse.class);
margaretha97bb3bd2018-03-14 18:41:14 +0100900
901 assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
902
903 String entity = response.getEntity(String.class);
904 JsonNode node = JsonUtils.readTree(entity);
905 assertEquals(StatusCodes.GROUP_DELETED, node.at("/errors/0/0").asInt());
margarethada5a6ab2019-11-08 10:06:05 +0100906 assertEquals("Group new-user-group has been deleted.",
margaretha97bb3bd2018-03-14 18:41:14 +0100907 node.at("/errors/0/1").asText());
908 }
margarethaf7abb362018-09-18 20:09:37 +0200909
910 @Test
911 public void testAddSameMemberRole () throws UniformInterfaceException,
912 ClientHandlerException, KustvaktException {
913 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
margarethaf7abb362018-09-18 20:09:37 +0200914 form.add("memberUsername", "dory");
margarethad575bd92021-06-14 09:42:18 +0200915 form.add("roleId", "1");
margarethaf7abb362018-09-18 20:09:37 +0200916
917 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100918 .path("@marlin-group").path("role").path("add")
margarethaf7abb362018-09-18 20:09:37 +0200919 .type(MediaType.APPLICATION_FORM_URLENCODED)
920 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
921 .createBasicAuthorizationHeaderValue("marlin", "pass"))
922 .entity(form).post(ClientResponse.class);
923
924 assertEquals(Status.OK.getStatusCode(), response.getStatus());
925
926 UserGroupMember member = memberDao.retrieveMemberById("dory", 1);
927 Set<Role> roles = member.getRoles();
928 assertEquals(2, roles.size());
929 }
930
931 @Test
932 public void testDeleteAddMemberRole () throws UniformInterfaceException,
933 ClientHandlerException, KustvaktException {
934 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
margarethaf7abb362018-09-18 20:09:37 +0200935 form.add("memberUsername", "dory");
margarethad575bd92021-06-14 09:42:18 +0200936 form.add("roleId", "1");
margarethaf7abb362018-09-18 20:09:37 +0200937
938 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100939 .path("@marlin-group").path("role").path("delete")
margarethaf7abb362018-09-18 20:09:37 +0200940 .type(MediaType.APPLICATION_FORM_URLENCODED)
941 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
942 .createBasicAuthorizationHeaderValue("marlin", "pass"))
943 .entity(form).post(ClientResponse.class);
944
945 assertEquals(Status.OK.getStatusCode(), response.getStatus());
946
947 UserGroupMember member = memberDao.retrieveMemberById("dory", 1);
948 Set<Role> roles = member.getRoles();
949 assertEquals(1, roles.size());
950
951 testAddSameMemberRole();
952 }
953
954 @Test
955 public void testEditMemberRoleEmpty () throws UniformInterfaceException,
956 ClientHandlerException, KustvaktException {
957 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
margarethaf7abb362018-09-18 20:09:37 +0200958 form.add("memberUsername", "dory");
margarethaa18ab2b2019-11-11 12:55:26 +0100959
margarethaf7abb362018-09-18 20:09:37 +0200960 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100961 .path("@marlin-group").path("role").path("edit")
margarethaf7abb362018-09-18 20:09:37 +0200962 .type(MediaType.APPLICATION_FORM_URLENCODED)
963 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
964 .createBasicAuthorizationHeaderValue("marlin", "pass"))
margarethaa18ab2b2019-11-11 12:55:26 +0100965 .post(ClientResponse.class, form);
margarethaf7abb362018-09-18 20:09:37 +0200966
967 assertEquals(Status.OK.getStatusCode(), response.getStatus());
968
969 UserGroupMember member = memberDao.retrieveMemberById("dory", 1);
970 Set<Role> roles = member.getRoles();
971 assertEquals(0, roles.size());
972
margarethaa18ab2b2019-11-11 12:55:26 +0100973 testEditMemberRole();
margarethaf7abb362018-09-18 20:09:37 +0200974 }
975
margarethaa18ab2b2019-11-11 12:55:26 +0100976 private void testEditMemberRole ()
margarethaf7abb362018-09-18 20:09:37 +0200977 throws UniformInterfaceException, ClientHandlerException,
978 KustvaktException {
margarethaa18ab2b2019-11-11 12:55:26 +0100979 MultivaluedMap<String, String> form = new MultivaluedMapImpl();
980 form.add("memberUsername", "dory");
margarethad575bd92021-06-14 09:42:18 +0200981 form.add("roleId", "1");
982 form.add("roleId", "3");
margarethaf7abb362018-09-18 20:09:37 +0200983
984 ClientResponse response = resource().path(API_VERSION).path("group")
margaretha03b195a2019-11-12 14:57:15 +0100985 .path("@marlin-group").path("role").path("edit")
margarethaf7abb362018-09-18 20:09:37 +0200986 .type(MediaType.APPLICATION_FORM_URLENCODED)
987 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
988 .createBasicAuthorizationHeaderValue("marlin", "pass"))
989 .entity(form).post(ClientResponse.class);
990
991 assertEquals(Status.OK.getStatusCode(), response.getStatus());
992
993 UserGroupMember member = memberDao.retrieveMemberById("dory", 1);
994 Set<Role> roles = member.getRoles();
995 assertEquals(2, roles.size());
996 }
997
margaretha0b63de42017-12-20 18:48:09 +0100998}