From 6398d86b83dc4723f0e99fa1d9bf7d68b4d05805 Mon Sep 17 00:00:00 2001 From: amckenzie Date: Wed, 18 Dec 2019 10:43:27 +0000 Subject: [PATCH] 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