Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import reactor.core.publisher.Mono;
import uk.nhs.adaptors.gpc.consumer.common.ResourceReader;
import uk.nhs.adaptors.gpc.consumer.gpc.exception.GpConnectException;
import uk.nhs.adaptors.gpc.consumer.sds.builder.SdsRequestBuilder;
import uk.nhs.adaptors.gpc.consumer.sds.configuration.SdsConfiguration;
import uk.nhs.adaptors.gpc.consumer.sds.exception.SdsException;
import uk.nhs.adaptors.gpc.consumer.testcontainers.WiremockExtension;
Expand Down Expand Up @@ -87,10 +88,10 @@ public class SdsClientComponentTest {
private WireMockServer wireMockServer;

@Autowired
private SdsConfiguration sdsConfiguration;
private SdsClient sdsClient;

@Autowired
private SdsClient sdsClient;
private SdsRequestBuilder sdsRequestBuilder;

@Value("classpath:sds/sds_endpoint_response.json")
private Resource sdsEndpointResponse;
Expand Down Expand Up @@ -184,7 +185,7 @@ private void stubSdsError(String path) {
public void callForGetAsidTest(String interactionId) {
wireMockServer.resetAll();

ReflectionTestUtils.setField(sdsClient, "supplierOdsCode", SUPPLIER_ODS_CODE);
ReflectionTestUtils.setField(sdsRequestBuilder, "supplierOdsCode", SUPPLIER_ODS_CODE);
stubSdsAsidOperation(interactionId, DEVICE, ResourceReader.asString(sdsDeviceResponse));

assertEquals(
Expand All @@ -195,25 +196,6 @@ public void callForGetAsidTest(String interactionId) {
wireMockServer.resetAll();
}

@ParameterizedTest
@NullSource
@ValueSource(strings = {"", " "})
public void callForGetAsidAndExpectExceptionWhenODSCodeIsNullTest(String emptyOrNullOdsCode) {
wireMockServer.resetAll();

ReflectionTestUtils.setField(sdsClient, "supplierOdsCode", null);

GpConnectException thrownGpConnectException
= assertThrows(GpConnectException.class,
() -> sdsClient.callForGetAsid(GET_STRUCTURED_INTERACTION, emptyOrNullOdsCode, X_CORRELATION_ID),
"Test is expected to throw an exception when ODS code is null"
);

assertTrue(thrownGpConnectException.getMessage().contains("Supplier ODS code variable must be defined"));

wireMockServer.resetAll();
}

@Test
public void When_SdsReturnsResult_Expect_AddressIsReturned() {
allInteractions.forEach(pair -> {
Expand Down Expand Up @@ -284,7 +266,7 @@ public void When_SdsDeviceReturnsNoResults_Expect_EmptyResultIsReturned() {
public void When_SdsConsumerAsidLookupReturnsNoResult_Expect_EmptyResultIsReturned() {
wireMockServer.resetAll();

ReflectionTestUtils.setField(sdsClient, "supplierOdsCode", SUPPLIER_ODS_CODE);
ReflectionTestUtils.setField(sdsRequestBuilder, "supplierOdsCode", SUPPLIER_ODS_CODE);
stubSdsAsidOperation(GET_STRUCTURED_INTERACTION, DEVICE, ResourceReader.asString(sdsNoResultResponse));

assertThatThrownBy(() -> sdsClient.callForGetAsid(GET_STRUCTURED_INTERACTION, FROM_ODS_CODE, X_CORRELATION_ID).block())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,25 @@ void When_SdsConfigurationDoesNotHaveOdsCodePopulated_Expect_ContextIsNotCreated
});
}

@Test
void When_SdsConfigurationDoesOdsCodePopulatedButIsWhitespaceOnly_Expect_ContextIsNotCreated() {
contextRunner
.withPropertyValues(
buildPropertyValue(URL, URL_VALUE),
buildPropertyValue(API_KEY, API_KEY_VALUE),
buildPropertyValue(SUPPLIER_ODS_CODE, " \t \n \r ")
)
.run(context -> {
assertThat(context).hasFailed();

var startupFailure = context.getStartupFailure();

assertThat(startupFailure)
.rootCause()
.hasMessageContaining("The environment variable(s) GPC_SUPPLIER_ODS_CODE must be provided.");
});
}

@Test
void When_SdsConfigurationHasMultipleValuesNotPopulated_Expect_ContextIsNotCreated() {
contextRunner
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.hl7.fhir.dstu3.model.Identifier;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec;

Expand Down Expand Up @@ -48,16 +47,15 @@ public class SdsClient {
private final IParser fhirParser;
private final SdsRequestBuilder sdsRequestBuilder;

@Value("${gpc-consumer.sds.supplierOdsCode}")
private String supplierOdsCode;


public Mono<String> callForGetAsid(String interactionId, String fromOdsCode, String correlationId) {
LOGGER.info(
"SDS lookup for consumer ASID (fromOdsCode={}, interactionId={}, correlationId={})",
fromOdsCode,
interactionId,
correlationId);
var sdsDeviceRequest = sdsRequestBuilder.buildAsDeviceAsidRequest(fromOdsCode, supplierOdsCode, interactionId, correlationId);
var sdsDeviceRequest = sdsRequestBuilder.buildAsDeviceAsidRequest(fromOdsCode, interactionId, correlationId);
return retrieveAsDeviceNhsSpineAsid(sdsDeviceRequest, LOOKUP_CONTEXT_CONSUMER_ASID);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.stereotype.Component;
Expand All @@ -15,7 +15,6 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import reactor.netty.http.client.HttpClient;
import uk.nhs.adaptors.gpc.consumer.gpc.exception.GpConnectException;
import uk.nhs.adaptors.gpc.consumer.sds.configuration.SdsConfiguration;
import uk.nhs.adaptors.gpc.consumer.web.RequestBuilderService;
import uk.nhs.adaptors.gpc.consumer.web.WebClientFilterService;
Expand All @@ -40,6 +39,9 @@ public class SdsRequestBuilder {
private final RequestBuilderService requestBuilderService;
private final WebClientFilterService webClientFilterService;

@Value("${gpc-consumer.sds.supplierOdsCode}")
private String supplierOdsCode;


public RequestHeadersSpec<?> buildEndpointRequest(String fromOdsCode, String correlationId, String interactionUrn) {
return buildMhsEndpointRequest(fromOdsCode, interactionUrn, correlationId);
Expand All @@ -59,20 +61,13 @@ private RequestHeadersSpec<? extends RequestHeadersSpec<?>> buildAsDeviceRequest
return buildClientFor(odsCode, interaction, correlationId, ENDPOINT_AS_DEVICE);
}

public RequestHeadersSpec<? extends RequestHeadersSpec<?>> buildAsDeviceAsidRequest(String odsCode, String supplierOdsCode,
String interaction, String correlationId) {
return buildAsidClientFor(odsCode, supplierOdsCode, interaction, correlationId);
}

@NotNull
private RequestHeadersSpec<? extends RequestHeadersSpec<?>> buildAsidClientFor(String consumerOrgOdsCode, String supplierOdsCode,
String interaction, String correlationId) {

if (StringUtils.isEmpty(supplierOdsCode)) {
LOGGER.error("Supplier ODS code is not configured — cannot build ASID lookup request");
throw new GpConnectException("Supplier ODS code variable must be defined");
}

public RequestHeadersSpec<? extends RequestHeadersSpec<?>> buildAsDeviceAsidRequest(
String consumerOrgOdsCode,
String interaction,
String correlationId
) {
LOGGER.debug("Building ASID Device request (consumerOdsCode={}, supplierOdsCode={}, interaction={})",
consumerOrgOdsCode, supplierOdsCode, interaction);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,13 @@ class SdsClientTest {
@BeforeEach
void setUp() {
sdsClient = new SdsClient(fhirParser, sdsRequestBuilder);
ReflectionTestUtils.setField(sdsClient, "supplierOdsCode", SUPPLIER_ODS_CODE);
ReflectionTestUtils.setField(sdsRequestBuilder, "supplierOdsCode", SUPPLIER_ODS_CODE);
}

@Test
@SuppressWarnings("unchecked")
void When_DeviceBundleContainsSpineAsid_Expect_CallForGetAsidReturnsAsid() {
when(sdsRequestBuilder.buildAsDeviceAsidRequest(FROM_ODS_CODE, SUPPLIER_ODS_CODE, INTERACTION_ID, CORRELATION_ID))
when(sdsRequestBuilder.buildAsDeviceAsidRequest(FROM_ODS_CODE, INTERACTION_ID, CORRELATION_ID))
.thenReturn(deviceRequest);
stubDeviceResponse(buildDeviceBundle(TEST_ASID));

Expand All @@ -87,7 +87,7 @@ void When_DeviceBundleContainsSpineAsid_Expect_CallForGetAsidReturnsAsid() {
@Test
@SuppressWarnings("unchecked")
void When_DeviceBundleHasNoEntries_Expect_CallForGetAsidErrors() {
when(sdsRequestBuilder.buildAsDeviceAsidRequest(FROM_ODS_CODE, SUPPLIER_ODS_CODE, INTERACTION_ID, CORRELATION_ID))
when(sdsRequestBuilder.buildAsDeviceAsidRequest(FROM_ODS_CODE, INTERACTION_ID, CORRELATION_ID))
.thenReturn(deviceRequest);
stubDeviceResponse(buildEmptyBundle());

Expand All @@ -100,7 +100,7 @@ void When_DeviceBundleHasNoEntries_Expect_CallForGetAsidErrors() {
@Test
@SuppressWarnings("unchecked")
void When_DeviceMissingSpineAsidIdentifier_Expect_CallForGetAsidErrors() {
when(sdsRequestBuilder.buildAsDeviceAsidRequest(FROM_ODS_CODE, SUPPLIER_ODS_CODE, INTERACTION_ID, CORRELATION_ID))
when(sdsRequestBuilder.buildAsDeviceAsidRequest(FROM_ODS_CODE, INTERACTION_ID, CORRELATION_ID))
.thenReturn(deviceRequest);
stubDeviceResponse(buildDeviceBundleWithWrongIdentifierSystem());

Expand Down Expand Up @@ -329,12 +329,6 @@ private String buildDeviceBundleWithWrongIdentifierSystem() {
return fhirParser.encodeResourceToString(bundle);
}

private String buildDeviceBundleWithoutIdentifier() {
var bundle = new Bundle();
bundle.addEntry().setResource(new Device());
return fhirParser.encodeResourceToString(bundle);
}

private String buildEndpointBundle(String address, String nhsMhsId) {
var bundle = new Bundle();
var endpoint = new Endpoint();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package uk.nhs.adaptors.gpc.consumer.sds.builder;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

Expand All @@ -9,7 +8,6 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
Expand All @@ -19,7 +17,6 @@

import io.netty.handler.ssl.SslContext;
import reactor.core.publisher.Mono;
import uk.nhs.adaptors.gpc.consumer.gpc.exception.GpConnectException;
import uk.nhs.adaptors.gpc.consumer.sds.configuration.SdsConfiguration;
import uk.nhs.adaptors.gpc.consumer.web.RequestBuilderService;
import uk.nhs.adaptors.gpc.consumer.web.WebClientFilterService;
Expand All @@ -36,7 +33,6 @@
class SdsRequestBuilderTest {

private static final String ODS_CODE = "A12345";
private static final String SUPPLIER_ODS_CODE = "SUPPLIER01";
private static final String CORRELATION_ID = "corr-id-001";
private static final String INTERACTION_ID = "urn:nhs:names:services:gpconnect:fhir:operation:gpc.getstructuredrecord-1";
private static final String SDS_URL = "https://sds.example.com";
Expand Down Expand Up @@ -71,18 +67,10 @@ void setUp() {
.thenReturn(ExchangeFilterFunction.ofResponseProcessor(Mono::just));
}

@ParameterizedTest
@NullAndEmptySource
void When_SupplierOdsCodeIsBlank_Expect_GpConnectException(String blankSupplierOdsCode) {
assertThatThrownBy(() -> sdsRequestBuilder.buildAsDeviceAsidRequest(ODS_CODE, blankSupplierOdsCode, INTERACTION_ID, CORRELATION_ID))
.isInstanceOf(GpConnectException.class)
.hasMessageContaining("Supplier ODS code variable must be defined");
}

@Test
void When_SupplierOdsCodeIsPresent_Expect_BuildAsDeviceAsidRequestReturnsRequest() {

var result = sdsRequestBuilder.buildAsDeviceAsidRequest(ODS_CODE, SUPPLIER_ODS_CODE, INTERACTION_ID, CORRELATION_ID);
var result = sdsRequestBuilder.buildAsDeviceAsidRequest(ODS_CODE, INTERACTION_ID, CORRELATION_ID);

assertNotNull(result);
}
Expand Down
Loading