Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public Base redact(ExtractionRedactionWrapper wrapper) {

if (!validProfiles.equals(wrapper.profiles())) {
logger.error("Missing Profiles in Resource {} {}: {} for requested profiles {}", resource.getResourceType(), resource.getId(), resourceProfiles, wrapper.profiles());
throw new RuntimeException("Resource is missing required profiles: " + resourceProfiles);
throw new RuntimeException("Resource is missing required profiles: " + wrapper.profiles());
}
} else {
resourceProfiles = wrapper.profiles().stream().map(CanonicalType::new).toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import org.hl7.fhir.r4.model.CanonicalType;
import org.hl7.fhir.r4.model.CodeableConcept;
import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.Condition;
import org.hl7.fhir.r4.model.DomainResource;
import org.hl7.fhir.r4.model.Identifier;
import org.hl7.fhir.r4.model.Medication;
import org.hl7.fhir.r4.model.Meta;
import org.hl7.fhir.r4.model.Observation;
import org.hl7.fhir.r4.model.Patient;
import org.junit.Test;
import org.junit.jupiter.api.Nested;
Expand All @@ -23,6 +25,7 @@

import static de.medizininformatikinitiative.torch.util.FhirUtil.createAbsentReasonExtension;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

public class RedactionTest {

Expand All @@ -45,11 +48,11 @@ public RedactionTest() throws IOException {
@ParameterizedTest
@ValueSource(strings = {"Observation_lab_Missing_Elements_Unknown_Slices.json"})
void testObservationLab(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource("src/test/resources/InputResources/Observation/" + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Observation src = (Observation) integrationTestSetup.readResource("src/test/resources/InputResources/Observation/" + resource);
Observation expected = (Observation) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(OBSERVATION_LAB), Map.of("Observation.subject", Set.of("Patient/VHF-MIXED-TEST-CASE-0001-a"), "Observation.encounter", Set.of("Encounter/VHF-MIXED-TEST-CASE-0001-a-E-1")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Observation) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}
Expand All @@ -59,11 +62,11 @@ void testObservationLab(String resource) throws IOException {
"Observation-mii-exa-test-data-patient-1-vitalstatus-1.json"
})
void testValueSetBindingPassingThroughAsDiscriminator(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource("src/test/resources/InputResources/Observation/" + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Observation src = (Observation) integrationTestSetup.readResource("src/test/resources/InputResources/Observation/" + resource);
Observation expected = (Observation) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(VITALSTATUS), Map.of("Observation.subject", Set.of("Patient/VHF-MIXED-TEST-CASE-0001-a"), "Observation.encounter", Set.of("Encounter/VHF-MIXED-TEST-CASE-0001-a-E-1")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Observation) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}
Expand All @@ -73,18 +76,50 @@ void testValueSetBindingPassingThroughAsDiscriminator(String resource) throws IO
"Observation-mii-exa-test-data-patient-1-vitalstatus-1-identifier.json"
})
void testReferenceComplexType(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource("src/test/resources/InputResources/Observation/" + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Observation src = (Observation) integrationTestSetup.readResource("src/test/resources/InputResources/Observation/" + resource);
Observation expected = (Observation) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(VITALSTATUS), Map.of("Observation.subject", Set.of("Patient/VHF-MIXED-TEST-CASE-0001-a"), "Observation.encounter", Set.of("Encounter/VHF-MIXED-TEST-CASE-0001-a-E-1")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Observation) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}

@Test
public void mismatchProfileWithAssignedProfile() {
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please rename the nested Condition test into ConditionTest and import the Condition class

Meta meta = new Meta();
meta.setProfile(List.of(new CanonicalType(MEDICATION)));
src.setMeta(meta);
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());

assertThatThrownBy(() -> integrationTestSetup.redaction().redact(wrapper)).isInstanceOf(RuntimeException.class)
.hasMessage("Resource is missing required profiles: [" + DIAGNOSIS + "]");
}

@Test
public void unknownProfile() {
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
Meta meta = new Meta();
meta.setProfile(List.of(new CanonicalType("UnknownProfile")));
src.setMeta(meta);
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of("UnknownProfile"), Map.of(), Set.of());

assertThatThrownBy(() -> integrationTestSetup.redaction().redact(wrapper)).isInstanceOf(RuntimeException.class)
.hasMessage("Trying to handle unknown profiles: [UnknownProfile]");
}

@Test
public void metaMissing() {
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());
assertThatThrownBy(() -> integrationTestSetup.redaction().redact(wrapper)).isInstanceOf(RuntimeException.class);
}

@Test
public void unknownSlice() throws IOException {
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + "unknownSlice.json");
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + "unknownSlice.json");
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
Meta meta = new Meta();
meta.setProfile(List.of(new CanonicalType(DIAGNOSIS)));
Expand All @@ -94,6 +129,35 @@ public void unknownSlice() throws IOException {
concept.setCoding(List.of(code));
src.setCode(concept);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}

