org.dataconservancy.packaging.gui.presenter.impl.PackageGenerationPresenterImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.dataconservancy.packaging.gui.presenter.impl.PackageGenerationPresenterImplTest.java

Source

/*
 * Copyright 2014 Johns Hopkins University
 *
 * 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.dataconservancy.packaging.gui.presenter.impl;

import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;

import org.apache.commons.lang.StringUtils;
import org.dataconservancy.packaging.gui.BaseGuiTest;
import org.dataconservancy.packaging.gui.Controller;
import org.dataconservancy.packaging.gui.Errors.ErrorKey;
import org.dataconservancy.packaging.gui.view.HeaderView;
import org.dataconservancy.packaging.gui.view.PackageGenerationView;
import org.dataconservancy.packaging.gui.view.impl.HeaderViewImpl;
import org.dataconservancy.packaging.gui.view.impl.PackageGenerationViewImpl;
import org.dataconservancy.packaging.tool.api.Package;
import org.dataconservancy.packaging.tool.api.PackageGenerationService;
import org.dataconservancy.packaging.tool.impl.PackageImpl;
import org.dataconservancy.packaging.tool.model.*;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Tests for the package generation presenter implementations.
 * Tests that items are displayed correctly, packages generation success is handled correctly,
 * package generation errors are handled correctly.
 */
public class PackageGenerationPresenterImplTest extends BaseGuiTest {

    private PackageGenerationPresenterImpl presenter;
    private PackageGenerationView view;

    @Autowired
    private PackageGenerationService packageGenerationService;

    @Autowired
    private PackageGenerationParametersBuilder packageGenerationParamsBuilder;

    private boolean outputChooserShown;

    private File testFile = null;
    private File outputDirectory = null;
    private File fakePDFile = null;
    private Controller controller;

    @Rule
    public TemporaryFolder tmpfolder = new TemporaryFolder();

    @Before
    public void setup() throws IOException {

        outputChooserShown = false;
        fakePDFile = tmpfolder.newFile("faker.json");

        controller = new Controller() {
            @Override
            public void showHome(boolean clear) {
            }

            @Override
            public File showOpenFileDialog(FileChooser chooser) {
                return testFile;
            }

            @Override
            public File showOpenDirectoryDialog(DirectoryChooser chooser) {
                outputChooserShown = true;
                return outputDirectory;
            }

            @Override
            public PackageDescription getPackageDescription() {
                return new PackageDescription();
            }

            @Override
            public File getPackageDescriptionFile() {
                return fakePDFile;
            }
        };

        PackageDescriptionBuilder builder = new PackageDescriptionBuilder() {

            @Override
            public void serialize(PackageDescription packageDescription, OutputStream outputStream)
                    throws PackageToolException {

            }

            @Override
            public PackageDescription deserialize(InputStream inputStream) throws PackageToolException {
                return new PackageDescription();
            }
        };

        controller.setFactory(factory);
        factory.setController(controller);

        controller.setPackageFilenameIllegalCharacters(
                factory.getConfiguration().getPackageFilenameIllegalCharacters());

        // For this test, we want a new Presenter and view for each test so that the status message is checked properly
        view = new PackageGenerationViewImpl(labels);
        view.setHelp(help);

        HeaderView headerView = new HeaderViewImpl(labels);
        view.setHeaderView(headerView);

        presenter = new PackageGenerationPresenterImpl(view);
        presenter.setPackageGenerationService(packageGenerationService);
        presenter.setPackageGenerationParametersBuilder(packageGenerationParamsBuilder);
        presenter.setPackageDescriptionBuilder(builder);
        presenter.setMessages(messages);
        presenter.setErrors(errors);

        presenter.setController(controller);
    }

    /**
     * Ensure the presenter displays a node.
     */
    @Test
    public void testDisplay() {
        assertNotNull(presenter.display());
    }

    /**
     * Ensure that event handlers do the right thing.
     */
    @Test
    public void testEventHandlers() {

        assertFalse(outputChooserShown);
        view.getSelectOutputDirectoryButton().fire();
        assertTrue(outputChooserShown);
    }

    /**
     * Tests that the builders throwing an exception is handled correctly
     *
     * @throws IOException
     */
    @Test
    public void testBuilderExceptions() throws IOException {

        presenter.setPackageGenerationParametersBuilder(new PackageGenerationParametersBuilder() {

            @Override
            public PackageGenerationParameters buildParameters(InputStream in) throws ParametersBuildException {
                throw new ParametersBuildException("Bad params");
            }

            @Override
            public void buildParameters(PackageGenerationParameters params, OutputStream out)
                    throws ParametersBuildException {
            }

        });

        presenter.display();

        assertTrue(view.getStatusLabel().isVisible());
        assertEquals(errors.get(ErrorKey.PARAM_LOADING_ERROR), view.getStatusLabel().getText());
    }

