/**
* Copyright 2008 The University of North Carolina at Chapel Hill
*
* 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 edu.unc.lib.dl.cdr.sword.managers;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.Test;
import org.swordapp.server.AuthCredentials;
import org.swordapp.server.DepositReceipt;
import org.swordapp.server.SwordAuthException;
import org.swordapp.server.SwordError;
import edu.unc.lib.dl.acl.service.AccessControlService;
import edu.unc.lib.dl.acl.util.AccessGroupSet;
import edu.unc.lib.dl.acl.util.GroupsThreadStore;
import edu.unc.lib.dl.acl.util.ObjectAccessControlsBean;
import edu.unc.lib.dl.acl.util.Permission;
import edu.unc.lib.dl.cdr.sword.server.SwordConfigurationImpl;
import edu.unc.lib.dl.cdr.sword.server.managers.ContainerManagerImpl;
import edu.unc.lib.dl.cdr.sword.server.util.DepositReportingUtil;
import edu.unc.lib.dl.fedora.AccessClient;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.fedora.types.MIMETypedStream;
import edu.unc.lib.dl.util.ContentModelHelper;
import edu.unc.lib.dl.util.TripleStoreQueryService;
public class ContainerManagerTest extends Assert {
private SwordConfigurationImpl config;
public ContainerManagerTest(){
config = new SwordConfigurationImpl();
config.setBasePath("http://localhost");
config.setSwordPath("http://localhost/sword");
config.setAdminDepositor("admin");
}
@Test
public void getEntryCredentials() throws Exception {
DepositReceipt resultReceipt = mock(DepositReceipt.class);
DepositReportingUtil depositReportingUtil = mock(DepositReportingUtil.class);
when(depositReportingUtil.retrieveDepositReceipt(any(PID.class), any(SwordConfigurationImpl.class))).thenReturn(resultReceipt);
PID pid = new PID("uuid:test");
TripleStoreQueryService tripleStoreQueryService = mock(TripleStoreQueryService.class);
Map<String,String> disseminations = new HashMap<String,String>();
disseminations.put(pid.getURI() + "/" + ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName(), "text/xml");
disseminations.put(pid.getURI() + "/" + ContentModelHelper.Datastream.DATA_FILE.getName(), "image/jpg");
when(tripleStoreQueryService.fetchDisseminatorMimetypes(any(PID.class))).thenReturn(disseminations);
File modsFile = new File("src/test/resources/modsDocument.xml");
byte[] modsBytes = FileUtils.readFileToByteArray(modsFile);
MIMETypedStream mimeStream = new MIMETypedStream();
mimeStream.setStream(modsBytes);
GroupsThreadStore.storeGroups(new AccessGroupSet());
AccessControlService aclService = mock(AccessControlService.class);
ObjectAccessControlsBean objectACLs = mock(ObjectAccessControlsBean.class);
when(objectACLs.hasPermission(any(AccessGroupSet.class), any(Permission.class))).thenReturn(true);
when(aclService.getObjectAccessControls(any(PID.class))).thenReturn(objectACLs);
AccessClient accessClient = mock(AccessClient.class);
when(accessClient.getDatastreamDissemination(any(PID.class), eq(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()), anyString())).thenReturn(mimeStream);
ContainerManagerImpl containerManager = new ContainerManagerImpl();
containerManager.setDepositReportingUtil(depositReportingUtil);
containerManager.setTripleStoreQueryService(tripleStoreQueryService);
containerManager.setAccessClient(accessClient);
containerManager.setAclService(aclService);
String editIRI = "http://localhost" + SwordConfigurationImpl.EDIT_PATH + "/" + pid.getPid();
AuthCredentials auth = new AuthCredentials("testuser", "", null);
// Check to make sure that not finding the user's onyen is not the end of the world
when(objectACLs.hasPermission(any(AccessGroupSet.class), any(Permission.class))).thenReturn(true);
try {
DepositReceipt receipt = containerManager.getEntry(editIRI, null, auth, config);
assertNotNull(receipt);
} catch (SwordAuthException e){
fail();
}
when(objectACLs.hasPermission(any(AccessGroupSet.class), any(Permission.class))).thenReturn(false);
try {
containerManager.getEntry(editIRI, null, auth, config);
fail();
} catch (SwordError e){
//pass
}
GroupsThreadStore.clearGroups();
}
}