/*! * Copyright 2010 - 2016 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.controller; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mock; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.repository.RepositoryElementMetaInterface; import org.pentaho.di.repository.RepositoryObjectType; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.ui.repository.pur.services.ITrashService; import org.pentaho.di.ui.repository.repositoryexplorer.controllers.MainController; import org.pentaho.di.ui.repository.repositoryexplorer.model.UIRepositoryDirectory; import org.pentaho.ui.xul.components.XulMessageBox; import org.pentaho.ui.xul.containers.XulDeck; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyList; import static org.mockito.Mockito.contains; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * @author Tatsiana_Kasiankova * */ @RunWith( org.mockito.runners.MockitoJUnitRunner.class ) public class TrashBrowseControllerTest { private TrashBrowseControllerSpy trBrController; @Mock UIRepositoryDirectory repoDirMock; @Mock ITrashService trashServiceMock; @Mock Repository repositoryMock; @Mock List<TrashBrowseController.UIDeletedObject> selectedTrashFileItemsMock; @Mock TrashBrowseController.UIDeletedObject uiDeleteObjectMock; @Mock TrashBrowseController.UIDeletedObject uiDirectoryObjectMock; @Mock RepositoryElementMetaInterface objectInDirectory; @Mock ObjectId objectIdMock; @Mock ObjectId objectIdMock2; @Mock TransMeta transMetaMock; @Mock XulDeck deckMock; @Mock RepositoryDirectoryInterface actualDirMock; @Mock RepositoryDirectoryInterface actualSubDirMock; @Mock List<RepositoryElementMetaInterface> repositoryObjectsMock; @Mock List<RepositoryDirectoryInterface> repositoryDirectoryInterfaces; @Mock MainController mainControllerMock; @Mock XulMessageBox messageBoxMock; @Mock Map<ObjectId, UIRepositoryDirectory> dirMapMock; @Rule public ExpectedException expectedException = ExpectedException.none(); @Before public void setUp() throws Exception { trBrController = new TrashBrowseControllerSpy(); } @Test public void testShouldRefreshRepoDir_IfKettleExceptionOnRepoDirDeletion() throws Exception { KettleException ke = new KettleException( "TEST MESSAGE" ); doThrow( ke ).when( repoDirMock ).delete(); try { trBrController.deleteFolder( repoDirMock ); fail( "Expected appearance KettleException: " + ke.getMessage() ); } catch ( KettleException e ) { assertTrue( ke.getMessage().equals( e.getMessage() ) ); } verify( repoDirMock, times( 1 ) ).refresh(); } public class TrashBrowseControllerSpy extends TrashBrowseController { private static final long serialVersionUID = 1L; TrashBrowseControllerSpy() { super(); this.repoDir = repoDirMock; this.selectedTrashFileItems = selectedTrashFileItemsMock; this.trashService = trashServiceMock; this.repository = repositoryMock; this.deck = deckMock; this.mainController = mainControllerMock; this.messageBox = messageBoxMock; this.dirMap = dirMapMock; } } @Test public void testUnDeleteNoFileSelected() throws Exception { when( selectedTrashFileItemsMock.toArray() ).thenReturn( new TrashBrowseController.UIDeletedObject[0] ); when( selectedTrashFileItemsMock.size() ).thenReturn( 0 ); expectedException.expect( RuntimeException.class ); trBrController.undelete(); } @Test public void testUnDeleteTransformation() throws Exception { testUnDelete( RepositoryObjectType.TRANSFORMATION.name(), true ); verify( trashServiceMock, times( 1 ) ).undelete( anyList() ); verify( transMetaMock, times( 1 ) ).clearChanged(); verify( repositoryMock, times( 1 ) ).loadTransformation( objectIdMock, null ); verify( deckMock, times( 1 ) ).setSelectedIndex( 1 ); } @Test public void testUnDeleteJob() throws Exception { testUnDelete( RepositoryObjectType.JOB.name(), true ); verify( trashServiceMock, times( 1 ) ).undelete( anyList() ); verify( transMetaMock, never() ).clearChanged(); verify( repositoryMock, never() ).loadTransformation( objectIdMock, null ); verify( deckMock, times( 1 ) ).setSelectedIndex( 1 ); } @Test public void testClosestUIRepositoryDirectory() throws Exception { testUnDelete( RepositoryObjectType.JOB.name(), false ); verify( trashServiceMock, times( 1 ) ).undelete( anyList() ); verify( transMetaMock, never() ).clearChanged(); verify( repositoryMock, never() ).loadTransformation( objectIdMock, null ); verify( repoDirMock, times( 1 ) ).refresh(); verify( deckMock, times( 1 ) ).setSelectedIndex( 1 ); } private void testUnDelete( String deletedObjectType, boolean directoryNull ) throws Exception { List<TrashBrowseController.UIDeletedObject> uiDeleteObjects = Arrays.asList( uiDeleteObjectMock ); when( selectedTrashFileItemsMock.toArray() ) .thenReturn( new TrashBrowseController.UIDeletedObject[] { uiDeleteObjectMock } ); when( selectedTrashFileItemsMock.size() ).thenReturn( 1 ); doReturn( uiDeleteObjectMock ).when( selectedTrashFileItemsMock ).get( 0 ); doReturn( "/home/admin" ).when( uiDeleteObjectMock ).getOriginalParentPath(); doReturn( objectIdMock ).when( uiDeleteObjectMock ).getId(); doReturn( deletedObjectType ).when( uiDeleteObjectMock ).getType(); doReturn( uiDeleteObjects ).when( trashServiceMock ).getTrash(); if ( directoryNull ) { doReturn( null ).when( repositoryMock ).findDirectory( "/home/admin" ); } else { doReturn( actualSubDirMock ).when( repositoryMock ).findDirectory( "/home/admin" ); doReturn( objectIdMock ).when( actualSubDirMock ).getObjectId(); doReturn( null ).when( dirMapMock ).get( objectIdMock ); doReturn( actualDirMock ).when( actualSubDirMock ).getParent(); doReturn( objectIdMock2 ).when( actualDirMock ).getObjectId(); doReturn( repoDirMock ).when( dirMapMock ).get( objectIdMock2 ); } doReturn( transMetaMock ).when( repositoryMock ).loadTransformation( objectIdMock, null ); trBrController.undelete(); } @Test public void testUnDeleteDirectory() throws Exception { when( selectedTrashFileItemsMock.toArray() ) .thenReturn( new TrashBrowseController.UIDeletedObject[] { uiDirectoryObjectMock } ); when( selectedTrashFileItemsMock.size() ).thenReturn( 1 ); doReturn( uiDirectoryObjectMock ).when( selectedTrashFileItemsMock ).get( 0 ); doReturn( "/home/admin" ).when( uiDirectoryObjectMock ).getOriginalParentPath(); doReturn( objectIdMock ).when( uiDirectoryObjectMock ).getId(); doReturn( null ).when( uiDirectoryObjectMock ).getType(); doReturn( Arrays.asList( uiDirectoryObjectMock ) ).when( trashServiceMock ).getTrash(); doReturn( null ).when( repositoryMock ).findDirectory( "/home/admin" ); doReturn( transMetaMock ).when( repositoryMock ).loadTransformation( objectIdMock, null ); doReturn( "directory" ).when( uiDirectoryObjectMock ).getName(); doReturn( actualDirMock ).when( repositoryMock ).findDirectory( "/home/admin/directory" ); doReturn( null ).when( actualDirMock ).getChildren(); doReturn( RepositoryObjectType.TRANSFORMATION ).when( objectInDirectory ).getObjectType(); doReturn( objectIdMock ).when( objectInDirectory ).getObjectId(); doReturn( Arrays.asList( objectInDirectory ) ).when( actualDirMock ).getRepositoryObjects(); trBrController.undelete(); verify( trashServiceMock, times( 1 ) ).undelete( anyList() ); verify( transMetaMock, times( 1 ) ).clearChanged(); verify( repositoryMock, times( 1 ) ).loadTransformation( objectIdMock, null ); verify( repositoryMock, times( 1 ) ).findDirectory( "/home/admin/directory" ); verify( actualDirMock, times( 1 ) ).getChildren(); verify( deckMock, times( 1 ) ).setSelectedIndex( 1 ); } @Test public void testUnDeleteDirectoryWSubDir() throws Exception { List<TrashBrowseController.UIDeletedObject> uiDeleteObjects = Arrays.asList( uiDirectoryObjectMock ); when( selectedTrashFileItemsMock.toArray() ) .thenReturn( new TrashBrowseController.UIDeletedObject[] { uiDirectoryObjectMock } ); when( selectedTrashFileItemsMock.size() ).thenReturn( 1 ); doReturn( uiDirectoryObjectMock ).when( selectedTrashFileItemsMock ).get( 0 ); doReturn( "/home/admin" ).when( uiDirectoryObjectMock ).getOriginalParentPath(); doReturn( objectIdMock ).when( uiDirectoryObjectMock ).getId(); doReturn( null ).when( uiDirectoryObjectMock ).getType(); doReturn( uiDeleteObjects ).when( trashServiceMock ).getTrash(); doReturn( null ).when( repositoryMock ).findDirectory( "/home/admin" ); doReturn( transMetaMock ).when( repositoryMock ).loadTransformation( objectIdMock, null ); doReturn( "directory" ).when( uiDirectoryObjectMock ).getName(); doReturn( actualDirMock ).when( repositoryMock ).findDirectory( "/home/admin/directory" ); doReturn( Arrays.asList( actualSubDirMock ) ).when( actualDirMock ).getChildren(); doReturn( null ).when( actualSubDirMock ).getChildren(); doReturn( Arrays.asList( objectInDirectory ) ).when( actualSubDirMock ).getRepositoryObjects(); doReturn( RepositoryObjectType.TRANSFORMATION ).when( objectInDirectory ).getObjectType(); doReturn( objectIdMock ).when( objectInDirectory ).getObjectId(); doReturn( new ArrayList<RepositoryElementMetaInterface>() ).when( actualDirMock ).getRepositoryObjects(); trBrController.undelete(); verify( trashServiceMock, times( 1 ) ).undelete( anyList() ); verify( transMetaMock, times( 1 ) ).clearChanged(); verify( repositoryMock, times( 1 ) ).loadTransformation( objectIdMock, null ); verify( repositoryMock, times( 1 ) ).findDirectory( "/home/admin/directory" ); verify( actualDirMock, times( 3 ) ).getChildren(); verify( actualSubDirMock, times( 1 ) ).getChildren(); verify( deckMock, times( 1 ) ).setSelectedIndex( 1 ); } @Test public void testExceptionHandle() throws Exception { RuntimeException runtimeException = new RuntimeException( "Exception handle" ); when( selectedTrashFileItemsMock.toArray() ) .thenReturn( new TrashBrowseController.UIDeletedObject[] { uiDirectoryObjectMock } ); when( selectedTrashFileItemsMock.size() ).thenReturn( 1 ); doReturn( uiDirectoryObjectMock ).when( selectedTrashFileItemsMock ).get( 0 ); doThrow( runtimeException ).when( trashServiceMock ).undelete( anyList() ); doReturn( false ).when( mainControllerMock ).handleLostRepository( any( Throwable.class ) ); trBrController.undelete(); verify( messageBoxMock ).setTitle( "Error" ); verify( messageBoxMock ).setAcceptLabel( "OK" ); verify( messageBoxMock ).setMessage( contains( "Exception handle" ) ); verify( messageBoxMock, times( 1 ) ).open(); verify( deckMock, never() ).setSelectedIndex( 1 ); } @Test public void testExceptionNotHandle() throws Exception { RuntimeException runtimeException = new RuntimeException( "Exception handle" ); when( selectedTrashFileItemsMock.toArray() ) .thenReturn( new TrashBrowseController.UIDeletedObject[] { uiDirectoryObjectMock } ); when( selectedTrashFileItemsMock.size() ).thenReturn( 1 ); doReturn( uiDirectoryObjectMock ).when( selectedTrashFileItemsMock ).get( 0 ); doThrow( runtimeException ).when( trashServiceMock ).undelete( anyList() ); doReturn( true ).when( mainControllerMock ).handleLostRepository( any( Throwable.class ) ); trBrController.undelete(); verify( messageBoxMock, never() ).setTitle( "Error" ); verify( messageBoxMock, never() ).setAcceptLabel( "OK" ); verify( messageBoxMock, never() ).setMessage( contains( "Exception handle" ) ); verify( messageBoxMock, never() ).open(); verify( deckMock, never() ).setSelectedIndex( 1 ); } @Test public void testUnDeleteNotFoundDir() throws Exception { when( selectedTrashFileItemsMock.toArray() ) .thenReturn( new TrashBrowseController.UIDeletedObject[] { uiDirectoryObjectMock } ); when( selectedTrashFileItemsMock.size() ).thenReturn( 1 ); doReturn( uiDirectoryObjectMock ).when( selectedTrashFileItemsMock ).get( 0 ); doReturn( "/home/admin" ).when( uiDirectoryObjectMock ).getOriginalParentPath(); doReturn( objectIdMock ).when( uiDirectoryObjectMock ).getId(); doReturn( null ).when( uiDirectoryObjectMock ).getType(); doReturn( Arrays.asList( uiDirectoryObjectMock ) ).when( trashServiceMock ).getTrash(); doReturn( null ).when( repositoryMock ).findDirectory( "/home/admin" ); doReturn( transMetaMock ).when( repositoryMock ).loadTransformation( objectIdMock, null ); doReturn( "directory" ).when( uiDirectoryObjectMock ).getName(); doReturn( null ).when( repositoryMock ).findDirectory( "/home/admin/directory" ); trBrController.undelete(); verify( messageBoxMock ).setTitle( "Error" ); verify( messageBoxMock ).setAcceptLabel( "OK" ); verify( messageBoxMock ) .setMessage( eq( "Unable to restore directory /home/admin/directory cause : Directory not found" ) ); verify( messageBoxMock, times( 1 ) ).open(); verify( deckMock, times( 1 ) ).setSelectedIndex( 1 ); } }