Skip to content

Commit 1346972

Browse files
committed
converting integration tests into unit tests
1 parent 9cd5301 commit 1346972

File tree

2 files changed

+131
-73
lines changed

2 files changed

+131
-73
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package uk.nhs.adaptors.gp2gp.ehr;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.ExtendWith;
5+
import org.mockito.junit.jupiter.MockitoExtension;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.test.context.SpringBootTest;
8+
import org.springframework.boot.test.mock.mockito.MockBean;
9+
import org.springframework.test.annotation.DirtiesContext;
10+
import org.springframework.test.context.junit.jupiter.SpringExtension;
11+
import uk.nhs.adaptors.gp2gp.common.service.RandomIdGeneratorService;
12+
import uk.nhs.adaptors.gp2gp.common.service.TimestampService;
13+
import uk.nhs.adaptors.gp2gp.common.task.TaskDispatcher;
14+
import uk.nhs.adaptors.gp2gp.ehr.model.EhrExtractStatus;
15+
import uk.nhs.adaptors.gp2gp.gpc.GetGpcStructuredTaskDefinition;
16+
import uk.nhs.adaptors.gp2gp.testcontainers.ActiveMQExtension;
17+
import uk.nhs.adaptors.gp2gp.testcontainers.MongoDBExtension;
18+
19+
import java.time.Duration;
20+
import java.time.Instant;
21+
import java.time.temporal.ChronoUnit;
22+
import java.util.List;
23+
import java.util.UUID;
24+
25+
import static org.junit.jupiter.api.Assertions.assertEquals;
26+
import static org.junit.jupiter.api.Assertions.assertNull;
27+
import static org.mockito.Mockito.doReturn;
28+
import static org.mockito.Mockito.times;
29+
import static org.mockito.Mockito.verify;
30+
import static uk.nhs.adaptors.gp2gp.ehr.EhrStatusConstants.INCUMBENT_NACK_CODE;
31+
import static uk.nhs.adaptors.gp2gp.ehr.EhrStatusConstants.INCUMBENT_NACK_DISPLAY;
32+
33+
@SpringBootTest
34+
@DirtiesContext
35+
@ExtendWith({SpringExtension.class, MongoDBExtension.class, ActiveMQExtension.class, MockitoExtension.class})
36+
public class EhrResendControllerIT {
37+
38+
public static final Instant NOW = Instant.parse("2024-01-01T10:00:00Z");
39+
private static final Instant FIVE_DAYS_AGO = NOW.minus(Duration.ofDays(5));
40+
private static final String URI_TYPE = "https://fhir.nhs.uk/STU3/StructureDefinition/GPConnect-OperationOutcome-1";
41+
private static final String CONVERSATION_ID = "123-456";
42+
public static final String NHS_NUMBER = "12345";
43+
44+
@Autowired
45+
private EhrExtractStatusRepository ehrExtractStatusRepository;
46+
47+
@Autowired
48+
private EhrResendController ehrResendController;
49+
50+
@MockBean
51+
private RandomIdGeneratorService randomIdGeneratorService;
52+
53+
@MockBean
54+
private TaskDispatcher taskDispatcher;
55+
56+
@MockBean
57+
private TimestampService timestampService;
58+
59+
@Test
60+
public void When_AnEhrExtractHasFailed_Expect_GetGpcStructuredTaskScheduled() {
61+
62+
String ehrMessageRef = generateRandomUppercaseUUID();
63+
var ehrExtractStatus = new EhrExtractStatus();
64+
65+
ehrExtractStatus.setConversationId(CONVERSATION_ID);
66+
ehrExtractStatus.setEhrReceivedAcknowledgement(EhrExtractStatus.EhrReceivedAcknowledgement.builder()
67+
.conversationClosed(FIVE_DAYS_AGO)
68+
.errors(List.of(
69+
EhrExtractStatus.EhrReceivedAcknowledgement.ErrorDetails.builder()
70+
.code(INCUMBENT_NACK_CODE)
71+
.display(INCUMBENT_NACK_DISPLAY)
72+
.build()))
73+
.messageRef(ehrMessageRef)
74+
.received(FIVE_DAYS_AGO)
75+
.rootId(generateRandomUppercaseUUID())
76+
.build());
77+
ehrExtractStatus.setEhrRequest(EhrExtractStatus.EhrRequest.builder().nhsNumber(NHS_NUMBER).build());
78+
ehrExtractStatus.setEhrExtractCorePending(EhrExtractStatus.EhrExtractCorePending.builder().build());
79+
ehrExtractStatus.setEhrContinue(EhrExtractStatus.EhrContinue.builder().build());
80+
81+
ehrExtractStatusRepository.save(ehrExtractStatus);
82+
Instant now = Instant.now().truncatedTo(ChronoUnit.MILLIS);
83+
doReturn(now).when(timestampService).now();
84+
85+
ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
86+
87+
var updatedEhrExtractStatus = ehrExtractStatusRepository.findByConversationId(ehrExtractStatus.getConversationId());
88+
var taskDefinition = GetGpcStructuredTaskDefinition.getGetGpcStructuredTaskDefinition(randomIdGeneratorService, ehrExtractStatus);
89+
90+
verify(taskDispatcher, times(1)).createTask(taskDefinition);
91+
assertEquals(now, updatedEhrExtractStatus.get().getMessageTimestamp());
92+
assertNull(updatedEhrExtractStatus.get().getEhrExtractCorePending());
93+
assertNull(updatedEhrExtractStatus.get().getEhrContinue());
94+
assertNull(updatedEhrExtractStatus.get().getAckPending());
95+
assertNull(updatedEhrExtractStatus.get().getEhrReceivedAcknowledgement());
96+
}
97+
98+
private String generateRandomUppercaseUUID() {
99+
return UUID.randomUUID().toString().toUpperCase();
100+
}
101+
102+
}

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

