package gov.samhsa.acs.common.tool;
import static gov.samhsa.consent2share.commonunit.xml.XmlComparator.compareXMLs;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import gov.samhsa.acs.common.param.Params;
import gov.samhsa.acs.common.param.ParamsBuilder;
import gov.samhsa.acs.common.tool.exception.SimpleMarshallerException;
import gov.samhsa.acs.common.util.StringURIResolver;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import javax.xml.transform.Source;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
@RunWith(MockitoJUnitRunner.class)
public class XmlTransformerImplTest {
private static final String URI_RESOLVER_HREF_RULE_EXECUTION_RESPONSE_CONTAINER = "ruleExecutionResponseContainer";
private static final String PARAM_NAME_XDS_DOCUMENT_ENTRY_UNIQUE_ID = "xdsDocumentEntryUniqueId";
private static final String PARAM_NAME_PRIVACY_POLICIES_EXTERNAL_DOC_URL = "privacyPoliciesExternalDocUrl";
private static final String PARAM_NAME_PURPOSE_OF_USE = "purposeOfUse";
private static final String PARAM_NAME_INTENDED_RECIPIENT = "intendedRecipient";
private static final String PARAM_NAME_AUTHOR_TELECOMMUNICATION = "authorTelecommunication";
final String senderEmailAddress = "senderEmailAddress";
final String recipientEmailAddress = "recipientEmailAddress";
final String purposeOfUse = "purposeOfUse";
final String messageId = "messageId";
final String xdsDocumentEntryUniqueId = "xdsDocumentEntryUniqueId";
final String ruleExecutionResponseContainer = "<ruleExecutionContainer><executionResponseList><executionResponse><c32SectionLoincCode>11450-4</c32SectionLoincCode><code>66214007</code><codeSystem>2.16.840.1.113883.6.96</codeSystem><displayName>Substance Abuse Disorder</displayName><documentObligationPolicy>ENCRYPT</documentObligationPolicy><documentRefrainPolicy>NODSCLCD</documentRefrainPolicy><impliedConfSection>R</impliedConfSection><observationId>e11275e7-67ae-11db-bd13-0800200c9a66b827vs52h7</observationId><sensitivity>ETH</sensitivity><USPrivacyLaw>42CFRPart2</USPrivacyLaw></executionResponse><executionResponse><c32SectionLoincCode>11450-4</c32SectionLoincCode><code>111880001</code><codeSystem>2.16.840.1.113883.6.96</codeSystem><displayName>Acute HIV</displayName><documentObligationPolicy>ENCRYPT</documentObligationPolicy><documentRefrainPolicy>NODSCLCD</documentRefrainPolicy><impliedConfSection>V</impliedConfSection><observationId>d11275e7-67ae-11db-bd13-0800200c9a66</observationId><sensitivity>HIV</sensitivity><USPrivacyLaw>42CFRPart2</USPrivacyLaw></executionResponse></executionResponseList></ruleExecutionContainer>";
final Optional<Params> params = Optional.of(ParamsBuilder
.withParam(PARAM_NAME_AUTHOR_TELECOMMUNICATION, senderEmailAddress)
.and(PARAM_NAME_INTENDED_RECIPIENT, recipientEmailAddress)
.and(PARAM_NAME_PURPOSE_OF_USE, purposeOfUse)
.and(PARAM_NAME_PRIVACY_POLICIES_EXTERNAL_DOC_URL, messageId)
.and(PARAM_NAME_XDS_DOCUMENT_ENTRY_UNIQUE_ID,
xdsDocumentEntryUniqueId));
final Optional<URIResolver> uriResolver = Optional
.of(new StringURIResolver().put(
URI_RESOLVER_HREF_RULE_EXECUTION_RESPONSE_CONTAINER,
ruleExecutionResponseContainer));
private final List<String> ignoreList = Arrays
.asList(addSlashes("/SubmitObjectsRequest[1]/RegistryObjectList[1]/ExtrinsicObject[1]/Slot[1]/ValueList[1]/Value[1]"),
addSlashes("/SubmitObjectsRequest[1]/RegistryObjectList[1]/RegistryPackage[1]/Slot[1]/ValueList[1]/Value[1]"));
private final FileReader fileReader = new FileReaderImpl();
private final DocumentXmlConverter documentXmlConverter = new DocumentXmlConverterImpl();
@Rule
public ExpectedException thrown = ExpectedException.none();
@Mock
private SimpleMarshaller marshaller;
@InjectMocks
private XmlTransformerImpl sut;
private final String xslName = "AdditonalMetadataStylesheetForProcessedC32.xsl";
private final String docName = "c32.xml";
private final String docNameTransformed = "c32Transformed.xml";
private String doc;
private String docTransformed;
private final String xslUrl = Thread.currentThread()
.getContextClassLoader().getResource(xslName).toString();
@Before
public void setUp() throws Exception {
doc = fileReader.readFile(docName);
docTransformed = fileReader.readFile(docNameTransformed);
}
@After
public void tearDown() throws Exception {
}
@Test
public void testTransformDocumentSourceOptionalOfParamsOptionalOfURIResolver()
throws SAXException, IOException {
// Arrange
final Document xmlDocument = documentXmlConverter.loadDocument(doc);
final StreamSource xslSource = new StreamSource(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(xslName));
// Act
final String actualOutput = sut.transform(xmlDocument, xslSource,
params, uriResolver);
// Assert
assertTrue(compareXMLs(docTransformed, actualOutput, ignoreList)
.similar());
}
@Test
public void testTransformDocumentStringOptionalOfParamsOptionalOfURIResolver() {
// Arrange
final Document xmlDocument = documentXmlConverter.loadDocument(doc);
final String xslFileName = xslUrl;
// Act
final String actualOutput = sut.transform(xmlDocument, xslFileName,
params, uriResolver);
// Assert
assertTrue(compareXMLs(docTransformed, actualOutput, ignoreList)
.similar());
}
@Test
public void testTransformObjectStringOptionalOfParamsOptionalOfURIResolver()
throws SimpleMarshallerException, UnsupportedEncodingException {
// Arrange
final Object obj = mock(Object.class);
final ByteArrayOutputStream byteArrayOutputStream = mock(ByteArrayOutputStream.class);
when(marshaller.marshalAsByteArrayOutputStream(obj)).thenReturn(
byteArrayOutputStream);
when(byteArrayOutputStream.toByteArray()).thenReturn(
doc.getBytes("UTF-8"));
final String xslFileName = xslUrl;
// Act
final String actualOutput = sut.transform(obj, xslFileName, params,
uriResolver);
// Assert
assertTrue(compareXMLs(docTransformed, actualOutput, ignoreList)
.similar());
}
@Test
public void testTransformSourceSourceOptionalOfParamsOptionalOfURIResolver()
throws UnsupportedEncodingException {
// Arrange
final Source xmlSource = new StreamSource(new ByteArrayInputStream(
doc.getBytes("UTF-8")));
final Source xslSource = new StreamSource(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(xslName));
// Act
final String actualOutput = sut.transform(xmlSource, xslSource, params,
uriResolver);
// Assert
assertTrue(compareXMLs(docTransformed, actualOutput, ignoreList)
.similar());
}
@Test
public void testTransformStringStringOptionalOfParamsOptionalOfURIResolver() {
// Act
final String actualOutput = sut.transform(doc, xslUrl, params,
uriResolver);
// Assert
assertTrue(compareXMLs(docTransformed, actualOutput, ignoreList)
.similar());
}
private String addSlashes(String xpath) {
return xpath.replace("[", "\\[").replace("]", "\\]");
}
}