org.pentaho.di.trans.steps.propertyinput.PropertyInputMetaTest.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.trans.steps.propertyinput.PropertyInputMetaTest.java

Source

/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2016 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.propertyinput;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.vfs2.FileContent;
import org.apache.commons.vfs2.FileName;
import org.apache.commons.vfs2.FileObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.fileinput.FileInputList;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.trans.step.BaseStep;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.trans.steps.loadsave.LoadSaveTester;
import org.pentaho.di.trans.steps.loadsave.initializer.InitializerInterface;
import org.pentaho.di.trans.steps.loadsave.validator.ArrayLoadSaveValidator;
import org.pentaho.di.trans.steps.loadsave.validator.FieldLoadSaveValidator;
import org.pentaho.di.trans.steps.loadsave.validator.StringLoadSaveValidator;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;

public class PropertyInputMetaTest implements InitializerInterface<StepMetaInterface> {
    Class<PropertyInputMeta> testMetaClass = PropertyInputMeta.class;
    LoadSaveTester loadSaveTester;

    @Before
    public void setUp() throws Exception {
        KettleEnvironment.init();
        PluginRegistry.init(true);
        List<String> attributes = Arrays.asList("encoding", "fileType", "includeFilename", "resetRowNumber",
                "resolvevaluevariable", "filenameField", "includeRowNumber", "rowNumberField", "rowLimit",
                "filefield", "isaddresult", "dynamicFilenameField", "includeIniSection", "iniSectionField",
                "section", "shortFileFieldName", "pathFieldName", "hiddenFieldName",
                "lastModificationTimeFieldName", "uriNameFieldName", "rootUriNameFieldName", "extensionFieldName",
                "sizeFieldName", "fileName", "fileMask", "excludeFileMask", "fileRequired", "includeSubFolders",
                "inputFields");

        Map<String, String> getterMap = new HashMap<String, String>() {
            {
                put("encoding", "getEncoding");
                put("fileType", "getFileType");
                put("includeFilename", "includeFilename");
                put("resetRowNumber", "resetRowNumber");
                put("resolvevaluevariable", "isResolveValueVariable");
                put("filenameField", "getFilenameField");
                put("includeRowNumber", "includeRowNumber");
                put("rowNumberField", "getRowNumberField");
                put("rowLimit", "getRowLimit");
                put("filefield", "isFileField");
                put("isaddresult", "isAddResultFile");
                put("dynamicFilenameField", "getDynamicFilenameField");
                put("includeIniSection", "includeIniSection");
                put("iniSectionField", "getINISectionField");
                put("section", "getSection");
                put("shortFileFieldName", "getShortFileNameField");
                put("pathFieldName", "getPathField");
                put("hiddenFieldName", "isHiddenField");
                put("lastModificationTimeFieldName", "getLastModificationDateField");
                put("uriNameFieldName", "getUriField");
                put("rootUriNameFieldName", "getRootUriField");
                put("extensionFieldName", "getExtensionField");
                put("sizeFieldName", "getSizeField");
                put("fileName", "getFileName");
                put("fileMask", "getFileMask");
                put("excludeFileMask", "getExcludeFileMask");
                put("fileRequired", "getFileRequired");
                put("includeSubFolders", "getIncludeSubFolders");
                put("inputFields", "getInputFields");
            }
        };
        Map<String, String> setterMap = new HashMap<String, String>() {
            {
                put("encoding", "setEncoding");
                put("fileType", "setFileType");
                put("includeFilename", "setIncludeFilename");
                put("resetRowNumber", "setResetRowNumber");
                put("resolvevaluevariable", "setResolveValueVariable");
                put("filenameField", "setFilenameField");
                put("includeRowNumber", "setIncludeRowNumber");
                put("rowNumberField", "setRowNumberField");
                put("rowLimit", "setRowLimit");
                put("filefield", "setFileField");
                put("isaddresult", "setAddResultFile");
                put("dynamicFilenameField", "setDynamicFilenameField");
                put("includeIniSection", "setIncludeIniSection");
                put("iniSectionField", "setINISectionField");
                put("section", "setSection");
                put("shortFileFieldName", "setShortFileNameField");
                put("pathFieldName", "setPathField");
                put("hiddenFieldName", "setIsHiddenField");
                put("lastModificationTimeFieldName", "setLastModificationDateField");
                put("uriNameFieldName", "setUriField");
                put("rootUriNameFieldName", "setRootUriField");
                put("extensionFieldName", "setExtensionField");
                put("sizeFieldName", "setSizeField");
                put("fileName", "setFileName");
                put("fileMask", "setFileMask");
                put("excludeFileMask", "setExcludeFileMask");
                put("fileRequired", "setFileRequired");
                put("includeSubFolders", "setIncludeSubFolders");
                put("inputFields", "setInputFields");
            }
        };
        FieldLoadSaveValidator<String[]> stringArrayLoadSaveValidator = new ArrayLoadSaveValidator<String>(
                new StringLoadSaveValidator(), 5);

        FieldLoadSaveValidator<PropertyInputField[]> pifArrayLoadSaveValidator = new ArrayLoadSaveValidator<PropertyInputField>(
                new PropertyInputFieldLoadSaveValidator(), 5);

        Map<String, FieldLoadSaveValidator<?>> attrValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>();
        attrValidatorMap.put("fileName", stringArrayLoadSaveValidator);
        attrValidatorMap.put("fileMask", stringArrayLoadSaveValidator);
        attrValidatorMap.put("excludeFileMask", stringArrayLoadSaveValidator);
        attrValidatorMap.put("fileRequired", stringArrayLoadSaveValidator);
        attrValidatorMap.put("includeSubFolders", stringArrayLoadSaveValidator);
        attrValidatorMap.put("inputFields", pifArrayLoadSaveValidator);
        Map<String, FieldLoadSaveValidator<?>> typeValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>();
        // typeValidatorMap.put( int[].class.getCanonicalName(), new PrimitiveIntArrayLoadSaveValidator( new IntLoadSaveValidator(), 1 ) );

        loadSaveTester = new LoadSaveTester(testMetaClass, attributes, new ArrayList<String>(),
                new ArrayList<String>(), getterMap, setterMap, attrValidatorMap, typeValidatorMap, this);
    }