Lines changed: 29 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,27 @@
77
import org.hl7.fhir.dstu3.model.UriType;
88
import org.junit.jupiter.api.Test;
99
import org.junit.jupiter.api.extension.ExtendWith;
10+
import org.mockito.InjectMocks;
11+
import org.mockito.Mock;
1012
import org.mockito.junit.jupiter.MockitoExtension;
11-
import org.springframework.beans.factory.annotation.Autowired;
12-
import org.springframework.boot.test.context.SpringBootTest;
13-
import org.springframework.boot.test.mock.mockito.MockBean;
1413
import org.springframework.http.HttpStatus;
15-
import org.springframework.test.annotation.DirtiesContext;
16-
import org.springframework.test.context.junit.jupiter.SpringExtension;
1714
import uk.nhs.adaptors.gp2gp.common.service.RandomIdGeneratorService;
1815
import uk.nhs.adaptors.gp2gp.common.service.TimestampService;
1916
import uk.nhs.adaptors.gp2gp.common.task.TaskDispatcher;
2017
import uk.nhs.adaptors.gp2gp.ehr.model.EhrExtractStatus;
21-
import uk.nhs.adaptors.gp2gp.gpc.GetGpcStructuredTaskDefinition;
22-
import uk.nhs.adaptors.gp2gp.testcontainers.ActiveMQExtension;
23-
import uk.nhs.adaptors.gp2gp.testcontainers.MongoDBExtension;
2418

2519
import java.time.Duration;
2620
import java.time.Instant;
27-
import java.time.temporal.ChronoUnit;
2821
import java.util.Collections;
2922
import java.util.List;
23+
import java.util.Optional;
3024
import java.util.UUID;
3125

