001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.auth.common;
007
008import static com.google.common.collect.Sets.newHashSet;
009import static org.junit.Assert.assertEquals;
010import static org.junit.Assert.assertNotEquals;
011import static org.junit.Assert.assertTrue;
012import static org.mockito.Mockito.mock;
013import static org.mockito.Mockito.when;
014
015import java.security.Principal;
016import java.util.Set;
017
018import javax.servlet.http.HttpServletRequest;
019
020import org.fcrepo.auth.common.ContainerRolesPrincipalProvider.ContainerRolesPrincipal;
021
022import org.junit.Before;
023import org.junit.Test;
024import org.mockito.Mock;
025import org.mockito.MockitoAnnotations;
026
027/**
028 * Tests for {@link ContainerRolesPrincipalProvider}.
029 *
030 * @author Kevin S. Clarke
031 */
032public class ContainerRolesPrincipalProviderTest {
033
034    @Mock
035    private HttpServletRequest request;
036
037    private ContainerRolesPrincipalProvider provider;
038
039    /**
040     * Sets up ContainerRolesPrincipalProviderTest's tests.
041     */
042    @Before
043    public void setUp() {
044        MockitoAnnotations.openMocks(this);
045        provider = new ContainerRolesPrincipalProvider();
046    }
047
048    /**
049     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
050     */
051    @Test
052    public void testSetRole() {
053        when(request.isUserInRole("a")).thenReturn(true);
054        provider.setRoleNames(newHashSet("a"));
055
056        final Set<Principal> principals = provider.getPrincipals(request);
057
058        assertEquals(1, principals.size());
059        assertTrue("The principals should contain 'a'", principals.contains(new ContainerRolesPrincipal("a")));
060    }
061
062    /**
063     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
064     */
065    @Test
066    public void testSetRoles() {
067        when(request.isUserInRole("a")).thenReturn(true);
068        when(request.isUserInRole("b")).thenReturn(true);
069        provider.setRoleNames(newHashSet("a", "b"));
070
071        final Set<Principal> principals = provider.getPrincipals(request);
072
073        assertEquals(2, principals.size());
074        assertTrue("The principals should contain 'a'", principals.contains(new ContainerRolesPrincipal("a")));
075        assertTrue("The principals should contain 'b'", principals.contains(new ContainerRolesPrincipal("b")));
076    }
077
078    /**
079     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
080     */
081    @Test
082    public void testTrimSetRoles() {
083        when(request.isUserInRole("a")).thenReturn(true);
084        when(request.isUserInRole("b")).thenReturn(true);
085        provider.setRoleNames(newHashSet(" a", "b "));
086
087        final Set<Principal> principals = provider.getPrincipals(request);
088
089        assertEquals(2, principals.size());
090        assertTrue("The principals should contain 'a'", principals.contains(new ContainerRolesPrincipal("a")));
091        assertTrue("The principals should contain 'b'", principals.contains(new ContainerRolesPrincipal("b")));
092    }
093
094    /**
095     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
096     */
097    @Test
098    public void testNoConfigedRoleNames() {
099        final Set<Principal> principals = provider.getPrincipals(request);
100        assertTrue("Empty set expected when no role names configured", principals.isEmpty());
101    }
102
103    /**
104     * Test for {@link ContainerRolesPrincipalProvider#getPrincipals(javax.servlet.http.HttpServletRequest)}.
105     */
106    @Test
107    public void testNoRequest() {
108        provider.setRoleNames(newHashSet("a"));
109
110        final Set<Principal> principals = provider.getPrincipals(null);
111        assertTrue("Empty set expected when no request supplied", principals.isEmpty());
112
113    }
114
115    /**
116     * Test for {@link ContainerRolesPrincipalProvider#getPrincipals(javax.servlet.http.HttpServletRequest)}.
117     */
118    @Test
119    public void testPrincipalEqualsDifferentClass() {
120        when(request.isUserInRole("a")).thenReturn(true);
121        provider.setRoleNames(newHashSet("a"));
122
123        final Set<Principal> principals = provider.getPrincipals(request);
124        final Principal principal = principals.iterator().next();
125
126        assertNotEquals("Principals should not be equal if not the same class", principal, mock(Principal.class));
127    }
128
129}