    // Call the allocate method on the LoadSaveTester meta class
    public void modify(StepMetaInterface propInputMeta) {
        if (propInputMeta instanceof PropertyInputMeta) {
            ((PropertyInputMeta) propInputMeta).allocate(5, 5);
        }
    }

    @Test
    public void testSerialization() throws KettleException {
        loadSaveTester.testSerialization();
    }

    //PropertyInputField
    public class PropertyInputFieldLoadSaveValidator implements FieldLoadSaveValidator<PropertyInputField> {
        final Random rand = new Random();

        @Override
        public PropertyInputField getTestObject() {
            PropertyInputField rtn = new PropertyInputField();
            rtn.setCurrencySymbol(UUID.randomUUID().toString());
            rtn.setDecimalSymbol(UUID.randomUUID().toString());
            rtn.setFormat(UUID.randomUUID().toString());
            rtn.setGroupSymbol(UUID.randomUUID().toString());
            rtn.setName(UUID.randomUUID().toString());
            rtn.setTrimType(rand.nextInt(4));
            rtn.setPrecision(rand.nextInt(9));
            rtn.setRepeated(rand.nextBoolean());
            rtn.setLength(rand.nextInt(50));
            rtn.setSamples(new String[] { UUID.randomUUID().toString(), UUID.randomUUID().toString(),
                    UUID.randomUUID().toString() });
            return rtn;
        }

        @Override
        public boolean validateTestObject(PropertyInputField testObject, Object actual) {
            if (!(actual instanceof PropertyInputField)) {
                return false;
            }
            PropertyInputField actualInput = (PropertyInputField) actual;
            return (testObject.toString().equals(actualInput.toString()));
        }
    }

    @Test
    public void testOpenNextFile() throws Exception {

        PropertyInputMeta propertyInputMeta = Mockito.mock(PropertyInputMeta.class);
        PropertyInputData propertyInputData = new PropertyInputData();
        FileInputList fileInputList = new FileInputList();
        FileObject fileObject = Mockito.mock(FileObject.class);
        FileName fileName = Mockito.mock(FileName.class);
        Mockito.when(fileName.getRootURI()).thenReturn("testFolder");
        Mockito.when(fileName.getURI()).thenReturn("testFileName.ini");

        String header = "test ini data with umlauts";
        String key = "key";
        String testValue = "value-with-";
        String testData = "[" + header + "]\r\n" + key + "=" + testValue;
        String charsetEncode = "Windows-1252";

        InputStream inputStream = new ByteArrayInputStream(testData.getBytes(Charset.forName(charsetEncode)));
        FileContent fileContent = Mockito.mock(FileContent.class);
        Mockito.when(fileObject.getContent()).thenReturn(fileContent);
        Mockito.when(fileContent.getInputStream()).thenReturn(inputStream);
        Mockito.when(fileObject.getName()).thenReturn(fileName);
        fileInputList.addFile(fileObject);

        propertyInputData.files = fileInputList;
        propertyInputData.propfiles = false;
        propertyInputData.realEncoding = charsetEncode;

        PropertyInput propertyInput = Mockito.mock(PropertyInput.class);

        Field logField = BaseStep.class.getDeclaredField("log");
        logField.setAccessible(true);
        logField.set(propertyInput, Mockito.mock(LogChannelInterface.class));

        Mockito.doCallRealMethod().when(propertyInput).dispose(propertyInputMeta, propertyInputData);

        propertyInput.dispose(propertyInputMeta, propertyInputData);

        Method method = PropertyInput.class.getDeclaredMethod("openNextFile");
        method.setAccessible(true);
        method.invoke(propertyInput);

        Assert.assertEquals(testValue, propertyInputData.wini.get(header).get(key));
    }

}