package edu.internet2.middleware.grouper;
import org.cagrid.gridgrouper.model.GroupDescriptor;
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.exception.MemberAddException;
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.assertNull;
import static org.junit.Assert.fail;
public class TestMembershipRequestsEdgeCases 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 testAddMembershipRequestsTwice() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Pending);
assertEquals("Only one membership request should be generated.", 1, members.size());
} catch (MemberAddException e) {
// Expected fault
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testMembershipRetrieveal() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Pending);
MembershipRequestUpdate update = new MembershipRequestUpdate("A note", "A note",MembershipRequestStatus.Rejected);
grouper.updateMembershipRequest(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A, update);
members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Rejected);
assertEquals("Only one membership request should be generated.", 1, members.size());
} catch (MemberAddException e) {
// Expected fault
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testAddMembershipRequestsForExistingMember() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMember(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A);
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Pending);
assertEquals("Shouldn't be able to request membership if already a member", 0, members.size());
} catch (MemberAddException e) {
// Expected fault
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testAddMembershipRequestsForRejectedMember() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
MembershipRequestUpdate update = new MembershipRequestUpdate(null, "A note", MembershipRequestStatus.Rejected);
grouper.updateMembershipRequest(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A, update);
try {
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
fail("Should not be able to add a membership request if a previous request has been rejected");
} catch (MemberAddException e) {
// Expected fault
}
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Rejected);
assertEquals("Membership request should still be rejected", 1, members.size());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testAddMembershipRequestsForRemovedMember() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
MembershipRequestUpdate update = new MembershipRequestUpdate(null, "A note", MembershipRequestStatus.Approved);
grouper.updateMembershipRequest(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A, update);
grouper.deleteMember(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A);
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Pending);
assertEquals("Should be able to request membership", 1, members.size());
assertEquals("Should have membership request history", 4, members.get(0).getHistory().size());
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testNotePrivieges() {
try {
GroupDescriptor grp = initialGroupAndRequestSetup();
grouper.enableMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp));
grouper.addMembershipRequest(USER_A, Utils.getGroupIdentifier(grp));
MembershipRequestUpdate update = new MembershipRequestUpdate("An Approved Admin Note", "An Approved Public Note", MembershipRequestStatus.Approved);
grouper.updateMembershipRequest(SUPER_USER, Utils.getGroupIdentifier(grp), USER_A, update);
List<MembershipRequestDescriptor> members = grouper.getMembershipRequests(SUPER_USER, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Approved);
assertEquals("Should be able to request membership", 1, members.size());
assertEquals("Should have membership request history", 2, members.get(0).getHistory().size());
if (members.get(0).getHistory().get(0).getAdminNote() != null) {
assertEquals("Admin should be able to see see the admin note", "An Approved Admin Note", members.get(0).getHistory().get(0).getAdminNote());
} else {
assertEquals("Admin should be able to see see the admin note", "An Approved Admin Note", members.get(0).getHistory().get(1).getAdminNote());
}
members = grouper.getMembershipRequests(USER_A, Utils.getGroupIdentifier(grp),
MembershipRequestStatus.Approved);
assertEquals("Should have membership request history", 2, members.get(0).getHistory().size());
assertNull("User should not see the admin not", members.get(0).getHistory().get(0).getAdminNote());
assertNull("User should not see the admin not", members.get(0).getHistory().get(1).getAdminNote());
} catch (Exception e) {
fail(e.getMessage());
}
}
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;
}
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;
}
}