33import com .fasterxml .jackson .core .JsonProcessingException ;
44import com .fasterxml .jackson .databind .JsonNode ;
55import com .fasterxml .jackson .databind .ObjectMapper ;
6+ import org .jetbrains .annotations .NotNull ;
67import org .junit .jupiter .api .BeforeEach ;
78import org .junit .jupiter .api .Test ;
89import org .junit .jupiter .api .extension .ExtendWith ;
1617import uk .nhs .adaptors .gp2gp .common .service .TimestampService ;
1718import uk .nhs .adaptors .gp2gp .common .task .TaskDispatcher ;
1819import uk .nhs .adaptors .gp2gp .ehr .model .EhrExtractStatus ;
20+ import uk .nhs .adaptors .gp2gp .ehr .status .controller .EhrStatusController ;
21+ import uk .nhs .adaptors .gp2gp .ehr .status .service .EhrStatusService ;
1922import uk .nhs .adaptors .gp2gp .gpc .GetGpcStructuredTaskDefinition ;
2023
2124import java .time .Duration ;
3134import static org .mockito .Mockito .times ;
3235import static org .mockito .Mockito .verify ;
3336import static org .mockito .Mockito .when ;
37+ import static uk .nhs .adaptors .gp2gp .ehr .status .model .MigrationStatus .IN_PROGRESS ;
3438
3539@ ExtendWith (MockitoExtension .class )
3640class EhrResendControllerTest {
@@ -46,6 +50,11 @@ class EhrResendControllerTest {
4650 private static final String FROM_ASID_CODE = "test-from-asid" ;
4751 private static final String INCUMBENT_NACK_CODE = "99" ;
4852 private static final String INCUMBENT_NACK_DISPLAY = "Unexpected condition." ;
53+ public static final List <EhrExtractStatus .EhrReceivedAcknowledgement .ErrorDetails > EHR_RECEIVED_ACK_ERROR_DETAILS = List .of (
54+ EhrExtractStatus .EhrReceivedAcknowledgement .ErrorDetails .builder ()
55+ .code (INCUMBENT_NACK_CODE )
56+ .display (INCUMBENT_NACK_DISPLAY )
57+ .build ());
4958 private static final String PRECONDITION_FAILED = "PRECONDITION_FAILED" ;
5059 private static final String GPCONNECT_ERROR_OR_WARNING_CODE = "https://fhir.nhs.uk/STU3/ValueSet/Spine-ErrorOrWarningCode-1" ;
5160 private static final String INVALID_IDENTIFIER_VALUE = "INVALID_IDENTIFIER_VALUE" ;
@@ -67,6 +76,8 @@ class EhrResendControllerTest {
6776 private TaskDispatcher taskDispatcher ;
6877
6978 private EhrResendController ehrResendController ;
79+ private EhrStatusController ehrStatusController ;
80+ private EhrStatusService ehrStatusService ;
7081
7182
7283 @ BeforeEach
@@ -79,27 +90,14 @@ void setUp() {
7990 randomIdGeneratorService ,
8091 timestampService ,
8192 fhirParseService );
93+ ehrStatusService = new EhrStatusService (ehrExtractStatusRepository );
94+ ehrStatusController = new EhrStatusController (ehrStatusService );
8295 }
8396
8497 @ Test
8598 void When_AnEhrExtractHasFailed_Expect_GetGpcStructuredTaskScheduledAndEhrExtractStatusIsReset () {
8699
87- String ehrMessageRef = generateRandomUppercaseUUID ();
88- var ehrExtractStatus = new EhrExtractStatus ();
89-
90- ehrExtractStatus .setConversationId (CONVERSATION_ID );
91- ehrExtractStatus .setEhrReceivedAcknowledgement (EhrExtractStatus .EhrReceivedAcknowledgement .builder ()
92- .conversationClosed (FIVE_DAYS_AGO )
93- .errors (List .of (
94- EhrExtractStatus .EhrReceivedAcknowledgement .ErrorDetails .builder ()
95- .code (INCUMBENT_NACK_CODE )
96- .display (INCUMBENT_NACK_DISPLAY )
97- .build ()))
98- .messageRef (ehrMessageRef )
99- .received (FIVE_DAYS_AGO )
100- .rootId (generateRandomUppercaseUUID ())
101- .build ());
102- ehrExtractStatus .setEhrRequest (EhrExtractStatus .EhrRequest .builder ().nhsNumber (NHS_NUMBER ).build ());
100+ var ehrExtractStatus = getEhrExtractStatus (EHR_RECEIVED_ACK_ERROR_DETAILS );
103101 ehrExtractStatus .setEhrExtractCorePending (EhrExtractStatus .EhrExtractCorePending .builder ().build ());
104102 ehrExtractStatus .setEhrContinue (EhrExtractStatus .EhrContinue .builder ().build ());
105103 ehrExtractStatus .setGpcAccessDocument (EhrExtractStatus .GpcAccessDocument .builder ().build ());
@@ -153,22 +151,7 @@ void When_AnEhrExtractIsStillInProgress_Expect_FailedOperationOutcome() throws J
153151 @ Test
154152 void When_AnEhrExtractHasFailed_Expect_RespondsWith202 () {
155153
156- String ehrMessageRef = generateRandomUppercaseUUID ();
157- var ehrExtractStatus = new EhrExtractStatus ();
158-
159- ehrExtractStatus .setConversationId (CONVERSATION_ID );
160- ehrExtractStatus .setEhrReceivedAcknowledgement (EhrExtractStatus .EhrReceivedAcknowledgement .builder ()
161- .conversationClosed (FIVE_DAYS_AGO )
162- .errors (List .of (
163- EhrExtractStatus .EhrReceivedAcknowledgement .ErrorDetails .builder ()
164- .code (INCUMBENT_NACK_CODE )
165- .display (INCUMBENT_NACK_DISPLAY )
166- .build ()))
167- .messageRef (ehrMessageRef )
168- .received (FIVE_DAYS_AGO )
169- .rootId (generateRandomUppercaseUUID ())
170- .build ());
171- ehrExtractStatus .setEhrRequest (EhrExtractStatus .EhrRequest .builder ().nhsNumber (NHS_NUMBER ).build ());
154+ var ehrExtractStatus = getEhrExtractStatus (EHR_RECEIVED_ACK_ERROR_DETAILS );
172155
173156 when (ehrExtractStatusRepository .findByConversationId (CONVERSATION_ID )).thenReturn (Optional .of (ehrExtractStatus ));
174157
@@ -183,17 +166,7 @@ void When_AnEhrExtractHasFailed_Expect_RespondsWith202() {
183166 @ Test
184167 void When_AnEhrExtractHasAPositiveAcknowledgement_Expect_FailedOperationOutcome () throws JsonProcessingException {
185168
186- String ehrMessageRef = generateRandomUppercaseUUID ();
187- var ehrExtractStatus = new EhrExtractStatus ();
188- ehrExtractStatus .setConversationId (CONVERSATION_ID );
189- ehrExtractStatus .setEhrReceivedAcknowledgement (EhrExtractStatus .EhrReceivedAcknowledgement .builder ()
190- .conversationClosed (FIVE_DAYS_AGO )
191- .errors (List .of ())
192- .messageRef (ehrMessageRef )
193- .received (FIVE_DAYS_AGO )
194- .rootId (generateRandomUppercaseUUID ())
195- .build ());
196- ehrExtractStatus .setEhrRequest (EhrExtractStatus .EhrRequest .builder ().nhsNumber (NHS_NUMBER ).build ());
169+ var ehrExtractStatus = getEhrExtractStatus (List .of ());
197170
198171 when (ehrExtractStatusRepository .findByConversationId (CONVERSATION_ID )).thenReturn (Optional .of (ehrExtractStatus ));
199172
@@ -224,6 +197,42 @@ void When_AnEhrExtractDoesNotExist_Expect_RespondsWith404() throws JsonProcessin
224197 );
225198 }
226199
200+ @ Test
201+ void When_ResendingTransfer_Expect_EhrStatusInProgressStatus () {
202+
203+ var ehrExtractStatus = getEhrExtractStatus (EHR_RECEIVED_ACK_ERROR_DETAILS );
204+ ehrExtractStatus .setEhrExtractCorePending (EhrExtractStatus .EhrExtractCorePending .builder ().build ());
205+ ehrExtractStatus .setEhrContinue (EhrExtractStatus .EhrContinue .builder ().build ());
206+ ehrExtractStatus .setGpcAccessDocument (EhrExtractStatus .GpcAccessDocument .builder ().build ());
207+
208+ when (ehrExtractStatusRepository .findByConversationId (CONVERSATION_ID )).thenReturn (Optional .of (ehrExtractStatus ));
209+
210+ Instant now = Instant .now ().truncatedTo (ChronoUnit .MILLIS );
211+ when (timestampService .now ()).thenReturn (now );
212+
213+ ehrResendController .scheduleEhrExtractResend (CONVERSATION_ID );
214+ var ehrStatus = ehrStatusController .getEhrStatus (CONVERSATION_ID );
215+
216+ assertEquals (IN_PROGRESS , ehrStatus .getBody ().getMigrationStatus ());
217+ }
218+
219+ private @ NotNull EhrExtractStatus getEhrExtractStatus (List <EhrExtractStatus .EhrReceivedAcknowledgement .ErrorDetails > errors ) {
220+
221+ String ehrMessageRef = generateRandomUppercaseUUID ();
222+ var ehrExtractStatus = new EhrExtractStatus ();
223+
224+ ehrExtractStatus .setConversationId (CONVERSATION_ID );
225+ ehrExtractStatus .setEhrReceivedAcknowledgement (EhrExtractStatus .EhrReceivedAcknowledgement .builder ()
226+ .conversationClosed (FIVE_DAYS_AGO )
227+ .errors (errors )
228+ .messageRef (ehrMessageRef )
229+ .received (FIVE_DAYS_AGO )
230+ .rootId (generateRandomUppercaseUUID ())
231+ .build ());
232+ ehrExtractStatus .setEhrRequest (EhrExtractStatus .EhrRequest .builder ().nhsNumber (NHS_NUMBER ).build ());
233+ return ehrExtractStatus ;
234+ }
235+
227236 private void assertResponseHasExpectedOperationOutcome (JsonNode rootNode , String serverErrMsg ,
228237 String diagnosticsMsg , String issueCode ) {
229238 var coding = rootNode .path ("issue" ).get (0 ).path ("details" ).path ("coding" ).get (0 );
0 commit comments