package gov.samhsa.acs.documentsegmentation.tools;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import gov.samhsa.acs.brms.RuleExecutionServiceImpl;
import gov.samhsa.acs.brms.domain.FactModel;
import gov.samhsa.acs.brms.guvnor.GuvnorServiceImpl;
import gov.samhsa.acs.common.exception.DS4PException;
import gov.samhsa.acs.common.namespace.PepNamespaceContext;
import gov.samhsa.acs.common.tool.DocumentAccessorImpl;
import gov.samhsa.acs.common.tool.DocumentXmlConverterImpl;
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.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.xml.security.encryption.XMLEncryptionException;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DocumentTaggerImplTest {
private static final String N = "N";
private static final String R = "R";
private static final String V = "V";
private static final String PROBLEMS_SECTION = "11450-4";
private static final String ALLERGIES_SECTION = "48765-2";
private static final String MEDICATIONS_SECTION = "10160-0";
private static final String RESULTS_SECTION = "30954-2";
private static final String REDACT = "REDACT";
private static final String NO_ACTION = "NO_ACTION";
private final static String DISCLAIMER_DOCUMENT = "<disclaimerText><text>This is a disclaimer text</text></disclaimerText>";
private final static String DISCLAIMER_TEXT = "<text>This is a disclaimer text</text>";
private static FileReaderImpl fileReader;
private static SimpleMarshallerImpl marshaller;
private static DocumentFactModelExtractorImpl documentFactModelExtractor;
private static EmbeddedClinicalDocumentExtractor embeddedClinicalDocumentExtractor;
private static DocumentAccessorImpl documentAccessor;
private static RuleExecutionServiceImpl ruleExecutionService;
private static GuvnorServiceImpl guvnorServiceMock;
private static String c32;
private static String remC32;
private static String robustC32;
private static String executionResponseContainer;
private static String remExecutionResponseContainer;
private static String testRuleExecutionResponseContainer_xml;
private static String messageId;
private static DocumentXmlConverterImpl documentXmlConverter;
private static DocumentTaggerImpl documentTagger;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private XmlTransformer xmlTransformer;
@Before
public void setUp() throws Exception {
// Arrange
fileReader = new FileReaderImpl();
documentAccessor = new DocumentAccessorImpl();
marshaller = new SimpleMarshallerImpl();
xmlTransformer = new XmlTransformerImpl(marshaller);
documentFactModelExtractor = new DocumentFactModelExtractorImpl(
xmlTransformer);
documentXmlConverter = new DocumentXmlConverterImpl();
embeddedClinicalDocumentExtractor = new EmbeddedClinicalDocumentExtractorImpl(
documentXmlConverter, documentAccessor);
guvnorServiceMock = mock(GuvnorServiceImpl.class);
final String ruleSource = fileReader
.readFile("testAnnotationRules.txt");
when(guvnorServiceMock.getVersionedRulesFromPackage()).thenReturn(
ruleSource);
ruleExecutionService = new RuleExecutionServiceImpl(guvnorServiceMock,
marshaller);
c32 = fileReader.readFile("sampleC32/c32.xml");
remC32 = fileReader.readFile("testRemC32.xml");
robustC32 = fileReader
.readFile("testMU_Rev3_HITSP_C32C83_4Sections_RobustEntries_NoErrors.xml");
executionResponseContainer = fileReader
.readFile("ruleExecutionResponseContainer.xml");
remExecutionResponseContainer = fileReader
.readFile("testRemRuleExecutionContainer.xml");
testRuleExecutionResponseContainer_xml = fileReader
.readFile("testRuleExecutionResponseContainer.xml");
messageId = UUID.randomUUID().toString();
documentXmlConverter = new DocumentXmlConverterImpl();
documentTagger = new DocumentTaggerImpl(DISCLAIMER_DOCUMENT,
xmlTransformer);
}
@Test
public void testTagDocument() throws Exception {
// Arrange
logger.debug(c32);
// Act
final String taggedDocument = documentTagger.tagDocument(c32,
executionResponseContainer);
// Assert
logger.debug(taggedDocument);
assertTrue(!taggedDocument.contains("<confidentialityCode/>"));
assertTrue(taggedDocument
.contains("<confidentialityCode xmlns:ds4p=\"http://www.siframework.org/ds4p\""));
assertTrue(taggedDocument.contains(DISCLAIMER_TEXT));
assertTrue(taggedDocument.contains("code=\"R\""));
assertTrue(taggedDocument
.contains("codeSystem=\"2.16.840.1.113883.5.25\""));
assertTrue(c32.contains("<confidentialityCode/>"));
assertTrue(!c32
.contains("<confidentialityCode xmlns:ds4p=\"http://www.siframework.org/ds4p\""));
assertTrue(!c32.contains("code=\"R\""));
assertTrue(!c32.contains("codeSystem=\"2.16.840.1.113883.5.25\""));
}
@Test
public void testTagDocument_Confidentiality_N() throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = N;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_R() throws Exception {
// Arrange
final String responseContainer = remExecutionResponseContainer.replace(
"@itemAction", REDACT);
final String expectedDocumentLevelConfidentiality = R;
final String expectedProblemsSectionLevelConfidentiality = R;
// Act
final String taggedDocument = documentTagger.tagDocument(remC32,
responseContainer);
// Assert
final Document doc = documentXmlConverter.loadDocument(taggedDocument);
// --Document Level
verifyDocumentLevelConfidentiality(doc,
expectedDocumentLevelConfidentiality);
// --Problems Section Level
verifySectionLevelConfidentiality(doc, PROBLEMS_SECTION,
expectedProblemsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_R_From_Allergies()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = NO_ACTION;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = R;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = R;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_R_From_Medications()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = NO_ACTION;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = R;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = R;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_R_From_Problems()
throws Exception {
// Arrange
final String problem1 = NO_ACTION;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = R;
final String expectedProblemsSectionLevelConfidentiality = R;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_R_From_Results()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = NO_ACTION;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = R;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = R;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V() throws Exception {
// Arrange
final String responseContainer = remExecutionResponseContainer.replace(
"@itemAction", NO_ACTION);
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = V;
// Act
final String taggedDocument = documentTagger.tagDocument(remC32,
responseContainer);
// Assert
final Document doc = documentXmlConverter.loadDocument(taggedDocument);
verifyDocumentLevelConfidentiality(doc,
expectedDocumentLevelConfidentiality);
// --Problems Section Level
verifySectionLevelConfidentiality(doc, PROBLEMS_SECTION,
expectedProblemsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Allergy_Overrides_Medication()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = NO_ACTION;
final String medication1 = NO_ACTION;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = V;
final String expectedMedicationsSectionLevelConfidentiality = R;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Allergy_Overrides_Problem()
throws Exception {
// Arrange
final String problem1 = NO_ACTION;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = NO_ACTION;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = R;
final String expectedAllergiesSectionLevelConfidentiality = V;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Allergy_Overrides_Result()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = NO_ACTION;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = NO_ACTION;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = V;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = R;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Allergies1()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = NO_ACTION;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = V;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Allergies2()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = NO_ACTION;
final String allergy2 = NO_ACTION;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = V;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Medications1()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = NO_ACTION;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = V;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Medications2()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = NO_ACTION;
final String medication2 = NO_ACTION;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = V;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Problems1()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = NO_ACTION;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = V;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Problems2()
throws Exception {
// Arrange
final String problem1 = NO_ACTION;
final String problem2 = NO_ACTION;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = V;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Results1()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = NO_ACTION;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = V;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_From_Results2()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = NO_ACTION;
final String result2 = NO_ACTION;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = V;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Medication_Overrides_Allergy()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = NO_ACTION;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = NO_ACTION;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = R;
final String expectedMedicationsSectionLevelConfidentiality = V;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Medication_Overrides_Problem()
throws Exception {
// Arrange
final String problem1 = NO_ACTION;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = NO_ACTION;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = R;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = V;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Medication_Overrides_Result()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = NO_ACTION;
final String result1 = NO_ACTION;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = V;
final String expectedResultsSectionLevelConfidentiality = R;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Problem_Overrides_Allergy()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = NO_ACTION;
final String allergy1 = NO_ACTION;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = V;
final String expectedAllergiesSectionLevelConfidentiality = R;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Problem_Overrides_Medication()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = NO_ACTION;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = NO_ACTION;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = V;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = R;
final String expectedResultsSectionLevelConfidentiality = N;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Problem_Overrides_Result()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = NO_ACTION;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = NO_ACTION;
final String result2 = REDACT;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = V;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = R;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Result_Overrides_Allergy()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = NO_ACTION;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = NO_ACTION;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = R;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = V;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Result_Overrides_Medication()
throws Exception {
// Arrange
final String problem1 = REDACT;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = NO_ACTION;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = NO_ACTION;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = N;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = R;
final String expectedResultsSectionLevelConfidentiality = V;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Confidentiality_V_Result_Overrides_Problem()
throws Exception {
// Arrange
final String problem1 = NO_ACTION;
final String problem2 = REDACT;
final String allergy1 = REDACT;
final String allergy2 = REDACT;
final String medication1 = REDACT;
final String medication2 = REDACT;
final String result1 = REDACT;
final String result2 = NO_ACTION;
final String expectedDocumentLevelConfidentiality = V;
final String expectedProblemsSectionLevelConfidentiality = R;
final String expectedAllergiesSectionLevelConfidentiality = N;
final String expectedMedicationsSectionLevelConfidentiality = N;
final String expectedResultsSectionLevelConfidentiality = V;
// Act and Assert
testDocumentAndSectionLevelConfidentiality(problem1, problem2,
allergy1, allergy2, medication1, medication2, result1, result2,
expectedDocumentLevelConfidentiality,
expectedProblemsSectionLevelConfidentiality,
expectedAllergiesSectionLevelConfidentiality,
expectedMedicationsSectionLevelConfidentiality,
expectedResultsSectionLevelConfidentiality);
}
@Test
public void testTagDocument_Entry_Level_Tagging() throws Exception {
// Arrange
logger.debug(c32);
String factModelXml = documentFactModelExtractor.extractFactModel(c32,
fileReader.readFile("testXacmlResultRedactHIV.xml"));
c32 = embeddedClinicalDocumentExtractor
.extractClinicalDocumentFromFactModel(factModelXml);
factModelXml = removeEmbeddedClinicalDocument(factModelXml);
final FactModel factModel = marshaller.unmarshalFromXml(
FactModel.class, factModelXml);
final String executionResponseContainer = ruleExecutionService
.assertAndExecuteClinicalFacts(factModel)
.getRuleExecutionResponseContainer();
// Act
final String taggedDocument = documentTagger.tagDocument(c32,
executionResponseContainer);
// Assert
logger.debug(taggedDocument);
assertTrue(!taggedDocument.contains("<confidentialityCode/>"));
assertTrue(taggedDocument
.contains("<confidentialityCode xmlns:ds4p=\"http://www.siframework.org/ds4p\""));
assertTrue(taggedDocument.contains("code=\"R\""));
assertTrue(taggedDocument.contains(DISCLAIMER_TEXT));
assertTrue(taggedDocument
.contains("codeSystem=\"2.16.840.1.113883.5.25\""));
assertTrue(c32.contains("<confidentialityCode/>"));
assertTrue(!c32
.contains("<confidentialityCode xmlns:ds4p=\"http://www.siframework.org/ds4p\""));
assertTrue(!c32.contains("code=\"R\""));
assertTrue(!c32.contains("codeSystem=\"2.16.840.1.113883.5.25\""));
final Document taggedDoc = documentXmlConverter
.loadDocument(taggedDocument);
verifyEntryLevelTags(taggedDoc, "d1e259",
Arrays.asList(new String[] { "R", "NODSCLCD", "ENCRYPT" }));
verifyEntryLevelTags(taggedDoc, "d1e220",
Arrays.asList(new String[] { "V", "ENCRYPT", "NODSCLCD" }));
verifyEntryLevelTags(taggedDoc, "d1e1261",
Arrays.asList(new String[] { "R", "ENCRYPT", "NORDSCLCD" }));
}
@Test
public void testTagDocument_Entry_Level_Tagging_Four_Sections()
throws Exception {
// Arrange
logger.debug(c32);
String factModelXml = documentFactModelExtractor.extractFactModel(c32,
fileReader.readFile("testXacmlResultRedactHIV.xml"));
c32 = embeddedClinicalDocumentExtractor
.extractClinicalDocumentFromFactModel(factModelXml);
factModelXml = removeEmbeddedClinicalDocument(factModelXml);
final FactModel factModel = marshaller.unmarshalFromXml(
FactModel.class, factModelXml);
final String executionResponseContainer = ruleExecutionService
.assertAndExecuteClinicalFacts(factModel)
.getRuleExecutionResponseContainer();
// Act
final String taggedDocument = documentTagger.tagDocument(c32,
executionResponseContainer);
// Assert
final Document taggedDoc = documentXmlConverter
.loadDocument(taggedDocument);
verifyEntryLevelTags(taggedDoc, "d1e1168",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e503",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "R" }));
verifyEntryLevelTags(taggedDoc, "d1e1168",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e341",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e849",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e798",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e220",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e259",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "R" }));
verifyEntryLevelTags(taggedDoc, "d1e564",
Arrays.asList(new String[] { "ENCRYPT", "NODSCLCD", "V" }));
verifyEntryLevelTags(taggedDoc, "d1e1261",
Arrays.asList(new String[] { "ENCRYPT", "NORDSCLCD", "R" }));
}
@Test(expected = DS4PException.class)
public void testTagDocument_Throws_DS4PException() {
// Empty xml file
@SuppressWarnings("unused")
final String taggedDocument = documentTagger.tagDocument("",
executionResponseContainer);
}
private void addNodeListToSolutionList(List<String> solutionList,
NodeList nodeList) {
for (int i = 0; i < nodeList.getLength(); i++) {
final Node node = nodeList.item(i);
solutionList.add(node.getNodeValue());
}
}
private Node getNode(Document xmlDocument, String xPathExpr)
throws XPathExpressionException {
// Create XPath instance
final XPathFactory xpathFact = XPathFactory.newInstance();
final XPath xpath = xpathFact.newXPath();
xpath.setNamespaceContext(new PepNamespaceContext());
// Evaluate XPath expression against parsed document
final Node node = (Node) xpath.evaluate(xPathExpr, xmlDocument,
XPathConstants.NODE);
return node;
}
private NodeList getNodeList(Document xmlDocument, String xPathExpr)
throws XPathExpressionException {
// Create XPath instance
final XPathFactory xpathFact = XPathFactory.newInstance();
final XPath xpath = xpathFact.newXPath();
xpath.setNamespaceContext(new PepNamespaceContext());
// Evaluate XPath expression against parsed document
final NodeList nodeList = (NodeList) xpath.evaluate(xPathExpr,
xmlDocument, XPathConstants.NODESET);
return nodeList;
}
private String removeEmbeddedClinicalDocument(String factModelXml)
throws Exception, XPathExpressionException, IOException {
final Document fmDoc = documentXmlConverter.loadDocument(factModelXml);
final Node ecd = documentAccessor.getNode(fmDoc,
"//hl7:EmbeddedClinicalDocument");
ecd.getParentNode().removeChild(ecd);
factModelXml = documentXmlConverter.convertXmlDocToString(fmDoc);
return factModelXml;
}
private String setResponseContainer(String problem1, String problem2,
String allergy1, String allergy2, String medication1,
String medication2, String result1, String result2) {
final String responseContainer = testRuleExecutionResponseContainer_xml
.replace("@Problem1", problem1).replace("@Problem2", problem2)
.replace("@Allergy1", allergy1).replace("@Allergy2", allergy2)
.replace("@Medication1", medication1)
.replace("@Medication2", medication2)
.replace("@Result1", result1).replace("@Result2", result2);
return responseContainer;
}
private void testDocumentAndSectionLevelConfidentiality(String problem1,
String problem2, String allergy1, String allergy2,
String medication1, String medication2, String result1,
String result2, String expectedDocumentLevelConfidentiality,
String expectedProblemsSectionLevelConfidentiality,
String expectedAllergiesSectionLevelConfidentiality,
String expectedMedicationsSectionLevelConfidentiality,
String expectedResultsSectionLevelConfidentiality)
throws Exception, XPathExpressionException {
final String responseContainer = setResponseContainer(problem1,
problem2, allergy1, allergy2, medication1, medication2,
result1, result2);
// Act
final String taggedDocument = documentTagger.tagDocument(robustC32,
responseContainer);
// Assert
final Document doc = documentXmlConverter.loadDocument(taggedDocument);
verifyDocumentLevelConfidentiality(doc,
expectedDocumentLevelConfidentiality);
verifySectionLevelConfidentiality(doc, PROBLEMS_SECTION,
expectedProblemsSectionLevelConfidentiality);
verifySectionLevelConfidentiality(doc, ALLERGIES_SECTION,
expectedAllergiesSectionLevelConfidentiality);
verifySectionLevelConfidentiality(doc, MEDICATIONS_SECTION,
expectedMedicationsSectionLevelConfidentiality);
verifySectionLevelConfidentiality(doc, RESULTS_SECTION,
expectedResultsSectionLevelConfidentiality);
}
private void verifyCodeAttributeValue(Document document, String xPathExpr,
String expectedCodeAttributeValue) throws XPathExpressionException {
final Node documentLevelConfidentialityCodeNode = getNode(document,
xPathExpr);
final String documentLevelConfidentialityCodeValue = documentLevelConfidentialityCodeNode
.getAttributes().getNamedItem("code").getNodeValue();
assertEquals(expectedCodeAttributeValue,
documentLevelConfidentialityCodeValue);
}
private void verifyDocumentLevelConfidentiality(Document doc,
String expectedDocumentLevelConfidentiality)
throws XPathExpressionException {
final String xPathExprDocumentLevel = "/hl7:ClinicalDocument/hl7:confidentialityCode";
verifyCodeAttributeValue(doc, xPathExprDocumentLevel,
expectedDocumentLevelConfidentiality);
}
private void verifyEntryLevelTags(Document taggedDoc,
String generatedEntryId, List<String> expectedList)
throws XPathExpressionException, XMLEncryptionException, Exception {
final String xPathExpr = "//hl7:entry[child::hl7:generatedEntryId='$generatedEntryId']//hl7:entryRelationship[descendant::hl7:templateId[@root='2.16.840.1.113883.3.3251.1.4']]//hl7:value/@code";
final String xPathExprForOrganizer = "//hl7:entry[child::hl7:generatedEntryId='$generatedEntryId']//hl7:component[child::hl7:organizer[child::hl7:templateId[@root='2.16.840.1.113883.3.3251.1.4']]]//hl7:value/@code";
final LinkedList<String> solutionList = new LinkedList<String>();
// Add everything except organizer
NodeList nodeList = getNodeList(taggedDoc,
xPathExpr.replace("$generatedEntryId", generatedEntryId));
addNodeListToSolutionList(solutionList, nodeList);
// Add organizer
nodeList = getNodeList(taggedDoc, xPathExprForOrganizer.replace(
"$generatedEntryId", generatedEntryId));
addNodeListToSolutionList(solutionList, nodeList);
// Assert
assertTrue(solutionList.containsAll(expectedList));
}
private void verifySectionLevelConfidentiality(Document doc,
String sectionCode, String expectedSectionLevelConfidentiality)
throws XPathExpressionException {
final String xPathExprProblemsSectionLevel = "//hl7:section[hl7:code[@code='$']]/hl7:confidentialityCode"
.replace("$", sectionCode);
verifyCodeAttributeValue(doc, xPathExprProblemsSectionLevel,
expectedSectionLevelConfidentiality);
}
}