From 6398d86b83dc4723f0e99fa1d9bf7d68b4d05805 Mon Sep 17 00:00:00 2001 From: amckenzie Date: Wed, 18 Dec 2019 10:43:27 +0000 Subject: [PATCH 1/3] Add integration test for the event error handling --- .../cakeshop/it/CatchupPerformanceIT.java | 3 - .../cakeshop/it/EventErrorHandlingIT.java | 103 ++++++++++++++++++ .../it/MultipleEventListenerCakeShopIT.java | 21 +--- .../EventErrorLogRepositoryFactory.java | 31 ++++++ .../cakeshop/it/helpers/EventSender.java | 31 ++++++ .../wildfly-config/standalone-single.xml | 2 + .../example-service/example-single/pom.xml | 5 + pom.xml | 8 +- 8 files changed, 180 insertions(+), 24 deletions(-) create mode 100644 example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java create mode 100644 example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java create mode 100644 example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventSender.java diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/CatchupPerformanceIT.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/CatchupPerformanceIT.java index 99b1aabb..1eda242d 100644 --- a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/CatchupPerformanceIT.java +++ b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/CatchupPerformanceIT.java @@ -25,9 +25,6 @@ import uk.gov.justice.services.test.utils.core.messaging.Poller; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.Optional; diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java new file mode 100644 index 00000000..128e6b0c --- /dev/null +++ b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java @@ -0,0 +1,103 @@ +package uk.gov.justice.services.example.cakeshop.it; + +import static java.util.Optional.empty; +import static java.util.Optional.of; +import static java.util.UUID.randomUUID; +import static javax.json.Json.createArrayBuilder; +import static javax.json.Json.createObjectBuilder; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static uk.gov.justice.services.messaging.JsonEnvelope.envelopeFrom; +import static uk.gov.justice.services.messaging.JsonEnvelope.metadataBuilder; + +import uk.gov.justice.services.example.cakeshop.it.helpers.EventErrorLogRepositoryFactory; +import uk.gov.justice.services.example.cakeshop.it.helpers.EventSender; +import uk.gov.justice.services.messaging.JsonEnvelope; +import uk.gov.justice.services.system.domain.EventError; +import uk.gov.justice.services.system.persistence.EventErrorLogRepository; +import uk.gov.justice.services.test.utils.core.messaging.Poller; +import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; +import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import javax.json.JsonObject; +import javax.sql.DataSource; + +import org.junit.Before; +import org.junit.Test; + +public class EventErrorHandlingIT { + + private static final String TOPIC_NAME = "example.event"; + + private final EventSender eventSender = new EventSender(); + + private final DataSource systemDataSource = new TestJdbcDataSourceProvider().getSystemDataSource("framework"); + private final EventErrorLogRepositoryFactory eventErrorLogRepositoryFactory = new EventErrorLogRepositoryFactory(); + + private final DatabaseCleaner databaseCleaner = new DatabaseCleaner(); + + private final Poller poller = new Poller(); + + @Before + public void cleanDatabase() { + databaseCleaner.cleanSystemTables("framework"); + } + + @Test + public void shouldStoreEventProcessingErrorsInTheDatabase() throws Exception { + + final UUID recipeId = randomUUID(); + final UUID eventId = randomUUID(); + final String eventName = "example.events.recipe-added"; + + final JsonObject jsonObject = createObjectBuilder() + .add("recipeId", recipeId.toString()) + .add("name", "Chocolate muffin") + .add("glutenFree", true) + .add("ingredients", createArrayBuilder() + .add(createObjectBuilder() + .add("name", "someIngredient") + .add("quantity", 1) + ).build() + ).build(); + + final JsonEnvelope eventWithMissingEventNumberEnvelope = envelopeFrom( + metadataBuilder() + .withId(eventId) + .withName(eventName) + .withStreamId(recipeId) + .withPosition(1L) + .build(), + jsonObject); + + assertThat(eventWithMissingEventNumberEnvelope.metadata().eventNumber(), is(empty())); + + eventSender.sendToTopic(eventWithMissingEventNumberEnvelope, TOPIC_NAME); + + final EventErrorLogRepository eventErrorLogRepository = eventErrorLogRepositoryFactory.create(systemDataSource); + + final Optional eventError = poller.pollUntilFound(() -> { + final List eventErrors = eventErrorLogRepository.findAll(); + + if (eventErrors.size() > 0) { + return of(eventErrors.get(0)); + } + + return empty(); + }); + + if (eventError.isPresent()) { + assertThat(eventError.get().getEventId(), is(eventId)); + assertThat(eventError.get().getEventName(), is(eventName)); + assertThat(eventError.get().getEventNumber(), is(empty())); + assertThat(eventError.get().getComponent(), is("EVENT_LISTENER")); + } else { + fail(); + } + } +} diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/MultipleEventListenerCakeShopIT.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/MultipleEventListenerCakeShopIT.java index 12eb3b90..0b3ae053 100644 --- a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/MultipleEventListenerCakeShopIT.java +++ b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/MultipleEventListenerCakeShopIT.java @@ -18,6 +18,7 @@ import uk.gov.justice.services.example.cakeshop.it.helpers.ApiResponse; import uk.gov.justice.services.example.cakeshop.it.helpers.CommandSender; import uk.gov.justice.services.example.cakeshop.it.helpers.EventFactory; +import uk.gov.justice.services.example.cakeshop.it.helpers.EventSender; import uk.gov.justice.services.example.cakeshop.it.helpers.JmsBootstrapper; import uk.gov.justice.services.example.cakeshop.it.helpers.Querier; import uk.gov.justice.services.example.cakeshop.it.helpers.RestEasyClientFactory; @@ -26,10 +27,8 @@ import java.util.UUID; import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; -import javax.jms.Topic; import javax.json.JsonObject; import javax.ws.rs.client.Client; @@ -44,6 +43,7 @@ public class MultipleEventListenerCakeShopIT { private final EventFactory eventFactory = new EventFactory(); private final JmsBootstrapper jmsBootstrapper = new JmsBootstrapper(); + private final EventSender eventSender = new EventSender(); private Client client; private Querier querier; @@ -69,12 +69,7 @@ public void shouldReturnRecipeFromOtherEventListener() throws Exception { //adding 1 recipe as other event final UUID recipeId2 = randomUUID(); - - try (final Session jmsSession = jmsBootstrapper.jmsSession()) { - final Topic topic = jmsSession.createTopic("other.event"); - - try (final MessageProducer producer = jmsSession.createProducer(topic);) { - + final String topicName = "other.event"; final JsonObject jsonObject = createObjectBuilder() .add("recipeId", recipeId2.toString()) .add("name", "Chocolate muffin") @@ -95,15 +90,7 @@ public void shouldReturnRecipeFromOtherEventListener() throws Exception { .build(), jsonObject); - @SuppressWarnings("deprecation") final String json = jsonEnvelope.toDebugStringPrettyPrint(); - final TextMessage message = jmsSession.createTextMessage(); - - message.setText(json); - message.setStringProperty("CPPNAME", "other.recipe-added"); - - producer.send(message); - } - } + eventSender.sendToTopic(jsonEnvelope, topicName); await().until(() -> { final String responseBody = querier.recipesQueryResult(singletonList(new BasicNameValuePair("pagesize", "30"))).body(); diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java new file mode 100644 index 00000000..cb27ee44 --- /dev/null +++ b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java @@ -0,0 +1,31 @@ +package uk.gov.justice.services.example.cakeshop.it.helpers; + +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import uk.gov.justice.services.jdbc.persistence.SystemJdbcDataSourceProvider; +import uk.gov.justice.services.system.persistence.EventErrorLogRepository; + +import javax.sql.DataSource; + +import org.mockito.InjectMocks; +import org.mockito.Mock; + +public class EventErrorLogRepositoryFactory { + + @Mock + private SystemJdbcDataSourceProvider systemJdbcDataSourceProvider; + + @InjectMocks + private EventErrorLogRepository eventErrorLogRepository; + + + public EventErrorLogRepository create(final DataSource systemDataSource) { + + initMocks(this); + + when(systemJdbcDataSourceProvider.getDataSource()).thenReturn(systemDataSource); + + return eventErrorLogRepository; + } +} diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventSender.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventSender.java new file mode 100644 index 00000000..fabbc856 --- /dev/null +++ b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventSender.java @@ -0,0 +1,31 @@ +package uk.gov.justice.services.example.cakeshop.it.helpers; + +import uk.gov.justice.services.messaging.JsonEnvelope; + +import javax.jms.JMSException; +import javax.jms.MessageProducer; +import javax.jms.Session; +import javax.jms.TextMessage; +import javax.jms.Topic; + +public class EventSender { + + private final JmsBootstrapper jmsBootstrapper = new JmsBootstrapper(); + + public void sendToTopic(final JsonEnvelope jsonEnvelope, final String topicName) throws JMSException { + try (final Session jmsSession = jmsBootstrapper.jmsSession()) { + final Topic topic = jmsSession.createTopic(topicName); + + try (final MessageProducer producer = jmsSession.createProducer(topic);) { + + @SuppressWarnings("deprecation") final String json = jsonEnvelope.toDebugStringPrettyPrint(); + final TextMessage message = jmsSession.createTextMessage(); + + message.setText(json); + message.setStringProperty("CPPNAME", jsonEnvelope.metadata().name()); + + producer.send(message); + } + } + } +} diff --git a/example-context/example-service/example-it/src/test/resources/wildfly-config/standalone-single.xml b/example-context/example-service/example-it/src/test/resources/wildfly-config/standalone-single.xml index b520fb59..323b7976 100644 --- a/example-context/example-service/example-it/src/test/resources/wildfly-config/standalone-single.xml +++ b/example-context/example-service/example-it/src/test/resources/wildfly-config/standalone-single.xml @@ -166,6 +166,8 @@ diff --git a/example-context/example-service/example-single/pom.xml b/example-context/example-service/example-single/pom.xml index 7e968eb1..944bdb6f 100644 --- a/example-context/example-service/example-single/pom.xml +++ b/example-context/example-service/example-single/pom.xml @@ -85,6 +85,11 @@ event-store-management-commands ${event-store.version} + + uk.gov.justice.services + framework-system-errors + ${framework.version} + diff --git a/pom.xml b/pom.xml index be759974..b8802d0a 100644 --- a/pom.xml +++ b/pom.xml @@ -31,10 +31,10 @@ cake-shop - 4.1.0 - 6.4.0 - 2.4.2 - 2.4.0 + 4.2.1 + 6.5.0-M5 + 2.5.0-M1 + 2.5.0-M1 1.17.12 2.4.0 From 7fc19a7990a45498918aed30c8596847c3a152d0 Mon Sep 17 00:00:00 2001 From: amckenzie Date: Tue, 11 Feb 2020 14:39:41 +0000 Subject: [PATCH 2/3] Update event-store to 2.5.0-M3 --- example-context/example-service/example-it/pom.xml | 6 ++++++ example-context/example-service/example-single/pom.xml | 5 +++++ pom.xml | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/example-context/example-service/example-it/pom.xml b/example-context/example-service/example-it/pom.xml index a911332f..5201ddcd 100644 --- a/example-context/example-service/example-it/pom.xml +++ b/example-context/example-service/example-it/pom.xml @@ -191,6 +191,12 @@ ${event-store.version} test + + uk.gov.justice.event-store + event-store-management-command-handler-extension + ${event-store.version} + test + diff --git a/example-context/example-service/example-single/pom.xml b/example-context/example-service/example-single/pom.xml index 944bdb6f..32f9f9f3 100644 --- a/example-context/example-service/example-single/pom.xml +++ b/example-context/example-service/example-single/pom.xml @@ -85,6 +85,11 @@ event-store-management-commands ${event-store.version} + + uk.gov.justice.event-store + event-store-management-command-handler-extension + ${event-store.version} + uk.gov.justice.services framework-system-errors diff --git a/pom.xml b/pom.xml index b8802d0a..a3ebbd71 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ 4.2.1 6.5.0-M5 - 2.5.0-M1 + 2.5.0-M3 2.5.0-M1 1.17.12 From b7e107b20dfa0e07f9d6e7910acce22a43aaf920 Mon Sep 17 00:00:00 2001 From: amckenzie Date: Wed, 4 Mar 2020 11:29:05 +0000 Subject: [PATCH 3/3] Update event-store to 2.4.9 --- .../cakeshop/it/EventErrorHandlingIT.java | 103 ------------------ .../EventErrorLogRepositoryFactory.java | 31 ------ .../example-service/example-single/pom.xml | 5 - pom.xml | 8 +- 4 files changed, 4 insertions(+), 143 deletions(-) delete mode 100644 example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java delete mode 100644 example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java deleted file mode 100644 index 128e6b0c..00000000 --- a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/EventErrorHandlingIT.java +++ /dev/null @@ -1,103 +0,0 @@ -package uk.gov.justice.services.example.cakeshop.it; - -import static java.util.Optional.empty; -import static java.util.Optional.of; -import static java.util.UUID.randomUUID; -import static javax.json.Json.createArrayBuilder; -import static javax.json.Json.createObjectBuilder; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; -import static uk.gov.justice.services.messaging.JsonEnvelope.envelopeFrom; -import static uk.gov.justice.services.messaging.JsonEnvelope.metadataBuilder; - -import uk.gov.justice.services.example.cakeshop.it.helpers.EventErrorLogRepositoryFactory; -import uk.gov.justice.services.example.cakeshop.it.helpers.EventSender; -import uk.gov.justice.services.messaging.JsonEnvelope; -import uk.gov.justice.services.system.domain.EventError; -import uk.gov.justice.services.system.persistence.EventErrorLogRepository; -import uk.gov.justice.services.test.utils.core.messaging.Poller; -import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; -import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import javax.json.JsonObject; -import javax.sql.DataSource; - -import org.junit.Before; -import org.junit.Test; - -public class EventErrorHandlingIT { - - private static final String TOPIC_NAME = "example.event"; - - private final EventSender eventSender = new EventSender(); - - private final DataSource systemDataSource = new TestJdbcDataSourceProvider().getSystemDataSource("framework"); - private final EventErrorLogRepositoryFactory eventErrorLogRepositoryFactory = new EventErrorLogRepositoryFactory(); - - private final DatabaseCleaner databaseCleaner = new DatabaseCleaner(); - - private final Poller poller = new Poller(); - - @Before - public void cleanDatabase() { - databaseCleaner.cleanSystemTables("framework"); - } - - @Test - public void shouldStoreEventProcessingErrorsInTheDatabase() throws Exception { - - final UUID recipeId = randomUUID(); - final UUID eventId = randomUUID(); - final String eventName = "example.events.recipe-added"; - - final JsonObject jsonObject = createObjectBuilder() - .add("recipeId", recipeId.toString()) - .add("name", "Chocolate muffin") - .add("glutenFree", true) - .add("ingredients", createArrayBuilder() - .add(createObjectBuilder() - .add("name", "someIngredient") - .add("quantity", 1) - ).build() - ).build(); - - final JsonEnvelope eventWithMissingEventNumberEnvelope = envelopeFrom( - metadataBuilder() - .withId(eventId) - .withName(eventName) - .withStreamId(recipeId) - .withPosition(1L) - .build(), - jsonObject); - - assertThat(eventWithMissingEventNumberEnvelope.metadata().eventNumber(), is(empty())); - - eventSender.sendToTopic(eventWithMissingEventNumberEnvelope, TOPIC_NAME); - - final EventErrorLogRepository eventErrorLogRepository = eventErrorLogRepositoryFactory.create(systemDataSource); - - final Optional eventError = poller.pollUntilFound(() -> { - final List eventErrors = eventErrorLogRepository.findAll(); - - if (eventErrors.size() > 0) { - return of(eventErrors.get(0)); - } - - return empty(); - }); - - if (eventError.isPresent()) { - assertThat(eventError.get().getEventId(), is(eventId)); - assertThat(eventError.get().getEventName(), is(eventName)); - assertThat(eventError.get().getEventNumber(), is(empty())); - assertThat(eventError.get().getComponent(), is("EVENT_LISTENER")); - } else { - fail(); - } - } -} diff --git a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java b/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java deleted file mode 100644 index cb27ee44..00000000 --- a/example-context/example-service/example-it/src/test/java/uk/gov/justice/services/example/cakeshop/it/helpers/EventErrorLogRepositoryFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package uk.gov.justice.services.example.cakeshop.it.helpers; - -import static org.mockito.Mockito.when; -import static org.mockito.MockitoAnnotations.initMocks; - -import uk.gov.justice.services.jdbc.persistence.SystemJdbcDataSourceProvider; -import uk.gov.justice.services.system.persistence.EventErrorLogRepository; - -import javax.sql.DataSource; - -import org.mockito.InjectMocks; -import org.mockito.Mock; - -public class EventErrorLogRepositoryFactory { - - @Mock - private SystemJdbcDataSourceProvider systemJdbcDataSourceProvider; - - @InjectMocks - private EventErrorLogRepository eventErrorLogRepository; - - - public EventErrorLogRepository create(final DataSource systemDataSource) { - - initMocks(this); - - when(systemJdbcDataSourceProvider.getDataSource()).thenReturn(systemDataSource); - - return eventErrorLogRepository; - } -} diff --git a/example-context/example-service/example-single/pom.xml b/example-context/example-service/example-single/pom.xml index 32f9f9f3..1cb705ed 100644 --- a/example-context/example-service/example-single/pom.xml +++ b/example-context/example-service/example-single/pom.xml @@ -90,11 +90,6 @@ event-store-management-command-handler-extension ${event-store.version} - - uk.gov.justice.services - framework-system-errors - ${framework.version} - diff --git a/pom.xml b/pom.xml index a3ebbd71..44ff9192 100644 --- a/pom.xml +++ b/pom.xml @@ -31,10 +31,10 @@ cake-shop - 4.2.1 - 6.5.0-M5 - 2.5.0-M3 - 2.5.0-M1 + 4.1.0 + 6.4.0 + 2.4.9 + 2.4.0 1.17.12 2.4.0