package gov.samhsa.acs.xdsb.common;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import gov.samhsa.acs.common.tool.FileReaderImpl;
import gov.samhsa.acs.common.tool.SimpleMarshallerImpl;
import gov.samhsa.acs.common.tool.XmlTransformer;
import gov.samhsa.acs.common.tool.XmlTransformerImpl;
import java.io.IOException;
import java.util.LinkedList;
import oasis.names.tc.ebxml_regrep.xsd.lcm._3.SubmitObjectsRequest;
import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.xml.sax.SAXException;
public class XdsbMetadataGeneratorImplTest {
private final FileReaderImpl fileReader = new FileReaderImpl();
private final SimpleMarshallerImpl marshaller = new SimpleMarshallerImpl();
private final XmlTransformer xmlTransformer = new XmlTransformerImpl(
marshaller);
private XdsbMetadataGeneratorImpl sut;
@Test
public void printSpiritMetadata() throws IOException, SAXException {
// Arrange
initSpiritPrivacy();
final String policy = fileReader.readFile("XacmlConsentSample.xml");
final String expectedMetadata = fileReader
.readFile("XacmlConsentSampleResult.xml");
// Act
final String actualMetadata = sut.generateMetadataXml(policy, "haha",
null, null);
// Assert
final DetailedDiff diff = XmlComparator.compareXMLs(expectedMetadata,
actualMetadata, createIgnoreTime());
assertTrue(diff.similar());
}
@Test
public void testGenerateMetadata_CdaR2() throws Throwable {
initClinical();
final String metadataFileName = "unitTestMetaCdaR2Consent.xml";
testGenerateMetadata(metadataFileName);
}
@Test
public void testGenerateMetadata_RemC32() throws Throwable {
initClinical();
final String metadataFileName = "unitTestMetaRemC32.xml";
testGenerateMetadata(metadataFileName);
}
@Test
public void testGenerateMetadata_Xacml() throws Throwable {
initPrivacy();
final String metadataFileName = "unitTestMetaXacml.xml";
testGenerateMetadata(metadataFileName);
}
@Test
public void testGenerateMetadataXml_CdaR2() throws Throwable {
initClinical();
final String c32FileName = "cdaR2Consent.xml";
final String expectedMetadataFileName = "unitTestMetaCdaR2Consent.xml";
testGenerateMetadataXml(c32FileName, expectedMetadataFileName,
createIgnorableXPathRegexList());
}
@Test
public void testGenerateMetadataXml_RemC32() throws Throwable {
initClinical();
final String c32FileName = "remC32.xml";
final String expectedMetadataFileName = "unitTestMetaRemC32.xml";
testGenerateMetadataXml(c32FileName, expectedMetadataFileName,
createIgnorableXPathRegexList());
}
@Test
public void testGenerateMetadataXml_Xacml() throws Throwable {
initPrivacy();
final String c32FileName = "xacml_policy.xml";
final String expectedMetadataFileName = "unitTestMetaXacml.xml";
testGenerateMetadataXml(c32FileName, expectedMetadataFileName,
createIgnorableXPathRegexList());
}
private LinkedList<String> createIgnorableXPathRegexList() {
final LinkedList<String> ignorableXPathsRegex = new LinkedList<String>();
ignorableXPathsRegex
.add("\\/SubmitObjectsRequest\\[1\\]/RegistryObjectList\\[1\\]/ExtrinsicObject\\[1\\]/Slot\\[1\\]/ValueList\\[1\\]/Value\\[1\\]");
ignorableXPathsRegex
.add("\\/SubmitObjectsRequest\\[1\\]/RegistryObjectList\\[1\\]/ExtrinsicObject\\[1\\]/ExternalIdentifier\\[2\\]/@value");
ignorableXPathsRegex
.add("\\/SubmitObjectsRequest\\[1\\]/RegistryObjectList\\[1\\]/RegistryPackage\\[1\\]/Slot\\[1\\]/ValueList\\[1\\]/Value\\[1\\]");
ignorableXPathsRegex
.add("\\/SubmitObjectsRequest\\[1\\]/RegistryObjectList\\[1\\]/RegistryPackage\\[1\\]/ExternalIdentifier\\[1\\]/@value");
return ignorableXPathsRegex;
}
private LinkedList<String> createIgnoreTime() {
final LinkedList<String> ignorableXPathsRegex = new LinkedList<String>();
ignorableXPathsRegex.add("creationTime");
ignorableXPathsRegex.add("submissionTime");
return ignorableXPathsRegex;
}
private void initClinical() {
sut = new XdsbMetadataGeneratorImpl(new UniqueOidProviderImpl(),
XdsbDocumentType.CLINICAL_DOCUMENT, marshaller, xmlTransformer);
}
private void initPrivacy() {
sut = new XdsbMetadataGeneratorImpl(new UniqueOidProviderImpl(),
XdsbDocumentType.PRIVACY_CONSENT, marshaller, xmlTransformer);
}
private void initSpiritPrivacy() {
sut = new XdsbMetadataGeneratorImpl(new UniqueOidProviderImpl(),
XdsbDocumentType.SPIRIT_PRIVACY_CONSENT, marshaller,
xmlTransformer);
}
private void testGenerateMetadata(String metadataFileName)
throws IOException, Throwable, SAXException {
// Arrange
final String metadata = fileReader.readFile(metadataFileName);
final String documentMock = "documentMock";
final String homeCommunityIdMock = "homeCommunityIdMock";
sut = spy(sut);
doReturn(metadata).when(sut).generateMetadataXml(documentMock,
homeCommunityIdMock, null, null);
XMLUnit.setIgnoreWhitespace(true);
// Act
final SubmitObjectsRequest submitObjectsRequest = sut.generateMetadata(
documentMock, homeCommunityIdMock, null, null);
final String xml = marshaller.marshal(submitObjectsRequest);
// Assert
assertNotNull(submitObjectsRequest);
assertXMLEqual("", metadata, xml);
}
private void testGenerateMetadataXml(String fileName,
String expectedMetadataFileName,
LinkedList<String> ignorableXPathsRegex) throws IOException {
// Arrange
final String file = fileReader.readFile(fileName);
final String expectedMetadata = fileReader
.readFile(expectedMetadataFileName);
// Act
final String meta = sut.generateMetadataXml(file, "1.1.1.1.1", null,
null);
// Assert
final DetailedDiff diff = XmlComparator.compareXMLs(expectedMetadata,
meta, ignorableXPathsRegex);
assertTrue(diff.similar());
}
}