/*!
* Copyright 2010 - 2015 Pentaho Corporation. All rights reserved.
*
* Licensed 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.pentaho.di.ui.repository.pur.repositoryexplorer.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.ObjectRecipient;
import org.pentaho.di.repository.ObjectRecipient.Type;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryDirectory;
import org.pentaho.di.repository.pur.PurRepository;
import org.pentaho.di.repository.pur.model.ObjectAcl;
import org.pentaho.di.repository.pur.model.RepositoryObjectAcl;
import org.pentaho.di.repository.pur.model.RepositoryObjectRecipient;
import org.pentaho.di.ui.repository.pur.services.IAclService;
import org.pentaho.di.ui.repository.repositoryexplorer.AccessDeniedException;
import org.pentaho.di.ui.repository.repositoryexplorer.model.UIRepositoryDirectories;
import org.pentaho.di.ui.repository.repositoryexplorer.model.UIRepositoryDirectory;
import org.pentaho.di.ui.repository.repositoryexplorer.model.UIRepositoryObjects;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
/**
*
* @author tkafalas
*
*/
public class UIEERepositoryDirectoryTest {
private static final String ID = "ID";
private ObjectId mockObjectId;
private RepositoryDirectory mockRepositoryDirectory;
private UIRepositoryDirectory mockParent;
private IAclService mockAclService;
private Repository mockRepository;
private PurRepository mockPurRepository;
UIEERepositoryDirectory uiRepDir;
UIEERepositoryDirectory uiPurRepDir;
@Before
public void beforeTest() throws Exception {
mockObjectId = mock( ObjectId.class );
when( mockObjectId.getId() ).thenReturn( ID );
mockRepositoryDirectory = mock( RepositoryDirectory.class );
when( mockRepositoryDirectory.getObjectId() ).thenReturn( mockObjectId );
mockParent = mock( UIRepositoryDirectory.class );
mockAclService = mock( IAclService.class );
mockRepository = mock( Repository.class );
when( mockRepository.hasService( IAclService.class ) ).thenReturn( true );
when( mockRepository.getService( IAclService.class ) ).thenReturn( mockAclService );
mockPurRepository = mock( PurRepository.class );
when( mockPurRepository.hasService( IAclService.class ) ).thenReturn( true );
when( mockPurRepository.getService( IAclService.class ) ).thenReturn( mockAclService );
uiRepDir = new UIEERepositoryDirectory( mockRepositoryDirectory, mockParent, mockRepository );
uiPurRepDir = new UIEERepositoryDirectory( mockRepositoryDirectory, mockParent, mockPurRepository );
}
@Test
public void testAcls() throws Exception {
final String owner = "owner";
final String role = "role";
ObjectRecipient mockObjectRecipient = mock( ObjectRecipient.class );
when( mockObjectRecipient.getName() ).thenReturn( owner );
ObjectAcl mockAcl = mock( ObjectAcl.class );
when( mockAcl.getOwner() ).thenReturn( mockObjectRecipient );
when( mockAclService.getAcl( mockObjectId, false ) ).thenReturn( mockAcl );
uiRepDir.clearAcl();
UIRepositoryObjectAcls acls = new UIRepositoryObjectAcls();
uiRepDir.getAcls( acls );
verify( mockAclService, times( 1 ) ).getAcl( mockObjectId, false );
assertEquals( owner, acls.getOwner().getName() );
acls = new UIRepositoryObjectAcls();
uiRepDir.getAcls( acls, false );
verify( mockAclService, times( 2 ) ).getAcl( mockObjectId, false );
assertEquals( owner, acls.getOwner().getName() );
acls = new UIRepositoryObjectAcls();
RepositoryObjectAcl repObjectAcl = new RepositoryObjectAcl( new RepositoryObjectRecipient( role, Type.ROLE ) );
acls.setObjectAcl( new RepositoryObjectAcl( new RepositoryObjectRecipient( role, Type.ROLE ) ) );
uiRepDir.setAcls( acls );
verify( mockAclService ).setAcl( mockObjectId, repObjectAcl );
when( mockAclService.getAcl( mockObjectId, false ) ).thenThrow( new KettleException( "" ) );
uiRepDir.clearAcl();
try {
uiRepDir.getAcls( acls );
fail( "Expected an exception" );
} catch ( AccessDeniedException e ) {
// Test Succeeded if here
}
when( mockAclService.getAcl( mockObjectId, true ) ).thenThrow( new KettleException( "" ) );
uiRepDir.clearAcl();
try {
uiRepDir.getAcls( acls, true );
fail( "Expected an exception" );
} catch ( AccessDeniedException e ) {
// Test Succeeded if here
}
doThrow( new KettleException( "" ) ).when( mockAclService ).setAcl( any( ObjectId.class ), any( ObjectAcl.class ) );
uiRepDir.clearAcl();
try {
uiRepDir.setAcls( acls );
fail( "Expected an exception" );
} catch ( AccessDeniedException e ) {
// Test Succeeded if here
}
}
@Test
public void testDelete() throws Exception {
UIRepositoryDirectories mockUIRepositoryDirectories = mock( UIRepositoryDirectories.class );
when( mockUIRepositoryDirectories.contains( uiRepDir ) ).thenReturn( true );
when( mockParent.getChildren() ).thenReturn( mockUIRepositoryDirectories );
UIRepositoryObjects mockUIRepositoryObjects = mock( UIRepositoryObjects.class );
when( mockUIRepositoryObjects.contains( uiRepDir ) ).thenReturn( true );
when( mockParent.getRepositoryObjects() ).thenReturn( mockUIRepositoryObjects );
uiRepDir.delete( false );
verify( mockRepository ).deleteRepositoryDirectory( mockRepositoryDirectory );
verify( mockUIRepositoryDirectories, times( 1 ) ).remove( uiRepDir );
verify( mockUIRepositoryObjects, times( 1 ) ).remove( uiRepDir );
verify( mockParent, times( 1 ) ).refresh();
uiPurRepDir.delete( false );
verify( mockPurRepository ).deleteRepositoryDirectory( mockRepositoryDirectory, false );
verify( mockUIRepositoryDirectories, times( 2 ) ).remove( uiPurRepDir );
verify( mockUIRepositoryObjects, times( 2 ) ).remove( uiPurRepDir );
verify( mockParent, times( 2 ) ).refresh();
}
@Test
public void testSetName() throws Exception {
final String newDirName = "foo";
when( mockRepositoryDirectory.getName() ).thenReturn( "dirName" );
uiRepDir.setName( newDirName, true );
verify( mockRepository ).renameRepositoryDirectory( mockRepositoryDirectory.getObjectId(), null, newDirName );
uiPurRepDir.setName( newDirName, true );
verify( mockPurRepository ).renameRepositoryDirectory( mockRepositoryDirectory.getObjectId(), null, newDirName,
true );
}
@Test
public void testAccess() throws Exception {
when( mockAclService.hasAccess( mockObjectId, RepositoryFilePermission.READ ) ).thenReturn( true );
when( mockAclService.hasAccess( mockObjectId, RepositoryFilePermission.WRITE ) ).thenReturn( false );
assertTrue( uiPurRepDir.hasAccess( RepositoryFilePermission.READ ) );
assertFalse( uiPurRepDir.hasAccess( RepositoryFilePermission.WRITE ) );
}
@Test
public void testBadConstructor() throws Exception {
when( mockRepository.hasService( IAclService.class ) ).thenReturn( false );
try {
new UIEERepositoryDirectory( mockRepositoryDirectory, mockParent, mockRepository );
fail( "Expected an exception" );
} catch ( IllegalStateException e ) {
// Test Succeeded if here
}
}
}