/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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.spoon;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
import static junit.framework.Assert.*;
import java.util.ArrayList;
import java.util.Collections;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.pentaho.di.base.AbstractMeta;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.LastUsedFile;
import org.pentaho.di.core.NotePadMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.gui.Point;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.ObjectRevision;
import org.pentaho.di.repository.RepositoryDirectory;
import org.pentaho.di.repository.RepositoryObjectType;
import org.pentaho.di.repository.RepositorySecurityProvider;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.StepErrorMeta;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.trans.steps.csvinput.CsvInputMeta;
import org.pentaho.di.trans.steps.dummytrans.DummyTransMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.spoon.delegates.SpoonDelegates;
import org.pentaho.di.ui.spoon.delegates.SpoonTabsDelegate;
import org.pentaho.metastore.stores.delegate.DelegatingMetaStore;
import org.pentaho.xul.swt.tab.TabItem;
import org.pentaho.xul.swt.tab.TabSet;
/**
* Spoon tests
*
* @author Pavel Sakun
* @see Spoon
*/
public class SpoonTest {
private final Spoon spoon = mock( Spoon.class );
private final LogChannelInterface log = mock( LogChannelInterface.class );
private static SpoonPerspective mockSpoonPerspective = mock( SpoonPerspective.class );
private static SpoonPerspectiveManager perspective = SpoonPerspectiveManager.getInstance();
static {
perspective.addPerspective( mockSpoonPerspective );
}
@Before
public void setUp() throws KettleException {
doCallRealMethod().when( spoon ).copySelected( any( TransMeta.class ), anyListOf( StepMeta.class ),
anyListOf( NotePadMeta.class ) );
doCallRealMethod().when( spoon ).pasteXML( any( TransMeta.class ), anyString(), any( Point.class ) );
doCallRealMethod().when( spoon ).delHop( any( TransMeta.class ), any( TransHopMeta.class ) );
when( spoon.getLog() ).thenReturn( log );
KettleEnvironment.init();
}
/**
* test two steps
* @see http://jira.pentaho.com/browse/PDI-689
*
* @throws KettleException
*/
@Test
public void testCopyPasteStepsErrorHandling() throws KettleException {
final TransMeta transMeta = new TransMeta();
//for check copy both step and hop
StepMeta sourceStep = new StepMeta( "CsvInput", "Step1", new CsvInputMeta() );
StepMeta targetStep = new StepMeta( "Dummy", "Dummy Step1", new DummyTransMeta() );
sourceStep.setSelected( true );
targetStep.setSelected( true );
transMeta.addStep( sourceStep );
transMeta.addStep( targetStep );
StepErrorMeta errorMeta = new StepErrorMeta( transMeta, sourceStep, targetStep );
sourceStep.setStepErrorMeta( errorMeta );
errorMeta.setSourceStep( sourceStep );
errorMeta.setTargetStep( targetStep );
final int stepsSizeBefore = transMeta.getSteps().size();
doAnswer( new Answer() {
@Override
public Object answer( InvocationOnMock invocation ) throws Throwable {
spoon.pasteXML( transMeta, (String) invocation.getArguments()[0], mock( Point.class ) );
assertTrue( "Steps was not copied", stepsSizeBefore < transMeta.getSteps().size() );
//selected copied step
for ( StepMeta s:transMeta.getSelectedSteps() ) {
if ( s.getStepMetaInterface() instanceof CsvInputMeta ) {
//check that stepError was copied
assertNotNull( "Error hop was not copied", s.getStepErrorMeta() );
}
}
return null;
}
} ).when( spoon ).toClipboard( anyString() );
spoon.copySelected( transMeta, transMeta.getSelectedSteps(), Collections.<NotePadMeta>emptyList() );
}
/**
* test copy one step with error handling
* @see http://jira.pentaho.com/browse/PDI-13358
*
* @throws KettleException
*/
@Test
public void testCopyPasteOneStepWithErrorHandling() throws KettleException {
final TransMeta transMeta = new TransMeta();
StepMeta sourceStep = new StepMeta( "CsvInput", "Step1", new CsvInputMeta() );
StepMeta targetStep = new StepMeta( "Dummy", "Dummy Step1", new DummyTransMeta() );
sourceStep.setSelected( true );
transMeta.addStep( sourceStep );
transMeta.addStep( targetStep );
StepErrorMeta errorMeta = new StepErrorMeta( transMeta, sourceStep, targetStep );
sourceStep.setStepErrorMeta( errorMeta );
errorMeta.setSourceStep( sourceStep );
errorMeta.setTargetStep( targetStep );
final int stepsSizeBefore = transMeta.getSteps().size();
doAnswer( new Answer() {
@Override
public Object answer( InvocationOnMock invocation ) throws Throwable {
spoon.pasteXML( transMeta, (String) invocation.getArguments()[0], mock( Point.class ) );
assertTrue( "Steps was not copied", stepsSizeBefore < transMeta.getSteps().size() );
//selected copied step
for ( StepMeta s:transMeta.getSelectedSteps() ) {
if ( s.getStepMetaInterface() instanceof CsvInputMeta ) {
//check that stepError was empty, because we copy only one step from pair
assertNull( "Error hop was not copied", s.getStepErrorMeta() );
}
}
return null;
}
} ).when( spoon ).toClipboard( anyString() );
spoon.copySelected( transMeta, transMeta.getSelectedSteps(), Collections.<NotePadMeta>emptyList() );
}
/**
* Testing displayed test in case versioning enabled
* @see http://jira.pentaho.com/browse/BACKLOG-11607
*
* @throws KettleException
*/
@Test
public void testSetShellTextForTransformationWVersionEnabled() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, false, false, false, false, false, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] transformationName v1.0" );
}
@Test
public void testSetShellTextForTransformationWVersionEnabledRepIsNull() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, true, false, false, false, false, false );
verify( mockShell ).setText( "Spoon - transformationName v1.0" );
}
@Test
public void testSetShellTextForTransformationWVersionEnabledRevIsNull() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, true, true, false, false, false, false );
verify( mockShell ).setText( "Spoon - transformationName" );
}
@Test
public void testSetShellTextForTransformationWVersionEnabledChanged() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, false, false, true, false, false, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] transformationName v1.0 " + BaseMessages
.getString( Spoon.class, "Spoon.Various.Changed" ) );
}
@Test
public void testSetShellTextForTransformationWVersionEnabledNameIsNull() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, false, false, false, true, false, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] transformationFilename v1.0" );
}
@Test
public void testSetShellTextForTransformationWVersionEnabledNameFileNameNull() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, false, false, false, true, true, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] tabName v1.0" );
}
@Test
public void testSetShellTextForTransformationWVersionEnabledNameFileNameTabNull() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, true, true, false, false, false, true, true, true );
verify( mockShell )
.setText( "Spoon - [RepositoryName] " + BaseMessages.getString( Spoon.class, "Spoon.Various.NoName" ) + " v1.0" );
}
@Test
public void testSetShellTextForTransformationWVersionDisabled() {
TransMeta mockTransMeta = mock( TransMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockTransMeta, false, true, false, false, false, false, false, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] transformationName" );
}
@Test
public void testSetShellTextForJobWVersionEnabled() {
JobMeta mockJobMeta = mock( JobMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockJobMeta, true, false, false, false, false, false, false, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] jobName v1.0" );
}
@Test
public void testSetShellTextForJobWVersionEnabledRepIsNull() {
JobMeta mockJobMeta = mock( JobMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockJobMeta, true, false, true, false, false, false, false, false );
verify( mockShell ).setText( "Spoon - jobName v1.0" );
}
@Test
public void testSetShellTextForJobWVersionEnabledRevIsNull() {
JobMeta mockJobMeta = mock( JobMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockJobMeta, true, false, true, true, false, false, false, false );
verify( mockShell ).setText( "Spoon - jobName" );
}
@Test
public void testSetShellTextForJobWVersionDisabled() {
JobMeta mockJobMeta = mock( JobMeta.class );
Shell
mockShell =
prepareSetShellTextTests( spoon, mockJobMeta, false, false, false, false, false, false, false, false );
verify( mockShell ).setText( "Spoon - [RepositoryName] jobName" );
}
private static Shell prepareSetShellTextTests( Spoon spoon, AbstractMeta abstractMeta, boolean versionEnabled,
boolean isTransformation, boolean repIsNull, boolean revIsNull, boolean hasChanged, boolean nameIsNull,
boolean filenameIsNull, boolean tabNameIsNull ) {
Shell mockShell = mock( Shell.class );
ObjectRevision mockObjectRevision = revIsNull ? null : mock( ObjectRevision.class );
RepositoryDirectory mockRepDirectory = mock( RepositoryDirectory.class );
Repository mockRepository = repIsNull ? null : mock( Repository.class );
RepositorySecurityProvider mockRepSecurityProvider = mock( RepositorySecurityProvider.class );
SpoonDelegates mockDelegate = mock( SpoonDelegates.class );
SpoonTabsDelegate mockDelegateTabs = mock( SpoonTabsDelegate.class );
spoon.rep = mockRepository;
spoon.delegates = mockDelegate;
mockDelegate.tabs = mockDelegateTabs;
doCallRealMethod().when( spoon ).openSpoon();
doCallRealMethod().when( spoon ).setShellText();
doReturn( mockShell ).when( spoon ).getShell();
if ( !tabNameIsNull ) {
doReturn( "tabName" ).when( spoon ).getActiveTabText();
}
doReturn( false ).when( mockShell ).isDisposed();
setTransJobValues( abstractMeta, spoon, mockObjectRevision, mockRepDirectory, isTransformation, hasChanged,
nameIsNull, filenameIsNull );
if ( !revIsNull ) {
doReturn( "1.0" ).when( mockObjectRevision ).getName();
}
doReturn( "/admin" ).when( mockRepDirectory ).getPath();
if ( !repIsNull ) {
doReturn( mockRepSecurityProvider ).when( mockRepository ).getSecurityProvider();
doReturn( versionEnabled ).when( mockRepSecurityProvider ).isVersioningEnabled( anyString() );
}
doReturn( "RepositoryName" ).when( spoon ).getRepositoryName();
doReturn( new ArrayList<TabMapEntry>() ).when( mockDelegateTabs ).getTabs();
try {
spoon.openSpoon();
} catch ( NullPointerException e ) {
//ignore work is done
}
spoon.setShellText();
return mockShell;
}
private static void setTransJobValues( AbstractMeta mockObjMeta, Spoon spoon, ObjectRevision objectRevision,
RepositoryDirectory repositoryDirectory, boolean isTransformation, boolean hasChanged, boolean nameIsNull,
boolean filenameIsNull ) {
if ( isTransformation ) {
doReturn( mockObjMeta ).when( spoon ).getActiveTransformation();
doReturn( null ).when( spoon ).getActiveJob();
} else {
doReturn( null ).when( spoon ).getActiveTransformation();
doReturn( mockObjMeta ).when( spoon ).getActiveJob();
}
if ( objectRevision != null ) {
doReturn( objectRevision ).when( mockObjMeta ).getObjectRevision();
}
if ( !filenameIsNull ) {
doReturn( isTransformation ? "transformationFilename" : "jobFilename" ).when( mockObjMeta ).getFilename();
}
doReturn( hasChanged ).when( mockObjMeta ).hasChanged();
if ( !nameIsNull ) {
doReturn( isTransformation ? "transformationName" : "jobName" ).when( mockObjMeta ).getName();
}
doReturn( repositoryDirectory ).when( mockObjMeta ).getRepositoryDirectory();
doReturn( isTransformation ? RepositoryObjectType.TRANSFORMATION : RepositoryObjectType.JOB ).when( mockObjMeta )
.getRepositoryElementType();
}
@Test
public void testDelHop() throws Exception {
StepMetaInterface stepMetaInterface = Mockito.mock( StepMetaInterface.class );
StepMeta step = new StepMeta();
step.setStepMetaInterface( stepMetaInterface );
TransHopMeta transHopMeta = new TransHopMeta();
transHopMeta.setFromStep( step );
TransMeta transMeta = Mockito.mock( TransMeta.class );
spoon.delHop( transMeta, transHopMeta );
Mockito.verify( stepMetaInterface, times( 1 ) ).cleanAfterHopFromRemove( );
}
@Test
public void testNullParamSaveToFile() throws Exception {
doCallRealMethod().when( spoon ).saveToFile( any() );
assertFalse( spoon.saveToFile( null ) );
}
@Test
public void testJobToRepSaveToFile() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, false, false, MainSpoonPerspective.ID, true,
true, null, null, true, true );
doCallRealMethod().when( spoon ).saveToFile( mockJobMeta );
assertTrue( spoon.saveToFile( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( mockJobMeta ).setFilename( null );
verify( spoon.delegates.tabs ).renameTabs();
verify( spoon ).enableMenus();
}
@Test
public void testJobToFileSaveToFile() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, true, false, "NotMainSpoonPerspective", true,
true, null, "filename", true, true );
doCallRealMethod().when( spoon ).saveToFile( mockJobMeta );
assertTrue( spoon.saveToFile( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( spoon.delegates.tabs ).renameTabs();
verify( spoon ).enableMenus();
}
@Test
public void testJobToFileWithoutNameSaveToFile() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, true, false, "NotMainSpoonPerspective", true,
true, null, null, true, true );
doCallRealMethod().when( spoon ).saveToFile( mockJobMeta );
doReturn( true ).when( spoon ).saveFileAs( mockJobMeta );
assertTrue( spoon.saveToFile( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( spoon.delegates.tabs ).renameTabs();
verify( spoon ).enableMenus();
}
@Test
public void testJobToFileCantSaveToFile() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, true, false, "NotMainSpoonPerspective", true,
true, null, null, true, false );
doCallRealMethod().when( spoon ).saveToFile( mockJobMeta );
doReturn( true ).when( spoon ).saveFileAs( mockJobMeta );
assertFalse( spoon.saveToFile( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( spoon.delegates.tabs ).renameTabs();
verify( spoon ).enableMenus();
}
@Test
public void testTransToRepSaveToFile() throws Exception {
TransMeta mockTransMeta = mock( TransMeta.class );
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockTransMeta, false, false, MainSpoonPerspective.ID, true,
true, null, null, true, true );
doCallRealMethod().when( spoon ).saveToFile( mockTransMeta );
assertTrue( spoon.saveToFile( mockTransMeta ) );
verify( mockTransMeta ).setRepository( spoon.rep );
verify( mockTransMeta ).setMetaStore( spoon.metaStore );
verify( mockTransMeta ).setFilename( null );
verify( spoon.delegates.tabs ).renameTabs();
verify( spoon ).enableMenus();
}
@Test
public void testJobToRepSaveFileAs() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, false, false, MainSpoonPerspective.ID, true,
true, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockJobMeta );
assertTrue( spoon.saveFileAs( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( mockJobMeta ).setObjectId( null );
verify( mockJobMeta ).setFilename( null );
verify( spoon.delegates.tabs ).findTabMapEntry( mockJobMeta );
verify( spoon ).enableMenus();
}
@Test
public void testJobToRepSaveFileAsFailed() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, false, false, MainSpoonPerspective.ID, false,
true, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockJobMeta );
assertFalse( spoon.saveFileAs( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( mockJobMeta ).setObjectId( null );
verify( mockJobMeta ).setFilename( null );
verify( spoon ).enableMenus();
}
@Test
public void testJobToXMLFileSaveFileAs() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, true, true, "NotMainSpoonPerspective", true,
true, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockJobMeta );
assertTrue( spoon.saveFileAs( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( spoon.delegates.tabs ).findTabMapEntry( mockJobMeta );
verify( spoon ).enableMenus();
}
@Test
public void testJobToXMLFileSaveFileAsFailed() throws Exception {
JobMeta mockJobMeta = mock( JobMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockJobMeta, true, true, "NotMainSpoonPerspective", true,
false, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockJobMeta );
assertFalse( spoon.saveFileAs( mockJobMeta ) );
verify( mockJobMeta ).setRepository( spoon.rep );
verify( mockJobMeta ).setMetaStore( spoon.metaStore );
verify( spoon ).enableMenus();
}
@Test
public void testTransToRepSaveFileAs() throws Exception {
TransMeta mockTransMeta = mock( TransMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockTransMeta, false, false, MainSpoonPerspective.ID, true,
true, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockTransMeta );
assertTrue( spoon.saveFileAs( mockTransMeta ) );
verify( mockTransMeta ).setRepository( spoon.rep );
verify( mockTransMeta ).setMetaStore( spoon.metaStore );
verify( mockTransMeta ).setObjectId( null );
verify( mockTransMeta ).setFilename( null );
verify( spoon.delegates.tabs ).findTabMapEntry( mockTransMeta );
verify( spoon ).enableMenus();
}
@Test
public void testTransToRepSaveFileAsFailed() throws Exception {
TransMeta mockTransMeta = mock( TransMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockTransMeta, false, false, MainSpoonPerspective.ID, false,
true, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockTransMeta );
assertFalse( spoon.saveFileAs( mockTransMeta ) );
verify( mockTransMeta ).setRepository( spoon.rep );
verify( mockTransMeta ).setMetaStore( spoon.metaStore );
verify( mockTransMeta ).setObjectId( null );
verify( mockTransMeta ).setFilename( null );
verify( spoon ).enableMenus();
}
@Test
public void testTransToXMLFileSaveFileAs() throws Exception {
TransMeta mockTransMeta = mock( TransMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockTransMeta, true, true, "NotMainSpoonPerspective", true,
true, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockTransMeta );
assertTrue( spoon.saveFileAs( mockTransMeta ) );
verify( mockTransMeta ).setRepository( spoon.rep );
verify( mockTransMeta ).setMetaStore( spoon.metaStore );
verify( spoon.delegates.tabs ).findTabMapEntry( mockTransMeta );
verify( spoon ).enableMenus();
}
@Test
public void testTransToXMLFileSaveFileAsFailed() throws Exception {
TransMeta mockTransMeta = mock( TransMeta.class );
//passing a invalid type so not running GUIResource class
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockTransMeta, true, true, "NotMainSpoonPerspective", true,
false, "Invalid TYPE", null, true, true );
doCallRealMethod().when( spoon ).saveFileAs( mockTransMeta );
assertFalse( spoon.saveFileAs( mockTransMeta ) );
verify( mockTransMeta ).setRepository( spoon.rep );
verify( mockTransMeta ).setMetaStore( spoon.metaStore );
verify( spoon ).enableMenus();
}
@Test
public void testTransToRepSaveObjectIdNotNullToFile() throws Exception {
TransMeta mockTransMeta = mock( TransMeta.class );
prepareSetSaveTests( spoon, log, mockSpoonPerspective, mockTransMeta, false, false, MainSpoonPerspective.ID, true,
true, null, null, false, true );
doCallRealMethod().when( spoon ).saveToFile( mockTransMeta );
assertTrue( spoon.saveToFile( mockTransMeta ) );
verify( mockTransMeta ).setRepository( spoon.rep );
verify( mockTransMeta ).setMetaStore( spoon.metaStore );
verify( mockTransMeta, never() ).setFilename( null );
verify( spoon.delegates.tabs ).renameTabs();
verify( spoon ).enableMenus();
}
private static void prepareSetSaveTests( Spoon spoon, LogChannelInterface log, SpoonPerspective spoonPerspective,
AbstractMeta metaData, boolean repIsNull, boolean basicLevel, String perspectiveID, boolean saveToRepository,
boolean saveXMLFile, String fileType, String filename, boolean objectIdIsNull, boolean canSave )
throws Exception {
TabMapEntry mockTabMapEntry = mock( TabMapEntry.class );
TabItem mockTabItem = mock( TabItem.class );
Repository mockRepository = mock( Repository.class );
DelegatingMetaStore mockMetaStore = mock( DelegatingMetaStore.class );
spoon.rep = repIsNull ? null : mockRepository;
spoon.metaStore = mockMetaStore;
spoon.delegates = mock( SpoonDelegates.class );
spoon.delegates.tabs = mock( SpoonTabsDelegate.class );
spoon.props = mock( PropsUI.class );
doReturn( perspectiveID ).when( spoonPerspective ).getId();
doReturn( basicLevel ).when( log ).isBasic();
doReturn( basicLevel ).when( log ).isDetailed();
doReturn( mockTabMapEntry ).when( spoon.delegates.tabs ).findTabMapEntry( any() );
doReturn( mockTabItem ).when( mockTabMapEntry ).getTabItem();
doReturn( saveToRepository ).when( spoon ).saveToRepository( metaData, true );
doReturn( saveXMLFile ).when( spoon ).saveXMLFile( metaData, false );
if ( objectIdIsNull ) {
doReturn( null ).when( metaData ).getObjectId();
} else {
doReturn( new ObjectId() {
@Override public String getId() {
return "objectId";
}
} ).when( metaData ).getObjectId();
}
//saveFile
doReturn( filename ).when( metaData ).getFilename();
doReturn( canSave ).when( metaData ).canSave();
doReturn( false ).when( spoon.props ).useDBCache();
doReturn( saveToRepository ).when( spoon ).saveToRepository( metaData );
doReturn( saveXMLFile ).when( spoon ).save( metaData, filename, false );
doReturn( fileType ).when( metaData ).getFileType();
}
@Test
public void testLoadLastUsedTransLocalWithRepository() throws Exception {
String repositoryName = "repositoryName";
String fileName = "fileName";
setLoadLastUsedJobLocalWithRepository( false, repositoryName, null, fileName, true );
verify( spoon ).openFile( fileName, true );
}
@Test
public void testLoadLastUsedTransLocalNoRepository() throws Exception {
String repositoryName = null;
String fileName = "fileName";
setLoadLastUsedJobLocalWithRepository( false, repositoryName, null, fileName, true );
verify( spoon ).openFile( fileName, false );
}
@Test
public void testLoadLastUsedTransLocalNoFilename() throws Exception {
String repositoryName = null;
String fileName = null;
setLoadLastUsedJobLocalWithRepository( false, repositoryName, null, fileName, true );
verify( spoon, never() ).openFile( anyString(), anyBoolean() );
}
@Test
public void testLoadLastUsedJobLocalWithRepository() throws Exception {
String repositoryName = null;
String fileName = "fileName";
setLoadLastUsedJobLocalWithRepository( false, repositoryName, null, fileName, false );
verify( spoon ).openFile( fileName, false );
}
@Test
public void testLoadLastUsedRepTransNoRepository() throws Exception {
String repositoryName = null;
String fileName = "fileName";
setLoadLastUsedJobLocalWithRepository( true, repositoryName, null, fileName, false );
verify( spoon, never() ).openFile( anyString(), anyBoolean() );
}
private void setLoadLastUsedJobLocalWithRepository( boolean isSourceRepository, String repositoryName,
String directoryName, String fileName, boolean isTransformation ) throws Exception {
LastUsedFile mockLastUsedFile = mock( LastUsedFile.class );
if ( repositoryName != null ) {
Repository mockRepository = mock( Repository.class );
spoon.rep = mockRepository;
doReturn( repositoryName ).when( mockRepository ).getName();
} else {
spoon.rep = null;
}
doReturn( isSourceRepository ).when( mockLastUsedFile ).isSourceRepository();
doReturn( repositoryName ).when( mockLastUsedFile ).getRepositoryName();
doReturn( directoryName ).when( mockLastUsedFile ).getDirectory();
doReturn( fileName ).when( mockLastUsedFile ).getFilename();
doReturn( isTransformation ).when( mockLastUsedFile ).isTransformation();
doReturn( !isTransformation ).when( mockLastUsedFile ).isJob();
doCallRealMethod().when( spoon ).loadLastUsedFile( mockLastUsedFile, repositoryName );
spoon.loadLastUsedFile( mockLastUsedFile, repositoryName );
}
@Test
public void testCancelPromptToSave() throws Exception {
setPromptToSave( SWT.CANCEL, false );
assertFalse( spoon.promptForSave() );
}
@Test
public void testNoPromptToSave() throws Exception {
SpoonBrowser mockBrowser = setPromptToSave( SWT.NO, false );
assertTrue( spoon.promptForSave() );
verify( mockBrowser, never() ).applyChanges();
}
@Test
public void testYesPromptToSave() throws Exception {
SpoonBrowser mockBrowser = setPromptToSave( SWT.YES, false );
assertTrue( spoon.promptForSave() );
verify( mockBrowser ).applyChanges();
}
@Test
public void testCanClosePromptToSave() throws Exception {
setPromptToSave( SWT.YES, true );
assertTrue( spoon.promptForSave() );
}
private SpoonBrowser setPromptToSave( int buttonPressed, boolean canbeClosed ) throws Exception {
TabMapEntry mockTabMapEntry = mock( TabMapEntry.class );
TabSet mockTabSet = mock( TabSet.class );
ArrayList<TabMapEntry> lTabs = new ArrayList<>();
lTabs.add( mockTabMapEntry );
SpoonBrowser mockSpoonBrowser = mock( SpoonBrowser.class );
spoon.delegates = mock( SpoonDelegates.class );
spoon.delegates.tabs = mock( SpoonTabsDelegate.class );
spoon.tabfolder = mockTabSet;
doReturn( lTabs ).when( spoon.delegates.tabs ).getTabs();
doReturn( mockSpoonBrowser ).when( mockTabMapEntry ).getObject();
doReturn( canbeClosed ).when( mockSpoonBrowser ).canBeClosed();
doReturn( buttonPressed ).when( mockSpoonBrowser ).showChangedWarning();
doCallRealMethod().when( spoon ).promptForSave();
return mockSpoonBrowser;
}
}