package edu.harvard.iq.dataverse.authorization.groups;
import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.authorization.groups.impl.builtin.AllUsers;
import edu.harvard.iq.dataverse.authorization.groups.impl.builtin.AuthenticatedUsers;
import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroup;
import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupProvider;
import edu.harvard.iq.dataverse.mocks.MockExplicitGroupService;
import edu.harvard.iq.dataverse.mocks.MockRoleAssigneeServiceBean;
import edu.harvard.iq.dataverse.mocks.MocksFactory;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static java.util.stream.Collectors.toList;
import java.util.stream.Stream;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import static edu.harvard.iq.dataverse.util.CollectionLiterals.*;
/**
*
* @author michael
*/
public class GroupServiceBeanTest {
public GroupServiceBeanTest() {
}
@Test
public void testFlattenGroupsCollection() throws GroupException {
// Setup
MockRoleAssigneeServiceBean roleAssigneeSvc = new MockRoleAssigneeServiceBean();
ExplicitGroupProvider prv = new ExplicitGroupProvider(null, roleAssigneeSvc);
ExplicitGroup gA = new ExplicitGroup(prv);
gA.setDisplayName("A");
ExplicitGroup gAa = new ExplicitGroup(prv);
gAa.setDisplayName("Aa");
ExplicitGroup gAb = new ExplicitGroup(prv);
gAb.setDisplayName("Ab");
ExplicitGroup gAstar = new ExplicitGroup(prv);
gAstar.setDisplayName("A*");
Dataverse dv = MocksFactory.makeDataverse();
Stream.of( gA, gAa, gAb, gAstar).forEach( g -> {
g.setId( MocksFactory.nextId() );
g.setOwner(dv);
g.setGroupAliasInOwner( g.getDisplayName() );
roleAssigneeSvc.add(g);
g.updateAlias();
});
// create some containment hierarchy.
gA.add(gAa);
gA.add(gAb);
gAb.add(gAstar);
gAa.add(gAstar);
gAa.add( AuthenticatedUsers.get() );
// Test
GroupServiceBean sut = new GroupServiceBean();
sut.roleAssigneeSvc = roleAssigneeSvc;
Set<Group> grps = setOf( AllUsers.get(), gA );
List<Group> result = sut.flattenGroupsCollection(grps).collect(toList());
assertEquals( "Groups should appear only once", result.size(), new HashSet<>(result).size() );
grps.addAll( listOf(gAa, gAb, gAstar, AuthenticatedUsers.get()) );
assertEquals( "All groups should appear", grps, new HashSet<>(result) );
}
@Test
public void testCollectAncestors() throws GroupException {
// Setup
MockRoleAssigneeServiceBean roleAssigneeSvc = new MockRoleAssigneeServiceBean();
MockExplicitGroupService explicitGroupSvc = new MockExplicitGroupService();
ExplicitGroupProvider prv = new ExplicitGroupProvider(null, roleAssigneeSvc);
ExplicitGroup gA = new ExplicitGroup(prv);
gA.setDisplayName("A");
ExplicitGroup gAa = new ExplicitGroup(prv);
gAa.setDisplayName("Aa");
ExplicitGroup gAb = new ExplicitGroup(prv);
gAb.setDisplayName("Ab");
ExplicitGroup gAstar = new ExplicitGroup(prv);
gAstar.setDisplayName("A*");
Dataverse dv = MocksFactory.makeDataverse();
Stream.of( gA, gAa, gAb, gAstar).forEach( g -> {
g.setId( MocksFactory.nextId() );
g.setOwner(dv);
g.setGroupAliasInOwner( g.getDisplayName() );
g.updateAlias();
roleAssigneeSvc.add(g);
explicitGroupSvc.registerGroup(g);
});
// create some containment hierarchy.
gA.add(gAa);
gA.add(gAb);
gAb.add(gAstar);
gAa.add(gAstar);
gAa.add(AuthenticatedUsers.get());
// Test
GroupServiceBean sut = new GroupServiceBean();
sut.roleAssigneeSvc = roleAssigneeSvc;
sut.explicitGroupService = explicitGroupSvc;
assertEquals( setOf(gA), sut.collectAncestors(setOf(gA)) );
assertEquals( setOf(gA, gAb), sut.collectAncestors(setOf(gAb)) );
assertEquals( setOf(gA, gAa, AuthenticatedUsers.get()),
sut.collectAncestors(setOf(AuthenticatedUsers.get())) );
assertEquals( setOf(gA, gAb, gAa, gAstar),
sut.collectAncestors(setOf(gAstar)) );
}
}