diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index 7cf30964ab0a24cd32a74044361bd717425dc98e..9fa63c0d2232f8dfd35aa54bd7bc16066fdaff51 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 52fef53990ef14e198055d0acc9a2a9392ec03a2..63d284cc76dc7edbe80230cdbfe203ad527ce558 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 5362fe1b285f37d58fd993fb8f38c67a796dd479..14770d8263b19a703932aeda884ce836a8468f87 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 0000000000000000000000000000000000000000..29bf96819b8274e8d8c1150f4f0b451ec738358c --- /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 0000000000000000000000000000000000000000..7d8366fd465f55fd45ee4dd79e479d13ee97e5f0 --- /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 c89c480d7c5df70b610d1b178a492a56c2b34060..0f8d90a5348522dab11479557e8035beb181eadc 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 5614b918c59d96eb8e026ec7b84e28d7856fb082..b73ee77a8d667fb93f99b2ba3b38c6b0d98d8bbb 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 0000000000000000000000000000000000000000..cd3ff9c10b1ec12063292b7cec81e3a4bad2e5ab --- /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 b8ef7d838d2b70616f29b1408469dbcd92e921f6..fa1211c29d84766d5838a7ef176a05267cf5ac67 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: