From 5345dba8edb261206505bfed883ce58dbef1545e Mon Sep 17 00:00:00 2001 From: MartinWheelerMT Date: Tue, 7 Oct 2025 17:50:35 +0100 Subject: [PATCH 1/3] Address issue with flaky test * Move SendContinueHandlerFailure test to its own class. * Move now shared methods into base class. * Add `TestConfiguration` to new test class to ensure that the mock is fully created before wiring. --- .../amqp/SendContinueHandlerFailureIT.java | 56 +++++++++++++++++++ .../pss/translator/amqp/ServiceFailureIT.java | 30 +--------- .../nhs/adaptors/pss/util/BaseEhrHandler.java | 9 +++ 3 files changed, 66 insertions(+), 29 deletions(-) create mode 100644 gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/SendContinueHandlerFailureIT.java diff --git a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/SendContinueHandlerFailureIT.java b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/SendContinueHandlerFailureIT.java new file mode 100644 index 000000000..b5adcd9d7 --- /dev/null +++ b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/SendContinueHandlerFailureIT.java @@ -0,0 +1,56 @@ +package uk.nhs.adaptors.pss.translator.amqp; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.test.annotation.DirtiesContext; +import uk.nhs.adaptors.pss.translator.exception.MhsServerErrorException; +import uk.nhs.adaptors.pss.translator.task.SendContinueRequestHandler; +import uk.nhs.adaptors.pss.util.BaseEhrHandler; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import static uk.nhs.adaptors.common.enums.MigrationStatus.EHR_GENERAL_PROCESSING_ERROR; + +@SpringBootTest(webEnvironment = RANDOM_PORT) +@AutoConfigureMockMvc +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") +public class SendContinueHandlerFailureIT extends BaseEhrHandler { + public static final String JSON_LARGE_MESSAGE_SCENARIO_3_UK_06_JSON = "/json/LargeMessage/Scenario_3/uk06.json"; + + @TestConfiguration + static class MockedBeansConfig { + @Bean + public SendContinueRequestHandler sendContinueRequestHandler() { + return Mockito.mock(SendContinueRequestHandler.class); + } + } + + @Autowired + private SendContinueRequestHandler sendContinueRequestHandler; + + @Test + public void When_ReceivingEhrExtract_WithMhsOutboundServerError_Expect_MigrationHasProcessingError() { + doThrow(MhsServerErrorException.class) + .when(sendContinueRequestHandler).prepareAndSendRequest(any()); + + sendInboundMessageToQueue(JSON_LARGE_MESSAGE_SCENARIO_3_UK_06_JSON); + + await().until(() -> hasMigrationStatus(EHR_GENERAL_PROCESSING_ERROR, getConversationId())); + + verify(sendContinueRequestHandler, times(1)).prepareAndSendRequest(any()); + + assertThat(getCurrentMigrationStatus(getConversationId())) + .isEqualTo(EHR_GENERAL_PROCESSING_ERROR); + } +} diff --git a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java index 897ff8d76..886519ccb 100644 --- a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java +++ b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java @@ -17,7 +17,6 @@ import static uk.nhs.adaptors.common.enums.MigrationStatus.CONTINUE_REQUEST_ACCEPTED; import static uk.nhs.adaptors.common.enums.MigrationStatus.EHR_EXTRACT_REQUEST_ACCEPTED; import static uk.nhs.adaptors.common.enums.MigrationStatus.EHR_EXTRACT_REQUEST_ERROR; -import static uk.nhs.adaptors.common.enums.MigrationStatus.EHR_GENERAL_PROCESSING_ERROR; import static uk.nhs.adaptors.common.enums.MigrationStatus.ERROR_LRG_MSG_GENERAL_FAILURE; import static uk.nhs.adaptors.common.enums.MigrationStatus.REQUEST_RECEIVED; import static uk.nhs.adaptors.common.enums.QueueMessageType.TRANSFER_REQUEST; @@ -56,7 +55,6 @@ import uk.nhs.adaptors.pss.translator.exception.MhsServerErrorException; import uk.nhs.adaptors.pss.translator.service.MhsClientService; import uk.nhs.adaptors.pss.translator.task.SendACKMessageHandler; -import uk.nhs.adaptors.pss.translator.task.SendContinueRequestHandler; import uk.nhs.adaptors.pss.translator.task.SendNACKMessageHandler; import uk.nhs.adaptors.pss.util.BaseEhrHandler; import jakarta.jms.JMSException; @@ -67,6 +65,7 @@ @ExtendWith({SpringExtension.class, MockitoExtension.class}) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @AutoConfigureMockMvc +@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") public class ServiceFailureIT extends BaseEhrHandler { private static final String LOSING_ASID = "LOSING_ASID"; @@ -95,9 +94,6 @@ public class ServiceFailureIT extends BaseEhrHandler { @MockitoSpyBean private MhsClientService mhsClientService; - @MockitoSpyBean - private SendContinueRequestHandler sendContinueRequestHandler; - @MockitoSpyBean private SendACKMessageHandler sendACKMessageHandler; @MockitoSpyBean @@ -141,22 +137,6 @@ public void When_SendingInitialRequest_WithMhsOutboundServerError_Expect_Migrati .isEqualTo(EHR_EXTRACT_REQUEST_ERROR); } - @Test - public void When_ReceivingEhrExtract_WithMhsOutboundServerError_Expect_MigrationHasProcessingError() { - doThrow(MhsServerErrorException.class) - .when(sendContinueRequestHandler).prepareAndSendRequest(any()); - - sendInboundMessageToQueue(JSON_LARGE_MESSAGE_SCENARIO_3_UK_06_JSON); - - await().until(() -> hasMigrationStatus(EHR_GENERAL_PROCESSING_ERROR, getConversationId())); - - verify(sendContinueRequestHandler, times(1)) - .prepareAndSendRequest(any()); - - assertThat(getCurrentMigrationStatus(getConversationId())) - .isEqualTo(EHR_GENERAL_PROCESSING_ERROR); - } - @Test public void When_ReceivingCOPC_WithDataFormatExceptionError_Expect_MessageSentToDLQ() { doThrow(DataFormatException.class) @@ -381,14 +361,6 @@ private void dlqCleanUp() { } } - private boolean hasMigrationStatus(MigrationStatus migrationStatus, String conversationId) { - return migrationStatus.equals(getCurrentMigrationStatus(conversationId)); - } - - private MigrationStatus getCurrentMigrationStatus(String conversationId) { - return getMigrationStatusLogService().getLatestMigrationStatusLog(conversationId).getMigrationStatus(); - } - private void sendRequestToPssQueue(String conversationId, String patientNhsNumber) { getPatientMigrationRequestDao() diff --git a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/util/BaseEhrHandler.java b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/util/BaseEhrHandler.java index b592626f1..0fd2acf51 100644 --- a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/util/BaseEhrHandler.java +++ b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/util/BaseEhrHandler.java @@ -48,6 +48,7 @@ import uk.nhs.adaptors.pss.translator.mhs.model.InboundMessage; @Getter +@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") public abstract class BaseEhrHandler { public static final boolean OVERWRITE_EXPECTED_JSON = false; private static final String REQUEST_JOURNAL_PATH = "/__admin/requests"; @@ -195,6 +196,14 @@ protected boolean hasNackBeenSentWithCode(String code) { .contains(" getMhsRequestsForConversation() { var requestJournal = restTemplate.getForObject(mhsMockHost + REQUEST_JOURNAL_PATH, RequestJournal.class); From f29c311c2c11d06eb1a0157ec75ef8156e6b5094 Mon Sep 17 00:00:00 2001 From: MartinWheelerMT Date: Tue, 7 Oct 2025 19:33:36 +0100 Subject: [PATCH 2/3] * Address issue with flaky test --- .../uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java index 886519ccb..8ed364e8a 100644 --- a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java +++ b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java @@ -55,6 +55,7 @@ import uk.nhs.adaptors.pss.translator.exception.MhsServerErrorException; import uk.nhs.adaptors.pss.translator.service.MhsClientService; import uk.nhs.adaptors.pss.translator.task.SendACKMessageHandler; +import uk.nhs.adaptors.pss.translator.task.SendContinueRequestHandler; import uk.nhs.adaptors.pss.translator.task.SendNACKMessageHandler; import uk.nhs.adaptors.pss.util.BaseEhrHandler; import jakarta.jms.JMSException; @@ -95,6 +96,8 @@ public class ServiceFailureIT extends BaseEhrHandler { @MockitoSpyBean private MhsClientService mhsClientService; @MockitoSpyBean + private SendContinueRequestHandler sendContinueRequestHandler; + @MockitoSpyBean private SendACKMessageHandler sendACKMessageHandler; @MockitoSpyBean private SendNACKMessageHandler sendNACKMessageHandler; From 783a160f95739480da2b7a01ecfcbe4b579c3467 Mon Sep 17 00:00:00 2001 From: MartinWheelerMT Date: Wed, 8 Oct 2025 14:18:34 +0100 Subject: [PATCH 3/3] * Address issue with flaky test --- .../pss/translator/amqp/ServiceFailureIT.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java index 8ed364e8a..27def7ba0 100644 --- a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java +++ b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/amqp/ServiceFailureIT.java @@ -97,6 +97,7 @@ public class ServiceFailureIT extends BaseEhrHandler { private MhsClientService mhsClientService; @MockitoSpyBean private SendContinueRequestHandler sendContinueRequestHandler; + @MockitoSpyBean private SendACKMessageHandler sendACKMessageHandler; @MockitoSpyBean @@ -244,12 +245,12 @@ public void When_ReceivingCopc_WithMhsWebClientRequestException_Expect_Migration await().until(this::hasContinueMessageBeenReceived); doThrow(WebClientRequestException.class) - .doThrow(WebClientRequestException.class) - .doThrow(WebClientRequestException.class) - .doThrow(WebClientRequestException.class) - .doThrow(WebClientRequestException.class) - .doCallRealMethod() - .when(mhsClientService).send(any()); + .doThrow(WebClientRequestException.class) + .doThrow(WebClientRequestException.class) + .doThrow(WebClientRequestException.class) + .doThrow(WebClientRequestException.class) + .doCallRealMethod() + .when(mhsClientService).send(any()); sendInboundMessageToQueue(JSON_LARGE_MESSAGE_SCENARIO_3_COPC_JSON); @@ -271,8 +272,8 @@ public void When_ReceivingCopc_WithMhsWebClientResponseException_Expect_Migratio doThrow(webClientResponseException) .doThrow(webClientResponseException) .doThrow(webClientResponseException) - .doCallRealMethod() - .when(mhsClientService).send(any()); + .doCallRealMethod() + .when(mhsClientService).send(any()); sendInboundMessageToQueue(JSON_LARGE_MESSAGE_SCENARIO_3_COPC_JSON); @@ -399,4 +400,4 @@ private boolean hasContinueMessageBeenReceived() { var migrationStatusLog = getMigrationStatusLogService().getLatestMigrationStatusLog(getConversationId()); return CONTINUE_REQUEST_ACCEPTED.equals(migrationStatusLog.getMigrationStatus()); } -} +} \ No newline at end of file