/*
 * Created on 25-Feb-2005
 */
package org.bodington.servlet.facilities;

import java.security.acl.NotOwnerException;
import java.util.Set;

import org.bodington.server.BuildingContext;
import org.bodington.server.BuildingServerException;
import org.bodington.server.BuildingServerTest;
import org.bodington.server.BuildingSession;
import org.bodington.server.realm.Acl;
import org.bodington.server.realm.AclEntry;
import org.bodington.server.realm.Group;
import org.bodington.server.realm.Permission;
import org.bodington.server.realm.User;
import org.bodington.server.resources.Resource;

/**
 * @author buckett
 */
public class AclResourceTest extends BuildingServerTest
{

    /*
     * @see BuildingServerTest#setUp()
     */
    protected void setUp() throws Exception
    {
        super.setUp();
    }

    public void testGetResults() throws BuildingServerException, NotOwnerException
    {
        AclResource aclResource = new AclResource(resource);
        Set results = aclResource.getResults();
        assertTrue(results.size() == 0);
        
        User user1 = new User(zone, "user1", "user", "1"); 
        user1.save();
        User user2 = new User(zone, "user2", "user", "2");
        user2.save();
        
        Group group1 = new Group("group1", "group1", resource);
        group1.save();
        group1.addMember(user1);
        group1.addMember(user2);
        group1.save();
               
        Acl acl = new Acl();
        acl.setName("acl");
        acl.save();
        
        AclEntry aclEntry = new AclEntry();
        aclEntry.addPermission(Permission.VIEW);
        aclEntry.setGroup(group1);
        aclEntry.setAcl(acl);
        aclEntry.save();
        
        acl.addEntry(aclEntry);
        acl.save();
        
        Resource resourceRoot = new Resource();
        resourceRoot.setName("root");
        resourceRoot.setIntroduction("root");
        resourceRoot.setDescription("root");
        resourceRoot.setTitle("root");
        resourceRoot.setAclId(acl.getAclId());
        resourceRoot.save();
        
        aclResource = new AclResource(resourceRoot);
        results = aclResource.getResults();
        
        // As we don't have permission to view the group.
        assertTrue(results.size() == 1);
        
        group1.setResourceId(resourceRoot.getResourceId());
        group1.save();
        
        BuildingContext.getContext().setUser(user1);
        aclResource = new AclResource(resourceRoot);
        results = aclResource.getResults();
        
        
        // We should see both users as we have permission to see the group.
        assertTrue(results.size() == 2);
        
    }

    public void testGetResultsWithEmptyGroup() throws BuildingServerException, NotOwnerException
    {
        AclResource aclResource = new AclResource(resource);
        
        User user1 = new User(zone, "user1", "user", "1"); 
        user1.save();
    
        
        Group group1 = new Group("group1", "group1", resource);
        group1.save();
        
        Group group2 = new Group("group2", "group2", resource);
        group2.save();
               
        Acl acl = new Acl();
        acl.setName("acl");
        acl.save();
        
        AclEntry aclEntry1 = new AclEntry();
        aclEntry1.addPermission(Permission.VIEW);
        aclEntry1.setGroup(group1);
        aclEntry1.setAcl(acl);
        aclEntry1.save();
        
        acl.addEntry(aclEntry1);
        acl.save();
        
        AclEntry aclEntry2 = new AclEntry();
        aclEntry2.addPermission(Permission.VIEW);
        aclEntry2.setGroup(group2);
        aclEntry2.setAcl(acl);
        aclEntry2.save();
        
        acl.addEntry(aclEntry2);
        acl.save();
        
        Resource resourceRoot = new Resource();
        resourceRoot.setName("root");
        resourceRoot.setIntroduction("root");
        resourceRoot.setDescription("root");
        resourceRoot.setTitle("root");
        resourceRoot.setAclId(acl.getAclId());
        resourceRoot.save();
        
        BuildingContext.getContext().setUser(user1);
        aclResource = new AclResource(resourceRoot);
        Set results = aclResource.getResults();
        
        assertEquals(3, results.size());
        
    }

}
