Skip to content

Commit eaa64b4

Browse files
committed
Increase Redaction Code Coverage
1 parent dd9e932 commit eaa64b4

File tree

5 files changed

+263
-10
lines changed

5 files changed

+263
-10
lines changed

src/main/java/de/medizininformatikinitiative/torch/util/Redaction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public Base redact(ExtractionRedactionWrapper wrapper) {
8181

8282
if (!validProfiles.equals(wrapper.profiles())) {
8383
logger.error("Missing Profiles in Resource {} {}: {} for requested profiles {}", resource.getResourceType(), resource.getId(), resourceProfiles, wrapper.profiles());
84-
throw new RuntimeException("Resource is missing required profiles: " + resourceProfiles);
84+
throw new RuntimeException("Resource is missing required profiles: " + wrapper.profiles());
8585
}
8686
} else {
8787
resourceProfiles = wrapper.profiles().stream().map(CanonicalType::new).toList();

src/test/java/de/medizininformatikinitiative/torch/RedactionTest.java

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.hl7.fhir.r4.model.CanonicalType;
77
import org.hl7.fhir.r4.model.CodeableConcept;
88
import org.hl7.fhir.r4.model.Coding;
9+
import org.hl7.fhir.r4.model.Condition;
910
import org.hl7.fhir.r4.model.DomainResource;
1011
import org.hl7.fhir.r4.model.Identifier;
1112
import org.hl7.fhir.r4.model.Medication;
@@ -23,6 +24,7 @@
2324

2425
import static de.medizininformatikinitiative.torch.util.FhirUtil.createAbsentReasonExtension;
2526
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2628

2729
public class RedactionTest {
2830

@@ -82,6 +84,38 @@ void testReferenceComplexType(String resource) throws IOException {
8284
assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
8385
}
8486

87+
@Test
88+
public void mismatchProfileWithAssignedProfile() {
89+
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
90+
Meta meta = new Meta();
91+
meta.setProfile(List.of(new CanonicalType(MEDICATION)));
92+
src.setMeta(meta);
93+
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());
94+
95+
assertThatThrownBy(() -> integrationTestSetup.redaction().redact(wrapper)).isInstanceOf(RuntimeException.class)
96+
.hasMessage("Resource is missing required profiles: [" + DIAGNOSIS + "]");
97+
}
98+
99+
@Test
100+
public void unknownProfile() {
101+
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
102+
Meta meta = new Meta();
103+
meta.setProfile(List.of(new CanonicalType("UnknownProfile")));
104+
src.setMeta(meta);
105+
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of("UnknownProfile"), Map.of(), Set.of());
106+
107+
assertThatThrownBy(() -> integrationTestSetup.redaction().redact(wrapper)).isInstanceOf(RuntimeException.class)
108+
.hasMessage("Trying to handle unknown profiles: [UnknownProfile]");
109+
}
110+
111+
@Test
112+
public void metaMissing() {
113+
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
114+
115+
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());
116+
assertThatThrownBy(() -> integrationTestSetup.redaction().redact(wrapper)).isInstanceOf(RuntimeException.class);
117+
}
118+
85119
@Test
86120
public void unknownSlice() throws IOException {
87121
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + "unknownSlice.json");
@@ -100,6 +134,35 @@ public void unknownSlice() throws IOException {
100134
assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
101135
}
102136

