Skip to content

Commit 49dd7e8

Browse files
committed
the endpoint returns operationOutcome populated with more information
1 parent b8e0173 commit 49dd7e8

File tree

2 files changed

+80
-8
lines changed

2 files changed

+80
-8
lines changed

service/src/intTest/java/uk/nhs/adaptors/gp2gp/ehr/EhrResendControllerTest.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package uk.nhs.adaptors.gp2gp.ehr;
22

3+
import org.hl7.fhir.dstu3.model.CodeableConcept;
4+
import org.hl7.fhir.dstu3.model.Coding;
5+
import org.hl7.fhir.dstu3.model.Meta;
36
import org.hl7.fhir.dstu3.model.OperationOutcome;
7+
import org.hl7.fhir.dstu3.model.UriType;
48
import org.junit.jupiter.api.Test;
59
import org.junit.jupiter.api.extension.ExtendWith;
610
import org.mockito.junit.jupiter.MockitoExtension;
@@ -15,24 +19,28 @@
1519

1620
import java.time.Duration;
1721
import java.time.Instant;
22+
import java.util.Collections;
1823
import java.util.List;
1924
import java.util.UUID;
2025

2126
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.hl7.fhir.dstu3.model.OperationOutcome.IssueType;
2228
import static uk.nhs.adaptors.gp2gp.ehr.EhrStatusConstants.INCUMBENT_NACK_CODE;
2329
import static uk.nhs.adaptors.gp2gp.ehr.EhrStatusConstants.INCUMBENT_NACK_DISPLAY;
2430

