/** * Licensed to the Sakai Foundation (SF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The SF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ package org.sakaiproject.provider.user; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.PatternLayout; import org.apache.log4j.PropertyConfigurator; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.sakaiproject.component.api.ComponentManager; import org.sakaiproject.component.api.ServerConfigurationService; import org.sakaiproject.hybrid.util.NakamuraAuthenticationHelper; import org.sakaiproject.hybrid.util.NakamuraAuthenticationHelper.AuthInfo; import org.sakaiproject.thread_local.api.ThreadLocalManager; import org.sakaiproject.user.api.UserEdit; /** * @see NakamuraUserDirectoryProvider */ @RunWith(MockitoJUnitRunner.class) public class NakamuraUserDirectoryProviderTest { static final String MOCK_PRINCIPAL = "admin"; static final String MOCK_FIRSTNAME = "Admin"; static final String MOCK_LASTNAME = "User"; static final String MOCK_EMAIL = "admin@sakai.invalid"; NakamuraUserDirectoryProvider nakamuraUserDirectoryProvider; @Mock HttpServletRequest request; @Mock ComponentManager componentManager; @Mock ThreadLocalManager threadLocalManager; @Mock ServerConfigurationService serverConfigurationService; @Mock NakamuraAuthenticationHelper nakamuraAuthenticationHelper; @Mock AuthInfo authInfo; @Mock UserEdit userEdit; @BeforeClass public static void setupClass() { Properties log4jProperties = new Properties(); log4jProperties.put("log4j.rootLogger", "ALL, A1"); log4jProperties.put("log4j.appender.A1", "org.apache.log4j.ConsoleAppender"); log4jProperties.put("log4j.appender.A1.layout", "org.apache.log4j.PatternLayout"); log4jProperties.put("log4j.appender.A1.layout.ConversionPattern", PatternLayout.TTCC_CONVERSION_PATTERN); log4jProperties.put("log4j.threshold", "ALL"); PropertyConfigurator.configure(log4jProperties); } /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { // perform mock injection nakamuraUserDirectoryProvider = new NakamuraUserDirectoryProvider(); nakamuraUserDirectoryProvider.setComponentManager(componentManager); nakamuraUserDirectoryProvider.setThreadLocalManager(threadLocalManager); nakamuraUserDirectoryProvider .setServerConfigurationService(serverConfigurationService); nakamuraUserDirectoryProvider.nakamuraAuthenticationHelper = nakamuraAuthenticationHelper; // mock sakai.proeprties settings. when( serverConfigurationService.getString( NakamuraUserDirectoryProvider.CONFIG_VALIDATE_URL, nakamuraUserDirectoryProvider.validateUrl)).thenReturn( nakamuraUserDirectoryProvider.validateUrl); when( serverConfigurationService.getString( NakamuraUserDirectoryProvider.CONFIG_PRINCIPAL, nakamuraUserDirectoryProvider.principal)).thenReturn( nakamuraUserDirectoryProvider.principal); when( serverConfigurationService.getString( NakamuraUserDirectoryProvider.CONFIG_HOST_NAME, nakamuraUserDirectoryProvider.hostname)).thenReturn( nakamuraUserDirectoryProvider.hostname); ; when( nakamuraAuthenticationHelper .getPrincipalLoggedIntoNakamura(request)).thenReturn( authInfo); when(authInfo.getPrincipal()).thenReturn(MOCK_PRINCIPAL); when(authInfo.getFirstName()).thenReturn(MOCK_FIRSTNAME); when(authInfo.getLastName()).thenReturn(MOCK_LASTNAME); when(authInfo.getEmailAddress()).thenReturn(MOCK_EMAIL); // return HttpServletRequest from ThreadLocal when( threadLocalManager .get(NakamuraUserDirectoryProvider.CURRENT_HTTP_REQUEST)) .thenReturn(request); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#init()} */ @Test public void testInit() { // grab original default values final String originalValidateUrl = nakamuraUserDirectoryProvider.validateUrl; final String originalPrincipal = nakamuraUserDirectoryProvider.principal; final String originalHostname = nakamuraUserDirectoryProvider.hostname; try { nakamuraUserDirectoryProvider.init(); } catch (Throwable e) { fail("No exception should be thrown"); } verify(serverConfigurationService, times(1)).getString( NakamuraUserDirectoryProvider.CONFIG_VALIDATE_URL, originalValidateUrl); verify(serverConfigurationService, times(1)).getString( NakamuraUserDirectoryProvider.CONFIG_PRINCIPAL, originalPrincipal); verify(serverConfigurationService, times(1)).getString( NakamuraUserDirectoryProvider.CONFIG_HOST_NAME, originalHostname); assertEquals(originalValidateUrl, nakamuraUserDirectoryProvider.validateUrl); assertEquals(originalPrincipal, nakamuraUserDirectoryProvider.principal); assertEquals(originalHostname, nakamuraUserDirectoryProvider.hostname); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#authenticateUser(java.lang.String, org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testAuthenticateUser() { // test good path first Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.authenticateUser( MOCK_PRINCIPAL, userEdit, "password not used"); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertTrue(answer); verify(userEdit, times(1)).setEid(MOCK_PRINCIPAL); verify(userEdit, times(1)).setFirstName(MOCK_FIRSTNAME); verify(userEdit, times(1)).setLastName(MOCK_LASTNAME); verify(userEdit, times(1)).setEmail(MOCK_EMAIL); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#authenticateUser(java.lang.String, org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testAuthenticateUserNullEid() { Boolean answer = null; // test null eid try { answer = nakamuraUserDirectoryProvider.authenticateUser(null, userEdit, "password not used"); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse(answer); verify(userEdit, never()).setFirstName(any(String.class)); verify(userEdit, never()).setLastName(MOCK_LASTNAME); verify(userEdit, never()).setEmail(MOCK_EMAIL); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#authenticateUser(java.lang.String, org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testAuthenticateUserNotAuthenticated() { when( nakamuraAuthenticationHelper .getPrincipalLoggedIntoNakamura(request)).thenReturn( null); Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.authenticateUser( MOCK_PRINCIPAL, userEdit, "password not used"); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse(answer); verify(userEdit, never()).setFirstName(any(String.class)); verify(userEdit, never()).setLastName(MOCK_LASTNAME); verify(userEdit, never()).setEmail(MOCK_EMAIL); } // eid.equalsIgnoreCase(authInfo.getPrincipal() /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#authenticateUser(java.lang.String, org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testAuthenticateEidNotEqualToAuthInfoPrincipal() { /* * An edge case where the passed eid does not match the user logged into * Nakamura */ when(authInfo.getPrincipal()).thenReturn("lance"); Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.authenticateUser( MOCK_PRINCIPAL, userEdit, "password not used"); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse(answer); verify(userEdit, never()).setFirstName(any(String.class)); verify(userEdit, never()).setLastName(MOCK_LASTNAME); verify(userEdit, never()).setEmail(MOCK_EMAIL); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#authenticateWithProviderFirst(java.lang.String)} */ @Test public void testAuthenticateWithProviderFirst() { Boolean answer = null; try { answer = nakamuraUserDirectoryProvider .authenticateWithProviderFirst(MOCK_PRINCIPAL); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse("Implementation always returns false for now", answer); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#findUserByEmail(org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testFindUserByEmail() { Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.findUserByEmail(userEdit, MOCK_EMAIL); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertTrue(answer); verify(userEdit, times(1)).setEid(MOCK_PRINCIPAL); verify(userEdit, times(1)).setFirstName(MOCK_FIRSTNAME); verify(userEdit, times(1)).setLastName(MOCK_LASTNAME); verify(userEdit, times(1)).setEmail(MOCK_EMAIL); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#findUserByEmail(org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testFindUserByEmailNullEmail() { Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.findUserByEmail(userEdit, null); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse(answer); verify(userEdit, never()).setEid(MOCK_PRINCIPAL); verify(userEdit, never()).setFirstName(MOCK_FIRSTNAME); verify(userEdit, never()).setLastName(MOCK_LASTNAME); verify(userEdit, never()).setEmail(MOCK_EMAIL); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#findUserByEmail(org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testFindUserByEmailNotAuthenticated() { when( nakamuraAuthenticationHelper .getPrincipalLoggedIntoNakamura(request)).thenReturn( null); Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.findUserByEmail(userEdit, MOCK_EMAIL); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse(answer); verify(userEdit, never()).setEid(MOCK_PRINCIPAL); verify(userEdit, never()).setFirstName(MOCK_FIRSTNAME); verify(userEdit, never()).setLastName(MOCK_LASTNAME); verify(userEdit, never()).setEmail(MOCK_EMAIL); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#findUserByEmail(org.sakaiproject.user.api.UserEdit, java.lang.String)} */ @Test public void testFindUserByEmailEidNotEqualToAuthInfoPrincipal() { when(authInfo.getEmailAddress()).thenReturn("foo@bar.edu"); Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.findUserByEmail(userEdit, MOCK_EMAIL); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertFalse(answer); verify(userEdit, never()).setEid(MOCK_PRINCIPAL); verify(userEdit, never()).setFirstName(MOCK_FIRSTNAME); verify(userEdit, never()).setLastName(MOCK_LASTNAME); verify(userEdit, never()).setEmail(MOCK_EMAIL); } /** * Test method for * {@link NakamuraUserDirectoryProvider#getHttpServletRequest()} */ @Test public void testGetHttpServletRequest() { HttpServletRequest httpServletRequest = null; try { httpServletRequest = nakamuraUserDirectoryProvider .getHttpServletRequest(); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(httpServletRequest); assertTrue(request == httpServletRequest); } /** * Test method for * {@link NakamuraUserDirectoryProvider#getHttpServletRequest()} */ @Test public void testGetHttpServletRequestNullHttpServletRequest() { when( threadLocalManager .get(NakamuraUserDirectoryProvider.CURRENT_HTTP_REQUEST)) .thenReturn(null); try { nakamuraUserDirectoryProvider.getHttpServletRequest(); fail("IllegalStateException should be thrown"); } catch (IllegalStateException e) { assertNotNull("IllegalStateException should be thrown", e); } catch (Throwable e) { fail("IllegalStateException should be thrown"); } } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#getUser(org.sakaiproject.user.api.UserEdit)} */ @Test public void testGetUser() { // test good path when(userEdit.getEid()).thenReturn(MOCK_PRINCIPAL); Boolean answer = null; try { answer = nakamuraUserDirectoryProvider.getUser(userEdit); } catch (Throwable e) { fail("No exception should be thrown"); } assertNotNull(answer); assertTrue(answer); verify(userEdit, times(1)).setFirstName(MOCK_FIRSTNAME); verify(userEdit, times(1)).setLastName(MOCK_LASTNAME); verify(userEdit, times(1)).setEmail(MOCK_EMAIL); // test bad parameter try { answer = nakamuraUserDirectoryProvider.getUser(null); } catch (Throwable e) { fail("No exception should be thrown"); } assertFalse(answer); } /** * Test method for * {@link org.sakaiproject.provider.user.NakamuraUserDirectoryProvider#getUsers(java.util.Collection)} */ @Test public void testGetUsers() { nakamuraUserDirectoryProvider.getUsers(null); } }