From 9a52daa0f65bbbfeffe0b628ff91a829080f27ec Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 28 Jul 2022 16:34:24 +0200 Subject: [PATCH] GH-20 - Polishing. --- ...PublicationRepositoryIntegrationTests.java | 22 ++++++------- .../jpa/JpaEventPublicationRepository.java | 23 ++++++------- ...PublicationRepositoryIntegrationTests.java | 29 ++++++++--------- .../MongoDbEventPublicationRepository.java | 32 +++++++++---------- ...MongoDbEventPublicationRepositoryTest.java | 28 ++++++++-------- 5 files changed, 65 insertions(+), 69 deletions(-) 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 9f630cb4..f82affae 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 @@ -207,21 +207,21 @@ class JdbcEventPublicationRepositoryIntegrationTests { @Nested class DeleteCompletedPublications { - @Test - // GH-20 + @Test // GH-20 void shouldDeleteCompletedEvents() { - TestEvent testEvent1 = new TestEvent("abc"); - String serializedEvent1 = "{\"eventId\":\"abc\"}"; - TestEvent testEvent2 = new TestEvent("def"); - String serializedEvent2 = "{\"eventId\":\"def\"}"; + + var testEvent1 = new TestEvent("abc"); + var serializedEvent1 = "{\"eventId\":\"abc\"}"; + var testEvent2 = new TestEvent("def"); + var serializedEvent2 = "{\"eventId\":\"def\"}"; when(serializer.serialize(testEvent1)).thenReturn(serializedEvent1); when(serializer.deserialize(serializedEvent1, TestEvent.class)).thenReturn(testEvent1); when(serializer.serialize(testEvent2)).thenReturn(serializedEvent2); when(serializer.deserialize(serializedEvent2, TestEvent.class)).thenReturn(testEvent2); - CompletableEventPublication publication1 = CompletableEventPublication.of(testEvent1, TARGET_IDENTIFIER); - CompletableEventPublication publication2 = CompletableEventPublication.of(testEvent2, TARGET_IDENTIFIER); + var publication1 = CompletableEventPublication.of(testEvent1, TARGET_IDENTIFIER); + var publication2 = CompletableEventPublication.of(testEvent2, TARGET_IDENTIFIER); repository.create(publication1); repository.create(publication2); @@ -230,10 +230,8 @@ class JdbcEventPublicationRepositoryIntegrationTests { repository.deleteCompletedPublications(); - var eventPublications = operations.query( - "SELECT * FROM EVENT_PUBLICATION", (rs, __) -> rs.getString("SERIALIZED_EVENT")); - assertThat(eventPublications).hasSize(1); - assertThat(eventPublications.get(0)).isEqualTo(serializedEvent2); + assertThat(operations.query("SELECT * FROM EVENT_PUBLICATION", (rs, __) -> rs.getString("SERIALIZED_EVENT"))) + .hasSize(1).element(0).isEqualTo(serializedEvent2); } } } diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java index c989e7e5..056e83eb 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java @@ -38,14 +38,15 @@ import org.springframework.transaction.annotation.Transactional; * @author Björn Kieling */ @RequiredArgsConstructor -public class JpaEventPublicationRepository implements EventPublicationRepository { +class JpaEventPublicationRepository implements EventPublicationRepository { + private static String BY_EVENT_AND_LISTENER_ID = """ - select p + select p from JpaEventPublication p - where - p.serializedEvent = ?1 - and p.listenerId = ?2 - and p.completionDate is null + where + p.serializedEvent = ?1 + and p.listenerId = ?2 + and p.completionDate is null """; private static String INCOMPLETE = """ @@ -56,11 +57,11 @@ public class JpaEventPublicationRepository implements EventPublicationRepository """; private static final String DELETE_COMPLETED = """ - delete - from JpaEventPublication p - where - p.completionDate is not null - """; + delete + from JpaEventPublication p + where + p.completionDate is not null + """; private final EntityManager entityManager; private final EventSerializer serializer; diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java index 26de0177..8abe0f53 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java @@ -18,11 +18,10 @@ package org.springframework.modulith.events.jpa; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import lombok.RequiredArgsConstructor; -import lombok.Value; - import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; +import lombok.RequiredArgsConstructor; +import lombok.Value; import java.util.List; @@ -30,7 +29,6 @@ import javax.sql.DataSource; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -66,8 +64,6 @@ class JpaEventPublicationRepositoryIntegrationTests { private static final EventSerializer eventSerializer = mock(EventSerializer.class); - @Autowired EntityManager entityManager; - @Configuration @Import(JpaEventPublicationConfiguration.class) static class TestConfig { @@ -112,6 +108,7 @@ class JpaEventPublicationRepositoryIntegrationTests { } private final JpaEventPublicationRepository repository; + private final EntityManager em; @Test void persistsJpaEventPublication() { @@ -173,18 +170,19 @@ class JpaEventPublicationRepositoryIntegrationTests { @Test // GH-20 void shouldDeleteCompletedEvents() { - TestEvent testEvent1 = new TestEvent("abc"); - String serializedEvent1 = "{\"eventId\":\"abc\"}"; - TestEvent testEvent2 = new TestEvent("def"); - String serializedEvent2 = "{\"eventId\":\"def\"}"; + + var testEvent1 = new TestEvent("abc"); + var serializedEvent1 = "{\"eventId\":\"abc\"}"; + var testEvent2 = new TestEvent("def"); + var serializedEvent2 = "{\"eventId\":\"def\"}"; when(eventSerializer.serialize(testEvent1)).thenReturn(serializedEvent1); when(eventSerializer.deserialize(serializedEvent1, TestEvent.class)).thenReturn(testEvent1); when(eventSerializer.serialize(testEvent2)).thenReturn(serializedEvent2); when(eventSerializer.deserialize(serializedEvent2, TestEvent.class)).thenReturn(testEvent2); - CompletableEventPublication publication1 = CompletableEventPublication.of(testEvent1, TARGET_IDENTIFIER); - CompletableEventPublication publication2 = CompletableEventPublication.of(testEvent2, TARGET_IDENTIFIER); + var publication1 = CompletableEventPublication.of(testEvent1, TARGET_IDENTIFIER); + var publication2 = CompletableEventPublication.of(testEvent2, TARGET_IDENTIFIER); repository.create(publication1); repository.create(publication2); @@ -193,10 +191,9 @@ class JpaEventPublicationRepositoryIntegrationTests { repository.deleteCompletedPublications(); - var eventPublications = entityManager.createQuery( - "select p from JpaEventPublication p", JpaEventPublication.class).getResultList(); - assertThat(eventPublications).hasSize(1); - assertThat(eventPublications.get(0).getSerializedEvent()).isEqualTo(serializedEvent2); + assertThat(em.createQuery("select p from JpaEventPublication p", JpaEventPublication.class).getResultList()) + .hasSize(1) // + .element(0).extracting(JpaEventPublication::getSerializedEvent).isEqualTo(serializedEvent2); } @Value diff --git a/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepository.java b/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepository.java index 35266a7b..4ec2e55e 100644 --- a/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepository.java +++ b/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepository.java @@ -15,6 +15,9 @@ */ package org.springframework.modulith.events.mongodb; +import static org.springframework.data.mongodb.core.query.Criteria.*; +import static org.springframework.data.mongodb.core.query.Query.*; + import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; @@ -25,8 +28,6 @@ import java.util.stream.Collectors; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.util.TypeInformation; import org.springframework.modulith.events.CompletableEventPublication; import org.springframework.modulith.events.EventPublication; @@ -68,19 +69,20 @@ class MongoDbEventPublicationRepository implements EventPublicationRepository { @Override public EventPublication update(CompletableEventPublication publication) { - return findDocumentsByEventAndTargetIdentifierAndCompletionDateNull(publication.getEvent(), publication.getTargetIdentifier()) - .stream() - .findFirst() - .map(document -> document.setCompletionDate(publication.getCompletionDate().orElse(null))) - .map(mongoTemplate::save) - .map(this::documentToDomain) - .orElse(publication); + return findDocumentsByEventAndTargetIdentifierAndCompletionDateNull(publication.getEvent(), + publication.getTargetIdentifier()) // + .stream() // + .findFirst() // + .map(document -> document.setCompletionDate(publication.getCompletionDate().orElse(null))) // + .map(mongoTemplate::save) // + .map(this::documentToDomain) // + .orElse(publication); } @Override public List findIncompletePublications() { - var query = Query.query(Criteria.where("completionDate").isNull()); + var query = query(where("completionDate").isNull()); return mongoTemplate.find(query, MongoDbEventPublication.class).stream() // .map(this::documentToDomain) // @@ -104,8 +106,7 @@ class MongoDbEventPublicationRepository implements EventPublicationRepository { @Override public void deleteCompletedPublications() { - var query = Query.query(Criteria.where("completionDate").ne(null)); - mongoTemplate.remove(query, MongoDbEventPublication.class); + mongoTemplate.remove(query(where("completionDate").ne(null)), MongoDbEventPublication.class); } private List findDocumentsByEventAndTargetIdentifierAndCompletionDateNull( // @@ -113,12 +114,11 @@ class MongoDbEventPublicationRepository implements EventPublicationRepository { // we need to enforce writing of the type information var eventAsMongoType = mongoTemplate.getConverter().convertToMongoType(event, TypeInformation.of(Object.class)); - var query = Query // - .query(Criteria // - .where("event").is(eventAsMongoType) // + var query = query( + where("event").is(eventAsMongoType) // .and("listenerId").is(targetIdentifier.getValue()) // .and("completionDate").isNull()) // - .with(Sort.by("publicationDate").ascending()); + .with(Sort.by("publicationDate").ascending()); return mongoTemplate.find(query, MongoDbEventPublication.class); } diff --git a/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepositoryTest.java b/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepositoryTest.java index f57e8fb7..cab0b99c 100644 --- a/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepositoryTest.java +++ b/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationRepositoryTest.java @@ -28,8 +28,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.modulith.events.CompletableEventPublication; import org.springframework.modulith.events.EventPublication; import org.springframework.modulith.events.PublicationTargetIdentifier; @@ -76,7 +74,8 @@ class MongoDbEventPublicationRepositoryTest extends WithEmbeddedMongoDb { assertThat(eventPublications.get(0).getEvent()).isEqualTo(publication.getEvent()); assertThat(eventPublications.get(0).getTargetIdentifier()).isEqualTo(publication.getTargetIdentifier()); - assertThat(repository.findIncompletePublicationsByEventAndTargetIdentifier(testEvent, TARGET_IDENTIFIER)).isPresent(); + assertThat(repository.findIncompletePublicationsByEventAndTargetIdentifier(testEvent, TARGET_IDENTIFIER)) + .isPresent(); // Complete publication repository.update(publication.markCompleted()); @@ -128,7 +127,8 @@ class MongoDbEventPublicationRepositoryTest extends WithEmbeddedMongoDb { var testEvent = new TestEvent("id"); - assertThat(repository.findIncompletePublicationsByEventAndTargetIdentifier(testEvent, TARGET_IDENTIFIER)).isEmpty(); + assertThat(repository.findIncompletePublicationsByEventAndTargetIdentifier(testEvent, TARGET_IDENTIFIER)) + .isEmpty(); } @Test @@ -160,8 +160,8 @@ class MongoDbEventPublicationRepositoryTest extends WithEmbeddedMongoDb { var actual = repository.findIncompletePublicationsByEventAndTargetIdentifier(testEvent, TARGET_IDENTIFIER); assertThat(actual).hasValueSatisfying(it -> // - assertThat(it.getPublicationDate()) // - .isCloseTo(publicationOld.getPublicationDate(), within(1, ChronoUnit.MILLIS))); + assertThat(it.getPublicationDate()) // + .isCloseTo(publicationOld.getPublicationDate(), within(1, ChronoUnit.MILLIS))); } } @@ -170,11 +170,12 @@ class MongoDbEventPublicationRepositoryTest extends WithEmbeddedMongoDb { @Test // GH-20 void shouldDeleteCompletedEvents() { - TestEvent testEvent1 = new TestEvent("abc"); - TestEvent testEvent2 = new TestEvent("def"); - CompletableEventPublication publication1 = CompletableEventPublication.of(testEvent1, TARGET_IDENTIFIER); - CompletableEventPublication publication2 = CompletableEventPublication.of(testEvent2, TARGET_IDENTIFIER); + var testEvent1 = new TestEvent("abc"); + var testEvent2 = new TestEvent("def"); + + var publication1 = CompletableEventPublication.of(testEvent1, TARGET_IDENTIFIER); + var publication2 = CompletableEventPublication.of(testEvent2, TARGET_IDENTIFIER); repository.create(publication1); repository.create(publication2); @@ -183,10 +184,9 @@ class MongoDbEventPublicationRepositoryTest extends WithEmbeddedMongoDb { repository.deleteCompletedPublications(); - var eventPublications = mongoTemplate.findAll(MongoDbEventPublication.class); - - assertThat(eventPublications).hasSize(1); - assertThat(eventPublications.get(0).getEvent()).isEqualTo(testEvent2); + assertThat(mongoTemplate.findAll(MongoDbEventPublication.class)) // + .hasSize(1) // + .element(0).extracting(MongoDbEventPublication::getEvent).isEqualTo(testEvent2); } }