package org.ambraproject.action.article;
import org.ambraproject.action.AmbraWebTest;
import org.ambraproject.action.BaseActionSupport;
import org.ambraproject.models.Article;
import org.ambraproject.models.Issue;
import org.ambraproject.models.Journal;
import org.ambraproject.models.Volume;
import org.ambraproject.views.IssueInfo;
import org.ambraproject.web.VirtualJournalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
/**
* @author Alex Kudlick 9/7/12
*/
public class BrowseIssueActionTest extends AmbraWebTest {
@Autowired
protected BrowseIssueAction action;
private final String journalKey = "BrowseIssueActionTestJournalKey";
@Override
protected BaseActionSupport getAction() {
return action;
}
@Override
protected void doModifyRequest(Map<String, Object> request) {
//set the current journal
VirtualJournalContext virtualJournalContext = new VirtualJournalContext(journalKey,
defaultJournal.getJournalKey(), "http", 80, "localhost", "/", Collections.EMPTY_LIST);
request.put(VirtualJournalContext.PUB_VIRTUALJOURNAL_CONTEXT, virtualJournalContext);
}
@DataProvider(name = "journal")
public Object[][] getJournal() {
Journal journal = new Journal(journalKey);
journal.setVolumes(new ArrayList<Volume>(3));
for (String volumeName : new String[] {"OldVolume", "NewVolume"}) {
Volume volume = new Volume("id:BrowseIssueAction" + volumeName);
volume.setTitle(volumeName);
volume.setDescription("A plane crash causes the firm to go after the account for the airline involved " +
"and drop the smaller airline they have an account with. Peggy pays a visit to her mother and sister, " +
"who are now guardians of a child.");
volume.setIssues(new ArrayList<Issue>(4));
for (int i = 1; i <= 3; i++) {
List<String> articleDOIs = Arrays.asList(
volumeName + "Issue" + i + "Article1",
volumeName + "Issue" + i + "Article2",
volumeName + "Issue" + i + "Article3"
);
for(String doi : articleDOIs) {
Article art = new Article();
art.setDoi(doi);
art.setState(0);
art.setTitle(doi);
dummyDataStore.store(art);
}
Issue issue = new Issue("id:" + volumeName + "Issue" + i);
issue.setTitle(volumeName + " Issue " + i);
issue.setDescription(volumeName + " Issue " + i);
issue.setArticleDois(articleDOIs);
volume.getIssues().add(issue);
}
journal.getVolumes().add(volume);
}
journal.setCurrentIssue(journal.getVolumes().get(1).getIssues().get(0));
Long id = Long.valueOf(dummyDataStore.store(journal));
return new Object[][]{
{dummyDataStore.get(Journal.class, id)}
};
}
@AfterMethod
public void clearIssue() {
action.setIssue(null);
}
@Test(dataProvider = "journal")
public void testBrowseCurrentIssue(Journal journal) throws Exception {
assertEquals(action.execute(), BaseActionSupport.SUCCESS, "Action didn't return success");
IssueInfo issueInfo = action.getIssueInfo();
assertNotNull(issueInfo, "action had null issue info");
assertEquals(issueInfo.getArticleUriList(), journal.getCurrentIssue().getArticleDois(),
"action's issue had incorrect article dois");
assertEquals(issueInfo.getIssueURI(), journal.getCurrentIssue().getIssueUri(),
"Action's issue had incorrect issue uri");
}
@Test(dataProvider = "journal")
public void testBrowseLatestIssueFromLatestVolume(Journal journal) {
//set journal to have a null currentIssue
Issue originalIssue = journal.getCurrentIssue();
journal.setCurrentIssue(null);
dummyDataStore.update(journal);
try {
assertEquals(action.execute(), BaseActionSupport.SUCCESS, "Action didn't return success");
IssueInfo issueInfo = action.getIssueInfo();
assertNotNull(issueInfo, "action had null issue info");
//Load up latest volume w/ dummy datastore to defeat lazy-loaded issues
Long volumeId = journal.getVolumes().get(journal.getVolumes().size() - 1).getID();
Volume latestVolume = dummyDataStore.get(Volume.class, volumeId);
Issue latestIssue = latestVolume.getIssues().get(latestVolume.getIssues().size() - 1);
assertEquals(issueInfo.getIssueURI(), latestIssue.getIssueUri(), "action had incorrect issue uri");
assertEquals(issueInfo.getDescription(), latestIssue.getDescription(), "action had incorrect issue description");
assertEquals(action.getVolumeInfo().getVolumeUri(), latestVolume.getVolumeUri(), "action had incorrect volume");
} finally {
//reset state
journal.setCurrentIssue(originalIssue);
dummyDataStore.update(journal);
}
}
}