/* The contents of this file are subject to the license and copyright terms * detailed in the license directory at the root of the source tree (also * available online at http://fedora-commons.org/license/). */ package fedora.server.storage.translation; import java.util.HashMap; import java.util.Map; import javax.xml.transform.TransformerException; import org.custommonkey.xmlunit.NamespaceContext; import org.custommonkey.xmlunit.SimpleNamespaceContext; import org.custommonkey.xmlunit.XMLUnit; import org.custommonkey.xmlunit.exceptions.XpathException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import fedora.server.storage.types.DatastreamReferencedContent; import fedora.server.storage.types.DatastreamXMLMetadata; import fedora.server.storage.types.DigitalObject; import static fedora.common.Constants.METS; import static fedora.common.Constants.XLINK; import static fedora.common.Models.FEDORA_OBJECT_3_0; /** * Common unit tests for METSFedoraExt serializers. * * @author Chris Wilper */ public abstract class TestMETSFedoraExtDOSerializer extends TestXMLDOSerializer { protected static final String ROOT_PATH = "/" + METS.METS.qName; protected static final String AMDSEC_PATH = ROOT_PATH + "/" + METS.AMD_SEC.qName; TestMETSFedoraExtDOSerializer(DOSerializer serializer) { super(serializer); } //--- // Setup/Teardown //--- @Before @Override public void setUp() { super.setUp(); Map<String, String> nsMap = new HashMap<String, String>(); nsMap.put(METS.prefix, METS.uri); NamespaceContext ctx = new SimpleNamespaceContext(nsMap); XMLUnit.setXpathNamespaceContext(ctx); } @Override @After public void tearDown() { XMLUnit.setXpathNamespaceContext(SimpleNamespaceContext.EMPTY_CONTEXT); } //--- // Tests //--- @Test public void testOBJIDAttribute() throws TransformerException, XpathException { DigitalObject obj = createTestObject(FEDORA_OBJECT_3_0); Document xml = doSerializeOrFail(obj); assertXpathExists(ROOT_PATH + "[@OBJID='" + TEST_PID + "']", xml); } //@Test /* FIXME: not sure how this one is supposed to work in METS... */ //public void testCommonFedoraObjectTypes() throws TransformerException { // DigitalObject obj; // Document xml; // obj = createTestObject(DigitalObject.FEDORA_OBJECT); // xml = doSerializeOrFail(obj); // assertXpathExists(ROOT_PATH + "[@TYPE='" + MODEL.DATA_OBJECT.localName // + "']", xml); // obj = createTestObject(DigitalObject.FEDORA_SERVICE_DEPLOYMENT_OBJECT); // xml = doSerializeOrFail(obj); // assertXpathExists(ROOT_PATH + "[@TYPE='" // + MODEL.SERVICE_DEPLOYMENT_OBJECT.localName + "']", xml); // obj = createTestObject(DigitalObject.FEDORA_SERVICE_DEFINITION_OBJECT); // xml = doSerializeOrFail(obj); // assertXpathExists(ROOT_PATH + "[@TYPE='" // + MODEL.SERVICE_DEFINITION_OBJECT.localName + "']", xml); //} @Test public void testNoDatastreams() throws TransformerException, XpathException { DigitalObject obj = createTestObject(FEDORA_OBJECT_3_0); Document xml = doSerializeOrFail(obj); /* rels-ext */ assertXpathEvaluatesTo("1", "count(" + AMDSEC_PATH + ")", xml); } @Test public void testTwoInlineDatastreams() throws TransformerException, XpathException { DigitalObject obj = createTestObject(FEDORA_OBJECT_3_0); final String dsID1 = "DS1"; DatastreamXMLMetadata ds1 = createXDatastream(dsID1); final String dsID2 = "DS2"; DatastreamXMLMetadata ds2 = createXDatastream(dsID2); obj.addDatastreamVersion(ds1, true); obj.addDatastreamVersion(ds2, true); Document xml = doSerializeOrFail(obj); /* ds1, ds2 + rels-ext */ assertXpathEvaluatesTo("3", "count(" + AMDSEC_PATH + ")", xml); } //--- // Instance Helpers //--- protected void doTestXLinkNamespace() throws TransformerException, XpathException { DigitalObject obj = createTestObject(FEDORA_OBJECT_3_0); final String url = "http://example.org/DS1"; DatastreamReferencedContent ds = createRDatastream("DS1", url); obj.addDatastreamVersion(ds, true); Document xml = doSerializeOrFail(obj); String xpath = ROOT_PATH + "/" + METS.FILE_SEC.qName + "/" + METS.FILE_GRP.qName + "[@ID='DATASTREAMS']" + "/" + METS.FILE_GRP.qName + "[@ID='DS1']" + "/" + METS.FILE.qName + "/" + METS.FLOCAT.qName + "[@" + XLINK.HREF.qName + "='" + url + "']"; assertXpathExists(xpath, xml); } }