org.pentaho.platform.repository.solution.filebased.SolutionRepositoryVfsFileObjectTest.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.repository.solution.filebased.SolutionRepositoryVfsFileObjectTest.java

Source

/*
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License, version 2 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 *
 * Copyright 2017 Pentaho Corporation.  All rights reserved.
 */
package org.pentaho.platform.repository.solution.filebased;

import mockit.Deencapsulation;
import mockit.Verifications;
import org.apache.commons.vfs2.FileContent;
import org.apache.commons.vfs2.FileSystemException;
import org.junit.Test;
import org.pentaho.platform.api.repository2.unified.IAclNodeHelper;
import org.pentaho.platform.api.repository2.unified.IRepositoryContentConverterHandler;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.util.EnumSet;

import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.*;

public class SolutionRepositoryVfsFileObjectTest {

    @Test
    public void initFileTest() throws Exception {

        String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
        String dsRef = "/etc/mondrian/SteelWheels";
        SolutionRepositoryVfsFileObject fileObject = new SolutionRepositoryVfsFileObject(fileRef);
        SolutionRepositoryVfsFileObject fileObjectSpy = spy(fileObject);

        IAclNodeHelper aclNodeHelper = mock(IAclNodeHelper.class);
        doReturn(aclNodeHelper).when(fileObjectSpy).getAclHelper();

        RepositoryFile file = mock(RepositoryFile.class);
        doReturn(true).when(aclNodeHelper).canAccess(file, EnumSet.of(RepositoryFilePermission.READ));

        IUnifiedRepository repository = mock(IUnifiedRepository.class);
        doReturn(file).when(repository).getFile(fileRef);
        doReturn(repository).when(fileObjectSpy).getRepository();

        fileObjectSpy.getName();
        verify(repository, times(1)).getFile(eq(dsRef));
        verify(repository, times(1)).getFile(eq(fileRef));
        verify(aclNodeHelper, times(1)).canAccess(any(RepositoryFile.class),
                eq(EnumSet.of(RepositoryFilePermission.READ)));

        fileRef = "/etca/mondriana/SteelWheels/schema.xml";

        fileObject = new SolutionRepositoryVfsFileObject(fileRef);
        fileObjectSpy = spy(fileObject);

        doReturn(aclNodeHelper).when(fileObjectSpy).getAclHelper();
        doReturn(false).when(aclNodeHelper).canAccess(file, EnumSet.of(RepositoryFilePermission.READ));
        doReturn(repository).when(fileObjectSpy).getRepository();

        fileObjectSpy.getName();
        verify(repository, times(2)).getFile(eq(fileRef));
        verify(aclNodeHelper, times(2)).canAccess(any(RepositoryFile.class),
                eq(EnumSet.of(RepositoryFilePermission.READ)));
    }

    @Test
    public void testFileRefConstructor() {
        String expectedFileRef = "dummyFileRef";
        SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject(
                "dummyFileRef");
        assertThat(solutionRepositoryVfsFileObject.getFileRef(), is(expectedFileRef));
    }

    @Test
    public void testGetRepo(@mockit.Mocked IUnifiedRepository mockUnifiedRepository) {
        Deencapsulation.setField(SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository);
        SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject(
                "dummyFileRef");
        assertThat(solutionRepositoryVfsFileObject.getRepository(), is(mockUnifiedRepository));
    }

    @Test
    public void testGetConvertHandler(@mockit.Mocked final IRepositoryContentConverterHandler mockConvertHandler) {
        SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject(
                "dummyFileRef");
        Deencapsulation.setField(solutionRepositoryVfsFileObject, "converterHandler", mockConvertHandler);
        assertThat(solutionRepositoryVfsFileObject.getConverterHandler(), is(mockConvertHandler));
    }

    //TODO: change or remove this test once getUrl is fixed or removed
    @Test
    public void testGetUrl() throws FileSystemException, MalformedURLException {
        String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
        SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject(
                fileRef);
        assertThat(solutionRepositoryVfsFileObject.getURL(), is(nullValue()));
    }

