Skip to content

Commit 4db5ed2

Browse files
authored
NIAD-3147 - Populate confidentialityCode HL7v3 element when meta.security with value NOPAT is present within LinkSet (#848)
* [NIAD-3147] Add tests to verify confidentialityCode is added to LinkSet, refactored existing tests * [NIAD-3147] Add production code to add confidentialityCode to LinkSet * [NIAD-3147] General refactors to ConfidentialityCodeUtility * [NIAD-3147] Add description to CHANGELOG.md
1 parent feb411b commit 4db5ed2

File tree

13 files changed

+275
-178
lines changed

13 files changed

+275
-178
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ will contain a `NOPAT` `confidentialityCode` element.
1616
will contain a `NOPAT` `confidentialityCode` element.
1717
* When mapping a `TestResult`, `TestGroupHeader` or `FilingComment` which contains a `NOPAT` `meta.security` tag the resultant XML
1818
for that resource will contain a `NOPAT` `confidentialityCode` element.
19+
* When mapping a `Condition` which contains a `NOPAT` `meta.security` tag the resultant XML for that resource
20+
will contain a `NOPAT` `confidentialityCode` element.
1921

2022
## [2.0.6] - 2024-07-29
2123

service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/ConditionLinkSetMapper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import lombok.RequiredArgsConstructor;
2323
import lombok.extern.slf4j.Slf4j;
24+
import uk.nhs.adaptors.gp2gp.common.service.ConfidentialityService;
2425
import uk.nhs.adaptors.gp2gp.common.service.RandomIdGeneratorService;
2526
import uk.nhs.adaptors.gp2gp.ehr.exception.EhrMapperException;
2627
import uk.nhs.adaptors.gp2gp.ehr.mapper.parameters.ConditionLinkSetMapperParameters;
@@ -56,6 +57,7 @@ public class ConditionLinkSetMapper {
5657
private final RandomIdGeneratorService randomIdGeneratorService;
5758
private final CodeableConceptCdMapper codeableConceptCdMapper;
5859
private final ParticipantMapper participantMapper;
60+
private final ConfidentialityService confidentialityService;
5961

6062
public String mapConditionToLinkSet(Condition condition, boolean isNested) {
6163
if (!condition.hasAsserter()) {
@@ -70,6 +72,7 @@ public String mapConditionToLinkSet(Condition condition, boolean isNested) {
7072
buildEffectiveTimeLow(condition).ifPresent(builder::effectiveTimeLow);
7173
buildEffectiveTimeHigh(condition).ifPresent(builder::effectiveTimeHigh);
7274
buildAvailabilityTime(condition).ifPresent(builder::availabilityTime);
75+
builder.confidentialityCode(confidentialityService.generateConfidentialityCode(condition).orElse(null));
7376
builder.relatedClinicalContent(buildRelatedClinicalContent(condition));
7477

7578
buildQualifier(condition).ifPresent(qualifier -> setQualifierProperties(builder, qualifier));

service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/parameters/ConditionLinkSetMapperParameters.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class ConditionLinkSetMapperParameters {
2121
private String effectiveTimeHigh;
2222
private String effectiveTimeLow;
2323
private String availabilityTime;
24+
private String confidentialityCode;
2425
private List<String> relatedClinicalContent;
2526
private boolean generateObservationStatement;
2627
private String pertinentInfo;

service/src/main/resources/templates/ehr_link_set_template.mustache

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
{{#effectiveTimeHigh}}<high value="{{effectiveTimeHigh}}"/>{{/effectiveTimeHigh}}
1414
</effectiveTime>
1515
<availabilityTime value="{{availabilityTime}}" />
16+
{{#confidentialityCode}}
17+
{{{confidentialityCode}}}
18+
{{/confidentialityCode}}
1619
{{#relatedClinicalContent}}
1720
<component typeCode="COMP">
1821
<statementRef classCode="OBS" moodCode="EVN">
@@ -49,6 +52,9 @@
4952
{{#effectiveTimeHigh}}<high value="{{effectiveTimeHigh}}"/>{{/effectiveTimeHigh}}
5053
</effectiveTime>
5154
<availabilityTime {{#observationStatementAvailabilityTime}}value="{{observationStatementAvailabilityTime}}"{{/observationStatementAvailabilityTime}}{{^observationStatementAvailabilityTime}}nullFlavor="UNK"{{/observationStatementAvailabilityTime}} />
55+
{{#confidentialityCode}}
56+
{{{confidentialityCode}}}
57+
{{/confidentialityCode}}
5258
{{#pertinentInfo}}
5359
<pertinentInformation typeCode="PERT">
5460
<sequenceNumber value="+1" />

service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/ConditionLinkSetMapperTest.java

Lines changed: 206 additions & 150 deletions
Large diffs are not rendered by default.

service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/EhrExtractMapperComponentTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public void setUp() {
166166
messageContext, randomIdGeneratorService, new StructuredObservationValueMapper(),
167167
codeableConceptCdMapper, new ParticipantMapper()),
168168
new ConditionLinkSetMapper(
169-
messageContext, randomIdGeneratorService, codeableConceptCdMapper, participantMapper),
169+
messageContext, randomIdGeneratorService, codeableConceptCdMapper, participantMapper, confidentialityService),
170170
new DiaryPlanStatementMapper(messageContext, codeableConceptCdMapper, participantMapper),
171171
documentReferenceToNarrativeStatementMapper,
172172
new ImmunizationObservationStatementMapper(messageContext, codeableConceptCdMapper, participantMapper),

service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/EncounterComponentsMapperTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ public void setUp() {
144144
ConditionLinkSetMapper conditionLinkSetMapper = new ConditionLinkSetMapper(messageContext,
145145
randomIdGeneratorService,
146146
codeableConceptCdMapper,
147-
participantMapper
147+
participantMapper,
148+
confidentialityService
148149
);
149150
DiaryPlanStatementMapper diaryPlanStatementMapper
150151
= new DiaryPlanStatementMapper(messageContext, codeableConceptCdMapper, participantMapper);

service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/diagnosticreport/DiagnosticReportMapperTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import uk.nhs.adaptors.gp2gp.utils.ResourceTestFileUtils;
4545

4646
import static org.mockito.ArgumentMatchers.anyList;
47+
import static uk.nhs.adaptors.gp2gp.utils.ConfidentialityCodeUtility.NOPAT_HL7_CONFIDENTIALITY_CODE;
4748

4849
@ExtendWith(MockitoExtension.class)
4950
@MockitoSettings(strictness = Strictness.LENIENT)
@@ -80,8 +81,6 @@ class DiagnosticReportMapperTest {
8081
private static final String OUTPUT_XML_EXTENSION_ID = "diagnostic-report-with-extension-id.xml";
8182
private static final String OUTPUT_XML_MULTIPLE_RESULTS = "diagnostic-report-with-multiple-results.xml";
8283

83-
private static final String NOPAT_CONFIDENTIALITY_CODE = ConfidentialityCodeUtility.getNopatHl7v3ConfidentialityCode();
84-
8584
@Mock
8685
private CodeableConceptCdMapper codeableConceptCdMapper;
8786
@Mock
@@ -144,12 +143,12 @@ void When_DiagnosticReport_With_NopatMetaSecurity_Expect_ConfidentialityCodeWith
144143
final DiagnosticReport diagnosticReport = getDiagnosticReportResourceFromJson(testFile);
145144

146145
when(confidentialityService.generateConfidentialityCode(diagnosticReport))
147-
.thenReturn(Optional.of(NOPAT_CONFIDENTIALITY_CODE));
146+
.thenReturn(Optional.of(NOPAT_HL7_CONFIDENTIALITY_CODE));
148147

149148
final String result = mapper.mapDiagnosticReportToCompoundStatement(diagnosticReport);
150149

151150
assertAll(
152-
() -> assertThat(result).contains(NOPAT_CONFIDENTIALITY_CODE),
151+
() -> assertThat(result).contains(NOPAT_HL7_CONFIDENTIALITY_CODE),
153152
() -> assertThat(ConfidentialityCodeUtility.getSecurityCodeFromResource(diagnosticReport)).isEqualTo("NOPAT")
154153
);
155154
}
@@ -165,7 +164,7 @@ void When_DiagnosticReport_With_NoscrubMetaSecurity_Expect_ConfidentialityCodeNo
165164
final String result = mapper.mapDiagnosticReportToCompoundStatement(diagnosticReport);
166165

167166
assertAll(
168-
() -> assertThat(result).doesNotContain(NOPAT_CONFIDENTIALITY_CODE),
167+
() -> assertThat(result).doesNotContain(NOPAT_HL7_CONFIDENTIALITY_CODE),
169168
() -> assertThat(ConfidentialityCodeUtility.getSecurityCodeFromResource(diagnosticReport)).isEqualTo("NOSCRUB")
170169
);
171170
}

service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/diagnosticreport/ObservationMapperTest.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,12 @@
4545
import static org.mockito.ArgumentMatchers.any;
4646
import static org.mockito.Mockito.lenient;
4747
import static org.mockito.Mockito.when;
48+
import static uk.nhs.adaptors.gp2gp.utils.ConfidentialityCodeUtility.NOPAT_HL7_CONFIDENTIALITY_CODE;
4849

4950
@ExtendWith(MockitoExtension.class)
5051
class ObservationMapperTest {
5152
private static final String DIAGNOSTIC_REPORT_TEST_FILE_DIRECTORY = "/ehr/mapper/diagnosticreport/";
5253
private static final String OBSERVATION_TEST_FILE_DIRECTORY = "/ehr/mapper/diagnosticreport/observation/";
53-
private static final String NOPAT_CONFIDENTIALITY_CODE
54-
= ConfidentialityCodeUtility.getNopatHl7v3ConfidentialityCode();
5554

5655
private static final String OBSERVATION_ASSOCIATED_WITH_SPECIMEN_1_JSON =
5756
"observation_associated_with_specimen_1.json";
@@ -207,11 +206,12 @@ void When_MappingDefaultObservationJson_Expect_DefaultObservationStatementXmlOut
207206
void When_MappingTestGroupHeader_With_NopatMetaSecurity_Expect_ConfidentialityCodeWithinCompoundStatement()
208207
throws XPathExpressionException, IOException, ParserConfigurationException, SAXException {
209208
final Observation observation = getObservationResourceFromJson(OBSERVATION_TEST_GROUP_HEADER_JSON);
210-
final String xPath = "/component/CompoundStatement/confidentialityCode";
209+
final String xPath = "/component/CompoundStatement/" + ConfidentialityCodeUtility
210+
.getNopatConfidentialityCodeXpathSegment();
211211

212212
ConfidentialityCodeUtility.appendNopatSecurityToMetaForResource(observation);
213213
when(confidentialityService.generateConfidentialityCode(observationArgumentCaptor.capture()))
214-
.thenReturn(Optional.of(NOPAT_CONFIDENTIALITY_CODE));
214+
.thenReturn(Optional.of(NOPAT_HL7_CONFIDENTIALITY_CODE));
215215

216216
final String actualXml = observationMapper.mapObservationToCompoundStatement(observation);
217217

@@ -239,19 +239,20 @@ void When_MappingTestGroupHeader_With_NoscrubMetaSecurity_Expect_Confidentiality
239239
.filter(ConfidentialityCodeUtility::doesMetaContainNopat)
240240
.toList();
241241

242-
assertThat(actualXml).doesNotContainIgnoringCase(NOPAT_CONFIDENTIALITY_CODE);
242+
assertThat(actualXml).doesNotContainIgnoringCase(NOPAT_HL7_CONFIDENTIALITY_CODE);
243243
assertThat(metaWithNopat).hasSize(0);
244244
}
245245

246246
@Test
247247
void When_MappingTestResult_With_NopatMetaSecurity_Expect_ConfidentialityCodeWithinObservationStatement()
248248
throws XPathExpressionException, IOException, ParserConfigurationException, SAXException {
249249
final Observation observation = getObservationResourceFromJson(OBSERVATION_TEST_RESULT_JSON);
250-
final String xPath = "/component/ObservationStatement/confidentialityCode";
250+
final String xPath = "/component/ObservationStatement/" + ConfidentialityCodeUtility
251+
.getNopatConfidentialityCodeXpathSegment();
251252

252253
ConfidentialityCodeUtility.appendNopatSecurityToMetaForResource(observation);
253254
when(confidentialityService.generateConfidentialityCode(observation))
254-
.thenReturn(Optional.of(NOPAT_CONFIDENTIALITY_CODE));
255+
.thenReturn(Optional.of(NOPAT_HL7_CONFIDENTIALITY_CODE));
255256

256257
final String actualXml = observationMapper.mapObservationToCompoundStatement(observation);
257258

@@ -268,18 +269,19 @@ void When_MappingTestResult_With_NoscrubMetaSecurity_Expect_ConfidentialityCodeN
268269

269270
final String actualXml = observationMapper.mapObservationToCompoundStatement(observation);
270271

271-
assertThat(actualXml).doesNotContainIgnoringCase(NOPAT_CONFIDENTIALITY_CODE);
272+
assertThat(actualXml).doesNotContainIgnoringCase(NOPAT_HL7_CONFIDENTIALITY_CODE);
272273
}
273274

274275
@Test
275276
void When_MappingFilingComment_With_NopatMetaSecurity_Expect_ConfidentialityCodeWithinNarrativeStatement()
276277
throws XPathExpressionException, IOException, ParserConfigurationException, SAXException {
277278
final Observation observation = getObservationResourceFromJson(OBSERVATION_FILING_COMMENT_JSON);
278-
final String xPath = "/component/NarrativeStatement/confidentialityCode";
279+
final String xPath = "/component/NarrativeStatement/" + ConfidentialityCodeUtility
280+
.getNopatConfidentialityCodeXpathSegment();
279281

280282
ConfidentialityCodeUtility.appendNopatSecurityToMetaForResource(observation);
281283
when(confidentialityService.generateConfidentialityCode(observation))
282-
.thenReturn(Optional.of(NOPAT_CONFIDENTIALITY_CODE));
284+
.thenReturn(Optional.of(NOPAT_HL7_CONFIDENTIALITY_CODE));
283285

284286
final String actualXml = observationMapper.mapObservationToCompoundStatement(observation);
285287

@@ -296,7 +298,7 @@ void When_MappingFilingComment_With_NopatMetaSecurity_Expect_ConfidentialityCode
296298

297299
final String actualXml = observationMapper.mapObservationToCompoundStatement(observation);
298300

299-
assertThat(actualXml).doesNotContainIgnoringCase(NOPAT_CONFIDENTIALITY_CODE);
301+
assertThat(actualXml).doesNotContainIgnoringCase(NOPAT_HL7_CONFIDENTIALITY_CODE);
300302
}
301303

302304
private String getXmlStringFromFile(String filename) {

service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/diagnosticreport/SpecimenMapperTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.mockito.ArgumentMatchers.any;
66
import static org.mockito.Mockito.lenient;
77
import static org.mockito.Mockito.when;
8+
import static uk.nhs.adaptors.gp2gp.utils.ConfidentialityCodeUtility.NOPAT_HL7_CONFIDENTIALITY_CODE;
89

910
import java.util.Collections;
1011
import java.util.List;
@@ -51,7 +52,6 @@ class SpecimenMapperTest {
5152
private static final String INPUT_OBSERVATION_RELATED_TO_SPECIMEN = "input-observation-related-to-specimen.json";
5253
private static final String INPUT_OBSERVATION_NOT_RELATED_TO_SPECIMEN = "input-observation-not-related-to-specimen.json";
5354
private static final String TEST_ID = "5E496953-065B-41F2-9577-BE8F2FBD0757";
54-
private static final String NOPAT_CONFIDENTIALITY_CODE = ConfidentialityCodeUtility.getNopatHl7v3ConfidentialityCode();
5555
private static final String ID_FROM_ID_MAPPER = "some-id";
5656
private static final DiagnosticReport DIAGNOSTIC_REPORT = new DiagnosticReport().setIssuedElement(
5757
new InstantType(DIAGNOSTIC_REPORT_DATE)
@@ -166,15 +166,15 @@ void When_MappingSpecimen_With_NopatMetaSecurity_Expect_ConfidentialityCodeWithi
166166
ConfidentialityCodeUtility.appendNopatSecurityToMetaForResource(specimen);
167167

168168
when(confidentialityService.generateConfidentialityCode(specimen))
169-
.thenReturn(Optional.of(NOPAT_CONFIDENTIALITY_CODE));
169+
.thenReturn(Optional.of(NOPAT_HL7_CONFIDENTIALITY_CODE));
170170
when(idMapper.getOrNew(any(ResourceType.class), any(IdType.class)))
171171
.thenReturn(ID_FROM_ID_MAPPER);
172172

173173
final String result = specimenMapper.mapSpecimenToCompoundStatement(specimen,
174174
Collections.emptyList(), DIAGNOSTIC_REPORT);
175175

176176
assertAll(
177-
() -> assertThat(result).contains(NOPAT_CONFIDENTIALITY_CODE),
177+
() -> assertThat(result).contains(NOPAT_HL7_CONFIDENTIALITY_CODE),
178178
() -> assertThat(ConfidentialityCodeUtility.getSecurityCodeFromResource(specimen)).isEqualTo("NOPAT")
179179
);
180180
}
@@ -194,7 +194,7 @@ void When_MappingSpecimen_With_NoscrubMetaSecurity_Expect_ConfidentialityCodeWit
194194
Collections.emptyList(), DIAGNOSTIC_REPORT);
195195

196196
assertAll(
197-
() -> assertThat(result).doesNotContain(NOPAT_CONFIDENTIALITY_CODE),
197+
() -> assertThat(result).doesNotContain(NOPAT_HL7_CONFIDENTIALITY_CODE),
198198
() -> assertThat(ConfidentialityCodeUtility.getSecurityCodeFromResource(specimen)).isEqualTo("NOSCRUB")
199199
);
200200
}

0 commit comments

Comments
 (0)