@ParameterizedTest
@ValueSource(strings = {"DiagnosisWithExtensionAtCodeWithUnknownField.json"})
void notHandlingUnknownElementID(String resource) throws IOException {

Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of("Patient/12345", "Patient/123"), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));


}

@Test
public void emptyValues() throws IOException {
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + "EmptyValues.json");
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
Meta meta = new Meta();
meta.setProfile(List.of(new CanonicalType(DIAGNOSIS)));
src.setMeta(meta);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);

Expand All @@ -103,11 +167,11 @@ public void unknownSlice() throws IOException {
@ParameterizedTest
@ValueSource(strings = {"DiagnosisUnknownPrimitiveExtension.json", "DiagnosisWithExtensionAtCode.json", "DiagnosisUnknownComplexExtension.json"})
void removeUnknownPrimitiveAndComplexExtension(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of("Patient/12345", "Patient/123"), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}
Expand All @@ -130,7 +194,7 @@ public void backboneElementHandling() {


ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(medication, Set.of(MEDICATION), Map.of(), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Medication) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expectedMedication));
}
Expand All @@ -153,58 +217,58 @@ public void patient() {
expectedPatient.setIdentifier(List.of(identifier));

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(patient, Set.of(PATIENT), Map.of(), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Patient) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expectedPatient));
}

@Nested
class Condition {
class ConditionTest {

@ParameterizedTest
@ValueSource(strings = {"Condition-mii-exa-diagnose-condition-minimal.json", "Condition-mii-exa-diagnose-mehrfachkodierung-primaercode.json", "Condition-mii-exa-diagnose-mehrfachkodierung-primaercode.json", "Condition-mii-exa-diagnose-multiple-kodierungen.json", "Condition-mii-exa-test-data-patient-1-diagnose-1.json", "Condition-mii-exa-test-data-patient-1-diagnose-2.json", "Condition-mii-exa-test-data-patient-3-diagnose-1.json", "Condition-mii-exa-test-data-patient-4-diagnose-1.json"})
void diagnosisAllValid(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
DomainResource expected = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
void diagnosisNoChange(String resource) throws IOException {
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
Condition expected = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of("Patient/12345", "Patient/mii-exa-test-data-patient-1", "Patient/mii-exa-test-data-patient-3"), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}

@ParameterizedTest
@ValueSource(strings = {"Condition-mii-exa-diagnose-condition-minimal.json", "Condition-mii-exa-diagnose-mehrfachkodierung-primaercode.json"})
void invalidReferences(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of(), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}

@ParameterizedTest
@ValueSource(strings = {"DiagnosisWithInvalidSliceCode.json"})
void diagnosisInvalidElements(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of("Patient/12345"), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}

@ParameterizedTest
@ValueSource(strings = {"Diagnosis1.json", "Diagnosis2.json"})
void diagnosisMissingElements(String resource) throws IOException {
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
Condition expected = (Condition) integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);

ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of("Patient/12345", "Patient/123"), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
DomainResource tgt = (Condition) integrationTestSetup.redaction().redact(wrapper);

assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
{
"resourceType": "Condition",
"id": "mii-exa-diagnose-mehrfachkodierung-primaercode",
"meta": {
"profile": [
"https://www.medizininformatik-initiative.de/fhir/core/modul-diagnose/StructureDefinition/Diagnose"
]
},
"code": {
"coding": [
{
"system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm",
"extension": [
{
"url": "http://fhir.de/StructureDefinition/seitenlokalisation",
"valueCoding": {
"code": "L",
"system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION",
"display": "links"
}
},
{
"url": "http://fhir.de/StructureDefinition/icd-10-gm-mehrfachcodierungs-kennzeichen",
"valueCoding": {
"code": "†",
"system": "http://fhir.de/CodeSystem/icd-10-gm-mehrfachcodierungs-kennzeichen"
}
}
],
"code": "A54.4",
"version": "2020",
"display": "Gonokokkeninfektion des Muskel-Skelett-Systems"
},
{
"system": "http://fhir.de/CodeSystem/bfarm/alpha-id",
"code": "I97525",
"version": "2020",
"display": "Bursitis gonorrhoica"
}
]
},
"clinicalStatus": {
"coding": [
{
"code": "active",
"system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
"extension": [
{
"url": "http://fhir.de/StructureDefinition/seitenlokalisation",
"valueCoding": {
"code": "L",
"system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION",
"display": "links"
}
}
]
}
]
},
"verificationStatus": {
"coding": [
{
"code": "confirmed",
"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
}
]
},
"subject": {
"reference": "Patient/12345"
},
"encounter": {
"reference": "Encounter/12345"
},
"onsetPeriod": {
"start": "2019-09-26T12:45:00+01:00",
"end": "2020-03-25T13:00:00+01:00"
},
"recordedDate": "2020-01-05T12:53:00+01:00"
}
Loading