    @Test
    public void testExists(@mockit.Mocked final RepositoryFile mockRepoFile,
            @mockit.Mocked final IAclNodeHelper mockAclHelper,
            @mockit.Mocked final IUnifiedRepository mockUnifiedRepository) throws FileSystemException {
        String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
        Deencapsulation.setField(SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository);
        SolutionRepositoryVfsFileObject testObject = new SolutionRepositoryVfsFileObject(fileRef);
        Deencapsulation.setField(testObject, "aclHelper", mockAclHelper);
        new mockit.NonStrictExpectations() {
            //CHECKSTYLE IGNORE check FOR NEXT 4 LINES
            {
                mockUnifiedRepository.getFile(anyString);
                result = mockRepoFile;
                mockAclHelper.canAccess(mockRepoFile, EnumSet.of(RepositoryFilePermission.READ));
                result = true;
            }
        };
        assertThat(testObject.exists(), is(true));

        new Verifications() {
            //CHECKSTYLE IGNORE check FOR NEXT 4 LINES
            {
                mockUnifiedRepository.getFile(anyString);
                times = 2;
                mockAclHelper.canAccess(mockRepoFile, EnumSet.of(RepositoryFilePermission.READ));
                times = 1;
            }
        };
    }

    @Test
    @SuppressWarnings({ "checkstyle:onestatementperline",
            "multiple statements help understand the mock definition" })
    public void testExistsNot(@mockit.Mocked final IAclNodeHelper mockAclHelper,
            @mockit.Mocked final IUnifiedRepository mockUnifiedRepository) throws FileSystemException {
        String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
        Deencapsulation.setField(SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository);
        SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject(
                fileRef);
        Deencapsulation.setField(solutionRepositoryVfsFileObject, "aclHelper", mockAclHelper);
        new mockit.NonStrictExpectations() {
            //CHECKSTYLE IGNORE check FOR NEXT 4 LINES
            {
                mockUnifiedRepository.getFile(anyString);
                result = null;
                mockAclHelper.canAccess(null, EnumSet.of(RepositoryFilePermission.READ));
                result = true;
            }
        };
        assertThat(solutionRepositoryVfsFileObject.exists(), is(false));
        new Verifications() {
            //CHECKSTYLE IGNORE check FOR NEXT 4 LINES
            {
                mockUnifiedRepository.getFile(anyString);
                times = 2;
                mockAclHelper.canAccess(null, EnumSet.of(RepositoryFilePermission.READ));
                times = 1;
            }
        };
    }

    @Test
    @SuppressWarnings({ "checkstyle:onestatementperline",
            "multiple statements help understand the mock definition" })
    public void testContentRelatedMethods(@mockit.Mocked final RepositoryFile mockRepoFile,
            @mockit.Mocked final IAclNodeHelper mockAclHelper,
            @mockit.Mocked final IUnifiedRepository mockUnifiedRepository,
            @mockit.Mocked final SimpleRepositoryFileData mockFileData) throws FileSystemException {
        String fileRef = "/etc/mondrian/SteelWheels/schema.xml";
        new mockit.NonStrictExpectations() {
            //CHECKSTYLE IGNORE check FOR NEXT 6 LINES
            {
                mockUnifiedRepository.getFile(anyString);
                result = mockRepoFile;
                mockUnifiedRepository.getDataForRead((Serializable) any, (Class) any);
                result = mockFileData;
                mockAclHelper.canAccess(mockRepoFile, EnumSet.of(RepositoryFilePermission.READ));
                result = true;
                mockFileData.getStream();
                result = new ByteArrayInputStream("some string".getBytes());
            }
        };
        Deencapsulation.setField(SolutionRepositoryVfsFileObject.class, "repository", mockUnifiedRepository);
        SolutionRepositoryVfsFileObject solutionRepositoryVfsFileObject = new SolutionRepositoryVfsFileObject(
                fileRef);
        Deencapsulation.setField(solutionRepositoryVfsFileObject, "aclHelper", mockAclHelper);
        FileContent someFileContent = solutionRepositoryVfsFileObject.getContent();
        assertThat(someFileContent, is(notNullValue()));
        assertThat(solutionRepositoryVfsFileObject.isContentOpen(), is(false));
        someFileContent.getInputStream();
        assertThat(solutionRepositoryVfsFileObject.isContentOpen(), is(true));
        someFileContent.close();
        assertThat(solutionRepositoryVfsFileObject.isContentOpen(), is(false));

        someFileContent = solutionRepositoryVfsFileObject.getContent();
        someFileContent.getInputStream();
        assertThat(solutionRepositoryVfsFileObject.isContentOpen(), is(true));
        solutionRepositoryVfsFileObject.close();
        assertThat(solutionRepositoryVfsFileObject.isContentOpen(), is(false));
    }
}