Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ apply {
from("$rootDir/gradle/github/jar.gradle")

from("$rootDir/gradle/tasks/apitest.gradle")
from("$rootDir/gradle/dependencies/spring-cloud.gradle")
}

dependencies {
implementation(group: 'uk.gov.hmcts.cp', name: 'api-cp-crime-hearing-case-event-subscription', version: '1.0.0-cc7de31')
implementation(group: 'uk.gov.hmcts.cp', name: 'api-cp-crime-hearing-case-event-subscription', version: '1.0.1')


// This is proving to be a real puzzle. This is actually included in the api published pom
// ( though with scope of "runtime" )
Expand Down
15 changes: 15 additions & 0 deletions gradle/dependencies/spring-cloud.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2025.1.0"
}
}

dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

testImplementation 'org.wiremock.integrations:wiremock-spring-boot:3.2.0'
testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock'
testImplementation 'org.wiremock:wiremock-standalone:3.3.1'


}
Empty file added pmd-output.txt
Empty file.
3 changes: 2 additions & 1 deletion src/main/java/uk/gov/hmcts/cp/subscription/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@SpringBootApplication

public class Application {

public static void main(final String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package uk.gov.hmcts.cp.subscription.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import uk.gov.hmcts.cp.openapi.model.PcrEventPayload;

@FeignClient(
name = "document-service",
url = "${document-service.url}"
)
public interface DocumentServiceClient {
@PostMapping(
value = "/document-service/api/rest/document/metadata",
consumes = "application/json"
)
void updateDocumentMetadata(@RequestBody PcrEventPayload request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package uk.gov.hmcts.cp.subscription.services;

import feign.FeignException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.cp.openapi.model.PcrEventPayload;
import uk.gov.hmcts.cp.subscription.client.DocumentServiceClient;
@Service
@RequiredArgsConstructor
@Slf4j
public class WebhookInvoiceService {

private final DocumentServiceClient client;

public void processInvoiceEvent(final PcrEventPayload payload) {
log.info("Processing invoice webhook event: {}", payload);

try {
client.updateDocumentMetadata(payload);
log.info("Successfully updated document metadata for invoice event");
}catch (FeignException ex) {
log.error("Failed to update document metadata for invoice event", ex);
throw ex;
}
}
}
4 changes: 4 additions & 0 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
server:
port: ${SERVER_PORT:4550}

document-service:
url: ${DOCUMENT_SERVICE_URL:http://localhost:8081}

spring:
application:
name: service-hmcts-springboot-demo-postgres
Expand All @@ -15,6 +18,7 @@ spring:
locations: classpath:db/migration
baseline-on-migrate: true


management:
endpoints:
web:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
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 java.util.UUID;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;

@SpringBootTest(
classes = DocumentServiceClientTest.TestConfig.class,
webEnvironment = SpringBootTest.WebEnvironment.NONE
)
class DocumentServiceClientTest {

@Configuration
@EnableFeignClients(clients = DocumentServiceClient.class)
@Import({
FeignAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class
})
static class TestConfig {
}

@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 shouldSendPostRequestToDocumentService() {
wireMockServer.stubFor(post(urlEqualTo("/document-service/api/rest/document/metadata"))
.willReturn(aResponse()
.withStatus(204)));

PcrEventPayload payload = new PcrEventPayload();
payload.setEventId(UUID.randomUUID());

documentServiceClient.updateDocumentMetadata(payload);

wireMockServer.verify(postRequestedFor(urlEqualTo("/document-service/api/rest/document/metadata"))
.withHeader("Content-Type", containing("application/json")));
}

@Test
void shouldHandleSuccessfulResponse() {
wireMockServer.stubFor(post(urlEqualTo("/document-service/api/rest/document/metadata"))
.willReturn(aResponse()
.withStatus(200)));

PcrEventPayload payload = new PcrEventPayload();
payload.setEventId(UUID.randomUUID());

documentServiceClient.updateDocumentMetadata(payload);

wireMockServer.verify(1, postRequestedFor(
urlEqualTo("/document-service/api/rest/document/metadata")));
}

@Test
void shouldSendCorrectPayloadToDocumentService() {
UUID eventId = UUID.randomUUID();

wireMockServer.stubFor(post(urlEqualTo("/document-service/api/rest/document/metadata"))
.willReturn(aResponse()
.withStatus(204)));

PcrEventPayload payload = new PcrEventPayload();
payload.setEventId(eventId);

documentServiceClient.updateDocumentMetadata(payload);

wireMockServer.verify(postRequestedFor(urlEqualTo("/document-service/api/rest/document/metadata"))
.withHeader("Content-Type", containing("application/json"))
.withRequestBody(matchingJsonPath("$.eventId", equalTo(eventId.toString()))));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
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.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.client.DocumentServiceClient;

import java.util.UUID;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;

@SpringBootTest(
classes = WebhookInvoiceServiceTest.TestConfig.class,
webEnvironment = SpringBootTest.WebEnvironment.NONE
)
class WebhookInvoiceServiceTest {

@Configuration
@EnableFeignClients(clients = DocumentServiceClient.class)
@Import({
FeignAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class,
WebhookInvoiceService.class
})
static class TestConfig {
}

@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 WebhookInvoiceService webhookInvoiceService;

@Test
void shouldCallDocumentServiceToUpdateMetadata() {
wireMockServer.stubFor(post(urlEqualTo("/document-service/api/rest/document/metadata"))
.willReturn(aResponse()
.withStatus(200)));

PcrEventPayload payload = new PcrEventPayload();
payload.setEventId(UUID.randomUUID());

webhookInvoiceService.processInvoiceEvent(payload);

wireMockServer.verify(postRequestedFor(
urlEqualTo("/document-service/api/rest/document/metadata"))
.withHeader("Content-Type", containing("application/json")));
}
}
Loading