/*! * 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.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; 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 static org.mockito.Mockito.doThrow; import java.io.File; import java.util.Arrays; import java.util.List; 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.ObjectRevision; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectory; import org.pentaho.di.repository.RepositoryElementMetaInterface; import org.pentaho.di.repository.ObjectRecipient.Type; import org.pentaho.di.repository.pur.model.EERepositoryObject; import org.pentaho.di.repository.pur.model.ObjectAcl; import org.pentaho.di.repository.pur.model.RepositoryLock; 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.pur.services.ILockService; import org.pentaho.di.ui.repository.pur.services.IRevisionService; import org.pentaho.di.ui.repository.repositoryexplorer.AccessDeniedException; import org.pentaho.di.ui.repository.repositoryexplorer.model.UIRepositoryDirectory; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; /** * * @author tkafalas * */ public class UIEEJobTest { private final static String LOCK_MESSAGE = "lockMessage"; private final static String LOCK_NOTE = "lockNote"; private final static String JOB_ID = "jobId"; private ObjectId mockObjectId; private UIEEJob uiJob; private EERepositoryObject mockEERepositoryObject; private ILockService mockLockService; private RepositoryLock mockRepositoryLock; private UIRepositoryDirectory mockParent; private IRevisionService mockRevisionService; private IAclService mockAclService; private Repository mockRepository; @Before public void beforeTest() throws Exception { mockObjectId = mock( ObjectId.class ); when( mockObjectId.getId() ).thenReturn( JOB_ID ); mockEERepositoryObject = mock( EERepositoryObject.class ); when( mockEERepositoryObject.getObjectId() ).thenReturn( mockObjectId ); mockParent = mock( UIRepositoryDirectory.class ); mockLockService = mock( ILockService.class ); mockRevisionService = mock( IRevisionService.class ); mockAclService = mock( IAclService.class ); mockRepository = mock( Repository.class ); when( mockRepository.hasService( ILockService.class ) ).thenReturn( true ); when( mockRepository.getService( ILockService.class ) ).thenReturn( mockLockService ); when( mockRepository.hasService( IRevisionService.class ) ).thenReturn( true ); when( mockRepository.getService( IRevisionService.class ) ).thenReturn( mockRevisionService ); when( mockRepository.hasService( IAclService.class ) ).thenReturn( true ); when( mockRepository.getService( IAclService.class ) ).thenReturn( mockAclService ); uiJob = new UIEEJob( mockEERepositoryObject, mockParent, mockRepository ); mockRepositoryLock = mock( RepositoryLock.class ); } @Test public void testGetImage() { String image = uiJob.getImage(); assertNotNull( image ); File f = new File( image ); when( mockEERepositoryObject.getLock() ).thenReturn( mockRepositoryLock ); String image2 = uiJob.getImage(); assertNotNull( image2 ); f = new File( image2 ); assertNotEquals( image, image2 ); } @Test public void testGetLockMessage() throws Exception { when( mockEERepositoryObject.getLockMessage() ).thenReturn( LOCK_MESSAGE ); assertEquals( LOCK_MESSAGE, uiJob.getLockMessage() ); } @Test public void testLock() throws Exception { when( mockLockService.lockJob( mockObjectId, LOCK_NOTE ) ).thenReturn( mockRepositoryLock ); uiJob.lock( LOCK_NOTE ); verify( mockEERepositoryObject ).setLock( mockRepositoryLock ); verify( mockParent ).fireCollectionChanged(); uiJob.unlock(); verify( mockEERepositoryObject ).setLock( null ); verify( mockParent, times( 2 ) ).fireCollectionChanged(); } @Test public void testRevisions() throws Exception { final String revisionName = "revisionName"; final String commitMessage = "commitMessage"; ObjectRevision mockObjectRevision = mock( ObjectRevision.class ); when( mockObjectRevision.getName() ).thenReturn( revisionName ); List<ObjectRevision> mockRevisions = Arrays.asList( new ObjectRevision[] { mockObjectRevision } ); when( mockRevisionService.getRevisions( any( ObjectId.class ) ) ).thenReturn( mockRevisions ); uiJob.refreshRevisions(); verify( mockRevisionService, times( 1 ) ).getRevisions( mockObjectId ); UIRepositoryObjectRevisions revisions = uiJob.getRevisions(); assertEquals( 1, revisions.size() ); assertEquals( "revisionName", revisions.get( 0 ).getName() ); verify( mockRevisionService, times( 1 ) ).getRevisions( mockObjectId ); uiJob.restoreRevision( revisions.get( 0 ), commitMessage ); verify( mockRevisionService ).restoreJob( mockObjectId, revisionName, commitMessage ); verify( mockParent, times( 1 ) ).fireCollectionChanged(); } @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 ); uiJob.clearAcl(); UIRepositoryObjectAcls acls = new UIRepositoryObjectAcls(); uiJob.getAcls( acls ); verify( mockAclService ).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 ) ) ); uiJob.setAcls( acls ); verify( mockAclService ).setAcl( mockObjectId, repObjectAcl ); when( mockAclService.getAcl( mockObjectId, false ) ).thenThrow( new KettleException( "" ) ); uiJob.clearAcl(); try { uiJob.getAcls( acls ); fail( "Expected an exception" ); } catch ( AccessDeniedException e ) { // Test Succeeded if here } doThrow( new KettleException( "" ) ).when( mockAclService ).setAcl( any( ObjectId.class ), any( RepositoryObjectAcl.class ) ); try { uiJob.setAcls( acls ); fail( "Expected an exception" ); } catch ( AccessDeniedException e ) { // Test Succeeded if here } } @Test public void testAccess() throws Exception { when( mockAclService.hasAccess( mockObjectId, RepositoryFilePermission.READ ) ).thenReturn( true ); when( mockAclService.hasAccess( mockObjectId, RepositoryFilePermission.WRITE ) ).thenReturn( false ); assertTrue( uiJob.hasAccess( RepositoryFilePermission.READ ) ); assertFalse( uiJob.hasAccess( RepositoryFilePermission.WRITE ) ); } @Test public void testRename() throws Exception { final String newName = "newName"; RepositoryDirectory repDir = mock( RepositoryDirectory.class ); uiJob.renameJob( mockObjectId, repDir, newName ); verify( mockRevisionService, times( 1 ) ).getRevisions( mockObjectId ); } @Test public void testVersionFlags() throws Exception { assertFalse( uiJob.getVersioningEnabled() ); when( mockEERepositoryObject.getVersioningEnabled() ).thenReturn( true ); assertTrue( uiJob.getVersioningEnabled() ); assertFalse( uiJob.getVersionCommentEnabled() ); when( mockEERepositoryObject.getVersionCommentEnabled() ).thenReturn( true ); assertTrue( uiJob.getVersionCommentEnabled() ); } @Test( expected = IllegalStateException.class ) public void testIllegalStateOnAclService() throws Exception { when( mockRepository.hasService( IAclService.class ) ).thenReturn( false ); uiJob = new UIEEJob( mockEERepositoryObject, mockParent, mockRepository ); } @Test( expected = IllegalStateException.class ) public void testIllegalStateOnLockService() throws Exception { when( mockRepository.hasService( ILockService.class ) ).thenReturn( false ); uiJob = new UIEEJob( mockEERepositoryObject, mockParent, mockRepository ); } @Test( expected = IllegalStateException.class ) public void testIllegalStateOnRevisionService() throws Exception { when( mockRepository.hasService( IRevisionService.class ) ).thenReturn( false ); uiJob = new UIEEJob( mockEERepositoryObject, mockParent, mockRepository ); } @Test( expected = IllegalArgumentException.class ) public void testIllegalArgumentOnConstructor() throws Exception { RepositoryElementMetaInterface badObject = mock( RepositoryElementMetaInterface.class ); uiJob = new UIEEJob( badObject, mockParent, mockRepository ); } }