/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.content.packager;
import org.apache.log4j.Logger;
import org.dspace.AbstractUnitTest;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.MetadataSchema;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.*;
import org.dspace.core.Context;
import org.dspace.eperson.Group;
import org.dspace.eperson.factory.EPersonServiceFactory;
import org.dspace.eperson.service.GroupService;
import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.handle.service.HandleService;
import org.junit.*;
import java.sql.SQLException;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;
/**
* @author Andrea Schweer schweer@waikato.ac.nz
* for the University of Waikato's Institutional Research Repositories
*/
public class PackageUtilsTest extends AbstractUnitTest
{
private static final Logger log = Logger.getLogger(PackageUtilsTest.class);
protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected ItemService itemService = ContentServiceFactory.getInstance().getItemService();
protected WorkspaceItemService workspaceItemService = ContentServiceFactory.getInstance().getWorkspaceItemService();
protected InstallItemService installItemService = ContentServiceFactory.getInstance().getInstallItemService();
protected HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
/** Handles for Test objects initialized in setUpClass() and used in various tests below **/
private static String topCommunityHandle = null;
private static String testCollectionHandle = null;
/**
* This method will be run during class initialization. It will initialize
* shared resources required for all the tests. It is only run once.
*
* Other methods can be annotated with @Before here or in subclasses
* but no execution order is guaranteed
*/
@BeforeClass
public static void setUpClass()
{
try
{
Context context = new Context();
// Create a dummy Community hierarchy to test with
// Turn off authorization temporarily to create some test objects.
context.turnOffAuthorisationSystem();
CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
log.info("setUpClass() - CREATE TEST HIERARCHY");
// Create a hierachy of sub-Communities and Collections
// which looks like this:
// "Top Community"
// - "Child Community"
// - "Grandchild Collection"
//
Community topCommunity = communityService.create(null, context);
communityService.addMetadata(context, topCommunity, MetadataSchema.DC_SCHEMA, "title", null, null, "Top Community");
communityService.update(context, topCommunity);
topCommunityHandle = topCommunity.getHandle();
Community child = communityService.createSubcommunity(context, topCommunity);
communityService.addMetadata(context, child, MetadataSchema.DC_SCHEMA, "title", null, null, "Child Community");
communityService.update(context, child);
// Create our primary Test Collection
Collection grandchildCol = collectionService.create(context, child);
collectionService.addMetadata(context, grandchildCol, "dc", "title", null, null, "Grandchild Collection");
collectionService.update(context, grandchildCol);
testCollectionHandle = grandchildCol.getHandle();
// Commit these changes to our DB
context.restoreAuthSystemState();
context.complete();
}
catch (AuthorizeException ex)
{
log.error("Authorization Error in setUpClass()", ex);
fail("Authorization Error in setUpClass(): " + ex.getMessage());
}
catch (SQLException ex)
{
log.error("SQL Error in setUpClass()", ex);
fail("SQL Error in setUpClass(): " + ex.getMessage());
}
}
/**
* This method will be run once at the very end
*/
@AfterClass
public static void tearDownClass()
{
try
{
Context context = new Context();
CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
Community topCommunity = (Community) handleService.resolveToObject(context, topCommunityHandle);
// Delete top level test community and test hierarchy under it
if(topCommunity!=null)
{
log.info("tearDownClass() - DESTROY TEST HIERARCHY");
context.turnOffAuthorisationSystem();
communityService.delete(context, topCommunity);
context.restoreAuthSystemState();
context.complete();
}
if(context.isValid())
context.abort();
}
catch (Exception ex)
{
log.error("Error in tearDownClass()", ex);
}
}
/**
* Pass through initialisation; turn off authorisation
*/
@Before
@Override
public void init()
{
// call init() from AbstractUnitTest to initialize testing framework
super.init();
context.turnOffAuthorisationSystem();
}
@Test
public void testCrosswalkGroupNameWithoutUnderscore() throws Exception
{
Collection testCollection = (Collection) handleService.resolveToObject(context, testCollectionHandle);
Group originalFirstStepWorkflowGroup = testCollection.getWorkflowStep1();
GroupService groupService = EPersonServiceFactory.getInstance().getGroupService();
Group testGroup = groupService.create(context);
groupService.setName(testGroup, "TESTGROUP");
testCollection.setWorkflowGroup(1, testGroup);
String exportName = PackageUtils.translateGroupNameForExport(context,
testGroup.getName());
assertEquals("Group name without underscore unchanged by translation for export", testGroup.getName(), exportName);
String importName = PackageUtils.translateGroupNameForImport(context, exportName);
assertEquals("Exported Group name without underscore unchanged by translation for import", exportName, importName);
testCollection.setWorkflowGroup(1, originalFirstStepWorkflowGroup);
}
@Test
public void testCrosswalkGroupNameUnderscoresNoDSO() throws Exception
{
Collection testCollection = (Collection) handleService.resolveToObject(context, testCollectionHandle);
Group originalFirstStepWorkflowGroup = testCollection.getWorkflowStep1();
GroupService groupService = EPersonServiceFactory.getInstance().getGroupService();
Group testGroup = groupService.create(context);
groupService.setName(testGroup, "TESTGROUP_ABC_TEST");
testCollection.setWorkflowGroup(1, testGroup);
String exportName = PackageUtils.translateGroupNameForExport(context,
testGroup.getName());
assertEquals("Group name with underscores but no DSO unchanged by translation for export", testGroup.getName(), exportName);
String importName = PackageUtils.translateGroupNameForImport(context, exportName);
assertEquals("Exported Group name with underscores but no DSO unchanged by translation for import", exportName, importName);
testCollection.setWorkflowGroup(1, originalFirstStepWorkflowGroup);
}
@Test
public void testCrosswalkGroupNameUnderscoresAndDSO() throws Exception
{
Collection testCollection = (Collection) handleService.resolveToObject(context, testCollectionHandle);
Group originalFirstStepWorkflowGroup = testCollection.getWorkflowStep1();
Group group = collectionService.createWorkflowGroup(context, testCollection, 1);
String exportName = PackageUtils.translateGroupNameForExport(context,
group.getName());
assertNotEquals("Exported group name should differ from original", group.getName(), exportName);
assertThat("Exported group name should contain '_hdl:' substring", exportName, containsString("_hdl:"));
String importName = PackageUtils.translateGroupNameForImport(context, exportName);
assertEquals("Exported Group name with dso unchanged by roundtrip translation for export/import", group.getName(), importName);
testCollection.setWorkflowGroup(1, originalFirstStepWorkflowGroup);
}
@After
@Override
public void destroy() {
context.abort();
context.restoreAuthSystemState();
super.destroy();
}
}