Package org.pentaho.platform.repository.usersettings

Source Code of org.pentaho.platform.repository.usersettings.UserSettingServiceTest

/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2014 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.platform.repository.usersettings;

import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.ISecurityHelper;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.usersettings.pojo.IUserSetting;
import org.pentaho.platform.engine.core.system.PentahoSessionHolder;
import org.pentaho.platform.engine.security.SecurityHelper;
import org.pentaho.platform.repository2.ClientRepositoryPaths;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;

public class UserSettingServiceTest {
  private static final String USER_FOLDER_ID = "userFolderID";
  private static final String TENANT_FOLDER_ID = "tenantFolderID";
  private static final String COMMON_SETTING_NAME = "commonSettingName";
  private static final String COMMON_USER_SETTING_VALUE = "userSettingValue";
  private static final String COMMON_GLOBAL_SETTING_VALUE = "globalSettingValue";

  private static final String USER_SETTING_NAME_1 = "setting1";
  private static final String USER_SETTING_NAME_2 = "setting2";
  private static final String USER_SETTING_NAME_3 = "setting3";
  private static final String USER_SETTING_VALUE_1 = "1";
  private static final String USER_SETTING_VALUE_2 = "2";
  private static final String USER_SETTING_VALUE_3 = "3";

  private static final String GLOBAL_SETTING_NAME_1 = "setting11";
  private static final String GLOBAL_SETTING_NAME_2 = "setting22";
  private static final String GLOBAL_SETTING_NAME_3 = "setting33";
  private static final String GLOBAL_SETTING_VALUE_1 = "11";
  private static final String GLOBAL_SETTING_VALUE_2 = "22";
  private static final String GLOBAL_SETTING_VALUE_3 = "33";

  private UserSettingService userSettingService;
  private IUnifiedRepository repository;
  private IPentahoSession session;
  private HashMap<String, Serializable> userSettings;
  private HashMap<String, Serializable> globalSettings;
  private ISecurityHelper securityHelper;

  @Before
  public void setUp() throws Exception {
    repository = mock( IUnifiedRepository.class );

    session = mock( IPentahoSession.class );
    when( session.getName() ).thenReturn( "test" );
    PentahoSessionHolder.setSession( session );

    userSettings = new HashMap<String, Serializable>()
    { {
        put( USER_SETTING_NAME_1, USER_SETTING_VALUE_1 );
        put( UserSettingService.SETTING_PREFIX + COMMON_SETTING_NAME, COMMON_USER_SETTING_VALUE );
        put( USER_SETTING_NAME_2, USER_SETTING_VALUE_2 );
        put( UserSettingService.SETTING_PREFIX + USER_SETTING_NAME_3, USER_SETTING_VALUE_3 );
      } };
    globalSettings = new HashMap<String, Serializable>()
    { {
        put( GLOBAL_SETTING_NAME_1, GLOBAL_SETTING_VALUE_1 );
        put( UserSettingService.SETTING_PREFIX + COMMON_SETTING_NAME, COMMON_GLOBAL_SETTING_VALUE );
        put( GLOBAL_SETTING_NAME_2, GLOBAL_SETTING_VALUE_2 );
        put( UserSettingService.SETTING_PREFIX + GLOBAL_SETTING_NAME_3, GLOBAL_SETTING_VALUE_3 );
      } };

    when( repository.getFileMetadata( eq( USER_FOLDER_ID ) ) ).thenReturn( userSettings );
    when( repository.getFileMetadata( eq( TENANT_FOLDER_ID ) ) ).thenReturn( globalSettings );

    final RepositoryFile tenantRepositoryFile = mock( RepositoryFile.class );
    when( tenantRepositoryFile.getId() ).thenReturn( TENANT_FOLDER_ID );
    when( repository.getFile( eq( ClientRepositoryPaths.getEtcFolderPath() ) ) ).thenReturn( tenantRepositoryFile );

    final RepositoryFile userRepositoryFile = mock( RepositoryFile.class );
    when( userRepositoryFile.getId() ).thenReturn( USER_FOLDER_ID );
    when( repository.getFile( eq( ClientRepositoryPaths.getUserHomeFolderPath( session.getName() ) ) ) ).thenReturn( userRepositoryFile );

    securityHelper = mock( ISecurityHelper.class );
    when( securityHelper.runAsSystem( any( Callable.class ) ) ).thenAnswer( new Answer<Object>() {
      @Override
      public Object answer( InvocationOnMock invocation ) throws Throwable {
        final Callable callable = (Callable) invocation.getArguments()[0];
        if ( callable != null ) {
          return callable.call();
        }
        return null;
      }
    } );
    SecurityHelper.setMockInstance( securityHelper );

    userSettingService = new UserSettingService( repository );
    userSettingService.init( session );
  }

