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.GigiPreparedStatement;
12 import org.cacert.gigi.database.GigiResultSet;
13 import org.cacert.gigi.dbObjects.Group;
14 import org.cacert.gigi.dbObjects.ObjectCache;
15 import org.cacert.gigi.dbObjects.User;
16 import org.cacert.gigi.testUtils.ManagedTest;
17 import org.junit.Test;
19 public class TestUserGroupMembership extends ManagedTest {
21 private final Group ttpGroup = Group.getByString("ttp-assurer");
23 private final Group supporter = Group.getByString("supporter");
26 public void testAddObject() throws GigiApiException, SQLException {
27 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
29 User granter = User.getById(createVerifiedUser("grFname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
30 assertBehavesEmpty(u);
32 u.grantGroup(granter, ttpGroup);
33 assertBehavesTtpGroup(u);
35 ObjectCache.clearAllCaches();
36 User u2 = User.getById(u.getId());
38 assertThat(u2, is(not(sameInstance(u))));
39 assertBehavesTtpGroup(u2);
41 try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT * FROM `user_groups` WHERE `user`=?")) {
42 ps.setInt(1, u.getId());
43 GigiResultSet rs = ps.executeQuery();
45 assertTrue(rs.next());
46 assertEquals(0, rs.getInt("revokedby"));
47 assertEquals(granter.getId(), rs.getInt("grantedby"));
48 assertEquals(ttpGroup.getDatabaseName(), rs.getString("permission"));
50 assertNull(rs.getDate("deleted"));
51 assertNotNull(rs.getDate("granted"));
53 assertFalse(rs.next());
58 public void testRemoveObject() throws GigiApiException, SQLException {
59 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
61 User granter = User.getById(createVerifiedUser("grFname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
63 assertBehavesEmpty(u);
64 u.grantGroup(granter, ttpGroup);
65 assertBehavesTtpGroup(u);
66 u.revokeGroup(granter, ttpGroup);
67 assertBehavesEmpty(u);
69 ObjectCache.clearAllCaches();
70 User u2 = User.getById(u.getId());
71 assertThat(u2, is(not(sameInstance(u))));
72 assertBehavesEmpty(u);
74 try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT * FROM `user_groups` WHERE `user`=?")) {
75 ps.setInt(1, u.getId());
76 GigiResultSet rs = ps.executeQuery();
77 assertTrue(rs.next());
78 assertEquals(granter.getId(), rs.getInt("revokedby"));
79 assertEquals(granter.getId(), rs.getInt("grantedby"));
80 assertEquals(ttpGroup.getDatabaseName(), rs.getString("permission"));
82 assertNotNull(rs.getDate("deleted"));
83 assertNotNull(rs.getDate("granted"));
85 assertFalse(rs.next());
89 private void assertBehavesEmpty(User u) {
90 assertEquals(Collections.emptySet(), u.getGroups());
91 assertFalse(u.isInGroup(ttpGroup));
92 assertFalse(u.isInGroup(supporter));
95 private void assertBehavesTtpGroup(User u) {
96 assertEquals(new HashSet<>(Arrays.asList(ttpGroup)), u.getGroups());
97 assertTrue(u.isInGroup(ttpGroup));
98 assertFalse(u.isInGroup(supporter));
102 public void testListGroup() {
103 Group g = Group.getByString("supporter");
104 int start = g.getMembers(0, 10).length;
105 User ux = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
106 User ux2 = User.getById(createVerifiedUser("fn", "ln", createUniqueName() + "@example.org", TEST_PASSWORD));
107 assertEquals(0, g.getMembers(0, 10).length + start);
108 ux.grantGroup(ux, g);
109 assertEquals(1, g.getMembers(0, 10).length + start);
110 ux2.grantGroup(ux, g);
111 assertEquals(2, g.getMembers(0, 10).length + start);
112 ux2.revokeGroup(ux, g);
113 assertEquals(1, g.getMembers(0, 10).length + start);
114 ux.revokeGroup(ux, g);
115 assertEquals(0, g.getMembers(0, 10).length + start);
120 public void testGroupEquals() {
121 assertTrue(ttpGroup.equals(ttpGroup));
122 assertFalse(ttpGroup.equals(null));
123 assertFalse(ttpGroup.equals(""));
124 assertFalse(ttpGroup.equals(supporter));