Skip to content

Commit 996b2f6

Browse files
authored
NIAD-3371: Document Reference not marked with a Security Label (#1166)
* initial changes * adding a test scenario * fixing tests * changelog
1 parent 7d5e6c6 commit 996b2f6

4 files changed

Lines changed: 53 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file.
33

44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55

6+
## Unreleased
7+
8+
### Added
9+
* If a `ehrComposition` (which includes a `NarrativeStatement` with a reference to a document ) record includes a `confidentialityCode`,
10+
the `meta.security` field of the corresponding translated FHIR `DocumentReference` resource will now be [appropriately populated][nopat-docs].
11+
12+
613
## [3.1.0] - 2025-06-19
714

815
### Added

gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/mapper/DocumentReferenceMapper.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ private DocumentReference mapDocumentReference(RCMRMT030101UKNarrativeStatement
8888

8989
documentReference.addIdentifier(buildIdentifier(id, organization.getIdentifierFirstRep().getValue()));
9090
documentReference.setId(id);
91-
documentReference.setMeta(generateMeta(narrativeStatement));
91+
documentReference.setMeta(generateMeta(ehrComposition, narrativeStatement));
9292
documentReference.setStatus(DocumentReferenceStatus.CURRENT);
9393
documentReference.setType(getType(narrativeStatement));
9494
documentReference.setSubject(new Reference(patient));
@@ -115,14 +115,16 @@ private DocumentReference mapDocumentReference(RCMRMT030101UKNarrativeStatement
115115
return documentReference;
116116
}
117117

118-
private Meta generateMeta(RCMRMT030101UKNarrativeStatement narrativeStatement) {
118+
private Meta generateMeta(RCMRMT030101UKEhrComposition ehrComposition, RCMRMT030101UKNarrativeStatement narrativeStatement) {
119119
final RCMRMT030101UKExternalDocument externalDocument = narrativeStatement
120120
.getReference()
121121
.getFirst()
122122
.getReferredToExternalDocument();
123123

124124
return confidentialityService.createMetaAndAddSecurityIfConfidentialityCodesPresent(
125125
META_PROFILE,
126+
ehrComposition.getConfidentialityCode(),
127+
narrativeStatement.getConfidentialityCode(),
126128
externalDocument.getConfidentialityCode()
127129
);
128130
}

gp2gp-translator/src/test/java/uk/nhs/adaptors/pss/translator/mapper/DocumentReferenceMapperTest.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ class DocumentReferenceMapperTest {
8181
@InjectMocks
8282
private DocumentReferenceMapper documentReferenceMapper;
8383
@Captor
84-
private ArgumentCaptor<Optional<CV>> confidentialityCodeCaptor;
84+
private ArgumentCaptor<Optional<CV>> ehrCompositionCaptor;
85+
@Captor
86+
private ArgumentCaptor<Optional<CV>> narrativeStatementCaptor;
87+
@Captor
88+
private ArgumentCaptor<Optional<CV>> externalDocumentCaptor;
8589

8690
@BeforeEach
8791
void setup() {
@@ -98,8 +102,32 @@ void mapNarrativeStatementToDocumentReferenceWithValidData() {
98102
assertFullValidData(documentReference);
99103
}
100104

105+
@Test
106+
void mapNarrativeStatementToDocumentReferenceWithNopatSecurity() {
107+
108+
final Meta stubbedMeta = MetaUtil.getMetaFor(META_WITH_SECURITY, META_PROFILE);
109+
Mockito
110+
.lenient()
111+
.when(confidentialityService.createMetaAndAddSecurityIfConfidentialityCodesPresent(
112+
any(String.class), any(Optional.class), any(Optional.class), any(Optional.class))).thenReturn(stubbedMeta);
113+
114+
var ehrExtract = unmarshallEhrExtract("narrative_statement_has_referred_to_external_document_with_optional_data.xml");
115+
List<DocumentReference> documentReferences = documentReferenceMapper.mapResources(ehrExtract, createPatient(),
116+
getEncounterList(),
117+
AUTHOR_ORG,
118+
createAttachmentList());
119+
var documentReference = documentReferences.getFirst();
120+
121+
assertAll(
122+
() -> documentReferences.forEach(this::assertMetaHasSecurity),
123+
() -> assertOptionalValidData(documentReference)
124+
);
125+
126+
}
127+
101128
@Test
102129
void mapNarrativeStatementToDocumentReferenceWithOptionalData() {
130+
103131
var ehrExtract = unmarshallEhrExtract("narrative_statement_has_referred_to_external_document_with_optional_data.xml");
104132
List<DocumentReference> documentReferences = documentReferenceMapper.mapResources(ehrExtract, createPatient(),
105133
getEncounterList(), AUTHOR_ORG, createAttachmentList());
@@ -110,6 +138,7 @@ void mapNarrativeStatementToDocumentReferenceWithOptionalData() {
110138

111139
@Test
112140
void mapMultipleNarrativeStatementToDocumentReference() {
141+
113142
var ehrExtract = unmarshallEhrExtract("multiple_narrative_statements_has_referred_to_external_document.xml");
114143
List<DocumentReference> documentReferences = documentReferenceMapper.mapResources(ehrExtract, createPatient(),
115144
getEncounterList(), AUTHOR_ORG, createAttachmentList());
@@ -204,13 +233,15 @@ void When_NarrativeStatement_With_ExternalDocumentAndNopatConfidentialityCode_Ex
204233

205234
when(confidentialityService.createMetaAndAddSecurityIfConfidentialityCodesPresent(
206235
eq(META_PROFILE),
207-
confidentialityCodeCaptor.capture()
236+
ehrCompositionCaptor.capture(),
237+
narrativeStatementCaptor.capture(),
238+
externalDocumentCaptor.capture()
208239
)).thenReturn(META_WITH_SECURITY_ADDED);
209240

210241
final List<DocumentReference> documentReferences = documentReferenceMapper.mapResources(ehrExtract, createPatient(),
211242
getEncounterList(), AUTHOR_ORG, createAttachmentList());
212243

213-
final CV externalDocumentConfidentialityCode = confidentialityCodeCaptor
244+
final CV externalDocumentConfidentialityCode = externalDocumentCaptor
214245
.getValue()
215246
.orElseThrow(TestUtility.NoConfidentialityCodePresentException::new);
216247

@@ -227,14 +258,15 @@ void When_NarrativeStatement_With_ExternalDocumentAndNoConfidentialityCode_Expec
227258

228259
when(confidentialityService.createMetaAndAddSecurityIfConfidentialityCodesPresent(
229260
eq(META_PROFILE),
230-
confidentialityCodeCaptor.capture()
261+
ehrCompositionCaptor.capture(),
262+
narrativeStatementCaptor.capture(),
263+
externalDocumentCaptor.capture()
231264
)).thenReturn(META_WITHOUT_SECURITY_ADDED);
232265

233266
final List<DocumentReference> documentReferences = documentReferenceMapper.mapResources(ehrExtract, createPatient(),
234267
getEncounterList(), AUTHOR_ORG, createAttachmentList());
235268

236-
final Optional<CV> externalDocumentConfidentialityCode = confidentialityCodeCaptor
237-
.getValue();
269+
final Optional<CV> externalDocumentConfidentialityCode = externalDocumentCaptor.getValue();
238270

239271
assertAll(
240272
() -> documentReferences.forEach(this::assertMetaHasNoSecurity),
@@ -361,7 +393,9 @@ private void configureCommonStubs() {
361393

362394
Mockito.lenient().when(confidentialityService.createMetaAndAddSecurityIfConfidentialityCodesPresent(
363395
eq(META_PROFILE),
364-
confidentialityCodeCaptor.capture()
396+
ehrCompositionCaptor.capture(),
397+
narrativeStatementCaptor.capture(),
398+
externalDocumentCaptor.capture()
365399
)).thenReturn(MetaUtil.getMetaFor(META_WITHOUT_SECURITY, META_PROFILE));
366400
}
367401
}

gp2gp-translator/src/test/resources/xml/DocumentReference/narrative_statement_has_referred_to_external_document.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<ehrComposition classCode="COMPOSITION" moodCode="EVN">
1111
<id root="62A39454-299F-432E-993E-5A6232B4E099"/>
1212
<availabilityTime value="20190708143500"/>
13+
<confidentialityCode code="NOPAT" codeSystem="2.16.840.1.113883.4.642.3.47" displayName="no disclosure to patient, family or caregivers without attending provider&apos;s authorization"/>
1314
<author typeCode="AUT" contextControlCode="OP">
1415
<time value="20100114" />
1516
<agentRef classCode="AGNT">

0 commit comments

Comments
 (0)