package gov.samhsa.acs.documentsegmentation.tools; import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import static org.junit.Assert.assertTrue; import gov.samhsa.acs.common.exception.DS4PException; 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 gov.samhsa.consent2share.commonunit.xml.XmlComparator; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.custommonkey.xmlunit.XMLUnit; import org.junit.BeforeClass; import org.junit.Test; import org.xml.sax.SAXException; public class DocumentFactModelExtractorImplTest { private static FileReaderImpl fileReader; private static String xacmlResult; private static final String SAMPLE_C32_LOCATION = "sampleC32/"; private static final String SAMPLE_OUTPUT_LOCATION = "sampleC32/output/"; private static DocumentFactModelExtractorImpl documentFactModelExtractor; private static XmlTransformer xmlTransformer; @Test public void testExtractFactModel() throws IOException, SAXException { // Arrange final String c32FileName = "c32.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_CCD_HITSP_C32_ALL_TemplateIdsAtRoot_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_ALL_TemplateIdsAtRoot.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_HistoryAndMedications_WithAllR2Elements_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_HistoryAndMedications_WithAllR2Elements.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_Medications_Template_Robust_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_Medications_Template_Robust.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_Medications_Template_Small_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_Medications_Template_Small.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_Minimal_NoSections_Valid_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_Minimal_NoSections_Valid.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_Minimal_WithEntries_Valid_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_Minimal_WithEntries_Valid.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_Minimal_WithSections_Valid_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_Minimal_WithSections_Valid.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_v2_1_Examples_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_v2.1_Examples.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_CCD_HITSP_C32_Valid_WithViolations_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_HITSP_C32_Valid_WithViolations.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_CCD_Minimal_No_C32_templateIds_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "CCD_Minimal_No_C32_templateIds.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev0_CDAR2_Requirements_Only_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev0_CDAR2_Requirements_Only.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev1_BaseC32_RequiredTemplateIds_NoErrors_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev1_BaseC32_RequiredTemplateIds_NoErrors.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev2_BaseC32_RequiredContent_NoWarnings_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev2_BaseC32_RequiredContent_NoWarnings.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev3_11Sections_NoEntries_EntryErrorsOnly_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev3_11Sections_NoEntries_EntryErrorsOnly.xml"; // Act & Assert testFactModelExtraction(c32FileName); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev4_11Sections_Entries_MinimalErrors_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev4_11Sections_Entries_MinimalErrors.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev5_11Sections_Entries_MinimalWarnings_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev5_11Sections_Entries_MinimalWarnings.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_HITSP_C32v2_5_Rev6_16Sections_Entries_MinimalErrors_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "HITSP_C32v2.5_Rev6_16Sections_Entries_MinimalErrors.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_JohnHalamkaCCDDocument_C32_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "JohnHalamkaCCDDocument_C32.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_JohnHalamkaCCDDocument_CCDonly_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "JohnHalamkaCCDDocument_CCDonly.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test public void testExtractFactModel_SegmentedDocumentContentProfileSample_Xml() throws IOException, SAXException { // Arrange final String c32FileName = "SegmentedDocumentContentProfileSample.xml"; final List<String> ignoreList = new LinkedList<String>(); ignoreList.add("EmbeddedClinicalDocument"); // Act & Assert testFactModelExtraction(c32FileName, ignoreList); } @Test(expected = DS4PException.class) public void testExtractFactModel_Throws_DS4PException() { // Empty xml file @SuppressWarnings("unused") final String factModel = documentFactModelExtractor.extractFactModel( "", xacmlResult); } private void testFactModelExtraction(String c32FileName) throws IOException, SAXException { final String cd = fileReader .readFile(SAMPLE_C32_LOCATION + c32FileName); final String expectedFactModel = fileReader .readFile(SAMPLE_OUTPUT_LOCATION + c32FileName); // Act final String factModel = documentFactModelExtractor.extractFactModel( cd, xacmlResult); // Assert assertXMLEqual("", expectedFactModel, factModel); } private void testFactModelExtraction(String c32FileName, List<String> ignoreList) throws IOException, SAXException { final String cd = fileReader .readFile(SAMPLE_C32_LOCATION + c32FileName); final String expectedFactModel = fileReader .readFile(SAMPLE_OUTPUT_LOCATION + c32FileName); // Act final String factModel = documentFactModelExtractor.extractFactModel( cd, xacmlResult); // Assert assertTrue(XmlComparator.compareXMLs(expectedFactModel, factModel, ignoreList).similar()); } @BeforeClass public static void setUp() throws Exception { // Arrange XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreAttributeOrder(true); XMLUnit.setIgnoreComments(true); fileReader = new FileReaderImpl(); xacmlResult = "<xacmlResult><pdpDecision>Permit</pdpDecision><purposeOfUse>TREATMENT</purposeOfUse><messageId>4617a579-1881-4e40-9f98-f85bd81d6502</messageId><homeCommunityId>2.16.840.1.113883.3.467</homeCommunityId><pdpObligation>urn:oasis:names:tc:xspa:2.0:resource:org:us-privacy-law:42CFRPart2</pdpObligation><pdpObligation>urn:oasis:names:tc:xspa:2.0:resource:org:refrain-policy:NORDSLCD</pdpObligation><pdpObligation>urn:oasis:names:tc:xspa:2.0:resource:patient:redact:ETH</pdpObligation><pdpObligation>urn:oasis:names:tc:xspa:2.0:resource:patient:redact:PSY</pdpObligation><pdpObligation>urn:oasis:names:tc:xspa:2.0:resource:patient:mask:HIV</pdpObligation></xacmlResult>"; xmlTransformer = new XmlTransformerImpl(new SimpleMarshallerImpl()); documentFactModelExtractor = new DocumentFactModelExtractorImpl( xmlTransformer); } }