From ce1ef8c54018764a529f3e1517df42e77324c13a Mon Sep 17 00:00:00 2001 From: Dmitry Belyaev Date: Mon, 25 Jul 2022 18:53:46 +0200 Subject: [PATCH] GH-17 - Bootstrap PostgreSQL in a container and execute integration tests against it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Björn Kieling --- .../spring-modulith-events-jdbc/pom.xml | 38 ++++++++++++++++++- ...JdbcEventPublicationAutoConfiguration.java | 2 +- .../jdbc/JdbcEventPublicationRepository.java | 8 +++- ...ema-postgres.sql => schema-postgresql.sql} | 6 +-- ...baseSchemaInitializerIntegrationTests.java | 9 ++--- ...PublicationRepositoryIntegrationTests.java | 7 ++-- .../test/resources/application-h2.properties | 4 +- .../resources/application-hsqldb.properties | 4 +- .../resources/application-postgres.properties | 9 ++--- 9 files changed, 64 insertions(+), 23 deletions(-) rename spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/{schema-postgres.sql => schema-postgresql.sql} (100%) diff --git a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml index e5205475..078810fe 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml @@ -13,8 +13,21 @@ org.springframework.modulith.events.jdbc + 1.17.3 + + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + @@ -41,6 +54,30 @@ test + + org.springframework.boot + spring-boot-starter-jdbc + test + + + + + org.testcontainers + testcontainers + test + + + org.testcontainers + junit-jupiter + test + + + org.testcontainers + postgresql + test + + + org.hsqldb hsqldb @@ -60,5 +97,4 @@ - diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationAutoConfiguration.java b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationAutoConfiguration.java index e9bd4435..c76fcaa4 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationAutoConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationAutoConfiguration.java @@ -31,7 +31,7 @@ import org.springframework.modulith.events.config.EventPublicationConfigurationE class JdbcEventPublicationAutoConfiguration implements EventPublicationConfigurationExtension { @Bean - JdbcEventPublicationRepository jpaEventPublicationRepository(JdbcTemplate jdbcTemplate, EventSerializer serializer) { + JdbcEventPublicationRepository jdbcEventPublicationRepository(JdbcTemplate jdbcTemplate, EventSerializer serializer) { return new JdbcEventPublicationRepository(jdbcTemplate, serializer); } diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java index fd5d2323..e17d4170 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java @@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -81,7 +82,7 @@ class JdbcEventPublicationRepository implements EventPublicationRepository { UUID.randomUUID(), // publication.getEvent().getClass().getName(), // publication.getTargetIdentifier().getValue(), // - publication.getPublicationDate(), // + Timestamp.from(publication.getPublicationDate()), // serializeEvent(publication.getEvent())); return publication; @@ -96,7 +97,10 @@ class JdbcEventPublicationRepository implements EventPublicationRepository { (rs, rowNum) -> rs.getObject("ID", UUID.class), serializedEvent, publication.getTargetIdentifier().getValue()); if (!results.isEmpty()) { - operations.update(SQL_STATEMENT_UPDATE, publication.getCompletionDate().orElse(null), results.get(0)); + operations.update( + SQL_STATEMENT_UPDATE, + publication.getCompletionDate().map(Timestamp::from).orElse(null), + results.get(0)); } return publication; diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-postgres.sql b/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-postgresql.sql similarity index 100% rename from spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-postgres.sql rename to spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-postgresql.sql index 9a770217..eb71f60a 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-postgres.sql +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-postgresql.sql @@ -1,10 +1,10 @@ CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION ( ID UUID NOT NULL, - COMPLETION_DATE TIMESTAMP(9) WITH TIME ZONE, - EVENT_TYPE VARCHAR(512) NOT NULL, LISTENER_ID VARCHAR(512) NOT NULL, - PUBLICATION_DATE TIMESTAMP(9) WITH TIME ZONE NOT NULL, + EVENT_TYPE VARCHAR(512) NOT NULL, SERIALIZED_EVENT VARCHAR(4000) NOT NULL, + PUBLICATION_DATE TIMESTAMP(9) WITH TIME ZONE NOT NULL, + COMPLETION_DATE TIMESTAMP(9) WITH TIME ZONE, PRIMARY KEY (ID) ) diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java index 4bbb189d..8acf0a92 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.*; import java.util.Optional; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -44,10 +43,10 @@ class DatabaseSchemaInitializerIntegrationTests { private static final String COUNT_PUBLICATIONS = "SELECT COUNT(*) FROM EVENT_PUBLICATION"; - @JdbcTest @ImportAutoConfiguration(JdbcEventPublicationAutoConfiguration.class) @ContextConfiguration(classes = TestApplication.class) static class TestBase { + @MockBean EventSerializer serializer; } @@ -88,6 +87,7 @@ class DatabaseSchemaInitializerIntegrationTests { } @Nested + @JdbcTest class InitializationDisabledByDefault extends TestBase { @SpyBean JdbcOperations operations; @@ -106,16 +106,13 @@ class DatabaseSchemaInitializerIntegrationTests { @Nested @ActiveProfiles("hsqldb") - class HSQLDB extends WithInitEnabled { - - } + class HSQLDB extends WithInitEnabled {} @Nested @ActiveProfiles("h2") class H2 extends WithInitEnabled {} @Nested - @Disabled @ActiveProfiles("postgres") class Postgres extends WithInitEnabled {} } diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java index e1ab912c..b20c0c78 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.*; import lombok.Value; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -37,6 +36,8 @@ import org.springframework.modulith.testapp.TestApplication; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; +import java.time.temporal.ChronoUnit; + /** * Integration tests for {@link JdbcEventPublicationRepository}. * @@ -161,7 +162,8 @@ class JdbcEventPublicationRepositoryIntegrationTests { var actual = repository.findByEventAndTargetIdentifier(testEvent, TARGET_IDENTIFIER); assertThat(actual).hasValueSatisfying(it -> { - assertThat(it.getPublicationDate()).isEqualTo(publicationOld.getPublicationDate()); + assertThat(it.getPublicationDate()) // + .isCloseTo(publicationOld.getPublicationDate(), within(1, ChronoUnit.MILLIS)); }); } @@ -194,7 +196,6 @@ class JdbcEventPublicationRepositoryIntegrationTests { class H2 extends TestBase {} @Nested - @Disabled @ActiveProfiles("postgres") class Postgres extends TestBase {} diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-h2.properties b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-h2.properties index b29b54fa..fb956a9d 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-h2.properties +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-h2.properties @@ -1,4 +1,6 @@ spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 +# spring.test.database.replace=NONE - +# spring.modulith.events.schema-initialization.enabled=true diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-hsqldb.properties b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-hsqldb.properties index ee56e637..f316ebb0 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-hsqldb.properties +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-hsqldb.properties @@ -1,4 +1,6 @@ spring.datasource.driverClassName=org.hsqldb.jdbc.JDBCDriver +spring.datasource.url=jdbc:hsqldb:mem:testdb;DB_CLOSE_DELAY=-1 +# spring.test.database.replace=NONE - +# spring.modulith.events.schema-initialization.enabled=true diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-postgres.properties b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-postgres.properties index 3d86965b..ae9c8add 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-postgres.properties +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-postgres.properties @@ -1,7 +1,6 @@ -spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/postgres -spring.datasource.username=username -spring.datasource.password=password +spring.datasource.url=jdbc:tc:postgresql:13.2:////postgres +spring.datasource.driverClassName=org.testcontainers.jdbc.ContainerDatabaseDriver +# spring.test.database.replace=NONE - +# spring.modulith.events.schema-initialization.enabled=true