001/*
002 * Licensed to DuraSpace under one or more contributor license agreements.
003 * See the NOTICE file distributed with this work for additional information
004 * regarding copyright ownership.
005 *
006 * DuraSpace licenses this file to you under the Apache License,
007 * Version 2.0 (the "License"); you may not use this file except in
008 * compliance with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.fcrepo.auth.common;
019
020import static com.google.common.collect.Sets.newHashSet;
021import static org.junit.Assert.assertEquals;
022import static org.junit.Assert.assertNotEquals;
023import static org.junit.Assert.assertTrue;
024import static org.mockito.Mockito.mock;
025import static org.mockito.Mockito.when;
026import static org.mockito.MockitoAnnotations.initMocks;
027
028import java.security.Principal;
029import java.util.Set;
030
031import javax.servlet.http.HttpServletRequest;
032
033import org.fcrepo.auth.common.ContainerRolesPrincipalProvider.ContainerRolesPrincipal;
034import org.junit.Before;
035import org.junit.Test;
036import org.mockito.Mock;
037
038/**
039 * Tests for {@link ContainerRolesPrincipalProvider}.
040 *
041 * @author Kevin S. Clarke
042 */
043public class ContainerRolesPrincipalProviderTest {
044
045    @Mock
046    private HttpServletRequest request;
047
048    private ContainerRolesPrincipalProvider provider;
049
050    /**
051     * Sets up ContainerRolesPrincipalProviderTest's tests.
052     */
053    @Before
054    public void setUp() {
055        initMocks(this);
056        provider = new ContainerRolesPrincipalProvider();
057    }
058
059    /**
060     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
061     */
062    @Test
063    public void testSetRole() {
064        when(request.isUserInRole("a")).thenReturn(true);
065        provider.setRoleNames(newHashSet("a"));
066
067        final Set<Principal> principals = provider.getPrincipals(request);
068
069        assertEquals(1, principals.size());
070        assertTrue("The principals should contain 'a'", principals.contains(new ContainerRolesPrincipal("a")));
071    }
072
073    /**
074     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
075     */
076    @Test
077    public void testSetRoles() {
078        when(request.isUserInRole("a")).thenReturn(true);
079        when(request.isUserInRole("b")).thenReturn(true);
080        provider.setRoleNames(newHashSet("a", "b"));
081
082        final Set<Principal> principals = provider.getPrincipals(request);
083
084        assertEquals(2, principals.size());
085        assertTrue("The principals should contain 'a'", principals.contains(new ContainerRolesPrincipal("a")));
086        assertTrue("The principals should contain 'b'", principals.contains(new ContainerRolesPrincipal("b")));
087    }
088
089    /**
090     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
091     */
092    @Test
093    public void testTrimSetRoles() {
094        when(request.isUserInRole("a")).thenReturn(true);
095        when(request.isUserInRole("b")).thenReturn(true);
096        provider.setRoleNames(newHashSet(" a", "b "));
097
098        final Set<Principal> principals = provider.getPrincipals(request);
099
100        assertEquals(2, principals.size());
101        assertTrue("The principals should contain 'a'", principals.contains(new ContainerRolesPrincipal("a")));
102        assertTrue("The principals should contain 'b'", principals.contains(new ContainerRolesPrincipal("b")));
103    }
104
105    /**
106     * Test for {@link ContainerRolesPrincipalProvider#setRoleNames(Set)}.
107     */
108    @Test
109    public void testNoConfigedRoleNames() {
110        final Set<Principal> principals = provider.getPrincipals(request);
111        assertTrue("Empty set expected when no role names configured", principals.isEmpty());
112    }
113
114    /**
115     * Test for {@link ContainerRolesPrincipalProvider#getPrincipals(javax.servlet.http.HttpServletRequest)}.
116     */
117    @Test
118    public void testNoRequest() {
119        provider.setRoleNames(newHashSet("a"));
120
121        final Set<Principal> principals = provider.getPrincipals(null);
122        assertTrue("Empty set expected when no request supplied", principals.isEmpty());
123
124    }
125
126    /**
127     * Test for {@link ContainerRolesPrincipalProvider#getPrincipals(javax.servlet.http.HttpServletRequest)}.
128     */
129    @Test
130    public void testPrincipalEqualsDifferentClass() {
131        when(request.isUserInRole("a")).thenReturn(true);
132        provider.setRoleNames(newHashSet("a"));
133
134        final Set<Principal> principals = provider.getPrincipals(request);
135        final Principal principal = principals.iterator().next();
136
137        assertNotEquals("Principals should not be equal if not the same class", principal, mock(Principal.class));
138    }
139
140}