25-
2631
@SpringBootTest
2732
@DirtiesContext
2833
@ExtendWith({SpringExtension.class, MongoDBExtension.class, ActiveMQExtension.class, MockitoExtension.class})
2934
public class EhrResendControllerTest {
3035

3136
public static final Instant NOW = Instant.parse("2024-01-01T10:00:00Z");
3237
private static final Instant FIVE_DAYS_AGO = NOW.minus(Duration.ofDays(5));
38+
private static final String URI_TYPE = "https://fhir.nhs.uk/STU3/StructureDefinition/GPConnect-OperationOutcome-1";
39+
private static final String CONVERSATION_ID = "123-456";
3340

3441
@Autowired
3542
private EhrExtractStatusRepository ehrExtractStatusRepository;
43+
3644
@Autowired
3745
private EhrResendController ehrResendController;
3846

@@ -41,7 +49,8 @@ public void When_AnEhrExtractHasFailed_Expect_RespondsWith202() {
4149

4250
String ehrMessageRef = generateRandomUppercaseUUID();
4351
var ehrExtractStatus = new EhrExtractStatus();
44-
ehrExtractStatus.setConversationId("123-456");
52+
53+
ehrExtractStatus.setConversationId(CONVERSATION_ID);
4554
ehrExtractStatus.setEhrReceivedAcknowledgement(EhrExtractStatus.EhrReceivedAcknowledgement.builder()
4655
.conversationClosed(FIVE_DAYS_AGO)
4756
.errors(List.of(
@@ -56,24 +65,48 @@ public void When_AnEhrExtractHasFailed_Expect_RespondsWith202() {
5665

5766
ehrExtractStatusRepository.save(ehrExtractStatus);
5867

59-
var response = ehrResendController.scheduleEhrExtractResend("123-456");
68+
var response = ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
6069

6170
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.ACCEPTED);
6271
assertThat(response.getBody()).isNull();
6372
}
6473

6574
@Test
6675
public void When_AnEhrExtractDoesNotExist_Expect_RespondsWith404() {
67-
var response = ehrResendController.scheduleEhrExtractResend("123-456");
76+
77+
var details = new CodeableConcept();
78+
var codeableConceptCoding = new Coding();
79+
codeableConceptCoding.setSystem("http://fhir.nhs.net/ValueSet/gpconnect-error-or-warning-code-1");
80+
codeableConceptCoding.setCode("INVALID_IDENTIFIER_VALUE");
81+
details.setCoding(List.of(codeableConceptCoding));
82+
var diagnostics = "Provide a conversationId that exists and retry the operation";
83+
84+
var operationOutcome = createOperationOutcome(IssueType.VALUE, OperationOutcome.IssueSeverity.ERROR, details, diagnostics);
85+
86+
var response = ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
6887

6988
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
70-
// TODO: Add more detail to OperationOutcome
71-
assertThat(response.getBody()).usingRecursiveComparison().isEqualTo(new OperationOutcome());
89+
90+
assertThat(response.getBody()).usingRecursiveComparison().isEqualTo(operationOutcome);
7291
}
7392

7493
private String generateRandomUppercaseUUID() {
7594
return UUID.randomUUID().toString().toUpperCase();
7695
}
7796

97+
public static OperationOutcome createOperationOutcome(
98+
OperationOutcome.IssueType type, OperationOutcome.IssueSeverity severity, CodeableConcept details, String diagnostics) {
99+
var operationOutcome = new OperationOutcome();
100+
Meta meta = new Meta();
101+
meta.setProfile(Collections.singletonList(new UriType(URI_TYPE)));
102+
operationOutcome.setMeta(meta);
103+
operationOutcome.addIssue()
104+
.setCode(type)
105+
.setSeverity(severity)
106+
.setDetails(details)
107+
.setDiagnostics(diagnostics);
108+
return operationOutcome;
109+
}
110+
78111

79112
}
Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package uk.nhs.adaptors.gp2gp.ehr;
22

33
import lombok.AllArgsConstructor;
4+
import org.hl7.fhir.dstu3.model.CodeableConcept;
5+
import org.hl7.fhir.dstu3.model.Coding;
6+
import org.hl7.fhir.dstu3.model.Meta;
47
import org.hl7.fhir.dstu3.model.OperationOutcome;
8+
import org.hl7.fhir.dstu3.model.UriType;
59
import org.springframework.beans.factory.annotation.Autowired;
610
import org.springframework.http.HttpStatus;
711
import org.springframework.http.ResponseEntity;
@@ -11,20 +15,55 @@
1115
import org.springframework.web.bind.annotation.RestController;
1216
import uk.nhs.adaptors.gp2gp.ehr.model.EhrExtractStatus;
1317

18+
import java.util.Collections;
19+
import java.util.List;
1420
import java.util.Optional;
1521

1622
@RestController
1723
@AllArgsConstructor(onConstructor = @__(@Autowired))
1824
@RequestMapping(path = "/ehr-resend")
1925
public class EhrResendController {
26+
27+
private static final String OPERATION_OUTCOME_URL = "https://fhir.nhs.uk/STU3/StructureDefinition/GPConnect-OperationOutcome-1";
28+
2029
private EhrExtractStatusRepository ehrExtractStatusRepository;
2130

2231
@PostMapping("/{conversationId}")
2332
public ResponseEntity<OperationOutcome> scheduleEhrExtractResend(@PathVariable String conversationId) {
2433
Optional<EhrExtractStatus> ehrExtractStatus = ehrExtractStatusRepository.findByConversationId(conversationId);
2534

26-
return ehrExtractStatus.map(e -> new ResponseEntity<OperationOutcome>(HttpStatus.ACCEPTED))
27-
.orElse(new ResponseEntity<>(new OperationOutcome(), HttpStatus.NOT_FOUND));
35+
if (ehrExtractStatus.isEmpty()) {
36+
var details = new CodeableConcept();
37+
var codeableConceptCoding = new Coding();
38+
codeableConceptCoding.setSystem("http://fhir.nhs.net/ValueSet/gpconnect-error-or-warning-code-1");
39+
codeableConceptCoding.setCode("INVALID_IDENTIFIER_VALUE");
40+
details.setCoding(List.of(codeableConceptCoding));
41+
var diagnostics = "Provide a conversationId that exists and retry the operation";
42+
43+
var operationOutcome = createOperationOutcome(OperationOutcome.IssueType.VALUE,
44+
OperationOutcome.IssueSeverity.ERROR,
45+
details,
46+
diagnostics);
47+
48+
return new ResponseEntity<>(operationOutcome, HttpStatus.NOT_FOUND);
49+
}
50+
51+
return new ResponseEntity<>(HttpStatus.ACCEPTED);
52+
53+
}
54+
55+
public static OperationOutcome createOperationOutcome(
56+
OperationOutcome.IssueType type, OperationOutcome.IssueSeverity severity, CodeableConcept details, String diagnostics) {
57+
var operationOutcome = new OperationOutcome();
58+
Meta meta = new Meta();
59+
meta.setProfile(Collections.singletonList(new UriType(OPERATION_OUTCOME_URL)));
60+
operationOutcome.setMeta(meta);
61+
operationOutcome.addIssue()
62+
.setCode(type)
63+
.setSeverity(severity)
64+
.setDetails(details)
65+
.setDiagnostics(diagnostics);
66+
return operationOutcome;
2867
}
2968

3069
}

0 commit comments

Comments
 (0)