    /**
     * Tests that errors thrown by the package generation service are correctly handled.
     *
     * @throws IOException
     */
    @Test
    public void testPackageGenerationError() throws IOException, InterruptedException {
        presenter.display();
        testFile = tmpfolder.newFile("test");

        presenter.setTestBackgroundService();
        presenter.setPackageGenerationParametersBuilder(new PackageGenerationParametersBuilder() {

            @Override
            public PackageGenerationParameters buildParameters(InputStream in) throws ParametersBuildException {
                return new PackageGenerationParameters();
            }

            @Override
            public void buildParameters(PackageGenerationParameters params, OutputStream out)
                    throws ParametersBuildException {
            }

        });

        presenter.setPackageGenerationService(new PackageGenerationService() {

            @Override
            public Package generatePackage(PackageDescription desc, PackageGenerationParameters params)
                    throws PackageToolException {
                throw new PackageToolException(PackagingToolReturnInfo.PKG_UNEXPECTED_PACKAGING_FORMAT);
            }

        });

        outputDirectory = new File("./");
        view.getPackageNameField().textProperty().setValue("tempfile");
        view.getSelectOutputDirectoryButton().fire();

        assertFalse(view.getStatusLabel().isVisible());

        view.getContinueButton().fire();

        assertTrue(view.getStatusLabel().isVisible());
        assertEquals(
                errors.get(ErrorKey.PACKAGE_GENERATION_CREATION_ERROR) + " "
                        + PackagingToolReturnInfo.PKG_UNEXPECTED_PACKAGING_FORMAT.stringMessage(),
                view.getStatusLabel().getText());
    }

    /**
     * Tests that a successful package generation results in the correct message.
     *
     * @throws IOException
     */
    @Test
    public void testSuccessfulPackageGeneration() throws IOException, InterruptedException {
        //Check if what will become the package file already exists and if so delete it, this prevents the overwrite popup from appearing.
        File createdFile = new File("./thePackage.tar.gz");
        if (createdFile.exists()) {
            createdFile.delete();
        }

        testFile = tmpfolder.newFile("test");

        PrintWriter fileOut = new PrintWriter(testFile);

        fileOut.println("foo");
        fileOut.close();

        final Package pkg = new PackageImpl(testFile, "thePackage", null);

        final PackageGenerationParameters pkgParams = new PackageGenerationParameters();
        pkgParams.addParam(GeneralParameterNames.PACKAGE_NAME, "thePackage");
        pkgParams.addParam(GeneralParameterNames.ARCHIVING_FORMAT, "tar");
        pkgParams.addParam(GeneralParameterNames.COMPRESSION_FORMAT, "gz");
        pkgParams.addParam(BagItParameterNames.PKG_BAG_DIR, "./thePackage.tar.gz");

        presenter.setTestBackgroundService();

        presenter.setPackageGenerationParametersBuilder(new PackageGenerationParametersBuilder() {

            @Override
            public PackageGenerationParameters buildParameters(InputStream in) throws ParametersBuildException {
                return pkgParams;
            }

            @Override
            public void buildParameters(PackageGenerationParameters params, OutputStream out)
                    throws ParametersBuildException {
            }

        });

        presenter.setPackageGenerationService(new PackageGenerationService() {

            @Override
            public Package generatePackage(PackageDescription desc, PackageGenerationParameters params)
                    throws PackageToolException {
                return pkg;
            }

        });
        presenter.display();

        outputDirectory = new File("./");

        view.getPackageNameField().setText("thePackage");
        view.getStatusLabel().setVisible(false);
        view.getSelectOutputDirectoryButton().fire();

        view.getContinueButton().fire();

        assertTrue(createdFile.exists());
        assertFalse(view.getStatusLabel().isVisible());

        //Clean up the newly created file
        if (!createdFile.delete()) {
            createdFile.deleteOnExit();
        }
    }

    @Test
    public void testEmptyOutputDirectoryProducesEmptyOutputFile() {
        outputDirectory = null;
        view.getPackageNameField().setText("fake");

        assertTrue(view.getCurrentOutputDirectoryTextField().getText().isEmpty());
    }

    @Test
    public void testEmptyPackageNameProducesEmptyOutputFile() {
        presenter.display();

        outputDirectory = new File("./");
        view.getSelectOutputDirectoryButton().fire();
        view.getPackageNameField().setText("");

        assertTrue(view.getCurrentOutputDirectoryTextField().getText().isEmpty());
    }

    @Test
    public void testOutputFileExistsIfPackageNameAndDirectoryValid() {
        presenter.display();

        view.getPackageNameField().setText("fakefile");
        outputDirectory = new File("./");
        view.getSelectOutputDirectoryButton().fire();

        assertFalse(view.getCurrentOutputDirectoryTextField().getText().isEmpty());
        assertTrue(view.getCurrentOutputDirectoryTextField().getText().endsWith("fakefile.tar.gz"));
    }

    @Test
    public void testIllegalCharactersAreNotAllowedInPackage() {
        presenter.display();

        view.getPackageNameField().setText("fake*file");
        outputDirectory = new File("./");
        view.getSelectOutputDirectoryButton().fire();

        assertTrue(view.getCurrentOutputDirectoryTextField().getText().isEmpty());
        assertTrue(view.getStatusLabel().isVisible());
        assertTrue(view.getStatusLabel().getText()
                .startsWith(errors.get(ErrorKey.PACKAGE_FILENAME_HAS_ILLEGAL_CHARACTERS)));
    }

    @Test
    public void testLongFilenameShowsWarning() {
        presenter.display();

        view.getPackageNameField().setText(StringUtils.rightPad("fakepackage", 300, "xyz"));
        outputDirectory = new File("/tmp");
        view.getSelectOutputDirectoryButton().fire();

        assertFalse(view.getCurrentOutputDirectoryTextField().getText().isEmpty());
        assertTrue(view.getStatusLabel().isVisible());

        assertEquals(
                messages.formatFilenameLengthWarning(view.getCurrentOutputDirectoryTextField().getText().length()),
                view.getStatusLabel().getText());
    }
}