/*!
* 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.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.repository.ObjectRecipient;
import org.pentaho.di.repository.ObjectRecipient.Type;
import org.pentaho.di.repository.pur.model.ObjectAce;
import org.pentaho.di.repository.pur.model.RepositoryObjectAce;
import org.pentaho.di.repository.pur.model.RepositoryObjectAcl;
import org.pentaho.di.repository.pur.model.RepositoryObjectRecipient;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
/**
*
* @author tkafalas
*
*/
public class UIRepositoryObjectAclModelTest {
private final String RECIPIENT0 = "Looney Tunes";
private final String RECIPIENT1 = "Elmer Fudd";
private final String RECIPIENT2 = "Bug Bunny";
private final String RECIPIENT3 = "Daffy Duck";
private final String ROLE1 = "role1";
private final String ROLE2 = "role2";
private final String ROLE3 = "role3";
private final String USER1 = "user1";
private final String USER2 = "user2";
private final String USER3 = "user3";
UIRepositoryObjectAcls repositoryObjectAcls;
RepositoryObjectAcl repObjectAcl;
UIRepositoryObjectAcl userAcl1;
UIRepositoryObjectAcl userAcl2;
UIRepositoryObjectAcl userAcl3;
UIRepositoryObjectAcl roleAcl1;
UIRepositoryObjectAcl roleAcl2;
UIRepositoryObjectAcl roleAcl3;
List<UIRepositoryObjectAcl> originalUIAcls;
UIRepositoryObjectAclModel repositoryObjectAclModel;
List<String> defaultUserNameList;
List<String> defaultRoleNameList;
@Before
public void beforeTest() {
repositoryObjectAcls = new UIRepositoryObjectAcls();
repObjectAcl = new RepositoryObjectAcl( new RepositoryObjectRecipient( RECIPIENT0, Type.ROLE ) );
repositoryObjectAcls
.setObjectAcl( new RepositoryObjectAcl( new RepositoryObjectRecipient( RECIPIENT0, Type.ROLE ) ) );
userAcl1 = new UIRepositoryObjectAcl( createUserAce( RECIPIENT1 ) );
userAcl2 = new UIRepositoryObjectAcl( createUserAce( RECIPIENT2 ) );
userAcl3 = new UIRepositoryObjectAcl( createUserAce( RECIPIENT3 ) );
repositoryObjectAclModel = new UIRepositoryObjectAclModel( repositoryObjectAcls );
roleAcl1 = new UIRepositoryObjectAcl( createRoleAce( ROLE1 ) );
roleAcl2 = new UIRepositoryObjectAcl( createRoleAce( ROLE2 ) );
roleAcl3 = new UIRepositoryObjectAcl( createRoleAce( ROLE3 ) );
defaultUserNameList = Arrays.asList( new String[] { USER1, USER2, USER3 } );
defaultRoleNameList = Arrays.asList( new String[] { ROLE1, ROLE2, ROLE3 } );
}
@Test
public void testGetAcls() {
List<UIRepositoryObjectAcl> originalUIAcls = Arrays.asList( new UIRepositoryObjectAcl[] { userAcl1, userAcl2 } );
repositoryObjectAcls.addAcls( originalUIAcls );
repositoryObjectAclModel.assignRole( ROLE3 );
assertEquals( userAcl2, repositoryObjectAclModel.getAcl( RECIPIENT2 ) );
assertEquals( ROLE3, repositoryObjectAclModel.getAcl( ROLE3 ).getRecipientName() );
assertNull( repositoryObjectAclModel.getAcl( "foo" ) );
}
@Test
public void testSelectedAvailableRoles() {
List<String> selectedAvailableRoles = Arrays.asList( new String[] { ROLE1, ROLE2 } );
repositoryObjectAclModel.setSelectedAvailableRoles( selectedAvailableRoles );
repositoryObjectAclModel.setSelectedAvailableRole( ROLE3 );
assertStringListMatches( defaultRoleNameList, repositoryObjectAclModel.getSelectedAvailableRoles() );
}
@Test
public void testSelectedAvailableUsers() {
List<String> selectedAvailableUsers = Arrays.asList( new String[] { USER1, USER2 } );
repositoryObjectAclModel.setSelectedAvailableUsers( selectedAvailableUsers );
repositoryObjectAclModel.setSelectedAvailableUser( USER3 );
assertStringListMatches( defaultUserNameList, repositoryObjectAclModel.getSelectedAvailableUsers() );
}
@Test
public void testSelectedAssignedRoles() {
List<UIRepositoryObjectAcl> assignedRoles = Arrays.asList( new UIRepositoryObjectAcl[] { roleAcl1, roleAcl2 } );
repositoryObjectAclModel.setSelectedAssignedRoles( assignedRoles );
assertListMatches( assignedRoles, repositoryObjectAclModel.getSelectedAssignedRoles() );
}
@Test
public void testSelectedAssignedUsers() {
List<UIRepositoryObjectAcl> assignedUsers = Arrays.asList( new UIRepositoryObjectAcl[] { roleAcl1, roleAcl2 } );
repositoryObjectAclModel.setSelectedAssignedUsers( assignedUsers );
repositoryObjectAclModel.setSelectedAssignedUser( roleAcl3 );
assertListMatches( Arrays.asList( new UIRepositoryObjectAcl[] { roleAcl1, roleAcl2, roleAcl3 } ),
repositoryObjectAclModel.getSelectedAssignedUsers() );
}
@Test
public void testAvailableUsers() {
repositoryObjectAclModel.setAvailableUserList( defaultUserNameList );
assertStringListMatches( defaultUserNameList, repositoryObjectAclModel.getAvailableUserList() );
assertEquals( USER1, repositoryObjectAclModel.getAvailableUser( 0 ) );
assertEquals( 1, repositoryObjectAclModel.getAvailableUserIndex( USER2 ) );
assertEquals( -1, repositoryObjectAclModel.getAvailableUserIndex( "foo" ) );
}
@Test
public void testAvailableRoles() {
repositoryObjectAclModel.setAvailableRoleList( defaultRoleNameList );
assertStringListMatches( defaultRoleNameList, repositoryObjectAclModel.getAvailableRoleList() );
assertEquals( ROLE1, repositoryObjectAclModel.getAvailableRole( 0 ) );
assertEquals( 1, repositoryObjectAclModel.getAvailableRoleIndex( ROLE2 ) );
assertEquals( -1, repositoryObjectAclModel.getAvailableRoleIndex( "foo" ) );
}
@Test
public void testSelectedUsersAndRoles() {
// Set USER1/ROLE1 so that they are selected acls. SetAclsList will retain this selected status by
// removing them from available lists.
UIRepositoryObjectAcl selectedUserAcl = new UIRepositoryObjectAcl( createUserAce( USER1 ) );
UIRepositoryObjectAcl selectedRoleAcl = new UIRepositoryObjectAcl( createRoleAce( ROLE1 ) );
UIRepositoryObjectAcl unselectedAcl = new UIRepositoryObjectAcl( createUserAce( "FOO" ) );
repositoryObjectAcls.addAcl( selectedUserAcl );
repositoryObjectAcls.addAcl( selectedRoleAcl );
repositoryObjectAclModel.setAclsList( defaultUserNameList, defaultRoleNameList );
assertStringListMatches( Arrays.asList( new String[] { USER2, USER3 } ), repositoryObjectAclModel
.getAvailableUserList() );
assertStringListMatches( Arrays.asList( new String[] { ROLE2, ROLE3 } ), repositoryObjectAclModel
.getAvailableRoleList() );
assertEquals( repositoryObjectAclModel.getSelectedAvailableUsers().get( 0 ), defaultUserNameList.get( 0 ) );
assertEquals( repositoryObjectAclModel.getSelectedAvailableRoles().get( 0 ), defaultRoleNameList.get( 0 ) );
assertNameToAclListMatches( Arrays.asList( new String[] { USER1, ROLE1 } ), repositoryObjectAclModel
.getSelectedAcls().getAcls() );
assertEquals( selectedUserAcl, repositoryObjectAclModel.getSelectedUser( 0 ) );
assertEquals( 0, repositoryObjectAclModel.getSelectedUserIndex( selectedUserAcl ) );
assertEquals( -1, repositoryObjectAclModel.getSelectedUserIndex( unselectedAcl ) );
assertEquals( selectedRoleAcl, repositoryObjectAclModel.getSelectedRole( 0 ) );
assertEquals( 0, repositoryObjectAclModel.getSelectedRoleIndex( selectedRoleAcl ) );
assertEquals( -1, repositoryObjectAclModel.getSelectedRoleIndex( unselectedAcl ) );
}
@Test
public void testAssignRoles() {
UIRepositoryObjectAcl selectedRoleAcl = new UIRepositoryObjectAcl( createRoleAce( ROLE1 ) );
repositoryObjectAcls.addAcl( selectedRoleAcl );
repositoryObjectAclModel.setAclsList( null, defaultRoleNameList );
List<Object> objectRoleList = Arrays.asList( new Object[] { ROLE2 } );
repositoryObjectAclModel.assignRoles( objectRoleList );
assertStringListMatches( Arrays.asList( new String[] { ROLE3 } ), repositoryObjectAclModel.getAvailableRoleList() );
assertNameToAclListMatches( Arrays.asList( new String[] { ROLE2 } ), repositoryObjectAclModel
.getSelectedAssignedRoles() );
assertNameToAclListMatches( Arrays.asList( new String[] { ROLE2 } ), repositoryObjectAclModel.getAclsToAdd() );
repositoryObjectAclModel.updateSelectedAcls();
assertNameToAclListMatches( Arrays.asList( new String[] { ROLE1, ROLE2 } ), repositoryObjectAclModel
.getSelectedAcls().getAcls() );
// For some reason, updateSelectedAcls does not clear aclsToAdd. After the update ROLE2 is still present in
// the aclsToAdd list. This probably is not an issue because the interface reloads. For now, I will clear
// manually now so I can exercise some unassign code.
repositoryObjectAclModel.getAclsToAdd().clear();
// Unassign the pending ROLE2 and the pre-assigned ROLE1
UIRepositoryObjectAcl role2Acl = repositoryObjectAclModel.getSelectedRole( 1 );
repositoryObjectAclModel.unassign( Arrays.asList( new Object[] { role2Acl, selectedRoleAcl } ) );
assertEquals( 0, repositoryObjectAclModel.getSelectedAssignedRoles().size() );
assertStringListMatches( defaultRoleNameList, repositoryObjectAclModel.getAvailableRoleList() );
repositoryObjectAclModel.updateSelectedAcls();
assertEquals( 0, repositoryObjectAclModel.getSelectedAcls().getAcls().size() );
}
@Test
public void testAssignUsers() {
UIRepositoryObjectAcl selectedUserAcl = new UIRepositoryObjectAcl( createUserAce( USER1 ) );
repositoryObjectAcls.addAcl( selectedUserAcl );
repositoryObjectAclModel.setAclsList( defaultUserNameList, null );
List<Object> objectUserList = Arrays.asList( new Object[] { USER2 } );
repositoryObjectAclModel.assignUsers( objectUserList );
assertStringListMatches( Arrays.asList( new String[] { USER3 } ), repositoryObjectAclModel.getAvailableUserList() );
assertNameToAclListMatches( Arrays.asList( new String[] { USER2 } ), repositoryObjectAclModel
.getSelectedAssignedUsers() );
assertNameToAclListMatches( Arrays.asList( new String[] { USER2 } ), repositoryObjectAclModel.getAclsToAdd() );
repositoryObjectAclModel.updateSelectedAcls();
assertNameToAclListMatches( Arrays.asList( new String[] { USER1, USER2 } ), repositoryObjectAclModel
.getSelectedAcls().getAcls() );
// For some reason, updateSelectedAcls does not clear aclsToAdd. After the update USER2 is still present in
// the aclsToAdd list. This probably is not an issue because the interface reloads. For now, I will clear
// manually now so I can exercise some unassign code.
repositoryObjectAclModel.getAclsToAdd().clear();
// Unassign the pending USER2 and the pre-assigned USER1
UIRepositoryObjectAcl user2Acl = repositoryObjectAclModel.getSelectedUser( 1 );
repositoryObjectAclModel.unassign( Arrays.asList( new Object[] { user2Acl, selectedUserAcl } ) );
assertEquals( 0, repositoryObjectAclModel.getSelectedAssignedUsers().size() );
assertStringListMatches( defaultUserNameList, repositoryObjectAclModel.getAvailableUserList() );
repositoryObjectAclModel.updateSelectedAcls();
assertEquals( 0, repositoryObjectAclModel.getSelectedAcls().getAcls().size() );
}
@Test
public void testUserAssignmentFlags() {
assertFalse( repositoryObjectAclModel.isUserAssignmentPossible() );
repositoryObjectAclModel.setUserAssignmentPossible( true );
assertTrue( repositoryObjectAclModel.isUserAssignmentPossible() );
assertFalse( repositoryObjectAclModel.isUserUnassignmentPossible() );
repositoryObjectAclModel.setUserUnassignmentPossible( true );
assertTrue( repositoryObjectAclModel.isUserUnassignmentPossible() );
assertFalse( repositoryObjectAclModel.isRoleAssignmentPossible() );
repositoryObjectAclModel.setRoleAssignmentPossible( true );
assertTrue( repositoryObjectAclModel.isRoleAssignmentPossible() );
assertFalse( repositoryObjectAclModel.isRoleUnassignmentPossible() );
repositoryObjectAclModel.setRoleUnassignmentPossible( true );
assertTrue( repositoryObjectAclModel.isRoleUnassignmentPossible() );
}
@Test
public void testClear() {
repositoryObjectAcls.addAcl( new UIRepositoryObjectAcl( createUserAce( USER1 ) ) );
repositoryObjectAcls.addAcl( new UIRepositoryObjectAcl( createRoleAce( ROLE1 ) ) );
repositoryObjectAclModel.setAclsList( defaultUserNameList, defaultRoleNameList );
repositoryObjectAclModel.assignRoles( Arrays.asList( new Object[] { ROLE2 } ) );
repositoryObjectAclModel.assignUsers( Arrays.asList( new Object[] { USER2 } ) );
repositoryObjectAclModel.clear();
assertEquals( 0, repositoryObjectAclModel.getAvailableUserList().size() );
assertEquals( 0, repositoryObjectAclModel.getAvailableRoleList().size() );
assertEquals( 0, repositoryObjectAclModel.getSelectedAssignedUsers().size() );
assertEquals( 0, repositoryObjectAclModel.getSelectedAssignedRoles().size() );
assertEquals( 0, repositoryObjectAclModel.getSelectedAvailableUsers().size() );
assertEquals( 0, repositoryObjectAclModel.getSelectedAvailableRoles().size() );
// Selected List is unchanged.
assertEquals( 1, repositoryObjectAclModel.getSelectedUserList().size() );
assertEquals( 1, repositoryObjectAclModel.getSelectedRoleList().size() );
}
/**
* Assert that all items in list knownList exist in the checkedList
*
* @param knownList
* @param unknownList
*/
private void assertListMatches( List<UIRepositoryObjectAcl> knownList, List<UIRepositoryObjectAcl> checkedList ) {
assertEquals( "list sizes don't match", knownList.size(), checkedList.size() );
boolean found;
for ( UIRepositoryObjectAcl knownUIAcl : knownList ) {
found = false;
for ( UIRepositoryObjectAcl checkedAcl : checkedList ) {
if ( knownUIAcl.equals( checkedAcl ) ) {
found = true;
break;
}
}
assertTrue( "Did not find " + knownUIAcl.getRecipientName(), found );
}
}
private void assertStringListMatches( List<String> knownList, List<String> checkedList ) {
assertEquals( "list sizes don't match", knownList.size(), checkedList.size() );
boolean found;
for ( String known : knownList ) {
found = false;
for ( String checked : checkedList ) {
if ( known.equals( checked ) ) {
found = true;
break;
}
}
assertTrue( "Did not find " + known, found );
}
}
private void assertNameToAclListMatches( List<String> knownList, List<UIRepositoryObjectAcl> checkedList ) {
assertEquals( "list sizes don't match", knownList.size(), checkedList.size() );
boolean found;
for ( String knownName : knownList ) {
found = false;
for ( UIRepositoryObjectAcl checkedAcl : checkedList ) {
if ( knownName.equals( checkedAcl.getRecipientName() ) ) {
found = true;
break;
}
}
assertTrue( "Did not find " + knownName, found );
}
}
private ObjectAce createUserAce( String recipientName ) {
ObjectRecipient objectRecipient = new RepositoryObjectRecipient( recipientName, ObjectRecipient.Type.USER );
ObjectAce objectAce =
new RepositoryObjectAce( objectRecipient, EnumSet.of( RepositoryFilePermission.READ,
RepositoryFilePermission.WRITE ) );
return objectAce;
}
private ObjectAce createRoleAce( String recipientName ) {
ObjectRecipient objectRecipient = new RepositoryObjectRecipient( recipientName, ObjectRecipient.Type.ROLE );
ObjectAce objectAce =
new RepositoryObjectAce( objectRecipient, EnumSet.of( RepositoryFilePermission.READ,
RepositoryFilePermission.WRITE ) );
return objectAce;
}
}