3226
import static org.assertj.core.api.Assertions.assertThat;
33-
import static org.hl7.fhir.dstu3.model.OperationOutcome.IssueType;
34-
import static org.junit.jupiter.api.Assertions.assertEquals;
3527
import static org.junit.jupiter.api.Assertions.assertNull;
3628
import static org.mockito.Mockito.doReturn;
37-
import static org.mockito.Mockito.times;
38-
import static org.mockito.Mockito.verify;
39-
import static uk.nhs.adaptors.gp2gp.ehr.EhrStatusConstants.INCUMBENT_NACK_CODE;
40-
import static uk.nhs.adaptors.gp2gp.ehr.EhrStatusConstants.INCUMBENT_NACK_DISPLAY;
41-
42-
@SpringBootTest
43-
@DirtiesContext
44-
@ExtendWith({SpringExtension.class, MongoDBExtension.class, ActiveMQExtension.class, MockitoExtension.class})
29+
30+
@ExtendWith(MockitoExtension.class)
4531
public class EhrResendControllerTest {
4632

4733
public static final Instant NOW = Instant.parse("2024-01-01T10:00:00Z");
@@ -51,21 +37,23 @@ public class EhrResendControllerTest {
5137
public static final String NHS_NUMBER = "12345";
5238
private static final String TO_ASID_CODE = "test-to-asid";
5339
private static final String FROM_ASID_CODE = "test-from-asid";
40+
public static final String INCUMBENT_NACK_CODE = "99";
41+
public static final String INCUMBENT_NACK_DISPLAY = "Unexpected condition.";
5442

55-
@Autowired
43+
@Mock
5644
private EhrExtractStatusRepository ehrExtractStatusRepository;
5745

58-
@Autowired
59-
private EhrResendController ehrResendController;
46+
@Mock
47+
private TimestampService timestampService;
6048

61-
@MockBean
49+
@Mock
6250
private RandomIdGeneratorService randomIdGeneratorService;
6351

64-
@MockBean
52+
@Mock
6553
private TaskDispatcher taskDispatcher;
6654

67-
@MockBean
68-
private TimestampService timestampService;
55+
@InjectMocks
56+
private EhrResendController ehrResendController;
6957

7058
@Test
7159
public void When_AnEhrExtractHasNotFailedAndAnotherResendRequestArrives_Expect_FailedOperationOutcome() {
@@ -84,9 +72,12 @@ public void When_AnEhrExtractHasNotFailedAndAnotherResendRequestArrives_Expect_F
8472
.ehrRequest(EhrExtractStatus.EhrRequest.builder().nhsNumber(NHS_NUMBER).toAsid(TO_ASID_CODE).fromAsid(FROM_ASID_CODE).build())
8573
.build();
8674

87-
ehrExtractStatusRepository.save(IN_PROGRESS_EXTRACT_STATUS);
75+
doReturn(Optional.of(IN_PROGRESS_EXTRACT_STATUS)).when(ehrExtractStatusRepository).findByConversationId(CONVERSATION_ID);
8876

89-
var operationOutcome = createOperationOutcome(IssueType.BUSINESSRULE, OperationOutcome.IssueSeverity.ERROR, details, diagnostics);
77+
var operationOutcome = createOperationOutcome(OperationOutcome.IssueType.BUSINESSRULE,
78+
OperationOutcome.IssueSeverity.ERROR,
79+
details,
80+
diagnostics);
9081

9182
var response = ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
9283

@@ -101,34 +92,6 @@ public void When_AnEhrExtractHasFailed_Expect_RespondsWith202() {
10192
String ehrMessageRef = generateRandomUppercaseUUID();
10293
var ehrExtractStatus = new EhrExtractStatus();
10394

104-
ehrExtractStatus.setConversationId(CONVERSATION_ID);
105-
ehrExtractStatus.setEhrReceivedAcknowledgement(EhrExtractStatus.EhrReceivedAcknowledgement.builder()
106-
.conversationClosed(FIVE_DAYS_AGO)
107-
.errors(List.of(
108-
EhrExtractStatus.EhrReceivedAcknowledgement.ErrorDetails.builder()
109-
.code(INCUMBENT_NACK_CODE)
110-
.display(INCUMBENT_NACK_DISPLAY)
111-
.build()))
112-
.messageRef(ehrMessageRef)
113-
.received(FIVE_DAYS_AGO)
114-
.rootId(generateRandomUppercaseUUID())
115-
.build());
116-
ehrExtractStatus.setEhrRequest(EhrExtractStatus.EhrRequest.builder().nhsNumber(NHS_NUMBER).build());
117-
118-
ehrExtractStatusRepository.save(ehrExtractStatus);
119-
120-
var response = ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
121-
122-
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.ACCEPTED);
123-
assertThat(response.getBody()).isNull();
124-
}
125-
126-
@Test
127-
public void When_AnEhrExtractHasFailed_Expect_GetGpcStructuredTaskScheduled() {
128-
129-
String ehrMessageRef = generateRandomUppercaseUUID();
130-
var ehrExtractStatus = new EhrExtractStatus();
131-
13295
ehrExtractStatus.setConversationId(CONVERSATION_ID);
13396
ehrExtractStatus.setEhrReceivedAcknowledgement(EhrExtractStatus.EhrReceivedAcknowledgement.builder()
13497
.conversationClosed(FIVE_DAYS_AGO)
@@ -142,24 +105,13 @@ public void When_AnEhrExtractHasFailed_Expect_GetGpcStructuredTaskScheduled() {
142105
.rootId(generateRandomUppercaseUUID())
143106
.build());
144107
ehrExtractStatus.setEhrRequest(EhrExtractStatus.EhrRequest.builder().nhsNumber(NHS_NUMBER).build());
145-
ehrExtractStatus.setEhrExtractCorePending(EhrExtractStatus.EhrExtractCorePending.builder().build());
146-
ehrExtractStatus.setEhrContinue(EhrExtractStatus.EhrContinue.builder().build());
147-
148-
ehrExtractStatusRepository.save(ehrExtractStatus);
149-
Instant now = Instant.now().truncatedTo(ChronoUnit.MILLIS);
150-
doReturn(now).when(timestampService).now();
151108

152-
ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
109+
doReturn(Optional.of(ehrExtractStatus)).when(ehrExtractStatusRepository).findByConversationId(CONVERSATION_ID);
153110

154-
var updatedEhrExtractStatus = ehrExtractStatusRepository.findByConversationId(ehrExtractStatus.getConversationId());
155-
var taskDefinition = GetGpcStructuredTaskDefinition.getGetGpcStructuredTaskDefinition(randomIdGeneratorService, ehrExtractStatus);
111+
var response = ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
156112

157-
verify(taskDispatcher, times(1)).createTask(taskDefinition);
158-
assertEquals(now, updatedEhrExtractStatus.get().getMessageTimestamp());
159-
assertNull(updatedEhrExtractStatus.get().getEhrExtractCorePending());
160-
assertNull(updatedEhrExtractStatus.get().getEhrContinue());
161-
assertNull(updatedEhrExtractStatus.get().getAckPending());
162-
assertNull(updatedEhrExtractStatus.get().getEhrReceivedAcknowledgement());
113+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.ACCEPTED);
114+
assertNull(response.getBody());
163115
}
164116

165117
@Test
@@ -172,7 +124,12 @@ public void When_AnEhrExtractDoesNotExist_Expect_RespondsWith404() {
172124
details.setCoding(List.of(codeableConceptCoding));
173125
var diagnostics = "Provide a conversationId that exists and retry the operation";
174126

175-
var operationOutcome = createOperationOutcome(IssueType.VALUE, OperationOutcome.IssueSeverity.ERROR, details, diagnostics);
127+
var operationOutcome = createOperationOutcome(OperationOutcome.IssueType.VALUE,
128+
OperationOutcome.IssueSeverity.ERROR,
129+
details,
130+
diagnostics);
131+
doReturn(Optional.empty()).when(ehrExtractStatusRepository).findByConversationId(CONVERSATION_ID);
132+
176133

177134
var response = ehrResendController.scheduleEhrExtractResend(CONVERSATION_ID);
178135

@@ -199,5 +156,4 @@ public static OperationOutcome createOperationOutcome(
199156
return operationOutcome;
200157
}
201158

202-
203159
}

0 commit comments

Comments
 (0)