From 213eb57b07c4ee750c099feed3353cd0f02a553f Mon Sep 17 00:00:00 2001 From: coling01 Date: Tue, 9 Dec 2025 07:25:34 +0000 Subject: [PATCH 01/11] feature: amp-126 init project db * Add flyway to create tables and fk constraint * Add entities * Add repositories * Add repository tests to prove flyway and jpa line up ok --- build.gradle | 1 + docker/docker-compose.yml | 16 ++++++- .../hmcts/cp/entities/SubscriberEntity.java | 26 ++++++++++ .../hmcts/cp/entities/SubscriptionEntity.java | 32 +++++++++++++ .../java/uk/gov/hmcts/cp/model/EventType.java | 6 +++ .../cp/repositories/SubscriberRepository.java | 9 ++++ .../repositories/SubscriptionRepository.java | 9 ++++ .../db/migration/V1.001__initial_schema.sql | 15 ++++++ .../cp/config/TestContainersInitialise.java | 31 ++++++++++++ .../integration/IntegrationTestBase.java | 5 +- .../RootControllerIntegrationTest.java | 2 +- .../cp/repositories/RepositoryTestBase.java | 48 +++++++++++++++++++ .../SubscriberRepositoryTest.java | 26 ++++++++++ .../SubscriptionRepositoryTest.java | 35 ++++++++++++++ 14 files changed, 257 insertions(+), 4 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java create mode 100644 src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java create mode 100644 src/main/java/uk/gov/hmcts/cp/model/EventType.java create mode 100644 src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java create mode 100644 src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java create mode 100644 src/main/resources/db/migration/V1.001__initial_schema.sql create mode 100644 src/test/java/uk/gov/hmcts/cp/config/TestContainersInitialise.java rename src/test/java/uk/gov/hmcts/cp/{controllers => }/integration/IntegrationTestBase.java (64%) rename src/test/java/uk/gov/hmcts/cp/{controllers => }/integration/RootControllerIntegrationTest.java (89%) create mode 100644 src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java create mode 100644 src/test/java/uk/gov/hmcts/cp/repositories/SubscriberRepositoryTest.java create mode 100644 src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java diff --git a/build.gradle b/build.gradle index 44052908..1545ba66 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,7 @@ version = System.getProperty('ARTEFACT_VERSION') ?: '0.0.999' apply { from("$rootDir/gradle/dependencies/java-core.gradle") from("$rootDir/gradle/dependencies/spring-core.gradle") + from("$rootDir/gradle/dependencies/spring-db.gradle") from("$rootDir/gradle/github/repositories.gradle") from("$rootDir/gradle/github/java.gradle") diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c8116301..919b380e 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,4 +1,15 @@ services: + postgres: + image: postgres:16-alpine + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=postgres + ports: + - '5432:5432' + volumes: + - postgres-db-volume:/var/lib/postgresql/data + app: container_name: app build: @@ -6,5 +17,6 @@ services: dockerfile: docker/Dockerfile ports: - "8082:8082" - environment: - SERVER_PORT: 8082 + +volumes: + postgres-db-volume: \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java b/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java new file mode 100644 index 00000000..65b57e86 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java @@ -0,0 +1,26 @@ +package uk.gov.hmcts.cp.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "subscriber") +@Getter +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +public class SubscriberEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String name; +} \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java b/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java new file mode 100644 index 00000000..cbb2f95c --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java @@ -0,0 +1,32 @@ +package uk.gov.hmcts.cp.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import uk.gov.hmcts.cp.model.EventType; + +@Entity +@Table(name = "subscription") +@Getter +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +public class SubscriptionEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private long subscriberId; + @Enumerated(EnumType.STRING) + private EventType eventType; + private String notifyUrl; +} \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/cp/model/EventType.java b/src/main/java/uk/gov/hmcts/cp/model/EventType.java new file mode 100644 index 00000000..0a14af77 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/model/EventType.java @@ -0,0 +1,6 @@ +package uk.gov.hmcts.cp.model; + +public enum EventType { + PCR, + CUSTODIAL_RESULT +} diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java new file mode 100644 index 00000000..6a8f926a --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java @@ -0,0 +1,9 @@ +package uk.gov.hmcts.cp.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import uk.gov.hmcts.cp.entities.SubscriberEntity; + +@Repository +public interface SubscriberRepository extends JpaRepository { +} diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java new file mode 100644 index 00000000..5deabd2c --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java @@ -0,0 +1,9 @@ +package uk.gov.hmcts.cp.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; + +@Repository +public interface SubscriptionRepository extends JpaRepository { +} diff --git a/src/main/resources/db/migration/V1.001__initial_schema.sql b/src/main/resources/db/migration/V1.001__initial_schema.sql new file mode 100644 index 00000000..d65119a7 --- /dev/null +++ b/src/main/resources/db/migration/V1.001__initial_schema.sql @@ -0,0 +1,15 @@ +create table subscriber ( + id bigserial primary key not null, + name varchar(128) not null +); +create unique index on subscriber (name); + +create table subscription ( + id bigserial primary key not null, + subscriber_id bigint not null, + event_type varchar(32) not null, + notify_url text not null +); + +alter table subscription + add constraint subscription_subscriber_id_fk foreign key (subscriber_id) references subscriber (id); \ No newline at end of file diff --git a/src/test/java/uk/gov/hmcts/cp/config/TestContainersInitialise.java b/src/test/java/uk/gov/hmcts/cp/config/TestContainersInitialise.java new file mode 100644 index 00000000..abd5f99a --- /dev/null +++ b/src/test/java/uk/gov/hmcts/cp/config/TestContainersInitialise.java @@ -0,0 +1,31 @@ +package uk.gov.hmcts.cp.config; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.testcontainers.containers.PostgreSQLContainer; + +@Slf4j +public class TestContainersInitialise implements ApplicationContextInitializer { + + private static final PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer( + "postgres") + .withDatabaseName("postgres") + .withUsername("postgres") + .withPassword("postgres"); + + + @SneakyThrows + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + postgreSQLContainer.start(); + TestPropertyValues.of( + "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(), + "spring.datasource.username=" + postgreSQLContainer.getUsername(), + "spring.datasource.password=" + postgreSQLContainer.getPassword() + ).applyTo(applicationContext.getEnvironment()); + } +} + diff --git a/src/test/java/uk/gov/hmcts/cp/controllers/integration/IntegrationTestBase.java b/src/test/java/uk/gov/hmcts/cp/integration/IntegrationTestBase.java similarity index 64% rename from src/test/java/uk/gov/hmcts/cp/controllers/integration/IntegrationTestBase.java rename to src/test/java/uk/gov/hmcts/cp/integration/IntegrationTestBase.java index 1ffe987b..b2cb2ef8 100644 --- a/src/test/java/uk/gov/hmcts/cp/controllers/integration/IntegrationTestBase.java +++ b/src/test/java/uk/gov/hmcts/cp/integration/IntegrationTestBase.java @@ -1,12 +1,15 @@ -package uk.gov.hmcts.cp.controllers.integration; +package uk.gov.hmcts.cp.integration; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.MockMvc; +import uk.gov.hmcts.cp.config.TestContainersInitialise; @SpringBootTest +@ContextConfiguration(initializers = TestContainersInitialise.class) @AutoConfigureMockMvc @Slf4j public abstract class IntegrationTestBase { diff --git a/src/test/java/uk/gov/hmcts/cp/controllers/integration/RootControllerIntegrationTest.java b/src/test/java/uk/gov/hmcts/cp/integration/RootControllerIntegrationTest.java similarity index 89% rename from src/test/java/uk/gov/hmcts/cp/controllers/integration/RootControllerIntegrationTest.java rename to src/test/java/uk/gov/hmcts/cp/integration/RootControllerIntegrationTest.java index 8ae04ed5..8cb2cd84 100644 --- a/src/test/java/uk/gov/hmcts/cp/controllers/integration/RootControllerIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/cp/integration/RootControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.cp.controllers.integration; +package uk.gov.hmcts.cp.integration; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java b/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java new file mode 100644 index 00000000..89820d2d --- /dev/null +++ b/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java @@ -0,0 +1,48 @@ +package uk.gov.hmcts.cp.repositories; + +import lombok.extern.slf4j.Slf4j; +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.test.context.ContextConfiguration; +import uk.gov.hmcts.cp.config.TestContainersInitialise; +import uk.gov.hmcts.cp.entities.SubscriberEntity; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; +import uk.gov.hmcts.cp.model.EventType; + +@SpringBootTest +@ContextConfiguration(initializers = TestContainersInitialise.class) +@AutoConfigureMockMvc +@Slf4j +public abstract class RepositoryTestBase { + + @Autowired + protected SubscriberRepository subscriberRepository; + + @Autowired + protected SubscriptionRepository subscriptionRepository; + + protected void clearAllTables() { + log.info("Clearing all tables"); + subscriptionRepository.deleteAll(); + subscriberRepository.deleteAll(); + } + + protected SubscriberEntity insertSubscriber(String name) { + SubscriberEntity subscriber = SubscriberEntity.builder().name(name).build(); + SubscriberEntity saved = subscriberRepository.save(subscriber); + log.info("Inserted subscriber:{}", saved.getId()); + return saved; + } + + protected SubscriptionEntity insertSubscription(long subscriberId) { + SubscriptionEntity subscription = SubscriptionEntity.builder() + .subscriberId(subscriberId) + .eventType(EventType.PCR) + .notifyUrl("https://example.com/notify") + .build(); + SubscriptionEntity saved = subscriptionRepository.save(subscription); + log.info("Inserted subscription:{}", saved.getId()); + return saved; + } +} diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriberRepositoryTest.java b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriberRepositoryTest.java new file mode 100644 index 00000000..da9f2ba3 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriberRepositoryTest.java @@ -0,0 +1,26 @@ +package uk.gov.hmcts.cp.repositories; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.cp.entities.SubscriberEntity; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class SubscriberRepositoryTest extends RepositoryTestBase { + + @BeforeEach + void beforeEach() { + clearAllTables(); + } + + @Test + void subscriber_should_save_and_read_ok() { + insertSubscriber("My subscriber"); + List subscribers = subscriberRepository.findAll(); + assertThat(subscribers).hasSize(1); + assertThat(subscribers.get(0).getId()).isNotNull(); + assertThat(subscribers.get(0).getName()).isEqualTo("My subscriber"); + } +} \ No newline at end of file diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java new file mode 100644 index 00000000..e270aafa --- /dev/null +++ b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java @@ -0,0 +1,35 @@ +package uk.gov.hmcts.cp.repositories; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.cp.entities.SubscriberEntity; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static uk.gov.hmcts.cp.model.EventType.PCR; + +class SubscriptionRepositoryTest extends RepositoryTestBase { + + @BeforeEach + void beforeEach() { + clearAllTables(); + } + + @Test + void subscription_should_save_and_read_ok() { + SubscriberEntity subscriber = insertSubscriber("My subscriber"); + insertSubscription(subscriber.getId()); + List subscriptions = subscriptionRepository.findAll(); + assertThat(subscriptions).hasSize(1); + assertThat(subscriptions.get(0).getId()).isNotNull(); + assertThat(subscriptions.get(0).getEventType()).isEqualTo(PCR); + } + + @Test + void fk_constraint_should_prevent_orphaned_subscription() { + assertThrows(Exception.class, () -> insertSubscription(99L)); + } +} \ No newline at end of file From 81a09fb61e9c0ed694400de66ad85b57b806e967 Mon Sep 17 00:00:00 2001 From: coling01 Date: Tue, 9 Dec 2025 07:34:38 +0000 Subject: [PATCH 02/11] feature: amp-126 init project db * Add flyway to create tables and fk constraint * Add entities * Add repositories * Add repository tests to prove flyway and jpa line up ok --- .../uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java index e270aafa..ce01e82f 100644 --- a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java @@ -26,6 +26,7 @@ void subscription_should_save_and_read_ok() { assertThat(subscriptions).hasSize(1); assertThat(subscriptions.get(0).getId()).isNotNull(); assertThat(subscriptions.get(0).getEventType()).isEqualTo(PCR); + assertThat(subscriptions.get(0).getNotifyUrl()).isEqualTo("https://example.com/notify"); } @Test From 2766deecb8a1068ec2c7dec56850f3e30e93241b Mon Sep 17 00:00:00 2001 From: coling01 Date: Tue, 9 Dec 2025 09:37:26 +0000 Subject: [PATCH 03/11] feature: amp-126 init project db * Add flyway to create tables and fk constraint * Add entities * Add repositories * Add repository tests to prove flyway and jpa line up ok --- .github/workflows/codeql.yml | 2 +- build.gradle | 3 ++ .../hmcts/cp/mappers/SubscriptionMapper.java | 19 ++++++++ .../repositories/SubscriptionRepository.java | 4 ++ .../cp/services/SubscriptionService.java | 30 ++++++++++++ .../cp/mappers/SubscriptionMapperTest.java | 28 +++++++++++ .../SubscriptionRepositoryTest.java | 8 ++++ .../cp/services/SubscriptionServiceTest.java | 47 +++++++++++++++++++ 8 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java create mode 100644 src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java create mode 100644 src/test/java/uk/gov/hmcts/cp/mappers/SubscriptionMapperTest.java create mode 100644 src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 99650e2e..c0fe9c93 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -96,7 +96,7 @@ jobs: - name: DAST - Build and run containerised app run: | - docker compose -f docker/docker-compose.api.yml up -d + docker compose -f docker/docker-compose.yml up -d echo "Waiting for health endpoint..." for i in {1..30}; do diff --git a/build.gradle b/build.gradle index 1545ba66..eb2ff717 100644 --- a/build.gradle +++ b/build.gradle @@ -41,4 +41,7 @@ springBoot { dependencies { implementation('uk.gov.hmcts.cp:api-cp-crime-courthearing-cases-results:0.0.0-a65d290') + + // Lets add this to the api because we need it to prevent its openapi NotNull errors + implementation("io.swagger.core.v3:swagger-annotations:2.2.41") } diff --git a/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java b/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java new file mode 100644 index 00000000..8de3f4f5 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java @@ -0,0 +1,19 @@ +package uk.gov.hmcts.cp.mappers; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; +import uk.gov.hmcts.cp.openapi.model.Result; + +import java.util.List; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SubscriptionMapper { + + @Mapping(source = "notifyUrl", target = "resultText") + public abstract Result mapSubscriptionToResult(SubscriptionEntity subscription); + + public abstract List mapSubscriptionsToResults(List subscriptions); + +} diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java index 5deabd2c..ce924d39 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java @@ -4,6 +4,10 @@ import org.springframework.stereotype.Repository; import uk.gov.hmcts.cp.entities.SubscriptionEntity; +import java.util.List; + @Repository public interface SubscriptionRepository extends JpaRepository { + + List getBySubscriberId(long subscriberId); } diff --git a/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java b/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java new file mode 100644 index 00000000..6108cc14 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java @@ -0,0 +1,30 @@ +package uk.gov.hmcts.cp.services; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; +import uk.gov.hmcts.cp.mappers.SubscriptionMapper; +import uk.gov.hmcts.cp.openapi.model.Result; +import uk.gov.hmcts.cp.repositories.SubscriptionRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SubscriptionService { + + private final SubscriptionRepository subscriptionRepository; + private final SubscriptionMapper mapper; + + public Result getSubscriptionById(final long subscriptionId) { + SubscriptionEntity entity = subscriptionRepository.getReferenceById(subscriptionId); + return mapper.mapSubscriptionToResult(entity); + } + + public List getSubscriptionsBySubscriber(final long subscriberId) { + List subscriptions = subscriptionRepository.getBySubscriberId(subscriberId); + return mapper.mapSubscriptionsToResults(subscriptions); + } +} diff --git a/src/test/java/uk/gov/hmcts/cp/mappers/SubscriptionMapperTest.java b/src/test/java/uk/gov/hmcts/cp/mappers/SubscriptionMapperTest.java new file mode 100644 index 00000000..2f103fd7 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/cp/mappers/SubscriptionMapperTest.java @@ -0,0 +1,28 @@ +package uk.gov.hmcts.cp.mappers; + +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; +import uk.gov.hmcts.cp.openapi.model.Result; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class SubscriptionMapperTest { + + SubscriptionMapper mapper = new SubscriptionMapperImpl(); + + @Test + void single_subscription_should_map_to_response() { + SubscriptionEntity subscription = SubscriptionEntity.builder().notifyUrl("https://example").build(); + Result result = mapper.mapSubscriptionToResult(subscription); + assertThat(result.getResultText()).isEqualTo("https://example"); + } + + @Test + void list_of_subscriptions_should_map_to_response() { + SubscriptionEntity subscription = SubscriptionEntity.builder().notifyUrl("https://example").build(); + List results = mapper.mapSubscriptionsToResults(List.of(subscription)); + assertThat(results).hasSize(1); + } +} \ No newline at end of file diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java index ce01e82f..535cd58f 100644 --- a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java @@ -33,4 +33,12 @@ void subscription_should_save_and_read_ok() { void fk_constraint_should_prevent_orphaned_subscription() { assertThrows(Exception.class, () -> insertSubscription(99L)); } + + @Test + void query_by_subscriber_id_should_return_subscription_list() { + SubscriberEntity subscriber = insertSubscriber("My subscriber"); + insertSubscription(subscriber.getId()); + List subscriptions = subscriptionRepository.getBySubscriberId(subscriber.getId()); + assertThat(subscriptions).hasSize(1); + } } \ No newline at end of file diff --git a/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java b/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java new file mode 100644 index 00000000..4e5c0339 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java @@ -0,0 +1,47 @@ +package uk.gov.hmcts.cp.services; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.cp.entities.SubscriptionEntity; +import uk.gov.hmcts.cp.mappers.SubscriptionMapper; +import uk.gov.hmcts.cp.mappers.SubscriptionMapperImpl; +import uk.gov.hmcts.cp.openapi.model.Result; +import uk.gov.hmcts.cp.repositories.SubscriptionRepository; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SubscriptionServiceTest { + + @Mock + SubscriptionRepository subscriptionRepository; + @Spy + SubscriptionMapper mapper = new SubscriptionMapperImpl(); + + @InjectMocks + SubscriptionService subscriptionService; + + SubscriptionEntity subscriptionEntity = SubscriptionEntity.builder().notifyUrl("url").build(); + + @Test + void get_single_subscription_should_return_single() { + when(subscriptionRepository.getReferenceById(123L)).thenReturn(subscriptionEntity); + Result response = subscriptionService.getSubscriptionById(123L); + assertThat(response.getResultText()).isEqualTo("url"); + } + + @Test + void get_subscription_by_subscriber_id_should_return() { + when(subscriptionRepository.getBySubscriberId(123L)).thenReturn(List.of(subscriptionEntity)); + List response = subscriptionService.getSubscriptionsBySubscriber(123L); + assertThat(response).hasSize(1); + assertThat(response.get(0).getResultText()).isEqualTo("url"); + } +} \ No newline at end of file From 96622a005c43e26061b54e5b09e902ccc0f2ffd9 Mon Sep 17 00:00:00 2001 From: coling01 Date: Tue, 9 Dec 2025 10:20:00 +0000 Subject: [PATCH 04/11] feature: amp-126 init project db and mapper and service * Add flyway to create tables and fk constraint * Add entities * Add repositories * Add repository tests to prove flyway and jpa line up ok * Add MapStruct mapper layer * Add simple service layer --- .gitignore | 2 +- gradle/dependencies/spring-db.gradle | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 gradle/dependencies/spring-db.gradle diff --git a/.gitignore b/.gitignore index 31ab8a84..97bd8192 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -gradle +gradle/wrapper bin/* !bin/run-in-docker.sh .gradle diff --git a/gradle/dependencies/spring-db.gradle b/gradle/dependencies/spring-db.gradle new file mode 100644 index 00000000..dbede3e9 --- /dev/null +++ b/gradle/dependencies/spring-db.gradle @@ -0,0 +1,10 @@ +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.postgresql:postgresql' + implementation 'org.springframework.boot:spring-boot-starter-flyway' + implementation 'org.flywaydb:flyway-core' + implementation 'org.flywaydb:flyway-database-postgresql' + testImplementation("org.springframework.boot:spring-boot-testcontainers:4.0.0") + testImplementation 'org.testcontainers:postgresql:1.21.3' + testImplementation 'org.testcontainers:junit-jupiter:1.21.3' +} \ No newline at end of file From c212e21458dbe2409d26ed46f2788219f4c84bc1 Mon Sep 17 00:00:00 2001 From: coling01 Date: Tue, 9 Dec 2025 14:32:34 +0000 Subject: [PATCH 05/11] feature: amp-126 init project db and mapper and service * Add flyway to create tables and fk constraint * Add entities * Add repositories * Add repository tests to prove flyway and jpa line up ok * Add MapStruct mapper layer * Add simple service layer * Make subscription id a uuid --- .../uk/gov/hmcts/cp/entities/SubscriberEntity.java | 6 ++++-- .../uk/gov/hmcts/cp/entities/SubscriptionEntity.java | 8 +++++--- .../hmcts/cp/repositories/SubscriberRepository.java | 4 +++- .../cp/repositories/SubscriptionRepository.java | 5 +++-- .../gov/hmcts/cp/services/SubscriptionService.java | 5 +++-- .../db/migration/V1.001__initial_schema.sql | 6 +++--- .../hmcts/cp/repositories/RepositoryTestBase.java | 4 +++- .../cp/repositories/SubscriptionRepositoryTest.java | 4 +++- .../hmcts/cp/services/SubscriptionServiceTest.java | 12 ++++++++---- 9 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java b/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java index 65b57e86..66690929 100644 --- a/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java +++ b/src/main/java/uk/gov/hmcts/cp/entities/SubscriberEntity.java @@ -10,6 +10,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.UUID; + @Entity @Table(name = "subscriber") @Getter @@ -19,8 +21,8 @@ public class SubscriberEntity { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; private String name; } \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java b/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java index cbb2f95c..349c54de 100644 --- a/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java +++ b/src/main/java/uk/gov/hmcts/cp/entities/SubscriptionEntity.java @@ -13,6 +13,8 @@ import lombok.NoArgsConstructor; import uk.gov.hmcts.cp.model.EventType; +import java.util.UUID; + @Entity @Table(name = "subscription") @Getter @@ -22,10 +24,10 @@ public class SubscriptionEntity { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; - private long subscriberId; + private UUID subscriberId; @Enumerated(EnumType.STRING) private EventType eventType; private String notifyUrl; diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java index 6a8f926a..acf9960d 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java @@ -4,6 +4,8 @@ import org.springframework.stereotype.Repository; import uk.gov.hmcts.cp.entities.SubscriberEntity; +import java.util.UUID; + @Repository -public interface SubscriberRepository extends JpaRepository { +public interface SubscriberRepository extends JpaRepository { } diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java index ce924d39..fddb0001 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java @@ -5,9 +5,10 @@ import uk.gov.hmcts.cp.entities.SubscriptionEntity; import java.util.List; +import java.util.UUID; @Repository -public interface SubscriptionRepository extends JpaRepository { +public interface SubscriptionRepository extends JpaRepository { - List getBySubscriberId(long subscriberId); + List getBySubscriberId(UUID subscriberId); } diff --git a/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java b/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java index 6108cc14..16d72afb 100644 --- a/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java +++ b/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java @@ -9,6 +9,7 @@ import uk.gov.hmcts.cp.repositories.SubscriptionRepository; import java.util.List; +import java.util.UUID; @Service @RequiredArgsConstructor @@ -18,12 +19,12 @@ public class SubscriptionService { private final SubscriptionRepository subscriptionRepository; private final SubscriptionMapper mapper; - public Result getSubscriptionById(final long subscriptionId) { + public Result getSubscriptionById(final UUID subscriptionId) { SubscriptionEntity entity = subscriptionRepository.getReferenceById(subscriptionId); return mapper.mapSubscriptionToResult(entity); } - public List getSubscriptionsBySubscriber(final long subscriberId) { + public List getSubscriptionsBySubscriber(final UUID subscriberId) { List subscriptions = subscriptionRepository.getBySubscriberId(subscriberId); return mapper.mapSubscriptionsToResults(subscriptions); } diff --git a/src/main/resources/db/migration/V1.001__initial_schema.sql b/src/main/resources/db/migration/V1.001__initial_schema.sql index d65119a7..818a931c 100644 --- a/src/main/resources/db/migration/V1.001__initial_schema.sql +++ b/src/main/resources/db/migration/V1.001__initial_schema.sql @@ -1,12 +1,12 @@ create table subscriber ( - id bigserial primary key not null, + id uuid primary key not null, name varchar(128) not null ); create unique index on subscriber (name); create table subscription ( - id bigserial primary key not null, - subscriber_id bigint not null, + id uuid primary key not null, + subscriber_id uuid not null, event_type varchar(32) not null, notify_url text not null ); diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java b/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java index 89820d2d..bdfb3cc7 100644 --- a/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java +++ b/src/test/java/uk/gov/hmcts/cp/repositories/RepositoryTestBase.java @@ -10,6 +10,8 @@ import uk.gov.hmcts.cp.entities.SubscriptionEntity; import uk.gov.hmcts.cp.model.EventType; +import java.util.UUID; + @SpringBootTest @ContextConfiguration(initializers = TestContainersInitialise.class) @AutoConfigureMockMvc @@ -35,7 +37,7 @@ protected SubscriberEntity insertSubscriber(String name) { return saved; } - protected SubscriptionEntity insertSubscription(long subscriberId) { + protected SubscriptionEntity insertSubscription(UUID subscriberId) { SubscriptionEntity subscription = SubscriptionEntity.builder() .subscriberId(subscriberId) .eventType(EventType.PCR) diff --git a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java index 535cd58f..7df673b5 100644 --- a/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/cp/repositories/SubscriptionRepositoryTest.java @@ -6,6 +6,7 @@ import uk.gov.hmcts.cp.entities.SubscriptionEntity; import java.util.List; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -31,7 +32,8 @@ void subscription_should_save_and_read_ok() { @Test void fk_constraint_should_prevent_orphaned_subscription() { - assertThrows(Exception.class, () -> insertSubscription(99L)); + UUID randomSubscriptionId = UUID.randomUUID(); + assertThrows(Exception.class, () -> insertSubscription(randomSubscriptionId)); } @Test diff --git a/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java b/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java index 4e5c0339..0e4460e3 100644 --- a/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java +++ b/src/test/java/uk/gov/hmcts/cp/services/SubscriptionServiceTest.java @@ -13,6 +13,7 @@ import uk.gov.hmcts.cp.repositories.SubscriptionRepository; import java.util.List; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @@ -30,17 +31,20 @@ class SubscriptionServiceTest { SubscriptionEntity subscriptionEntity = SubscriptionEntity.builder().notifyUrl("url").build(); + UUID subscriberId = UUID.fromString("2413d0fd-8a75-4fb6-828d-1a1fb7ae7290"); + UUID subscriptionId = UUID.fromString("ee2e6e17-7c37-45ec-a1d4-4023500fb90d"); + @Test void get_single_subscription_should_return_single() { - when(subscriptionRepository.getReferenceById(123L)).thenReturn(subscriptionEntity); - Result response = subscriptionService.getSubscriptionById(123L); + when(subscriptionRepository.getReferenceById(subscriptionId)).thenReturn(subscriptionEntity); + Result response = subscriptionService.getSubscriptionById(subscriptionId); assertThat(response.getResultText()).isEqualTo("url"); } @Test void get_subscription_by_subscriber_id_should_return() { - when(subscriptionRepository.getBySubscriberId(123L)).thenReturn(List.of(subscriptionEntity)); - List response = subscriptionService.getSubscriptionsBySubscriber(123L); + when(subscriptionRepository.getBySubscriberId(subscriberId)).thenReturn(List.of(subscriptionEntity)); + List response = subscriptionService.getSubscriptionsBySubscriber(subscriberId); assertThat(response).hasSize(1); assertThat(response.get(0).getResultText()).isEqualTo("url"); } From 2340100108eb749ea3c224332aba3e1728b8a273 Mon Sep 17 00:00:00 2001 From: coling01 Date: Wed, 10 Dec 2025 13:07:56 +0000 Subject: [PATCH 06/11] chore: drop api-test pending spike to cleanup docker-compose and push docker --- build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/build.gradle b/build.gradle index eb2ff717..b4962a2d 100644 --- a/build.gradle +++ b/build.gradle @@ -25,9 +25,6 @@ apply { from("$rootDir/gradle/github/pmd.gradle") from("$rootDir/gradle/github/test.gradle") from("$rootDir/gradle/github/jar.gradle") - - from("$rootDir/gradle/tasks/apitest.gradle") - from("$rootDir/gradle/tasks/docker.gradle") } springBoot { From 623c0ca953e992f3b3502f61cfa4e3969c7fc6d0 Mon Sep 17 00:00:00 2001 From: coling01 Date: Wed, 10 Dec 2025 14:06:23 +0000 Subject: [PATCH 07/11] chore: fix pmd finals and qualifiers --- src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java | 4 ++-- .../uk/gov/hmcts/cp/repositories/SubscriberRepository.java | 1 + .../uk/gov/hmcts/cp/repositories/SubscriptionRepository.java | 1 + .../java/uk/gov/hmcts/cp/services/SubscriptionService.java | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java b/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java index 8de3f4f5..b0ce8094 100644 --- a/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java +++ b/src/main/java/uk/gov/hmcts/cp/mappers/SubscriptionMapper.java @@ -12,8 +12,8 @@ public interface SubscriptionMapper { @Mapping(source = "notifyUrl", target = "resultText") - public abstract Result mapSubscriptionToResult(SubscriptionEntity subscription); + Result mapSubscriptionToResult(SubscriptionEntity subscription); - public abstract List mapSubscriptionsToResults(List subscriptions); + List mapSubscriptionsToResults(List subscriptions); } diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java index acf9960d..e3437177 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java @@ -6,6 +6,7 @@ import java.util.UUID; +@FunctionalInterface @Repository public interface SubscriberRepository extends JpaRepository { } diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java index fddb0001..03f9dda1 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.UUID; +@FunctionalInterface @Repository public interface SubscriptionRepository extends JpaRepository { diff --git a/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java b/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java index 16d72afb..6fe6c468 100644 --- a/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java +++ b/src/main/java/uk/gov/hmcts/cp/services/SubscriptionService.java @@ -20,12 +20,12 @@ public class SubscriptionService { private final SubscriptionMapper mapper; public Result getSubscriptionById(final UUID subscriptionId) { - SubscriptionEntity entity = subscriptionRepository.getReferenceById(subscriptionId); + final SubscriptionEntity entity = subscriptionRepository.getReferenceById(subscriptionId); return mapper.mapSubscriptionToResult(entity); } public List getSubscriptionsBySubscriber(final UUID subscriberId) { - List subscriptions = subscriptionRepository.getBySubscriberId(subscriberId); + final List subscriptions = subscriptionRepository.getBySubscriberId(subscriberId); return mapper.mapSubscriptionsToResults(subscriptions); } } From 32455cd88c6f1ab015103aec7d617f6115927adc Mon Sep 17 00:00:00 2001 From: coling01 Date: Wed, 10 Dec 2025 14:54:17 +0000 Subject: [PATCH 08/11] chore: fix pmd finals and qualifiers ... exclude pmd rule ImplicitFunctionalInterface --- .github/pmd-ruleset.xml | 1 + .../java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java | 1 - .../uk/gov/hmcts/cp/repositories/SubscriptionRepository.java | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/pmd-ruleset.xml b/.github/pmd-ruleset.xml index 35916718..19dedd48 100644 --- a/.github/pmd-ruleset.xml +++ b/.github/pmd-ruleset.xml @@ -18,6 +18,7 @@ + diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java index e3437177..acf9960d 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriberRepository.java @@ -6,7 +6,6 @@ import java.util.UUID; -@FunctionalInterface @Repository public interface SubscriberRepository extends JpaRepository { } diff --git a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java index 03f9dda1..fddb0001 100644 --- a/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java +++ b/src/main/java/uk/gov/hmcts/cp/repositories/SubscriptionRepository.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.UUID; -@FunctionalInterface @Repository public interface SubscriptionRepository extends JpaRepository { From 7c29de0e96a5327acb2ac07d99108959d737dbfd Mon Sep 17 00:00:00 2001 From: coling01 Date: Wed, 10 Dec 2025 15:02:58 +0000 Subject: [PATCH 09/11] chore: ignore apiTest for now. We have a spike to sort out docker build and apiTest --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c0fe9c93..09b9e34a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -89,7 +89,7 @@ jobs: gradle-version: current - name: Gradle Build - run: gradle build -x test -x api + run: gradle build -x test - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 From feb214d5fa10506232693f88caf217c4449ff28c Mon Sep 17 00:00:00 2001 From: coling01 Date: Thu, 11 Dec 2025 12:18:50 +0000 Subject: [PATCH 10/11] feature: amp-151 setup docker for api-test * Move dockerfiles to root * Bring in api-test.gradle * Config app.yaml and dockerfile to line up for api-test --- docker/Dockerfile => Dockerfile | 0 build.gradle | 2 ++ docker-compose.yml | 21 +++++++++++++++++++++ docker/docker-compose.yml | 22 ---------------------- gradle/tasks/apitest.gradle | 24 ++++++++++++++++++++---- gradle/tasks/docker.gradle | 18 ------------------ src/main/resources/application.yaml | 16 ++++++++++++++++ 7 files changed, 59 insertions(+), 44 deletions(-) rename docker/Dockerfile => Dockerfile (100%) create mode 100644 docker-compose.yml delete mode 100644 docker/docker-compose.yml delete mode 100644 gradle/tasks/docker.gradle create mode 100644 src/main/resources/application.yaml diff --git a/docker/Dockerfile b/Dockerfile similarity index 100% rename from docker/Dockerfile rename to Dockerfile diff --git a/build.gradle b/build.gradle index b4962a2d..e52fd11a 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,8 @@ apply { from("$rootDir/gradle/github/pmd.gradle") from("$rootDir/gradle/github/test.gradle") from("$rootDir/gradle/github/jar.gradle") + + from("$rootDir/gradle/tasks/apitest.gradle") } springBoot { diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..4dbee57f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +services: + db: + image: postgres:16-alpine + environment: + POSTGRES_DB: appdb + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - "5432:5432" + + app: + build: + dockerfile: Dockerfile + environment: + DATASOURCE_URL: jdbc:postgresql://db:5432/appdb + DATASOURCE_USERNAME: postgres + DATASOURCE_PASSWORD: postgres + depends_on: + - db + ports: + - "8082:8082" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml deleted file mode 100644 index 919b380e..00000000 --- a/docker/docker-compose.yml +++ /dev/null @@ -1,22 +0,0 @@ -services: - postgres: - image: postgres:16-alpine - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - - POSTGRES_DB=postgres - ports: - - '5432:5432' - volumes: - - postgres-db-volume:/var/lib/postgresql/data - - app: - container_name: app - build: - context: .. - dockerfile: docker/Dockerfile - ports: - - "8082:8082" - -volumes: - postgres-db-volume: \ No newline at end of file diff --git a/gradle/tasks/apitest.gradle b/gradle/tasks/apitest.gradle index 6d23937e..63273b9a 100644 --- a/gradle/tasks/apitest.gradle +++ b/gradle/tasks/apitest.gradle @@ -1,4 +1,4 @@ -tasks.register('api', Test) { +tasks.register('apiTest', Test) { description = "Runs api tests against docker-compose stack" group = "Verification" @@ -13,12 +13,12 @@ tasks.register('api', Test) { } tasks.named('check') { - dependsOn tasks.named('api') + dependsOn tasks.named('apiTest') } tasks.named('build') { dependsOn tasks.named('test') - dependsOn tasks.named('api') + dependsOn tasks.named('apiTest') } sourceSets { @@ -30,5 +30,21 @@ sourceSets { } } -dependencies { +dockerCompose { + useComposeFiles = ['docker-compose.yml'] + startedServices = ['db', 'app'] + + buildBeforeUp = true + waitForTcpPorts = true + upAdditionalArgs = ['--wait', '--wait-timeout', '120'] + + captureContainersOutput = true + removeOrphans = true + stopContainers = true + removeContainers = true + + projectName = "app" + + useDockerComposeV2 = true + dockerExecutable = 'docker' } diff --git a/gradle/tasks/docker.gradle b/gradle/tasks/docker.gradle deleted file mode 100644 index 97085af8..00000000 --- a/gradle/tasks/docker.gradle +++ /dev/null @@ -1,18 +0,0 @@ -dockerCompose { - useComposeFiles = ['docker/docker-compose.yml'] - startedServices = ['app'] - - buildBeforeUp = true - waitForTcpPorts = true - upAdditionalArgs = ['--wait', '--wait-timeout', '30'] - - captureContainersOutput = true - removeOrphans = true - stopContainers = true - removeContainers = true - - projectName = "${rootProject.name}" - - useDockerComposeV2 = true - dockerExecutable = 'docker' -} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 00000000..d09414e5 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,16 @@ +server: + port: ${SERVER_PORT:8082} + +spring: + application: + name: service-hmcts-springboot-demo-postgres + jpa: + open-in-view: false + datasource: + url: ${DATASOURCE_URL:jdbc:postgresql://localhost:5432/appdb} + username: ${DATASOURCE_USERNAME:postgres} + password: ${DATASOURCE_PASSWORD:postgres} + flyway: + enabled: true + locations: classpath:db/migration + baseline-on-migrate: true From e1bd78ff7aa658db40ef7758ed96c557234c9ba8 Mon Sep 17 00:00:00 2001 From: coling01 Date: Thu, 11 Dec 2025 12:28:12 +0000 Subject: [PATCH 11/11] feature: amp-151 setup docker for api-test * Move dockerfiles to root * Bring in api-test.gradle * Config app.yaml and dockerfile to line up for api-test --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 09b9e34a..087c10e9 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -96,7 +96,7 @@ jobs: - name: DAST - Build and run containerised app run: | - docker compose -f docker/docker-compose.yml up -d + docker compose -f docker-compose.yml up -d echo "Waiting for health endpoint..." for i in {1..30}; do