137+
@ParameterizedTest
138+
@ValueSource(strings = {"DiagnosisWithExtensionAtCodeWithUnknownField.json"})
139+
void notHandlingUnknownElementID(String resource) throws IOException {
140+
141+
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
142+
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
143+
144+
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());
145+
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
146+
147+
assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
148+
149+
150+
}
151+
152+
@Test
153+
public void emptyValues() throws IOException {
154+
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + "EmptyValues.json");
155+
org.hl7.fhir.r4.model.Condition src = new org.hl7.fhir.r4.model.Condition();
156+
Meta meta = new Meta();
157+
meta.setProfile(List.of(new CanonicalType(DIAGNOSIS)));
158+
src.setMeta(meta);
159+
160+
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of(), Set.of());
161+
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
162+
163+
assertThat(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(tgt)).isEqualTo(fhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(expected));
164+
}
165+
103166
@ParameterizedTest
104167
@ValueSource(strings = {"DiagnosisUnknownPrimitiveExtension.json", "DiagnosisWithExtensionAtCode.json", "DiagnosisUnknownComplexExtension.json"})
105168
void removeUnknownPrimitiveAndComplexExtension(String resource) throws IOException {
@@ -159,13 +222,13 @@ public void patient() {
159222
}
160223

161224
@Nested
162-
class Condition {
225+
class ConditionTest {
163226

164227
@ParameterizedTest
165228
@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"})
166229
void diagnosisAllValid(String resource) throws IOException {
167-
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
168-
DomainResource expected = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
230+
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
231+
Condition expected = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
169232

170233
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());
171234
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
@@ -176,8 +239,8 @@ void diagnosisAllValid(String resource) throws IOException {
176239
@ParameterizedTest
177240
@ValueSource(strings = {"Condition-mii-exa-diagnose-condition-minimal.json", "Condition-mii-exa-diagnose-mehrfachkodierung-primaercode.json"})
178241
void invalidReferences(String resource) throws IOException {
179-
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
180-
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
242+
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
243+
Condition expected = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
181244

182245
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of(), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
183246
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
@@ -188,8 +251,8 @@ void invalidReferences(String resource) throws IOException {
188251
@ParameterizedTest
189252
@ValueSource(strings = {"DiagnosisWithInvalidSliceCode.json"})
190253
void diagnosisInvalidElements(String resource) throws IOException {
191-
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
192-
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
254+
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
255+
Condition expected = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
193256

194257
ExtractionRedactionWrapper wrapper = new ExtractionRedactionWrapper(src, Set.of(DIAGNOSIS), Map.of("Condition.subject", Set.of("Patient/12345"), "Condition.encounter", Set.of("Encounter/12345")), Set.of());
195258
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
@@ -200,8 +263,8 @@ void diagnosisInvalidElements(String resource) throws IOException {
200263
@ParameterizedTest
201264
@ValueSource(strings = {"Diagnosis1.json", "Diagnosis2.json"})
202265
void diagnosisMissingElements(String resource) throws IOException {
203-
DomainResource src = integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
204-
DomainResource expected = integrationTestSetup.readResource(EXPECTED_OUTPUT_DIR + resource);
266+
Condition src = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
267+
Condition expected = (Condition) integrationTestSetup.readResource(INPUT_CONDITION_DIR + resource);
205268

206269
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());
207270
DomainResource tgt = (DomainResource) integrationTestSetup.redaction().redact(wrapper);
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
"resourceType": "Condition",
3+
"id": "mii-exa-diagnose-mehrfachkodierung-primaercode",
4+
"meta": {
5+
"profile": [
6+
"https://www.medizininformatik-initiative.de/fhir/core/modul-diagnose/StructureDefinition/Diagnose"
7+
]
8+
},
9+
"code": {
10+
"coding": [
11+
{
12+
"system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm",
13+
"extension": [
14+
{
15+
"url": "http://fhir.de/StructureDefinition/seitenlokalisation",
16+
"valueCoding": {
17+
"code": "L",
18+
"system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION",
19+
"display": "links"
20+
}
21+
},
22+
{
23+
"url": "http://fhir.de/StructureDefinition/icd-10-gm-mehrfachcodierungs-kennzeichen",
24+
"valueCoding": {
25+
"code": "",
26+
"system": "http://fhir.de/CodeSystem/icd-10-gm-mehrfachcodierungs-kennzeichen"
27+
}
28+
}
29+
],
30+
"code": "A54.4",
31+
"version": "2020",
32+
"display": "Gonokokkeninfektion des Muskel-Skelett-Systems"
33+
},
34+
{
35+
"system": "http://fhir.de/CodeSystem/bfarm/alpha-id",
36+
"code": "I97525",
37+
"version": "2020",
38+
"display": "Bursitis gonorrhoica"
39+
}
40+
]
41+
},
42+
"clinicalStatus": {
43+
"coding": [
44+
{
45+
"code": "active",
46+
"system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
47+
"extension": [
48+
{
49+
"url": "http://fhir.de/StructureDefinition/seitenlokalisation",
50+
"valueCoding": {
51+
"code": "L",
52+
"system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION",
53+
"display": "links"
54+
}
55+
}
56+
]
57+
}
58+
]
59+
},
60+
"verificationStatus": {
61+
"coding": [
62+
{
63+
"code": "confirmed",
64+
"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
65+
}
66+
]
67+
},
68+
"subject": {
69+
"reference": "Patient/12345"
70+
},
71+
"encounter": {
72+
"reference": "Encounter/12345"
73+
},
74+
"onsetPeriod": {
75+
"start": "2019-09-26T12:45:00+01:00",
76+
"end": "2020-03-25T13:00:00+01:00"
77+
},
78+
"recordedDate": "2020-01-05T12:53:00+01:00"
79+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
"resourceType": "Condition",
3+
"id": "mii-exa-diagnose-mehrfachkodierung-primaercode",
4+
"meta": {
5+
"profile": [
6+
"https://www.medizininformatik-initiative.de/fhir/core/modul-diagnose/StructureDefinition/Diagnose"
7+
]
8+
},
9+
"code": {
10+
"coding": [
11+
{
12+
"system": "http://fhir.de/CodeSystem/bfarm/icd-10-gm",
13+
"extension": [
14+
{
15+
"url": "http://fhir.de/StructureDefinition/seitenlokalisation",
16+
"valueCoding": {
17+
"code": "L",
18+
"system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION",
19+
"display": "links"
20+
}
21+
},
22+
{
23+
"url": "http://fhir.de/StructureDefinition/icd-10-gm-mehrfachcodierungs-kennzeichen",
24+
"valueCoding": {
25+
"code": "",
26+
"system": "http://fhir.de/CodeSystem/icd-10-gm-mehrfachcodierungs-kennzeichen"
27+
}
28+
}
29+
],
30+
"code": "A54.4",
31+
"version": "2020",
32+
"display": "Gonokokkeninfektion des Muskel-Skelett-Systems"
33+
},
34+
{
35+
"system": "http://fhir.de/CodeSystem/bfarm/alpha-id",
36+
"code": "I97525",
37+
"version": "2020",
38+
"display": "Bursitis gonorrhoica"
39+
}
40+
]
41+
},
42+
"clinicalStatus": {
43+
"coding": [
44+
{
45+
"code": "active",
46+
"system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
47+
"extension": [
48+
{
49+
"url": "http://fhir.de/StructureDefinition/seitenlokalisation",
50+
"valueCoding": {
51+
"code": "L",
52+
"system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ICD_SEITENLOKALISATION",
53+
"display": "links"
54+
}
55+
}
56+
]
57+
}
58+
]
59+
},
60+
"verificationStatus": {
61+
"coding": [
62+
{
63+
"code": "confirmed",
64+
"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
65+
}
66+
]
67+
},
68+
"subject": {
69+
"reference": "Patient/12345"
70+
},
71+
"encounter": {
72+
"reference": "Encounter/12345"
73+
},
74+
"onsetPeriod": {
75+
"start": "2019-09-26T12:45:00+01:00",
76+
"end": "2020-03-25T13:00:00+01:00"
77+
},
78+
"recordedDate": "2020-01-05T12:53:00+01:00"
79+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"resourceType": "Condition",
3+
"meta": {
4+
"profile": [
5+
"https://www.medizininformatik-initiative.de/fhir/core/modul-diagnose/StructureDefinition/Diagnose"
6+
]
7+
},
8+
"code": {
9+
"extension": [
10+
{
11+
"url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason",
12+
"valueCode": "masked"
13+
}
14+
]
15+
},
16+
"subject": {
17+
"extension": [
18+
{
19+
"url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason",
20+
"valueCode": "masked"
21+
}
22+
]
23+
},
24+
"_recordedDate": {
25+
"extension": [
26+
{
27+
"url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason",
28+
"valueCode": "masked"
29+
}
30+
]
31+
}
32+
}

0 commit comments

Comments
 (0)