From 7fd73d0005f437b415aec43678ae5d12bc798eb7 Mon Sep 17 00:00:00 2001 From: amckenzie Date: Fri, 2 Nov 2018 12:31:10 +0000 Subject: [PATCH] Reintruduce TestEventStore from framework --- pom.xml | 2 +- test-utils-event-store/pom.xml | 20 +++ .../test-utils-event/pom.xml | 44 ++++++ .../core/eventsource/TestEventRepository.java | 95 +++++++++++++ .../eventsource/TestEventRepositoryIT.java | 133 ++++++++++++++++++ .../test-utils-persistence}/pom.xml | 0 .../persistence/BaseTransactionalTest.java | 0 .../utils/persistence/DatabaseCleaner.java | 0 .../FrameworkTestDataSourceFactory.java | 0 .../TestEventStoreDataSourceFactory.java | 0 .../TestJdbcConnectionProvider.java | 0 .../TestJdbcDataSourceProvider.java | 0 .../resources/test-data-source.properties | 0 .../persistence/DatabaseCleanerTest.java | 0 .../EventStoreDataSourceFactoryIT.java | 0 .../FrameworkTestDataSourceFactoryTest.java | 0 .../TestJdbcConnectionProviderTest.java | 0 .../src/test/resources/liquibase.properties | 0 .../resources/liquibase/test-db-changelog.xml | 0 19 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 test-utils-event-store/pom.xml create mode 100644 test-utils-event-store/test-utils-event/pom.xml create mode 100644 test-utils-event-store/test-utils-event/src/main/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepository.java create mode 100644 test-utils-event-store/test-utils-event/src/test/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepositoryIT.java rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/pom.xml (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/java/uk/gov/justice/services/test/utils/persistence/BaseTransactionalTest.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleaner.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactory.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/java/uk/gov/justice/services/test/utils/persistence/TestEventStoreDataSourceFactory.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProvider.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcDataSourceProvider.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/main/resources/test-data-source.properties (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/test/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleanerTest.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/test/java/uk/gov/justice/services/test/utils/persistence/EventStoreDataSourceFactoryIT.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/test/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactoryTest.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/test/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProviderTest.java (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/test/resources/liquibase.properties (100%) rename {test-utils-persistence => test-utils-event-store/test-utils-persistence}/src/test/resources/liquibase/test-db-changelog.xml (100%) diff --git a/pom.xml b/pom.xml index 7be880c85..b95def2c4 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ event-sourcing interceptors event-store-bom - test-utils-persistence + test-utils-event-store diff --git a/test-utils-event-store/pom.xml b/test-utils-event-store/pom.xml new file mode 100644 index 000000000..0af1dcea0 --- /dev/null +++ b/test-utils-event-store/pom.xml @@ -0,0 +1,20 @@ + + + + event-store + uk.gov.justice.event-store + 1.0.0-SNAPSHOT + + 4.0.0 + + test-utils-event-store + pom + + test-utils-event + test-utils-persistence + + + + diff --git a/test-utils-event-store/test-utils-event/pom.xml b/test-utils-event-store/test-utils-event/pom.xml new file mode 100644 index 000000000..a78b1d4df --- /dev/null +++ b/test-utils-event-store/test-utils-event/pom.xml @@ -0,0 +1,44 @@ + + + + test-utils-event-store + uk.gov.justice.event-store + 1.0.0-SNAPSHOT + + 4.0.0 + + test-utils-event + + + + uk.gov.justice.event-store + event-repository-jdbc + ${project.version} + + + uk.gov.justice.services + test-utils-common + ${framework.version} + + + uk.gov.justice.services + test-utils-core + ${framework.version} + + + + + commons-logging + commons-logging + test + + + org.postgresql + postgresql + test + + + + diff --git a/test-utils-event-store/test-utils-event/src/main/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepository.java b/test-utils-event-store/test-utils-event/src/main/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepository.java new file mode 100644 index 000000000..9f77df683 --- /dev/null +++ b/test-utils-event-store/test-utils-event/src/main/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepository.java @@ -0,0 +1,95 @@ +package uk.gov.justice.services.test.utils.core.eventsource; + +import static java.util.stream.Collectors.toList; +import static org.slf4j.LoggerFactory.getLogger; +import static uk.gov.justice.services.test.utils.common.host.TestHostProvider.getHost; + +import uk.gov.justice.services.eventsourcing.repository.jdbc.AnsiSQLEventLogInsertionStrategy; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.InvalidPositionException; +import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.test.utils.common.reflection.ReflectionUtils; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp2.BasicDataSource; + +/** + * Standalone repository class to access event streams. To be used in integration testing. Moved + * here from framework by Allan + */ +public class TestEventRepository { + + private static final String POSTGRES_DRIVER_NAME = "org.postgresql.Driver"; + + private final EventJdbcRepository eventJdbcRepository; + private final DataSource dbSource; + + public TestEventRepository(final DataSource dbSource) { + this.dbSource = dbSource; + eventJdbcRepository = new EventJdbcRepository( + new AnsiSQLEventLogInsertionStrategy(), + new JdbcRepositoryHelper(), + null, + "", + getLogger(EventJdbcRepository.class)); + + ReflectionUtils.setField(eventJdbcRepository, "dataSource", dbSource); + } + + public TestEventRepository(final String url, final String username, final String password, final String driverClassName) { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(driverClassName); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + + this.dbSource = dataSource; + + eventJdbcRepository = new EventJdbcRepository( + new AnsiSQLEventLogInsertionStrategy(), + new JdbcRepositoryHelper(), + null, + "", + getLogger(EventJdbcRepository.class)); + + ReflectionUtils.setField(eventJdbcRepository, "dataSource", dbSource); + } + + public TestEventRepository(final String contextName) { + this(jdbcUrlFrom(contextName), contextName, contextName, POSTGRES_DRIVER_NAME); + } + + public static TestEventRepository forContext(final String contextName) { + return new TestEventRepository(contextName); + } + + public List eventsOfStreamId(final UUID streamId) { + try (final Stream events = eventJdbcRepository.findByStreamIdOrderByPositionAsc(streamId)) { + return events.collect(toList()); + } + } + + public List allEvents() { + try (final Stream events = eventJdbcRepository.findAll()) { + return events.collect(toList()); + } + } + + public void insert(final Event event) throws InvalidPositionException { + eventJdbcRepository.insert(event); + } + + public DataSource getDataSource() { + return dbSource; + } + + private static String jdbcUrlFrom(final String contextName) { + return String.format("jdbc:postgresql://%s/%seventstore", getHost(), contextName); + } +} diff --git a/test-utils-event-store/test-utils-event/src/test/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepositoryIT.java b/test-utils-event-store/test-utils-event/src/test/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepositoryIT.java new file mode 100644 index 000000000..c06d238de --- /dev/null +++ b/test-utils-event-store/test-utils-event/src/test/java/uk/gov/justice/services/test/utils/core/eventsource/TestEventRepositoryIT.java @@ -0,0 +1,133 @@ +package uk.gov.justice.services.test.utils.core.eventsource; + +import static java.util.UUID.randomUUID; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.sameInstance; +import static org.junit.Assert.assertThat; +import static uk.gov.justice.services.test.utils.common.host.TestHostProvider.getHost; + +import uk.gov.justice.services.common.util.UtcClock; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.List; +import java.util.UUID; + +import org.apache.commons.dbcp2.BasicDataSource; +import org.junit.Test; + +public class TestEventRepositoryIT { + + @Test + public void shouldGetAConnectionToTheEventStore() throws Exception { + + final TestEventRepository testEventRepository = TestEventRepository.forContext("framework"); + + try (final Connection connection = testEventRepository.getDataSource().getConnection()) { + try (final PreparedStatement preparedStatement = connection.prepareStatement("SELECT * from event_log")) { + try (final ResultSet resultSet = preparedStatement.executeQuery()) { + assertThat(resultSet, is(notNullValue())); + } + } + } + } + + @Test + public void shouldBeInstantiatedUsingADatasource() throws Exception { + + final String url = "jdbc:postgresql://localhost/frameworkeventstore"; + final String driverName = "org.postgresql.Driver"; + final String username = "framework"; + final String password = "framework"; + + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(driverName); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + + final TestEventRepository testEventRepository = new TestEventRepository(dataSource); + + assertThat(testEventRepository.getDataSource(), is(sameInstance(dataSource))); + } + + @Test + public void shouldInsertAndFindEvents() throws Exception { + + cleanDatabase(); + + final UUID steamId_1 = randomUUID(); + final UUID steamId_2 = randomUUID(); + final UUID steamId_3 = randomUUID(); + + final Event event_1 = anEvent(1L, steamId_1); + final Event event_2 = anEvent(2L, steamId_2); + final Event event_3 = anEvent(3L, steamId_3); + + final TestEventRepository testEventRepository = TestEventRepository.forContext("framework"); + + testEventRepository.insert(event_1); + testEventRepository.insert(event_2); + testEventRepository.insert(event_3); + + final List events = testEventRepository.allEvents(); + + assertThat(events.size(), is(3)); + + assertThat(events, hasItem(event_1)); + assertThat(events, hasItem(event_2)); + assertThat(events, hasItem(event_3)); + } + + @Test + public void shouldFindEventsByStreamId() throws Exception { + + cleanDatabase(); + + final UUID steamId_1 = randomUUID(); + final UUID steamId_2 = randomUUID(); + + final Event event_1 = anEvent(1L, steamId_1); + final Event event_2 = anEvent(2L, steamId_2); + final Event event_3 = anEvent(3L, steamId_2); + + final TestEventRepository testEventRepository = TestEventRepository.forContext("framework"); + + testEventRepository.insert(event_1); + testEventRepository.insert(event_2); + testEventRepository.insert(event_3); + + final List events = testEventRepository.eventsOfStreamId(steamId_2); + + assertThat(events.size(), is(2)); + + assertThat(events, hasItem(event_2)); + assertThat(events, hasItem(event_3)); + } + + private Event anEvent(final Long sequenceId, final UUID steamId) { + return new Event( + randomUUID(), + steamId, + sequenceId, + "event.name_" + sequenceId, + "metadata " + sequenceId, + "payload " + sequenceId, + new UtcClock().now() + ); + } + + private void cleanDatabase() throws Exception { + final TestEventRepository testEventRepository = TestEventRepository.forContext("framework"); + + try(final Connection connection = testEventRepository.getDataSource().getConnection()) { + try(final PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM event_log")) { + preparedStatement.executeUpdate(); + } + } + } +} diff --git a/test-utils-persistence/pom.xml b/test-utils-event-store/test-utils-persistence/pom.xml similarity index 100% rename from test-utils-persistence/pom.xml rename to test-utils-event-store/test-utils-persistence/pom.xml diff --git a/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/BaseTransactionalTest.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/BaseTransactionalTest.java similarity index 100% rename from test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/BaseTransactionalTest.java rename to test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/BaseTransactionalTest.java diff --git a/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleaner.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleaner.java similarity index 100% rename from test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleaner.java rename to test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleaner.java diff --git a/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactory.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactory.java similarity index 100% rename from test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactory.java rename to test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactory.java diff --git a/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestEventStoreDataSourceFactory.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestEventStoreDataSourceFactory.java similarity index 100% rename from test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestEventStoreDataSourceFactory.java rename to test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestEventStoreDataSourceFactory.java diff --git a/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProvider.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProvider.java similarity index 100% rename from test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProvider.java rename to test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProvider.java diff --git a/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcDataSourceProvider.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcDataSourceProvider.java similarity index 100% rename from test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcDataSourceProvider.java rename to test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/TestJdbcDataSourceProvider.java diff --git a/test-utils-persistence/src/main/resources/test-data-source.properties b/test-utils-event-store/test-utils-persistence/src/main/resources/test-data-source.properties similarity index 100% rename from test-utils-persistence/src/main/resources/test-data-source.properties rename to test-utils-event-store/test-utils-persistence/src/main/resources/test-data-source.properties diff --git a/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleanerTest.java b/test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleanerTest.java similarity index 100% rename from test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleanerTest.java rename to test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/DatabaseCleanerTest.java diff --git a/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/EventStoreDataSourceFactoryIT.java b/test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/EventStoreDataSourceFactoryIT.java similarity index 100% rename from test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/EventStoreDataSourceFactoryIT.java rename to test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/EventStoreDataSourceFactoryIT.java diff --git a/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactoryTest.java b/test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactoryTest.java similarity index 100% rename from test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactoryTest.java rename to test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/FrameworkTestDataSourceFactoryTest.java diff --git a/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProviderTest.java b/test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProviderTest.java similarity index 100% rename from test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProviderTest.java rename to test-utils-event-store/test-utils-persistence/src/test/java/uk/gov/justice/services/test/utils/persistence/TestJdbcConnectionProviderTest.java diff --git a/test-utils-persistence/src/test/resources/liquibase.properties b/test-utils-event-store/test-utils-persistence/src/test/resources/liquibase.properties similarity index 100% rename from test-utils-persistence/src/test/resources/liquibase.properties rename to test-utils-event-store/test-utils-persistence/src/test/resources/liquibase.properties diff --git a/test-utils-persistence/src/test/resources/liquibase/test-db-changelog.xml b/test-utils-event-store/test-utils-persistence/src/test/resources/liquibase/test-db-changelog.xml similarity index 100% rename from test-utils-persistence/src/test/resources/liquibase/test-db-changelog.xml rename to test-utils-event-store/test-utils-persistence/src/test/resources/liquibase/test-db-changelog.xml