Added delete group member triggers and admin tests for group controller.
Change-Id: Ie191da6b02fd447ee1364c4e5298a9b160ec21a0
diff --git a/full/src/main/resources/db/insert/V3.1__insert_virtual_corpus.sql b/full/src/main/resources/db/insert/V3.1__insert_virtual_corpus.sql
index c708076..e09d2fb 100644
--- a/full/src/main/resources/db/insert/V3.1__insert_virtual_corpus.sql
+++ b/full/src/main/resources/db/insert/V3.1__insert_virtual_corpus.sql
@@ -13,8 +13,8 @@
--INSERT INTO user_group(name,status,created_by)
-- VALUES ("all users","HIDDEN","system");
-INSERT INTO user_group(name,status,created_by)
- VALUES ("deleted group","DELETED","dory");
+INSERT INTO user_group(name,status,created_by, deleted_by)
+ VALUES ("deleted group","DELETED","dory", "dory");
@@ -54,6 +54,11 @@
(SELECT id from user_group where name = "auto group"),
"ACTIVE","system";
+INSERT INTO user_group_member(user_id, group_id, status, created_by)
+ SELECT "dory",
+ (SELECT id from user_group where name = "deleted group"),
+ "ACTIVE","dory";
+
-- virtual corpora
INSERT INTO virtual_corpus(name, type, required_access, created_by, description, status, corpus_query)
diff --git a/full/src/main/resources/db/new-mysql/V1.2__create_admin_table.sql b/full/src/main/resources/db/new-mysql/V1.2__create_admin_table.sql
index f51cd1a..7c8ce73 100644
--- a/full/src/main/resources/db/new-mysql/V1.2__create_admin_table.sql
+++ b/full/src/main/resources/db/new-mysql/V1.2__create_admin_table.sql
@@ -1,5 +1,5 @@
CREATE TABLE IF NOT EXISTS admin (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
+ id INTEGER PRIMARY KEY AUTO_INCREMENT,
user_id varchar(100) NOT NULL,
UNIQUE INDEX unique_index (user_id)
);
\ No newline at end of file
diff --git a/full/src/main/resources/db/new-mysql/V1.3__triggers.sql b/full/src/main/resources/db/new-mysql/V1.3__triggers.sql
new file mode 100644
index 0000000..7bc25dd
--- /dev/null
+++ b/full/src/main/resources/db/new-mysql/V1.3__triggers.sql
@@ -0,0 +1,14 @@
+delimiter |
+
+CREATE TRIGGER delete_member AFTER UPDATE ON user_group
+ FOR EACH ROW
+ BEGIN
+ UPDATE user_group_member
+ SET status = "DELETED"
+ WHERE NEW.status = "DELETED"
+ AND OLD.status != "DELETED"
+ AND group_id = NEW.id;
+ END;
+|
+
+delimiter ;
\ No newline at end of file
diff --git a/full/src/main/resources/db/new-sqlite/V1.2__triggers.sql b/full/src/main/resources/db/new-sqlite/V1.2__triggers.sql
index 890e792..63dfeae 100644
--- a/full/src/main/resources/db/new-sqlite/V1.2__triggers.sql
+++ b/full/src/main/resources/db/new-sqlite/V1.2__triggers.sql
@@ -1,9 +1,22 @@
CREATE TRIGGER insert_member_status AFTER INSERT ON user_group_member
BEGIN
- UPDATE user_group_member SET status_date = DATETIME('now', 'localtime') WHERE rowid = new.rowid;
+ UPDATE user_group_member
+ SET status_date = DATETIME('now', 'localtime')
+ WHERE rowid = new.rowid;
END;
CREATE TRIGGER update_member_status AFTER UPDATE ON user_group_member
BEGIN
- UPDATE user_group_member SET status_date = (datetime('now','localtime')) WHERE rowid = old.rowid;
+ UPDATE user_group_member
+ SET status_date = (datetime('now','localtime'))
+ WHERE rowid = old.rowid;
END;
+
+CREATE TRIGGER delete_member AFTER UPDATE ON user_group
+ WHEN new.status = "DELETED" AND old.status <> "DELETED"
+ BEGIN
+ UPDATE user_group_member
+ SET status = "DELETED"
+ WHERE group_id = new.id;
+ END;
+
\ No newline at end of file
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java
index a9127cc..265a173 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java
@@ -2,6 +2,8 @@
import static org.junit.Assert.assertEquals;
+import javax.ws.rs.core.MediaType;
+
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,27 +17,41 @@
import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.constant.GroupMemberStatus;
+import de.ids_mannheim.korap.constant.PredefinedRole;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.web.input.UserGroupJson;
public class UserGroupControllerAdminTest extends SpringJerseyTest {
@Autowired
private HttpAuthorizationHandler handler;
- @Test
- public void testListDoryGroups () throws KustvaktException {
+ private String adminUsername = "admin";
+ private String testUsername = "UserGroupControllerAdminTest";
+
+ private JsonNode listGroup (String username)
+ throws UniformInterfaceException, ClientHandlerException,
+ KustvaktException {
ClientResponse response = resource().path("group").path("list")
- .queryParam("username", "dory")
+ .queryParam("username", username)
.header(Attributes.AUTHORIZATION,
- handler.createBasicAuthorizationHeaderValue("admin",
- "pass"))
+ handler.createBasicAuthorizationHeaderValue(
+ adminUsername, "pass"))
.header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
.get(ClientResponse.class);
assertEquals(Status.OK.getStatusCode(), response.getStatus());
String entity = response.getEntity(String.class);
- // System.out.println(entity);
+ System.out.println(entity);
JsonNode node = JsonUtils.readTree(entity);
+
+ return node;
+ }
+
+ @Test
+ public void testListDoryGroups () throws KustvaktException {
+ JsonNode node = listGroup("dory");
JsonNode group = node.get(1);
assertEquals(2, group.at("/id").asInt());
assertEquals("dory group", group.at("/name").asText());
@@ -43,13 +59,14 @@
assertEquals(3, group.at("/members").size());
}
+ // same as list user-groups of the admin
@Test
public void testListWithoutUsername () throws UniformInterfaceException,
ClientHandlerException, KustvaktException {
ClientResponse response = resource().path("group").path("list")
.header(Attributes.AUTHORIZATION,
- handler.createBasicAuthorizationHeaderValue("admin",
- "pass"))
+ handler.createBasicAuthorizationHeaderValue(
+ adminUsername, "pass"))
.header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
.get(ClientResponse.class);
@@ -58,5 +75,108 @@
assertEquals("[]", entity);
}
+ @Test
+ public void testCreateUserGroup () throws UniformInterfaceException,
+ ClientHandlerException, KustvaktException {
+
+ UserGroupJson json = new UserGroupJson();
+ json.setName("admin test group");
+ json.setMembers(new String[] { "marlin", "nemo" });
+
+ ClientResponse response = resource().path("group").path("create")
+ .type(MediaType.APPLICATION_JSON)
+ .header(Attributes.AUTHORIZATION,
+ handler.createBasicAuthorizationHeaderValue(
+ testUsername, "password"))
+ .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32").entity(json)
+ .post(ClientResponse.class);
+
+ assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+ // list user group
+ JsonNode node = listGroup(testUsername);
+ assertEquals(1, node.size());
+ node = node.get(0);
+ assertEquals("admin test group", node.get("name").asText());
+
+ String groupId = node.get("id").asText();
+// testInviteMember(groupId);
+// testDeleteMember(groupId);
+ testDeleteGroup(groupId);
+ }
+
+ private void testDeleteGroup (String groupId)
+ throws UniformInterfaceException, ClientHandlerException,
+ KustvaktException {
+ //delete group
+ ClientResponse response = resource().path("group").path("delete")
+ .queryParam("groupId", groupId)
+ .header(Attributes.AUTHORIZATION,
+ handler.createBasicAuthorizationHeaderValue(
+ adminUsername, "pass"))
+ .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
+ .delete(ClientResponse.class);
+
+ assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+ // check group
+// JsonNode node = listGroup(testUsername);
+// assertEquals(0, node.size());
+ }
+
+ private void testDeleteMember (String groupId)
+ throws UniformInterfaceException, ClientHandlerException,
+ KustvaktException {
+ // delete marlin from group
+ ClientResponse response = resource().path("group").path("member")
+ .path("delete").queryParam("memberId", "marlin")
+ .queryParam("groupId", groupId)
+ .header(Attributes.AUTHORIZATION,
+ handler.createBasicAuthorizationHeaderValue(
+ adminUsername, "pass"))
+ .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
+ .delete(ClientResponse.class);
+
+ // check group member
+ JsonNode node = listGroup(testUsername);
+ node = node.get(0);
+ assertEquals(3, node.get("members").size());
+ assertEquals("nemo", node.at("/members/1/userId").asText());
+ assertEquals(GroupMemberStatus.PENDING.name(),
+ node.at("/members/1/status").asText());
+ }
+
+ private void testInviteMember (String groupId)
+ throws UniformInterfaceException, ClientHandlerException,
+ KustvaktException {
+ String[] members = new String[] { "darla" };
+
+ UserGroupJson userGroup = new UserGroupJson();
+ userGroup.setMembers(members);
+ userGroup.setId(Integer.parseInt(groupId));
+
+ ClientResponse response = resource().path("group").path("member")
+ .path("invite").type(MediaType.APPLICATION_JSON)
+ .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
+ .header(Attributes.AUTHORIZATION,
+ handler.createBasicAuthorizationHeaderValue(
+ adminUsername, "pass"))
+ .entity(userGroup).post(ClientResponse.class);
+
+ assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+ // list group
+ JsonNode node = listGroup(testUsername);
+ node = node.get(0);
+ assertEquals(4, node.get("members").size());
+
+ assertEquals("darla", node.at("/members/3/userId").asText());
+ assertEquals(GroupMemberStatus.PENDING.name(),
+ node.at("/members/3/status").asText());
+ assertEquals(PredefinedRole.USER_GROUP_MEMBER.name(),
+ node.at("/members/3/roles/0").asText());
+ assertEquals(PredefinedRole.VC_ACCESS_MEMBER.name(),
+ node.at("/members/3/roles/1").asText());
+ }
}
diff --git a/lite/src/main/java/de/ids_mannheim/korap/server/KustvaktLiteServer.java b/lite/src/main/java/de/ids_mannheim/korap/server/KustvaktLiteServer.java
index 54e80f9..4be47cd 100644
--- a/lite/src/main/java/de/ids_mannheim/korap/server/KustvaktLiteServer.java
+++ b/lite/src/main/java/de/ids_mannheim/korap/server/KustvaktLiteServer.java
@@ -3,7 +3,6 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
-import java.net.URL;
import java.util.Properties;
import de.ids_mannheim.korap.config.KustvaktConfiguration;