  @Test
  public void testDeleteUserSettings() throws Exception {
    final RepositoryFile repositoryFile = mock( RepositoryFile.class );
    when( repositoryFile.getId() ).thenReturn( USER_FOLDER_ID );
    when( repository.getFile( anyString() ) ).thenReturn( repositoryFile );

    doAnswer( new Answer() {
      @Override
      public Object answer( InvocationOnMock invocation ) throws Throwable {

        final Map<String, Serializable> settings = (Map<String, Serializable>) invocation.getArguments()[1];

        assertNotNull( settings );
        assertEquals( 2, settings.size() );

        final Iterator<String> iterator = settings.keySet().iterator();
        assertFalse( iterator.next().startsWith( UserSettingService.SETTING_PREFIX ) );
        assertFalse( iterator.next().startsWith( UserSettingService.SETTING_PREFIX ) );

        return null;
      }
    } ).when( repository ).setFileMetadata( eq( USER_FOLDER_ID ), anyMap() );

    userSettingService.deleteUserSettings();
  }

  @Test
  public void testGetUserSettings() throws Exception {
    final List<IUserSetting> settings = userSettingService.getUserSettings();

    assertNotNull( settings );
    assertEquals( 3, settings.size() );
    for ( IUserSetting setting : settings ) {
      if ( COMMON_SETTING_NAME.equals( setting.getSettingName() ) ) {
        assertEquals( COMMON_USER_SETTING_VALUE, setting.getSettingValue() );
      } else if ( USER_SETTING_NAME_3.equals( setting.getSettingName() ) ) {
        assertEquals( USER_SETTING_VALUE_3, setting.getSettingValue() );
      } else if ( GLOBAL_SETTING_NAME_3.equals( setting.getSettingName() ) ) {
        assertEquals( GLOBAL_SETTING_VALUE_3, setting.getSettingValue() );
      }
    }
  }

  @Test
  public void testGetUserSettingNoAuth() throws Exception {
    final String settingName = "settingName";
    final String defaultValue = "defaultValue";

    when( session.getAttribute( eq( "SPRING_SECURITY_CONTEXT" ) ) ).thenReturn( null );

    final IUserSetting userSetting = userSettingService.getUserSetting( settingName, defaultValue );

    assertEquals( settingName, userSetting.getSettingName() );
    assertEquals( defaultValue, userSetting.getSettingValue() );
  }

  @Test
  public void testGetUserSettingUnset() throws Exception {
    final String settingName = "settingName";
    final String defaultValue = "defaultValue";

    when( session.getAttribute( eq( "SPRING_SECURITY_CONTEXT" ) ) ).thenReturn( 1 );

    final IUserSetting userSetting = userSettingService.getUserSetting( settingName, defaultValue );
    assertEquals( settingName, userSetting.getSettingName() );
    assertEquals( defaultValue, userSetting.getSettingValue() );
  }

  @Test
  public void testGetUserSetting() throws Exception {
    final String settingName = USER_SETTING_NAME_3;
    final String defaultValue = "defaultValue";

    when( session.getAttribute( eq( "SPRING_SECURITY_CONTEXT" ) ) ).thenReturn( 1 );

    //try to get existing setting
    final IUserSetting userSetting = userSettingService.getUserSetting( settingName, defaultValue );
    assertEquals( settingName, userSetting.getSettingName() );
    assertEquals( USER_SETTING_VALUE_3, userSetting.getSettingValue() );
  }

