package edu.internet2.middleware.grouper;
import net.sf.hibernate.exception.ExceptionUtils;
import org.cagrid.gridgrouper.model.GroupDescriptor;
import org.cagrid.gridgrouper.model.MemberFilter;
import org.cagrid.gridgrouper.model.MembershipRequestDescriptor;
import org.cagrid.gridgrouper.model.MembershipRequestStatus;
import org.cagrid.gridgrouper.model.MembershipRequestUpdate;
import org.cagrid.gridgrouper.model.StemDescriptor;
import org.cagrid.gridgrouper.service.impl.testutils.Utils;
import org.cagrid.gridgrouper.service.impl.tools.GridGrouperBootstrapper;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class TestMembershipRequests extends GrouperBaseTest {
public static final String SUPER_USER = "/O=OSU/OU=BMI/OU=caGrid/OU=Dorian/OU=cagrid05/OU=IdP [1]/CN=super admin";
public static final String GROUPER_ALL = "GrouperAll";
private String USER_A = "/O=OSU/OU=BMI/OU=caGrid/OU=Dorian/OU=cagrid05/OU=IdP [1]/CN=user a";
private String USER_B = "/O=OSU/OU=BMI/OU=caGrid/OU=Dorian/OU=cagrid05/OU=IdP [1]/CN=user b";
private String USER_C = "/O=OSU/OU=BMI/OU=caGrid/OU=Dorian/OU=cagrid05/OU=IdP [1]/CN=user c";
private String USER_D = "/O=OSU/OU=BMI/OU=caGrid/OU=Dorian/OU=cagrid05/OU=IdP [1]/CN=user d";
@Test
public void testAddMembershipRequests() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_B, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_C, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_D, Utils.getGroupIdentifier(grp));
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Pending);
assertEquals("Do not retrieve the expected pending membership requests", 4, members.size());
} catch (Exception e) {
fail(ExceptionUtils.getFullStackTrace(e));
}
}
private GroupDescriptor initialGroupAndRequestSetup() throws Exception {
GridGrouperBootstrapper.addAdminMember(SUPER_USER);
grouper.getStem(SUPER_USER, Utils.getRootStemIdentifier());
String testStem = "TestStem";
StemDescriptor test = grouper.addChildStem(SUPER_USER, Utils.getRootStemIdentifier(), testStem, testStem);
final String groupExtension = "mygroup";
final String groupDisplayExtension = "My Group";
GroupDescriptor grp = createAndCheckGroup(test, groupExtension, groupDisplayExtension, 1);
final String subGroupExtension = "mysubgroup";
final String subGroupDisplayExtension = "My Sub Group";
createAndCheckGroup(test, subGroupExtension, subGroupDisplayExtension, 2);
return grp;
}
@Test
public void testApproveMembershipRequest() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_B, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_C, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_D, Utils.getGroupIdentifier(grp));
MembershipRequestUpdate update = new MembershipRequestUpdate();
update.setStatus(MembershipRequestStatus.Approved);
update.setPublicNote("I approve of this approval.");
grouper.updateMembershipRequest(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A, update);
GrouperSession session = GrouperSession.start(SubjectFinder.findById(SUPER_USER));
assertTrue(grouper.isMemberOf(session, Utils.getGroupIdentifier(grp), USER_A, MemberFilter.ALL));
assertFalse(grouper.isMemberOf(session, Utils.getGroupIdentifier(grp), USER_B, MemberFilter.ALL));
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testRejectMembershipRequest() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_B, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_C, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_D, Utils.getGroupIdentifier(grp));
MembershipRequestUpdate update = new MembershipRequestUpdate();
update.setStatus(MembershipRequestStatus.Rejected);
update.setPublicNote("I reject this rejection.");
grouper.updateMembershipRequest(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A, update);
GrouperSession session = GrouperSession.start(SubjectFinder.findById(SUPER_USER));
assertFalse(grouper.isMemberOf(session, Utils.getGroupIdentifier(grp), USER_A, MemberFilter.ALL));
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Rejected);
assertEquals("Did not find the rejected request", 1, members.size());
} catch (Exception e) {
fail(e.getMessage());
}
}
protected GroupDescriptor createAndCheckGroup(StemDescriptor stem, String extension, String displayExtension,
int childGroupCount) throws Exception {
GroupDescriptor grp = grouper.addChildGroup(SUPER_USER, Utils.getStemIdentifier(stem), extension, displayExtension);
return grp;
}
}