1 package club.wpia.gigi;
3 import static org.hamcrest.CoreMatchers.*;
4 import static org.junit.Assert.*;
6 import java.io.IOException;
7 import java.sql.SQLException;
8 import java.util.Arrays;
9 import java.util.Collections;
10 import java.util.HashSet;
12 import org.junit.Test;
14 import club.wpia.gigi.database.GigiPreparedStatement;
15 import club.wpia.gigi.database.GigiResultSet;
16 import club.wpia.gigi.dbObjects.Group;
17 import club.wpia.gigi.dbObjects.ObjectCache;
18 import club.wpia.gigi.dbObjects.User;
19 import club.wpia.gigi.testUtils.BusinessTest;
21 public class TestUserGroupMembership extends BusinessTest {
23 private final Group ttpGroup = Group.TTP_AGENT;
25 private final Group supporter = Group.SUPPORTER;
28 public void testAddObject() throws GigiApiException, SQLException, IOException {
29 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
31 User granter = getSupporter();
32 assertBehavesEmpty(u);
34 u.grantGroup(granter, ttpGroup);
35 assertBehavesTtpGroup(u);
37 ObjectCache.clearAllCaches();
38 User u2 = User.getById(u.getId());
40 assertThat(u2, is(not(sameInstance(u))));
41 assertBehavesTtpGroup(u2);
43 try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT * FROM `user_groups` WHERE `user`=?")) {
44 ps.setInt(1, u.getId());
45 GigiResultSet rs = ps.executeQuery();
47 assertTrue(rs.next());
48 assertEquals(0, rs.getInt("revokedby"));
49 assertEquals(granter.getId(), rs.getInt("grantedby"));
50 assertEquals(ttpGroup.getDBName(), rs.getString("permission"));
52 assertNull(rs.getTimestamp("deleted"));
53 assertNotNull(rs.getTimestamp("granted"));
55 assertFalse(rs.next());
60 public void testRemoveObject() throws GigiApiException, SQLException, IOException {
61 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
63 User granter = getSupporter();
65 assertBehavesEmpty(u);
66 u.grantGroup(granter, ttpGroup);
67 assertBehavesTtpGroup(u);
68 u.revokeGroup(granter, ttpGroup);
69 assertBehavesEmpty(u);
71 ObjectCache.clearAllCaches();
72 User u2 = User.getById(u.getId());
73 assertThat(u2, is(not(sameInstance(u))));
74 assertBehavesEmpty(u);
76 try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT * FROM `user_groups` WHERE `user`=?")) {
77 ps.setInt(1, u.getId());
78 GigiResultSet rs = ps.executeQuery();
79 assertTrue(rs.next());
80 assertEquals(granter.getId(), rs.getInt("revokedby"));
81 assertEquals(granter.getId(), rs.getInt("grantedby"));
82 assertEquals(ttpGroup.getDBName(), rs.getString("permission"));
84 assertNotNull(rs.getTimestamp("deleted"));
85 assertNotNull(rs.getTimestamp("granted"));
87 assertFalse(rs.next());
91 private void assertBehavesEmpty(User u) {
92 assertEquals(Collections.emptySet(), u.getGroups());
93 assertFalse(u.isInGroup(ttpGroup));
94 assertFalse(u.isInGroup(supporter));
97 private void assertBehavesTtpGroup(User u) {
98 assertEquals(new HashSet<>(Arrays.asList(ttpGroup)), u.getGroups());
99 assertTrue(u.isInGroup(ttpGroup));
100 assertFalse(u.isInGroup(supporter));
104 public void testListGroup() throws GigiApiException, IOException {
105 Group g = Group.SUPPORTER;
106 int start = g.getMembers(0, 10).length;
107 User ux = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
108 User ux2 = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
109 assertEquals(0, g.getMembers(0, 10).length + start);
110 ux.grantGroup(getSupporter(), g); // creates a supporter
111 assertEquals(2, g.getMembers(0, 10).length + start);
112 ux2.grantGroup(ux, g);
113 assertEquals(3, g.getMembers(0, 10).length + start);
114 ux2.revokeGroup(ux, g);
115 assertEquals(2, g.getMembers(0, 10).length + start);
116 ux.revokeGroup(ux, g);
117 assertEquals(1, g.getMembers(0, 10).length + start);
122 public void testGroupEquals() {
123 assertTrue(ttpGroup.equals(ttpGroup));
124 assertFalse(ttpGroup.equals(null));
125 assertFalse(ttpGroup.equals(""));
126 assertFalse(ttpGroup.equals(supporter));