From 048f2813b217d68e1a43c99bfb632988363ebfed Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Mon, 17 May 2021 08:00:24 +0200 Subject: [PATCH] OZG-626 sort vorganglist for EA and use docker for mongodb testing --- pluto-server/pom.xml | 15 +++- .../de/itvsh/ozg/pluto/vorgang/Vorgang.java | 1 + .../vorgang/VorgangHeaderRepository.java | 4 + .../vorgang/VorgangHeaderRepositoryImpl.java | 39 +++++++++ .../de/itvsh/ozg/pluto/DbInitializer.java | 29 +++++++ .../de/itvsh/ozg/pluto/TestConfiguration.java | 6 +- .../ozg/pluto/common/test/DataITCase.java | 4 + .../VorgangHeaderRepositoryITCase.java | 86 +++++++++++++++++++ .../test/resources/application-with_db.yml | 2 +- 9 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java create mode 100644 pluto-server/src/test/java/de/itvsh/ozg/pluto/DbInitializer.java create mode 100644 pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index 7cf30964a..9fa63c0d2 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -26,11 +26,11 @@ <lorem.version>2.1</lorem.version> <faker.version>1.0.2</faker.version> <spring-admin.version>2.3.1</spring-admin.version> - + <commons-io.version>2.8.0</commons-io.version> <spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName> - + <zip.version>2.7.0</zip.version> </properties> @@ -158,9 +158,16 @@ <artifactId>junit-jupiter-params</artifactId> <scope>test</scope> </dependency> +<!-- <dependency> --> +<!-- <groupId>de.flapdoodle.embed</groupId> --> +<!-- <artifactId>de.flapdoodle.embed.mongo</artifactId> --> +<!-- <scope>test</scope> --> +<!-- </dependency> --> + <dependency> - <groupId>de.flapdoodle.embed</groupId> - <artifactId>de.flapdoodle.embed.mongo</artifactId> + <groupId>org.testcontainers</groupId> + <artifactId>mongodb</artifactId> + <version>1.15.3</version> <scope>test</scope> </dependency> </dependencies> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/Vorgang.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/Vorgang.java index 52fef5399..63d284cc7 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/Vorgang.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/Vorgang.java @@ -21,6 +21,7 @@ public class Vorgang { public static final String MONGODB_FIELDNAME_ID = "id"; static final String MONGODB_FIELDNAME_VERSION = "version"; static final String MONGODB_FIELDNAME_STATUS = "status"; + static final String MONGODB_FIELDNAME_CREATED_AT = "createdAt"; public enum Status { NEU, ANGENOMMEN, VERWORFEN, IN_BEARBEITUNG, BESCHIEDEN, ABGESCHLOSSEN, WEITERGELEITET; diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepository.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepository.java index 5362fe1b2..14770d826 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepository.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepository.java @@ -1,7 +1,11 @@ package de.itvsh.ozg.pluto.vorgang; +import java.util.List; + import org.springframework.data.mongodb.repository.MongoRepository; interface VorgangHeaderRepository extends MongoRepository<VorgangHeader, String> { + @Override + List<VorgangHeader> findAll(); } \ No newline at end of file diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java new file mode 100644 index 000000000..29bf96819 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java @@ -0,0 +1,39 @@ +package de.itvsh.ozg.pluto.vorgang; + +import static de.itvsh.ozg.pluto.vorgang.Vorgang.*; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationPipeline; +import org.springframework.data.mongodb.core.aggregation.UnionWithOperation; +import org.springframework.data.mongodb.core.query.Criteria; + +import de.itvsh.ozg.pluto.vorgang.Vorgang.Status; + +class VorgangHeaderRepositoryImpl { + + @Autowired + private MongoTemplate template; + + public List<VorgangHeader> findAll() { + var aggregation = Aggregation.newAggregation( + Aggregation.match(new Criteria(MONGODB_FIELDNAME_STATUS).is(Status.IN_BEARBEITUNG)), + Aggregation.sort(Sort.by(MONGODB_FIELDNAME_CREATED_AT)), + UnionWithOperation.unionWith(Vorgang.COLLECTION_NAME).pipeline(buildZuBearbeitendePipeline())); + + var result = template.aggregate(aggregation, VorgangHeader.class, VorgangHeader.class); + return result.getMappedResults(); + } + + private AggregationPipeline buildZuBearbeitendePipeline() { + var aggregation = Aggregation.newAggregation( + Aggregation.match(new Criteria(MONGODB_FIELDNAME_STATUS).in(Status.NEU, Status.ANGENOMMEN, Status.VERWORFEN)), + Aggregation.sort(Sort.by(MONGODB_FIELDNAME_CREATED_AT))); + return aggregation.getPipeline(); + } + +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/DbInitializer.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/DbInitializer.java new file mode 100644 index 000000000..7d8366fd4 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/DbInitializer.java @@ -0,0 +1,29 @@ +package de.itvsh.ozg.pluto; + +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.utility.DockerImageName; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +public class DbInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { +// @Bean +// public MongoDBContainer mongodb(ConfigurableApplicationContext applicationContext) { + MongoDBContainer mongoDbContainer = new MongoDBContainer(DockerImageName.parse("mongo").withTag("4.4")); + LOG.info("Starting mongoDB ..."); + mongoDbContainer.start(); + LOG.info("mongoDB started."); + + TestPropertyValues.of( + "spring.data.mongodb.host=" + mongoDbContainer.getHost(), + "spring.data.mongodb.port=" + mongoDbContainer.getFirstMappedPort()).applyTo(applicationContext.getEnvironment()); + +// return mongoDbContainer; + + } +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java index c89c480d7..0f8d90a53 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java @@ -6,11 +6,15 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.javamail.JavaMailSender; +import lombok.extern.log4j.Log4j2; + @Configuration +@Log4j2 public class TestConfiguration { @Bean public JavaMailSender mockMailSender() { return mock(JavaMailSender.class); } -} + +} \ No newline at end of file diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/test/DataITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/test/DataITCase.java index 5614b918c..b73ee77a8 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/test/DataITCase.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/test/DataITCase.java @@ -7,12 +7,16 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; + +import de.itvsh.ozg.pluto.DbInitializer; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited @ITCase +@ContextConfiguration(initializers = { DbInitializer.class }) @ActiveProfiles({ "itcase", "with_db" }) public @interface DataITCase { diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java new file mode 100644 index 000000000..cd3ff9c10 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java @@ -0,0 +1,86 @@ +package de.itvsh.ozg.pluto.vorgang; + +import static org.assertj.core.api.Assertions.*; + +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.EnumSource.Mode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoOperations; + +import de.itvsh.ozg.pluto.common.test.DataITCase; +import de.itvsh.ozg.pluto.vorgang.Vorgang.Status; + +@DataITCase +class VorgangHeaderRepositoryITCase { + + @Autowired + private VorgangHeaderRepository repository; + @Autowired + private MongoOperations mongoOperations; + +// @ClassRule +// public static MongoDBContainer mongoDbContainer = new MongoDBContainer(DockerImageName.parse("mongo").withTag("4.4")); + +// @BeforeAll +// static void startDB() { +// mongoDbContainer.start(); +// } + + @Nested + class TestSortForEA { + + @BeforeEach + void persistVorgang() { + mongoOperations.dropCollection(Vorgang.class); + } + + @Test + void shouldSortInBearbeitungByCreatedAt() { + mongoOperations.save(VorgangTestFactory.createBuilder().id("3").status(Status.IN_BEARBEITUNG) + .createdAt(ZonedDateTime.now().minus(2, ChronoUnit.DAYS)).build()); + mongoOperations.save(VorgangTestFactory.createBuilder().id("2").status(Status.IN_BEARBEITUNG) + .createdAt(ZonedDateTime.now().minus(3, ChronoUnit.DAYS)).build()); + mongoOperations.save(VorgangTestFactory.createBuilder().id("1").status(Status.IN_BEARBEITUNG) + .createdAt(ZonedDateTime.now().minus(4, ChronoUnit.DAYS)).build()); + + var vorgaenge = repository.findAll(); + + assertThat(vorgaenge.get(0).getId()).isEqualTo("1"); + assertThat(vorgaenge.get(1).getId()).isEqualTo("2"); + assertThat(vorgaenge.get(2).getId()).isEqualTo("3"); + } + + @ParameterizedTest + @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "VERWORFEN" }) + void shouldSortAbzuarbeitendeAfterInBearbeitung(Status status) { + mongoOperations.save(VorgangTestFactory.createBuilder().id("2").status(status) + .createdAt(ZonedDateTime.now().minus(4, ChronoUnit.DAYS)).build()); + mongoOperations.save(VorgangTestFactory.createBuilder().id("1").status(Status.IN_BEARBEITUNG) + .createdAt(ZonedDateTime.now().minus(4, ChronoUnit.DAYS)).build()); + + var vorgaenge = repository.findAll(); + + assertThat(vorgaenge.get(0).getId()).isEqualTo("1"); + assertThat(vorgaenge.get(1).getId()).isEqualTo("2"); + } + } + +// static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { +// +// @Override +// public void initialize(ConfigurableApplicationContext applicationContext) { +// TestPropertyValues.of( +// "spring.data.mongodb.host=" + mongoDbContainer.getHost(), +// "spring.data.mongodb.port=" + mongoDbContainer.getFirstMappedPort()).applyTo(applicationContext.getEnvironment()); +// +// } +// +// } +} diff --git a/pluto-server/src/test/resources/application-with_db.yml b/pluto-server/src/test/resources/application-with_db.yml index b8ef7d838..fa1211c29 100644 --- a/pluto-server/src/test/resources/application-with_db.yml +++ b/pluto-server/src/test/resources/application-with_db.yml @@ -1,6 +1,6 @@ logging: level: - '[org.springframework.data.mongodb]': DEBUG + '[org.springframework.data.mongodb]': INFO spring: data: -- GitLab