1 package org.cacert.gigi;
3 import static org.hamcrest.CoreMatchers.*;
4 import static org.junit.Assert.*;
6 import java.sql.PreparedStatement;
7 import java.sql.ResultSet;
8 import java.sql.SQLException;
9 import java.util.Arrays;
10 import java.util.Collections;
11 import java.util.HashSet;
13 import org.cacert.gigi.database.DatabaseConnection;
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-assuer");
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 ResultSet 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 ResultSet 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 ResultSet fetchGroupRowsFor(User u) throws SQLException {
85 PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT * FROM user_groups WHERE user=?");
86 ps.setInt(1, u.getId());
87 ResultSet 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));