  @Test
  public void testGetUserSettingOnlyGlobalExist() throws Exception {
    final String settingName = GLOBAL_SETTING_NAME_3;
    final String defaultValue = "defaultValue";

    when( session.getAttribute( eq( "SPRING_SECURITY_CONTEXT" ) ) ).thenReturn( 1 );

    final IUserSetting userSetting = userSettingService.getUserSetting( settingName, defaultValue );
    assertEquals( settingName, userSetting.getSettingName() );
    assertEquals( GLOBAL_SETTING_VALUE_3, userSetting.getSettingValue() );
  }

  @Test
  public void testSetUserSetting() throws Exception {
    final String settingName = "settingName";
    final String settingValue = "settingValue";

    assertEquals( 4, userSettings.size() );
    userSettingService.setUserSetting( settingName, settingValue );
    assertEquals( 5, userSettings.size() );

    final Serializable value = userSettings.get( UserSettingService.SETTING_PREFIX + settingName );
    assertEquals( settingValue, value );

    verify( repository ).setFileMetadata( eq( USER_FOLDER_ID ), anyMap() );
  }

  @Test
  public void testGetGlobalUserSettingUnset() throws Exception {
    final String settingName = "settings";
    final String defaultValue = "defaultValue";

    final IUserSetting globalUserSetting = userSettingService.getGlobalUserSetting( settingName, defaultValue );

    assertEquals( settingName, globalUserSetting.getSettingName() );
    assertEquals( defaultValue, globalUserSetting.getSettingValue() );
  }

  @Test
  public void testGetGlobalUserSetting() throws Exception {
    final String settingName = GLOBAL_SETTING_NAME_3;
    final String defaultValue = "defaultValue";

    final IUserSetting globalUserSetting = userSettingService.getGlobalUserSetting( settingName, defaultValue );

    assertEquals( settingName, globalUserSetting.getSettingName() );
    assertEquals( GLOBAL_SETTING_VALUE_3, globalUserSetting.getSettingValue() );
  }

  @Test
  public void testGetGlobalUserSettings() throws Exception {
    final List<IUserSetting> globalUserSettings = userSettingService.getGlobalUserSettings();

    assertNotNull( globalUserSettings );
    assertEquals( 2, globalUserSettings.size() );
    label : for ( IUserSetting setting : globalUserSettings ) {
      for ( String key : globalSettings.keySet() ) {
        if ( key.startsWith( UserSettingService.SETTING_PREFIX ) && key.substring( UserSettingService.SETTING_PREFIX.length() ).equals( setting.getSettingName() ) ) {
          assertEquals( globalSettings.get( key ), setting.getSettingValue() );
          continue label;
        }
      }
      fail( "wrong setting" );
    }
  }

  @Test
  public void testSetGlobalUserSettingNonAdmin() throws Exception {
    final String settingName = "settingName";
    final String settingValue = "settingValue";

    when( securityHelper.isPentahoAdministrator( eq( session ) ) ).thenReturn( false );

    assertEquals( 4, globalSettings.size() );
    userSettingService.setGlobalUserSetting( settingName, settingValue );
    assertEquals( 4, globalSettings.size() );
  }

  @Test
  public void testSetGlobalUserSettingAdmin() throws Exception {
    final String settingName = "settingName";
    final String settingValue = "settingValue";

    when( securityHelper.isPentahoAdministrator( eq( session ) ) ).thenReturn( true );

    assertEquals( 4, globalSettings.size() );
    userSettingService.setGlobalUserSetting( settingName, settingValue );
    assertEquals( 5, globalSettings.size() );

    verify( repository ).setFileMetadata( eq( TENANT_FOLDER_ID ), anyMap() );
  }
}
TOP

Related Classes of org.pentaho.platform.repository.usersettings.UserSettingServiceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.