1 package org.cacert.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.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.BusinessTest;
18 import org.junit.Test;
20 public class TestUserGroupMembership extends BusinessTest {
22 private final Group ttpGroup = Group.TTP_ASSURER;
24 private final Group supporter = Group.SUPPORTER;
27 public void testAddObject() throws GigiApiException, SQLException, IOException {
28 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
30 User granter = getSupporter();
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 try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT * FROM `user_groups` WHERE `user`=?")) {
43 ps.setInt(1, u.getId());
44 GigiResultSet rs = ps.executeQuery();
46 assertTrue(rs.next());
47 assertEquals(0, rs.getInt("revokedby"));
48 assertEquals(granter.getId(), rs.getInt("grantedby"));
49 assertEquals(ttpGroup.getDBName(), rs.getString("permission"));
51 assertNull(rs.getDate("deleted"));
52 assertNotNull(rs.getDate("granted"));
54 assertFalse(rs.next());
59 public void testRemoveObject() throws GigiApiException, SQLException, IOException {
60 User u = User.getById(createVerifiedUser("fname", "lname", createUniqueName() + "@example.org", TEST_PASSWORD));
62 User granter = getSupporter();
64 assertBehavesEmpty(u);
65 u.grantGroup(granter, ttpGroup);
66 assertBehavesTtpGroup(u);
67 u.revokeGroup(granter, ttpGroup);
68 assertBehavesEmpty(u);
70 ObjectCache.clearAllCaches();
71 User u2 = User.getById(u.getId());
72 assertThat(u2, is(not(sameInstance(u))));
73 assertBehavesEmpty(u);
75 try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT * FROM `user_groups` WHERE `user`=?")) {
76 ps.setInt(1, u.getId());
77 GigiResultSet rs = ps.executeQuery();
78 assertTrue(rs.next());
79 assertEquals(granter.getId(), rs.getInt("revokedby"));
80 assertEquals(granter.getId(), rs.getInt("grantedby"));
81 assertEquals(ttpGroup.getDBName(), rs.getString("permission"));
83 assertNotNull(rs.getDate("deleted"));
84 assertNotNull(rs.getDate("granted"));
86 assertFalse(rs.next());
90 private void assertBehavesEmpty(User u) {
91 assertEquals(Collections.emptySet(), u.getGroups());
92 assertFalse(u.isInGroup(ttpGroup));
93 assertFalse(u.isInGroup(supporter));
96 private void assertBehavesTtpGroup(User u) {
97 assertEquals(new HashSet<>(Arrays.asList(ttpGroup)), u.getGroups());
98 assertTrue(u.isInGroup(ttpGroup));
99 assertFalse(u.isInGroup(supporter));
103 public void testListGroup() throws GigiApiException, IOException {
104 Group g = Group.SUPPORTER;
105 int start = g.getMembers(0, 10).length;
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 + start);
109 ux.grantGroup(getSupporter(), g); // creates a supporter
110 assertEquals(2, g.getMembers(0, 10).length + start);
111 ux2.grantGroup(ux, g);
112 assertEquals(3, g.getMembers(0, 10).length + start);
113 ux2.revokeGroup(ux, g);
114 assertEquals(2, g.getMembers(0, 10).length + start);
115 ux.revokeGroup(ux, g);
116 assertEquals(1, g.getMembers(0, 10).length + start);
121 public void testGroupEquals() {
122 assertTrue(ttpGroup.equals(ttpGroup));
123 assertFalse(ttpGroup.equals(null));
124 assertFalse(ttpGroup.equals(""));
125 assertFalse(ttpGroup.equals(supporter));