1 package org.cacert.gigi;
3 import static org.hamcrest.CoreMatchers.*;
4 import static org.junit.Assert.*;
6 import java.sql.SQLException;
7 import java.util.Arrays;
8 import java.util.Collections;
9 import java.util.HashSet;
11 import org.cacert.gigi.database.DatabaseConnection;
12 import org.cacert.gigi.database.GigiPreparedStatement;
13 import org.cacert.gigi.database.GigiResultSet;
14 import org.cacert.gigi.dbObjects.Group;
15 import org.cacert.gigi.dbObjects.ObjectCache;
16 import org.cacert.gigi.dbObjects.User;
17 import org.cacert.gigi.testUtils.ManagedTest;
18 import org.junit.Test;
20 public class TestUserGroupMembership extends ManagedTest {
22 private final Group ttpGroup = Group.getByString("ttp-assurer");
24 private final Group supporter = Group.getByString("supporter");
27 public void testAddObject() throws GigiApiException, SQLException {
28 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
30 User granter = User.getById(createVerifiedUser("grFname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
31 assertBehavesEmpty(u);
33 u.grantGroup(granter, ttpGroup);
34 assertBehavesTtpGroup(u);
36 ObjectCache.clearAllCaches();
37 User u2 = User.getById(u.getId());
39 assertThat(u2, is(not(sameInstance(u))));
40 assertBehavesTtpGroup(u2);
42 GigiResultSet rs = fetchGroupRowsFor(u);
44 assertTrue(rs.next());
45 assertEquals(0, rs.getInt("revokedby"));
46 assertEquals(granter.getId(), rs.getInt("grantedby"));
47 assertEquals(ttpGroup.getDatabaseName(), rs.getString("permission"));
49 assertNull(rs.getDate("deleted"));
50 assertNotNull(rs.getDate("granted"));
52 assertFalse(rs.next());
56 public void testRemoveObject() throws GigiApiException, SQLException {
57 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
59 User granter = User.getById(createVerifiedUser("grFname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
61 assertBehavesEmpty(u);
62 u.grantGroup(granter, ttpGroup);
63 assertBehavesTtpGroup(u);
64 u.revokeGroup(granter, ttpGroup);
65 assertBehavesEmpty(u);
67 ObjectCache.clearAllCaches();
68 User u2 = User.getById(u.getId());
69 assertThat(u2, is(not(sameInstance(u))));
70 assertBehavesEmpty(u);
72 GigiResultSet rs = fetchGroupRowsFor(u);
73 assertTrue(rs.next());
74 assertEquals(granter.getId(), rs.getInt("revokedby"));
75 assertEquals(granter.getId(), rs.getInt("grantedby"));
76 assertEquals(ttpGroup.getDatabaseName(), rs.getString("permission"));
78 assertNotNull(rs.getDate("deleted"));
79 assertNotNull(rs.getDate("granted"));
81 assertFalse(rs.next());
84 private GigiResultSet fetchGroupRowsFor(User u) throws SQLException {
85 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT * FROM user_groups WHERE user=?");
86 ps.setInt(1, u.getId());
87 GigiResultSet rs = ps.executeQuery();
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() {
105 Group g = Group.getByString("supporter");
106 User ux = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
107 User ux2 = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
108 assertEquals(0, g.getMembers(0, 10).length);
109 ux.grantGroup(ux, g);
110 assertEquals(1, g.getMembers(0, 10).length);
111 ux2.grantGroup(ux, g);
112 assertEquals(2, g.getMembers(0, 10).length);
113 ux2.revokeGroup(ux, g);
114 assertEquals(1, g.getMembers(0, 10).length);
115 ux.revokeGroup(ux, g);
116 assertEquals(0, g.getMembers(0, 10).length);
121 public void testGroupEquals() {
122 assertTrue(ttpGroup.equals(ttpGroup));
123 assertFalse(ttpGroup.equals(null));
124 assertFalse(ttpGroup.equals(""));
125 assertFalse(ttpGroup.equals(supporter));