org.ambraproject.admin.action.ManageVirtualJournalsActionTest.java Source code

Java tutorial

Introduction

Here is the source code for org.ambraproject.admin.action.ManageVirtualJournalsActionTest.java

Source

/*
 * $HeadURL$
 * $Id$
 * Copyright (c) 2006-2012 by Public Library of Science http://plos.org http://ambraproject.org
 * 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.0Unless 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.ambraproject.admin.action;

import com.opensymphony.xwork2.Action;
import org.ambraproject.action.BaseActionSupport;
import org.ambraproject.admin.AdminWebTest;
import org.ambraproject.models.Issue;
import org.ambraproject.models.Journal;
import org.ambraproject.models.Volume;
import org.ambraproject.web.VirtualJournalContext;
import org.apache.commons.lang.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;

/**
 * @author Alex Kudlick 1/30/12
 */
public class ManageVirtualJournalsActionTest extends AdminWebTest {

    @Autowired
    protected ManageVirtualJournalsAction action;

    @DataProvider(name = "basicInfo")
    public Object[][] getCurrentIssueAndVolumes() {
        Journal journal = new Journal();
        journal.setJournalKey("journalForTestManageJournals");
        journal.seteIssn("fakeEIssn");
        journal.setVolumes(new ArrayList<Volume>(3));

        Issue currentIssue = new Issue();
        currentIssue.setIssueUri("id:current-issue-for-test-volume");
        dummyDataStore.store(currentIssue);
        journal.setCurrentIssue(dummyDataStore.get(Issue.class, currentIssue.getID()));

        for (int i = 1; i <= 3; i++) {
            Volume volume = new Volume();
            volume.setDisplayName("200" + i);
            volume.setVolumeUri("id:fake-volume-for-manage-journals" + i);
            dummyDataStore.store(volume);
            journal.getVolumes().add(dummyDataStore.get(Volume.class, volume.getID()));
        }

        dummyDataStore.store(journal);

        return new Object[][] { { journal, currentIssue.getIssueUri() } };
    }

    @Test(dataProvider = "basicInfo")
    public void testExecute(Journal journal, String currentIssue) throws Exception {
        Map<String, Object> request = getDefaultRequestAttributes();
        request.put(VirtualJournalContext.PUB_VIRTUALJOURNAL_CONTEXT, makeVirtualJournalContext(journal));
        action.setRequest(request);

        String result = action.execute();
        assertEquals(result, Action.SUCCESS, "action didn't return success");

        assertEquals(action.getActionMessages().size(), 0, "Action returned messages on default execute");
        assertEquals(action.getActionErrors().size(), 0, "Action returned error messages");

        assertEquals(action.getJournal().getCurrentIssue().getIssueUri(), currentIssue,
                "action didn't get correct issue");
        assertEquals(action.getVolumes().size(), journal.getVolumes().size(),
                "Action returned incorrect number of volumes");
        for (int i = 0; i < journal.getVolumes().size(); i++) {
            Volume actual = action.getVolumes().get(i);
            Volume expected = journal.getVolumes().get(i);
            assertEquals(actual.getVolumeUri(), expected.getVolumeUri(),
                    "Volume " + (i + 1) + " didn't have correct uri");
            assertEquals(actual.getDisplayName(), expected.getDisplayName(),
                    "Volume " + (i + 1) + " didn't have correct display name");
        }
    }

    @Test(dataProvider = "basicInfo", dependsOnMethods = { "testExecute" }, alwaysRun = true)
    public void testCreateVolume(Journal journal, String currentIssue) throws Exception {
        int initialNumberOfVolumes = dummyDataStore.get(Journal.class, journal.getID()).getVolumes().size();
        String volumeUri = "id:new-volume-for-create-volume";
        String volumeDisplayName = "That Still Small Voice";
        //set properties on the action
        Map<String, Object> request = getDefaultRequestAttributes();
        request.put(VirtualJournalContext.PUB_VIRTUALJOURNAL_CONTEXT, makeVirtualJournalContext(journal));
        action.setRequest(request);
        action.setCommand("CREATE_VOLUME");
        action.setVolumeURI(volumeUri);
        action.setDisplayName(volumeDisplayName);

        //run the action
        String result = action.execute();
        assertEquals(result, Action.SUCCESS, "action didn't return success");
        assertEquals(action.getActionMessages().size(), 1, "Action didn't return message indicating success");
        assertEquals(action.getActionErrors().size(), 0, "Action returned error messages");

        //check action's return values
        assertEquals(action.getVolumes().size(), initialNumberOfVolumes + 1,
                "action didn't add new volume to list");
        Volume actualVolume = action.getVolumes().get(action.getVolumes().size() - 1);
        assertEquals(actualVolume.getVolumeUri(), volumeUri, "Volume didn't have correct uri");
        assertEquals(actualVolume.getDisplayName(), volumeDisplayName, "Volume didn't have correct id");

        assertTrue(action.getActionMessages().size() > 0, "Action didn't return a message indicating success");
        assertEquals(action.getActionErrors().size(), 0, "Action returned error messages");

        //check values stored to the database
        Journal storedJournal = dummyDataStore.get(Journal.class, journal.getID());
        assertEquals(storedJournal.getVolumes().size(), initialNumberOfVolumes + 1,
                "journal didn't get volume added in the database");

        assertEquals(storedJournal.getVolumes().get(storedJournal.getVolumes().size() - 1).getVolumeUri(),
                volumeUri, "Journal didn't have volume added in the db");

        //try creating a duplicate volume and see if we get an error message
        action.execute();
        assertEquals(action.getActionErrors().size(), 1,
                "action didn't add error when trying to save duplicate volume");
    }

