diff --git a/apiTest/src/test/java/uk/gov/hmcts/cp/subscription/http/SubscriptionApiTest.java b/apiTest/src/test/java/uk/gov/hmcts/cp/subscription/http/SubscriptionApiTest.java index c84293cf..e278d70b 100644 --- a/apiTest/src/test/java/uk/gov/hmcts/cp/subscription/http/SubscriptionApiTest.java +++ b/apiTest/src/test/java/uk/gov/hmcts/cp/subscription/http/SubscriptionApiTest.java @@ -24,11 +24,11 @@ class SubscriptionApiTest { @Test void round_trip_subscription_should_work_ok() throws InterruptedException { - final String postUrl = String.format("%s/client-subscriptions", baseUrl); + final String callbackUrl = "https://my-callback-url"; + final String postUrl = String.format("%s/client-subscriptions?callbackUrl=%s", baseUrl, callbackUrl); final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - final String body = "{\"eventTypes\":[\"PRISON_COURT_REGISTER_GENERATED\",\"CUSTODIAL_RESULT\"],\n" + - "\"notificationEndpoint\":{\"webhookUrl\":\"https://my-callback-url\"}}"; + final String body = "{\"eventTypes\":[\"PRISON_COURT_REGISTER_GENERATED\",\"CUSTODIAL_RESULT\"]}"; final ResponseEntity postResult = http.exchange( postUrl, HttpMethod.POST, diff --git a/build.gradle b/build.gradle index 0ca40705..1632fdd6 100644 --- a/build.gradle +++ b/build.gradle @@ -30,10 +30,11 @@ apply { } dependencies { - implementation(group: 'uk.gov.hmcts.cp', name: 'api-cp-crime-hearing-case-event-subscription', version: '1.0.4') + implementation(group: 'uk.gov.hmcts.cp', name: 'api-cp-crime-hearing-case-event-subscription', version: '1.0.6') // This is proving to be a real puzzle. This is actually included in the api published pom // ( though with scope of "runtime" ) // Yet we still need to add it manually. Grrr. TBC. implementation "io.swagger.core.v3:swagger-annotations:2.2.41" + implementation("org.owasp.encoder:encoder:1.2.3") } diff --git a/src/main/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java b/src/main/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java index 2b3f13a5..2840b0a7 100644 --- a/src/main/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java +++ b/src/main/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java @@ -2,10 +2,12 @@ import feign.FeignException; import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.client.HttpClientErrorException; @@ -31,6 +33,14 @@ public ResponseEntity handleClientException(final HttpClientErrorExcepti .body(exception.getMessage()); } + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseEntity handleHttpMessageNotReadable(final HttpMessageNotReadableException exception) { + log.error("Invalid request body: {}", exception.getMessage()); + return ResponseEntity + .status(HttpStatus.BAD_REQUEST) + .body(""); + } + @ExceptionHandler(Exception.class) public ResponseEntity handleUnknownException(final Exception exception) { log.error("Exception {}", exception.getMessage()); @@ -50,4 +60,10 @@ public ResponseEntity handleFeignException(final FeignException ex) { .status(status) .body(ex.contentUTF8()); } + + @ExceptionHandler(ConstraintViolationException.class) + public ResponseEntity handleConstraintViolation(final ConstraintViolationException ex) { + log.error("Exception {}", ex.getMessage()); + return ResponseEntity.badRequest().build(); + } } \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/cp/subscription/controllers/NotificationController.java b/src/main/java/uk/gov/hmcts/cp/subscription/controllers/NotificationController.java index b0110ada..37964157 100644 --- a/src/main/java/uk/gov/hmcts/cp/subscription/controllers/NotificationController.java +++ b/src/main/java/uk/gov/hmcts/cp/subscription/controllers/NotificationController.java @@ -1,10 +1,10 @@ package uk.gov.hmcts.cp.subscription.controllers; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RestController; import uk.gov.hmcts.cp.openapi.api.NotificationApi; import uk.gov.hmcts.cp.openapi.model.PcrEventPayload; @@ -18,8 +18,7 @@ public class NotificationController implements NotificationApi { private final NotificationService notificationService; @Override - @Transactional - public ResponseEntity createNotificationPCR(final PcrEventPayload pcrEventPayload) { + public ResponseEntity createNotificationPCR(@Valid final PcrEventPayload pcrEventPayload) { notificationService.processPcrEvent(pcrEventPayload.getMaterialId()); return new ResponseEntity<>(HttpStatus.ACCEPTED); } diff --git a/src/main/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionController.java b/src/main/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionController.java index e3d706f0..62e139be 100644 --- a/src/main/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionController.java +++ b/src/main/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionController.java @@ -2,13 +2,16 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.owasp.encoder.Encode; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RestController; + import uk.gov.hmcts.cp.openapi.api.SubscriptionApi; import uk.gov.hmcts.cp.openapi.model.ClientSubscription; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; +import uk.gov.hmcts.cp.openapi.model.CreateClientSubscriptionRequest; import uk.gov.hmcts.cp.subscription.services.SubscriptionService; import java.util.UUID; @@ -24,16 +27,18 @@ public class SubscriptionController implements SubscriptionApi { @Override @Transactional - public ResponseEntity createClientSubscription(final ClientSubscriptionRequest request) { - log.info("createClientSubscription clientId:{}", CLIENT_ID); - final ClientSubscription response = subscriptionService.saveSubscription(request); + public ResponseEntity createClientSubscription(final String callbackUrl, + final CreateClientSubscriptionRequest request) { + log.info("createClientSubscription callbackUrl:{} clientId:{}", Encode.forJava(callbackUrl), CLIENT_ID); + final ClientSubscription response = subscriptionService.saveSubscription(callbackUrl, request); log.info("createClientSubscription created subscription:{}", response.getClientSubscriptionId()); return new ResponseEntity<>(response, HttpStatus.CREATED); } @Override @Transactional - public ResponseEntity updateClientSubscription(final UUID clientSubscriptionId, final ClientSubscriptionRequest request) { + public ResponseEntity updateClientSubscription(final UUID clientSubscriptionId, + final ClientSubscriptionRequest request) { log.info("updateClientSubscription clientSubscriptionId:{} clientId:{}", clientSubscriptionId, CLIENT_ID); final ClientSubscription response = subscriptionService.updateSubscription(clientSubscriptionId, request); return new ResponseEntity<>(response, HttpStatus.OK); @@ -54,4 +59,5 @@ public ResponseEntity deleteClientSubscription(final UUID clientSubscripti subscriptionService.deleteSubscription(clientSubscriptionId); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + } diff --git a/src/main/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapper.java b/src/main/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapper.java index 0444e216..8406505b 100644 --- a/src/main/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapper.java +++ b/src/main/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapper.java @@ -7,6 +7,7 @@ import org.mapstruct.NullValueMappingStrategy; import uk.gov.hmcts.cp.openapi.model.ClientSubscription; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; +import uk.gov.hmcts.cp.openapi.model.CreateClientSubscriptionRequest; import uk.gov.hmcts.cp.openapi.model.EventType; import uk.gov.hmcts.cp.openapi.model.NotificationEndpoint; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; @@ -24,10 +25,10 @@ public interface SubscriptionMapper { @Mapping(target = "id", expression = "java(null)") @Mapping(source = "request.eventTypes", target = "eventTypes", qualifiedByName = "mapWithSortedEventTypes") - @Mapping(source = "request.notificationEndpoint", target = "notificationEndpoint", qualifiedByName = "mapFromNotificationEndpoint") + @Mapping(target = "notificationEndpoint", expression = "java(callbackUrl)") @Mapping(target = "createdAt", expression = "java(clockService.nowOffsetUTC())") @Mapping(target = "updatedAt", expression = "java(clockService.nowOffsetUTC())") - ClientSubscriptionEntity mapCreateRequestToEntity(@Context ClockService clockService, ClientSubscriptionRequest request); + ClientSubscriptionEntity mapCreateRequestToEntity(@Context ClockService clockService, String callbackUrl, CreateClientSubscriptionRequest request); @Mapping(source = "existing.id", target = "id") @Mapping(source = "request.eventTypes", target = "eventTypes", qualifiedByName = "mapWithSortedEventTypes") @@ -43,16 +44,16 @@ public interface SubscriptionMapper { @Named("mapWithSortedEventTypes") static List sortedEventTypes(final List events) { - final List sorted = events.stream().map(e -> e.name()).sorted().collect(toList()); - return sorted.stream().map(e -> EntityEventType.valueOf(e)).toList(); + final List sorted = events.stream().map(Enum::name).sorted().collect(toList()); + return sorted.stream().map(EntityEventType::valueOf).toList(); } @Named("mapFromNotificationEndpoint") static String mapFromNotificationEndpoint(final NotificationEndpoint notificationEndpoint) { - return notificationEndpoint.getWebhookUrl().toString(); + return notificationEndpoint.getCallbackUrl(); } static NotificationEndpoint mapToNotificationEndpoint(final String endpointUrl) { - return NotificationEndpoint.builder().webhookUrl(endpointUrl).build(); + return NotificationEndpoint.builder().callbackUrl(endpointUrl).build(); } } diff --git a/src/main/java/uk/gov/hmcts/cp/subscription/services/SubscriptionService.java b/src/main/java/uk/gov/hmcts/cp/subscription/services/SubscriptionService.java index 1bc05f54..58513ab9 100644 --- a/src/main/java/uk/gov/hmcts/cp/subscription/services/SubscriptionService.java +++ b/src/main/java/uk/gov/hmcts/cp/subscription/services/SubscriptionService.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service; import uk.gov.hmcts.cp.openapi.model.ClientSubscription; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; +import uk.gov.hmcts.cp.openapi.model.CreateClientSubscriptionRequest; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapper; import uk.gov.hmcts.cp.subscription.repositories.SubscriptionRepository; @@ -20,8 +21,8 @@ public class SubscriptionService { private final SubscriptionRepository subscriptionRepository; private final SubscriptionMapper mapper; - public ClientSubscription saveSubscription(final ClientSubscriptionRequest request) { - final ClientSubscriptionEntity entity = mapper.mapCreateRequestToEntity(clockService, request); + public ClientSubscription saveSubscription(final String callbackUrl, final CreateClientSubscriptionRequest request) { + final ClientSubscriptionEntity entity = mapper.mapCreateRequestToEntity(clockService, callbackUrl, request); return mapper.mapEntityToResponse(clockService, subscriptionRepository.save(entity)); } diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/client/DocumentServiceClientIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/client/DocumentServiceClientIntegrationTest.java deleted file mode 100644 index 1fe8eb3c..00000000 --- a/src/test/java/uk/gov/hmcts/cp/subscription/client/DocumentServiceClientIntegrationTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package uk.gov.hmcts.cp.subscription.client; - -import com.github.tomakehurst.wiremock.junit5.WireMockExtension; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignAutoConfiguration; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import uk.gov.hmcts.cp.openapi.model.PcrEventPayload; -import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; - -import java.util.UUID; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.post; -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; -import static com.github.tomakehurst.wiremock.client.WireMock.containing; -import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath; -import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; -import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) -class DocumentServiceClientIntegrationTest extends IntegrationTestBase { - - @RegisterExtension - static WireMockExtension wireMockServer = WireMockExtension.newInstance() - .options(wireMockConfig().dynamicPort()) - .build(); - - @Autowired - private DocumentServiceClient documentServiceClient; - - @DynamicPropertySource - static void configureProperties(DynamicPropertyRegistry registry) { - registry.add("document-service.url", wireMockServer::baseUrl); - registry.add("spring.cloud.discovery.enabled", () -> "false"); - registry.add("spring.cloud.service-registry.auto-registration.enabled", () -> "false"); - } - - @Test - void should_send_request_when_document_service_returns_no_content() { - wireMockServer.stubFor(post(urlEqualTo("/client-webhook-url")) - .willReturn(aResponse() - .withStatus(204))); - - PcrEventPayload payload = new PcrEventPayload(); - payload.setEventId(UUID.randomUUID()); - - documentServiceClient.updateDocumentMetadata(payload); - - wireMockServer.verify(postRequestedFor(urlEqualTo("/client-webhook-url")) - .withHeader("Content-Type", containing("application/json"))); - } - - @Test - void should_handle_successful_response() { - wireMockServer.stubFor(post(urlEqualTo("/client-webhook-url")) - .willReturn(aResponse() - .withStatus(200))); - - PcrEventPayload payload = new PcrEventPayload(); - payload.setEventId(UUID.randomUUID()); - - documentServiceClient.updateDocumentMetadata(payload); - - wireMockServer.verify(1, postRequestedFor( - urlEqualTo("/client-webhook-url"))); - } - - @Test - void should_send_correct_payload_to_document_service() { - UUID eventId = UUID.randomUUID(); - - wireMockServer.stubFor(post(urlEqualTo("/client-webhook-url")) - .willReturn(aResponse() - .withStatus(204))); - - PcrEventPayload payload = new PcrEventPayload(); - payload.setEventId(eventId); - - documentServiceClient.updateDocumentMetadata(payload); - - wireMockServer.verify(postRequestedFor(urlEqualTo("/client-webhook-url")) - .withHeader("Content-Type", containing("application/json")) - .withRequestBody(matchingJsonPath("$.eventId", equalTo(eventId.toString())))); - } -} \ No newline at end of file diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/clients/MaterialClientIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/clients/MaterialClientIntegrationTest.java deleted file mode 100644 index 9a2e5d60..00000000 --- a/src/test/java/uk/gov/hmcts/cp/subscription/clients/MaterialClientIntegrationTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package uk.gov.hmcts.cp.subscription.clients; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.wiremock.spring.ConfigureWireMock; -import org.wiremock.spring.EnableWireMock; -import uk.gov.hmcts.cp.subscription.clients.model.MaterialResponse; -import uk.gov.hmcts.cp.subscription.config.TestContainersInitialise; - -import java.nio.charset.StandardCharsets; -import java.util.UUID; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; - -@SpringBootTest -@ContextConfiguration(initializers = TestContainersInitialise.class) -@EnableWireMock({@ConfigureWireMock(name = "material-client", baseUrlProperties = "material-client.url")}) -class MaterialClientIntegrationTest { - - @Autowired - private MaterialClient materialClient; - - @Test - void should_return_material_by_id() { - - final UUID materialId = UUID.fromString("6c198796-08bb-4803-b456-fa0c29ca6021"); - MaterialResponse response = materialClient.getMetadataById(materialId); - - assertThat(response).satisfies(resp -> { - assertThat(resp.getMaterialId()).isEqualTo(materialId); - assertThat(resp.getAlfrescoAssetId()).isEqualTo(UUID.fromString("82257b1b-571d-432e-8871-b0c5b4bd18b1")); - assertThat(resp.getMimeType()).isEqualTo("application/pdf"); - assertThat(resp.getFileName()).isEqualTo("PrisonCourtRegister_20251219083322.pdf"); - }); - } - - @Test - void should_throw_not_found_when_material_does_not_exist() { - UUID materialId = UUID.fromString("6c198796-08bb-4803-b456-fa0c29ca6022"); - assertThatThrownBy(() -> materialClient.getMetadataById(materialId)) - .isInstanceOf(feign.FeignException.NotFound.class); - } - - @Test - void should_return_content_by_id() { - - final UUID materialId = UUID.fromString("7c198796-08bb-4803-b456-fa0c29ca6021"); - byte[] response = materialClient.getContentById(materialId); - - assertThat(response); - String pdfAsString = new String(response, StandardCharsets.ISO_8859_1); - assertThat(pdfAsString).startsWith("%PDF"); - assertThat(pdfAsString).contains("%%EOF"); - assertThat(response).hasSizeGreaterThan(500); - } - - @Test - void should_throw_not_found_when_content_does_not_exist() { - UUID materialId = UUID.fromString("7c198796-08bb-4803-b456-fa0c29ca6023"); - assertThatThrownBy(() -> materialClient.getContentById(materialId)) - .isInstanceOf(feign.FeignException.NotFound.class); - } -} diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/GlobalExceptionHandler.java similarity index 60% rename from src/test/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/GlobalExceptionHandler.java index fd8af5d2..6c4cc06b 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/GlobalExceptionHandler.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/GlobalExceptionHandler.java @@ -1,12 +1,20 @@ -package uk.gov.hmcts.cp.subscription.controllers; +package uk.gov.hmcts.cp.subscription.integration; +import feign.FeignException; import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.client.HttpClientErrorException; @RestControllerAdvice +@Component("integrationGlobalExceptionHandler") public class GlobalExceptionHandler { private static final String NOT_FOUND_MESSAGE = "No row with the given identifier exists"; diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/IntegrationTestBase.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/IntegrationTestBase.java index 247892ef..458b09d4 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/IntegrationTestBase.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/IntegrationTestBase.java @@ -9,7 +9,7 @@ import org.springframework.test.web.servlet.MockMvc; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; import uk.gov.hmcts.cp.openapi.model.NotificationEndpoint; -import uk.gov.hmcts.cp.subscription.config.TestContainersInitialise; +import uk.gov.hmcts.cp.subscription.integration.config.TestContainersInitialise; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; import uk.gov.hmcts.cp.subscription.model.EntityEventType; import uk.gov.hmcts.cp.subscription.repositories.SubscriptionRepository; @@ -32,10 +32,10 @@ public abstract class IntegrationTestBase { @Autowired protected SubscriptionRepository subscriptionRepository; - NotificationEndpoint notificationEndpoint = NotificationEndpoint.builder() - .webhookUrl("https://my-callback-url") + protected NotificationEndpoint notificationEndpoint = NotificationEndpoint.builder() + .callbackUrl("https://my-callback-url") .build(); - ClientSubscriptionRequest request = ClientSubscriptionRequest.builder() + protected ClientSubscriptionRequest request = ClientSubscriptionRequest.builder() .notificationEndpoint(notificationEndpoint) .eventTypes(List.of(PRISON_COURT_REGISTER_GENERATED, CUSTODIAL_RESULT)) .build(); diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/config/TestContainersInitialise.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/config/TestContainersInitialise.java similarity index 95% rename from src/test/java/uk/gov/hmcts/cp/subscription/config/TestContainersInitialise.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/config/TestContainersInitialise.java index 07fbc543..a3ea0152 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/config/TestContainersInitialise.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/config/TestContainersInitialise.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.config; +package uk.gov.hmcts.cp.subscription.integration.config; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/NotificationIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/NotificationControllerIntegrationTest.java similarity index 54% rename from src/test/java/uk/gov/hmcts/cp/subscription/integration/NotificationIntegrationTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/NotificationControllerIntegrationTest.java index b0448e68..19408436 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/NotificationIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/NotificationControllerIntegrationTest.java @@ -1,16 +1,11 @@ -package uk.gov.hmcts.cp.subscription.integration; +package uk.gov.hmcts.cp.subscription.integration.controllers; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.core.io.ClassPathResource; import org.springframework.http.MediaType; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.web.servlet.MockMvc; import org.wiremock.spring.ConfigureWireMock; import org.wiremock.spring.EnableWireMock; -import uk.gov.hmcts.cp.subscription.config.TestContainersInitialise; +import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; import java.nio.file.Files; @@ -18,21 +13,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ContextConfiguration(initializers = TestContainersInitialise.class) -@AutoConfigureMockMvc @EnableWireMock({@ConfigureWireMock(name = "material-client", baseUrlProperties = "material-client.url")}) -class NotificationIntegrationTest { - - @Autowired - private MockMvc mockMvc; +class NotificationControllerIntegrationTest extends IntegrationTestBase { @Test void should_return_created_when_posting_valid_payload() throws Exception { - ClassPathResource resource = new ClassPathResource("requests/pcr-request.json"); + ClassPathResource resource = new ClassPathResource("stubs/requests/pcr-request.json"); String requestJson = Files.readString(resource.getFile().toPath()); - mockMvc.perform(post("/notification/pcr") + mockMvc.perform(post("/notifications/pcr") .contentType(MediaType.APPLICATION_JSON) .content(requestJson)) .andDo(print()) diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionControllerValidationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionControllerValidationTest.java similarity index 85% rename from src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionControllerValidationTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionControllerValidationTest.java index 9eb826c3..443763ea 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionControllerValidationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionControllerValidationTest.java @@ -1,11 +1,12 @@ -package uk.gov.hmcts.cp.subscription.integration; +package uk.gov.hmcts.cp.subscription.integration.controllers; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import tools.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; import uk.gov.hmcts.cp.openapi.model.NotificationEndpoint; +import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; import uk.gov.hmcts.cp.subscription.repositories.SubscriptionRepository; import java.util.List; @@ -22,7 +23,7 @@ class SubscriptionControllerValidationTest extends IntegrationTestBase { SubscriptionRepository subscriptionRepository; NotificationEndpoint notificationEndpoint = NotificationEndpoint.builder() - .webhookUrl("https://my-callback-url") + .callbackUrl("https://my-callback-url") .build(); ClientSubscriptionRequest request = ClientSubscriptionRequest.builder() .notificationEndpoint(notificationEndpoint) @@ -34,6 +35,7 @@ void bad_event_type_should_return_400() throws Exception { String body = new ObjectMapper().writeValueAsString(request) .replace("PRISON_COURT_REGISTER_GENERATED", "BAD"); mockMvc.perform(post("/client-subscriptions") + .param("callbackUrl", "https://my-callback-url") .contentType(MediaType.APPLICATION_JSON) .content(body)) .andExpect(status().isBadRequest()) @@ -42,9 +44,9 @@ void bad_event_type_should_return_400() throws Exception { @Test void webhook_bad_url_should_return_400() throws Exception { - String body = new ObjectMapper().writeValueAsString(request) - .replace("https://my-callback-url", "not-a-url"); + String body = new ObjectMapper().writeValueAsString(request); mockMvc.perform(post("/client-subscriptions") + .param("callbackUrl", "not-a-url") .contentType(MediaType.APPLICATION_JSON) .content(body)) .andExpect(status().isBadRequest()) diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionDeleteControllerIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionDeleteControllerIntegrationTest.java similarity index 91% rename from src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionDeleteControllerIntegrationTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionDeleteControllerIntegrationTest.java index f7dafbca..3b21c498 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionDeleteControllerIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionDeleteControllerIntegrationTest.java @@ -1,9 +1,10 @@ -package uk.gov.hmcts.cp.subscription.integration; +package uk.gov.hmcts.cp.subscription.integration.controllers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; +import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; import uk.gov.hmcts.cp.subscription.model.EntityEventType; import java.util.List; diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionGetControllerIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionGetControllerIntegrationTest.java similarity index 93% rename from src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionGetControllerIntegrationTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionGetControllerIntegrationTest.java index 6f850fd0..0c5d3f15 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionGetControllerIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionGetControllerIntegrationTest.java @@ -1,8 +1,9 @@ -package uk.gov.hmcts.cp.subscription.integration; +package uk.gov.hmcts.cp.subscription.integration.controllers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; +import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; import uk.gov.hmcts.cp.subscription.model.EntityEventType; import java.util.List; diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionSaveControllerIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionSaveControllerIntegrationTest.java similarity index 89% rename from src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionSaveControllerIntegrationTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionSaveControllerIntegrationTest.java index 75b1294c..09b1878a 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionSaveControllerIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionSaveControllerIntegrationTest.java @@ -1,10 +1,11 @@ -package uk.gov.hmcts.cp.subscription.integration; +package uk.gov.hmcts.cp.subscription.integration.controllers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import tools.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; +import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; import uk.gov.hmcts.cp.subscription.model.EntityEventType; import java.util.List; @@ -26,6 +27,7 @@ void beforeEach() { void save_client_subscription_should_save_subscription() throws Exception { String body = new ObjectMapper().writeValueAsString(request); mockMvc.perform(post("/client-subscriptions") + .param("callbackUrl", "https://my-callback-url") .contentType(MediaType.APPLICATION_JSON) .header("client-id-todo", "1234") .content(body)) diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionUpdateControllerIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionUpdateControllerIntegrationTest.java similarity index 89% rename from src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionUpdateControllerIntegrationTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionUpdateControllerIntegrationTest.java index 129a1690..ed79e8b0 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/integration/SubscriptionUpdateControllerIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/controllers/SubscriptionUpdateControllerIntegrationTest.java @@ -1,11 +1,12 @@ -package uk.gov.hmcts.cp.subscription.integration; +package uk.gov.hmcts.cp.subscription.integration.controllers; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import tools.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; +import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; import uk.gov.hmcts.cp.subscription.model.EntityEventType; import java.time.OffsetDateTime; @@ -40,7 +41,7 @@ void update_client_subscription_should_update_subscription() throws Exception { .andExpect(jsonPath("$.clientSubscriptionId").value(existing.getId().toString())) .andExpect(jsonPath("$.eventTypes.[0]").value("CUSTODIAL_RESULT")) .andExpect(jsonPath("$.eventTypes.[1]").value("PRISON_COURT_REGISTER_GENERATED")) - .andExpect(jsonPath("$.notificationEndpoint.webhookUrl").value("https://my-callback-url")); + .andExpect(jsonPath("$.notificationEndpoint.callbackUrl").value("https://my-callback-url")); verifyCreatedAtIsUnchanged(existing.getId(), existing.getCreatedAt()); } diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/repositories/SubscriptionRepositoryTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/integration/repositories/SubscriptionRepositoryIntegrationTest.java similarity index 92% rename from src/test/java/uk/gov/hmcts/cp/subscription/repositories/SubscriptionRepositoryTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/integration/repositories/SubscriptionRepositoryIntegrationTest.java index afeba8d0..cd622ba1 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/repositories/SubscriptionRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/integration/repositories/SubscriptionRepositoryIntegrationTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.repositories; +package uk.gov.hmcts.cp.subscription.integration.repositories; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -12,7 +12,7 @@ import static uk.gov.hmcts.cp.subscription.model.EntityEventType.CUSTODIAL_RESULT; import static uk.gov.hmcts.cp.subscription.model.EntityEventType.PRISON_COURT_REGISTER_GENERATED; -class SubscriptionRepositoryTest extends IntegrationTestBase { +class SubscriptionRepositoryIntegrationTest extends IntegrationTestBase { @BeforeEach void beforeEach() { diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/services/WebhookServiceIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/services/WebhookServiceIntegrationTest.java deleted file mode 100644 index c550cd37..00000000 --- a/src/test/java/uk/gov/hmcts/cp/subscription/services/WebhookServiceIntegrationTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package uk.gov.hmcts.cp.subscription.services; - -import com.github.tomakehurst.wiremock.junit5.WireMockExtension; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import uk.gov.hmcts.cp.openapi.model.PcrEventPayload; -import uk.gov.hmcts.cp.subscription.integration.IntegrationTestBase; - -import java.util.UUID; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.containing; -import static com.github.tomakehurst.wiremock.client.WireMock.post; -import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; -import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching; -import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) -class WebhookServiceIntegrationTest extends IntegrationTestBase { - - @RegisterExtension - static WireMockExtension wireMockServer = WireMockExtension.newInstance() - .options(wireMockConfig().dynamicPort()) - .build(); - - @DynamicPropertySource - static void configureProperties(DynamicPropertyRegistry registry) { - registry.add("document-service.url", wireMockServer::baseUrl); - registry.add("spring.cloud.discovery.enabled", () -> "false"); - registry.add("spring.cloud.service-registry.auto-registration.enabled", () -> "false"); - } - - @Autowired - private WebhookService webhookService; - - @Test - void should_call_document_service_to_update_metadata() { - wireMockServer.stubFor(post(urlPathMatching("/client-webhook-url")) - .willReturn(aResponse().withStatus(200))); - - PcrEventPayload payload = PcrEventPayload.builder() - .eventId(UUID.randomUUID()) - .build(); - - webhookService.processPcrEvent(payload); - - wireMockServer.verify(postRequestedFor(urlPathMatching("/client-webhook-url")) - .withHeader("Content-Type", containing("application/json"))); - } -} diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/NotificationControllerTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/NotificationControllerTest.java similarity index 90% rename from src/test/java/uk/gov/hmcts/cp/subscription/controllers/NotificationControllerTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/NotificationControllerTest.java index 713c84e7..391ab763 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/NotificationControllerTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/NotificationControllerTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.controllers; +package uk.gov.hmcts.cp.subscription.unit.controllers; import org.junit.jupiter.api.Test; @@ -7,6 +7,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.cp.openapi.model.PcrEventPayload; +import uk.gov.hmcts.cp.subscription.controllers.NotificationController; import uk.gov.hmcts.cp.subscription.services.NotificationService; import java.util.UUID; diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/RootControllerTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/RootControllerTest.java similarity index 83% rename from src/test/java/uk/gov/hmcts/cp/subscription/controllers/RootControllerTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/RootControllerTest.java index 9878c823..02958004 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/RootControllerTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/RootControllerTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.controllers; +package uk.gov.hmcts.cp.subscription.unit.controllers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -6,6 +6,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThat; +import uk.gov.hmcts.cp.subscription.controllers.RootController; @ExtendWith(MockitoExtension.class) class RootControllerTest { diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionControllerTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/SubscriptionControllerTest.java similarity index 81% rename from src/test/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionControllerTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/SubscriptionControllerTest.java index 2639bc85..a66ec591 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/controllers/SubscriptionControllerTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/unit/controllers/SubscriptionControllerTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.controllers; +package uk.gov.hmcts.cp.subscription.unit.controllers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -7,11 +7,14 @@ import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.cp.openapi.model.ClientSubscription; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; +import uk.gov.hmcts.cp.openapi.model.CreateClientSubscriptionRequest; +import uk.gov.hmcts.cp.subscription.controllers.SubscriptionController; import uk.gov.hmcts.cp.subscription.services.SubscriptionService; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -25,14 +28,15 @@ class SubscriptionControllerTest { SubscriptionController subscriptionController; ClientSubscriptionRequest request = ClientSubscriptionRequest.builder().build(); + CreateClientSubscriptionRequest createClientSubscriptionRequest = CreateClientSubscriptionRequest.builder().build(); UUID subscriptionId = UUID.randomUUID(); + String callbackUrl = "https://example.com/callback"; @Test void create_controller_should_call_service() { ClientSubscription response = ClientSubscription.builder().clientSubscriptionId(subscriptionId).build(); - when(subscriptionService.saveSubscription(request)).thenReturn(response); - var result = subscriptionController.createClientSubscription(request); - verify(subscriptionService).saveSubscription(request); + when(subscriptionService.saveSubscription(callbackUrl, createClientSubscriptionRequest)).thenReturn(response); + var result = subscriptionController.createClientSubscription(callbackUrl, createClientSubscriptionRequest); assertThat(result.getStatusCode().value()).isEqualTo(201); assertThat(result.getBody()).isEqualTo(response); } diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapperTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/unit/mappers/SubscriptionMapperTest.java similarity index 87% rename from src/test/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapperTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/unit/mappers/SubscriptionMapperTest.java index a1f5e8a8..239a7f0c 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/mappers/SubscriptionMapperTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/unit/mappers/SubscriptionMapperTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.mappers; +package uk.gov.hmcts.cp.subscription.unit.mappers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -6,8 +6,11 @@ import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.cp.openapi.model.ClientSubscription; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; +import uk.gov.hmcts.cp.openapi.model.CreateClientSubscriptionRequest; import uk.gov.hmcts.cp.openapi.model.NotificationEndpoint; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; +import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapper; +import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapperImpl; import uk.gov.hmcts.cp.subscription.model.EntityEventType; import uk.gov.hmcts.cp.subscription.services.ClockService; @@ -31,15 +34,16 @@ class SubscriptionMapperTest { @Mock ClockService clockService; + String callbackUrl = "https://example.com"; SubscriptionMapper mapper = new SubscriptionMapperImpl(); UUID clientSubscriptionId = UUID.fromString("d730c6e1-66ba-4ef0-a3dd-0b9928faa76d"); NotificationEndpoint notificationEndpoint = NotificationEndpoint.builder() - .webhookUrl("https://example.com") + .callbackUrl("https://example.com") .build(); ClientSubscriptionEntity existing = ClientSubscriptionEntity.builder() .id(clientSubscriptionId) - .notificationEndpoint(notificationEndpoint.getWebhookUrl().toString()) + .notificationEndpoint(notificationEndpoint.getCallbackUrl().toString()) .eventTypes(mutableLisOfEventTypes()) .createdAt(MOCKCREATED) .updatedAt(MOCKUPDATED) @@ -48,12 +52,11 @@ class SubscriptionMapperTest { @Test void create_request_should_map_to_entity_with_sorted_types() { when(clockService.nowOffsetUTC()).thenReturn(MOCKCREATED); - ClientSubscriptionRequest request = ClientSubscriptionRequest.builder() - .notificationEndpoint(notificationEndpoint) + CreateClientSubscriptionRequest request = CreateClientSubscriptionRequest.builder() .eventTypes(List.of(PRISON_COURT_REGISTER_GENERATED, CUSTODIAL_RESULT)) .build(); - ClientSubscriptionEntity entity = mapper.mapCreateRequestToEntity(clockService, request); + ClientSubscriptionEntity entity = mapper.mapCreateRequestToEntity(clockService, callbackUrl, request); assertThat(entity.getId()).isNull(); assertThat(entity.getNotificationEndpoint()).isEqualTo("https://example.com"); @@ -65,7 +68,7 @@ void create_request_should_map_to_entity_with_sorted_types() { @Test void update_request_should_map_to_entity_with_sorted_types() { NotificationEndpoint updatedEndpoint = NotificationEndpoint.builder() - .webhookUrl("https://updated.com") + .callbackUrl("https://updated.com") .build(); ClientSubscriptionRequest request = ClientSubscriptionRequest.builder() .notificationEndpoint(updatedEndpoint) diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/services/NotificationServiceTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/unit/services/NotificationServiceTest.java similarity index 90% rename from src/test/java/uk/gov/hmcts/cp/subscription/services/NotificationServiceTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/unit/services/NotificationServiceTest.java index cdb1f4ae..8ce5b856 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/services/NotificationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/unit/services/NotificationServiceTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.services; +package uk.gov.hmcts.cp.subscription.unit.services; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -6,6 +6,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.cp.subscription.clients.MaterialClient; +import uk.gov.hmcts.cp.subscription.services.NotificationService; import java.util.UUID; diff --git a/src/test/java/uk/gov/hmcts/cp/subscription/services/SubscriptionServiceTest.java b/src/test/java/uk/gov/hmcts/cp/subscription/unit/services/SubscriptionServiceTest.java similarity index 77% rename from src/test/java/uk/gov/hmcts/cp/subscription/services/SubscriptionServiceTest.java rename to src/test/java/uk/gov/hmcts/cp/subscription/unit/services/SubscriptionServiceTest.java index 5c6f1f34..28e6e166 100644 --- a/src/test/java/uk/gov/hmcts/cp/subscription/services/SubscriptionServiceTest.java +++ b/src/test/java/uk/gov/hmcts/cp/subscription/unit/services/SubscriptionServiceTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.subscription.services; +package uk.gov.hmcts.cp.subscription.unit.services; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -7,10 +7,12 @@ import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.cp.openapi.model.ClientSubscription; import uk.gov.hmcts.cp.openapi.model.ClientSubscriptionRequest; +import uk.gov.hmcts.cp.openapi.model.CreateClientSubscriptionRequest; import uk.gov.hmcts.cp.subscription.entities.ClientSubscriptionEntity; import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapper; -import uk.gov.hmcts.cp.subscription.mappers.SubscriptionMapperImpl; import uk.gov.hmcts.cp.subscription.repositories.SubscriptionRepository; +import uk.gov.hmcts.cp.subscription.services.ClockService; +import uk.gov.hmcts.cp.subscription.services.SubscriptionService; import java.util.UUID; @@ -21,31 +23,33 @@ @ExtendWith(MockitoExtension.class) class SubscriptionServiceTest { - @Mock ClockService clockService; + @Mock + ClockService clockService; @Mock SubscriptionRepository subscriptionRepository; @Mock - SubscriptionMapper mapper = new SubscriptionMapperImpl(); - + SubscriptionMapper mapper; @InjectMocks SubscriptionService subscriptionService; + CreateClientSubscriptionRequest createClientSubscriptionRequest = CreateClientSubscriptionRequest.builder().build(); ClientSubscriptionRequest request = ClientSubscriptionRequest.builder().build(); ClientSubscriptionEntity requestEntity = ClientSubscriptionEntity.builder().build(); ClientSubscriptionEntity savedEntity = ClientSubscriptionEntity.builder().build(); ClientSubscriptionEntity updatedEntity = ClientSubscriptionEntity.builder().build(); ClientSubscription response = ClientSubscription.builder().build(); UUID subscriptionId = UUID.fromString("2ca16eb5-3998-4bb7-adce-4bb9b3b7223c"); + String callbackUrl = "https://example.com/callback"; @Test void save_request_should_save_new_entity() { - when(mapper.mapCreateRequestToEntity(clockService, request)).thenReturn(requestEntity); + when(mapper.mapCreateRequestToEntity(clockService, callbackUrl, createClientSubscriptionRequest)).thenReturn(requestEntity); when(subscriptionRepository.save(requestEntity)).thenReturn(savedEntity); when(mapper.mapEntityToResponse(clockService, savedEntity)).thenReturn(response); - ClientSubscription result = subscriptionService.saveSubscription(request); + ClientSubscription result = subscriptionService.saveSubscription(callbackUrl, createClientSubscriptionRequest); - verify(mapper).mapCreateRequestToEntity(clockService, request); + verify(mapper).mapCreateRequestToEntity(clockService, callbackUrl, createClientSubscriptionRequest); verify(subscriptionRepository).save(requestEntity); assertThat(result).isEqualTo(response); } diff --git a/src/test/resources/requests/pcr-request.json b/src/test/resources/stubs/requests/pcr-request.json similarity index 100% rename from src/test/resources/requests/pcr-request.json rename to src/test/resources/stubs/requests/pcr-request.json