/* * ****************************************************************************** * * Copyright (C) 2002-2015 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.trans.steps.xmloutput; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.pentaho.di.core.variables.VariableSpace; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.dictionary.DictionaryConst; import org.pentaho.metaverse.api.IComponentDescriptor; import org.pentaho.metaverse.api.IMetaverseBuilder; import org.pentaho.metaverse.api.IMetaverseNode; import org.pentaho.metaverse.api.INamespace; import org.pentaho.metaverse.api.MetaverseComponentDescriptor; import org.pentaho.metaverse.api.MetaverseObjectFactory; import org.pentaho.metaverse.api.model.IExternalResourceInfo; import java.util.Collection; import java.util.Set; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith( MockitoJUnitRunner.class ) public class XMLOutputStepAnalyzerTest { private XMLOutputStepAnalyzer analyzer; @Mock private XMLOutput mockXMLOutput; @Mock private XMLOutputMeta meta; @Mock private XMLOutputData data; @Mock IMetaverseNode node; @Mock IMetaverseBuilder mockBuilder; @Mock private INamespace mockNamespace; @Mock private StepMeta parentStepMeta; @Mock private TransMeta mockTransMeta; IComponentDescriptor descriptor; static MetaverseObjectFactory metaverseObjectFactory = new MetaverseObjectFactory(); @Before public void setUp() throws Exception { analyzer = spy( new XMLOutputStepAnalyzer() ); analyzer.setMetaverseBuilder( mockBuilder ); analyzer.setBaseStepMeta( meta ); analyzer.setRootNode( node ); analyzer.setParentTransMeta( mockTransMeta ); analyzer.setParentStepMeta( parentStepMeta ); descriptor = new MetaverseComponentDescriptor( "test", DictionaryConst.NODE_TYPE_TRANS_STEP, mockNamespace ); analyzer.setDescriptor( descriptor ); analyzer.setObjectFactory( metaverseObjectFactory ); when( mockXMLOutput.getStepDataInterface() ).thenReturn( data ); when( mockXMLOutput.getStepMeta() ).thenReturn( parentStepMeta ); when( meta.getParentStepMeta() ).thenReturn( parentStepMeta ); when( parentStepMeta.getStepMetaInterface() ).thenReturn( meta ); when( parentStepMeta.getParentTransMeta() ).thenReturn( mockTransMeta ); when( parentStepMeta.getName() ).thenReturn( "test" ); when( parentStepMeta.getStepID() ).thenReturn( "XmlOutputStep" ); } @Test public void testCustomAnalyze() throws Exception { when( meta.getMainElement() ).thenReturn( "main" ); when( meta.getRepeatElement() ).thenReturn( "repeat" ); analyzer.customAnalyze( meta, node ); verify( node ).setProperty( "parentnode", "main" ); verify( node ).setProperty( "rownode", "repeat" ); } @Test public void testGetSupportedSteps() { XMLOutputStepAnalyzer analyzer = new XMLOutputStepAnalyzer(); Set<Class<? extends BaseStepMeta>> types = analyzer.getSupportedSteps(); assertNotNull( types ); assertEquals( types.size(), 1 ); assertTrue( types.contains( XMLOutputMeta.class ) ); } @Test public void testGetOutputResourceFields() throws Exception { XMLField[] outputFields = new XMLField[2]; XMLField field1 = mock( XMLField.class ); XMLField field2 = mock( XMLField.class ); outputFields[0] = field1; outputFields[1] = field2; when( field1.getFieldName() ).thenReturn( "field1" ); when( field2.getFieldName() ).thenReturn( "field2" ); when( meta.getOutputFields() ).thenReturn( outputFields ); Set<String> outputResourceFields = analyzer.getOutputResourceFields( meta ); assertEquals( outputFields.length, outputResourceFields.size() ); for ( XMLField outputField : outputFields ) { assertTrue( outputResourceFields.contains( outputField.getFieldName() ) ); } } @Test public void testXMLOutputExternalResourceConsumer() throws Exception { XMLOutputExternalResourceConsumer consumer = new XMLOutputExternalResourceConsumer(); StepMeta meta = new StepMeta( "test", this.meta ); StepMeta spyMeta = spy( meta ); when( this.meta.getParentStepMeta() ).thenReturn( spyMeta ); when( spyMeta.getParentTransMeta() ).thenReturn( mockTransMeta ); when( this.meta.getFileName() ).thenReturn( null ); String[] filePaths = { "/path/to/file1", "/another/path/to/file2" }; when( this.meta.getFiles( Mockito.any( VariableSpace.class ) ) ).thenReturn( filePaths ); assertFalse( consumer.isDataDriven( this.meta ) ); Collection<IExternalResourceInfo> resources = consumer.getResourcesFromMeta( this.meta ); assertFalse( resources.isEmpty() ); assertEquals( 2, resources.size() ); when( this.meta.getExtension() ).thenReturn( "txt" ); assertEquals( XMLOutputMeta.class, consumer.getMetaClass() ); } @Test public void testCreateResourceNode() throws Exception { IExternalResourceInfo res = mock( IExternalResourceInfo.class ); when( res.getName() ).thenReturn( "file:///Users/home/tmp/xyz.xml" ); IMetaverseNode resourceNode = analyzer.createResourceNode( res ); assertNotNull( resourceNode ); assertEquals( DictionaryConst.NODE_TYPE_FILE, resourceNode.getType() ); } @Test public void testGetResourceInputNodeType() throws Exception { assertNull( analyzer.getResourceInputNodeType() ); } @Test public void testGetResourceOutputNodeType() throws Exception { assertEquals( DictionaryConst.NODE_TYPE_FILE_FIELD, analyzer.getResourceOutputNodeType() ); } @Test public void testIsOutput() throws Exception { assertTrue( analyzer.isOutput() ); } @Test public void testIsInput() throws Exception { assertFalse( analyzer.isInput() ); } @Test public void testGetUsedFields() throws Exception { assertNull( analyzer.getUsedFields( meta ) ); } }