    @Test(dataProvider = "basicInfo", dependsOnMethods = { "testExecute" }, alwaysRun = true)
    public void testRemoveVolumes(Journal journal, String currentIssue) throws Exception {
        List<Volume> initialVolumes = dummyDataStore.get(Journal.class, journal.getID()).getVolumes();

        String[] urisToDelte = new String[] { initialVolumes.get(0).getVolumeUri(),
                initialVolumes.get(2).getVolumeUri() };
        List<Volume> volumesToDelete = new ArrayList<Volume>(urisToDelte.length);
        for (Volume volume : initialVolumes) {
            if (ArrayUtils.indexOf(urisToDelte, volume.getVolumeUri()) != -1) {
                volumesToDelete.add(volume);
            }
        }

        Map<String, Object> request = getDefaultRequestAttributes();
        request.put(VirtualJournalContext.PUB_VIRTUALJOURNAL_CONTEXT, makeVirtualJournalContext(journal));
        action.setRequest(request);
        action.setCommand("REMOVE_VOLUMES");
        action.setVolsToDelete(urisToDelte);

        String result = action.execute();
        assertEquals(result, Action.SUCCESS, "action didn't return success");
        assertEquals(action.getActionMessages().size(), 1, "Action didn't return message indicating success");
        assertEquals(action.getActionErrors().size(), 0, "Action returned error messages");

        //check the return values on the action
        assertEquals(action.getVolumes().size(), initialVolumes.size() - 2, "action didn't remove volumes");
        assertTrue(action.getActionMessages().size() > 0, "Action didn't add message for deleting volumes");
        assertEquals(action.getActionErrors().size(), 0, "Action returned error messages");

        List<Volume> storedVolumes = dummyDataStore.get(Journal.class, journal.getID()).getVolumes();
        for (Volume deletedVolume : volumesToDelete) {
            assertFalse(storedVolumes.contains(deletedVolume),
                    "Volume " + deletedVolume + " didn't get removed from journal");
            assertNull(dummyDataStore.get(Volume.class, deletedVolume.getID()),
                    "Volume didn't get removed from the database");
        }
    }

    @Test(dataProvider = "basicInfo", dependsOnMethods = { "testExecute" }, alwaysRun = true)
    public void testSetCurrentIssue(Journal journal, String ignored) throws Exception {
        Issue currentIssue = new Issue("id:new-issue-uri-to-set");
        dummyDataStore.store(currentIssue);

        Map<String, Object> request = getDefaultRequestAttributes();
        request.put(VirtualJournalContext.PUB_VIRTUALJOURNAL_CONTEXT, makeVirtualJournalContext(journal));
        action.setRequest(request);
        action.setCommand("UPDATE_ISSUE");
        action.setCurrentIssueURI(currentIssue.getIssueUri());

        String result = action.execute();
        assertEquals(result, Action.SUCCESS, "action didn't return success");
        assertTrue(action.getActionErrors().size() == 0, "action returned error messages");
        assertTrue(action.getActionMessages().size() > 0, "action didn't return a message indicating success");

        assertEquals(action.getJournal().getCurrentIssue().getIssueUri(), currentIssue.getIssueUri(),
                "action didn't have correct issue uri");

        String storedIssueUri = dummyDataStore.get(Journal.class, journal.getID()).getCurrentIssue().getIssueUri();

        assertEquals(storedIssueUri, currentIssue.getIssueUri(), "issue uri didn't get stored to the database");

    }

    private VirtualJournalContext makeVirtualJournalContext(Journal journal) {
        return new VirtualJournalContext(journal.getJournalKey(), "dfltJournal", "http", 80, "localhost",
                "ambra-webapp", new ArrayList<String>());
    }

    @Override
    protected BaseActionSupport getAction() {
        return action;
    }
}