From c58679a1d4b5ceb1aa8219204dd114a9f38bb09d Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sat, 16 Apr 2022 00:28:41 +0200 Subject: [PATCH] merged master into v2_10_0 --- BudgetMasterServer/pom.xml | 14 +++-- .../database/importer/AccountImporter.java | 0 .../database/importer/CategoryImporter.java | 0 .../database/importer/ChartImporter.java | 0 .../database/importer/IconImporter.java | 0 .../database/importer/ImageImporter.java | 0 .../database/importer/ItemImporter.java | 0 .../database/importer/TagImporter.java | 0 .../importer/TemplateGroupImporter.java | 0 .../database/importer/TemplateImporter.java | 0 .../importer/TransactionImporter.java | 0 .../unit/database/ImportServiceTest.java | 39 ++++++++++++- .../importer/AccountImporterTest.java | 15 +++-- .../importer/CategoryImporterTest.java | 17 +++--- .../database/importer/ChartImporterTest.java | 34 ++++++++---- .../database/importer/IconImporterTest.java | 15 +++-- .../database/importer/ImageImporterTest.java | 15 +++-- .../database/importer/ImporterTestBase.java | 55 +++++++++++++++++++ .../importer/TemplateGroupImporterTest.java | 22 ++++---- .../importer/TemplateImporterTest.java | 30 +++++----- .../importer/TransactionImporterTest.java | 41 ++++++-------- 21 files changed, 196 insertions(+), 101 deletions(-) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java (100%) rename {src => BudgetMasterServer/src}/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java (100%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java (93%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java (89%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java (80%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java (83%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java (82%) create mode 100644 BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java (85%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java (94%) rename {src => BudgetMasterServer/src}/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java (90%) diff --git a/BudgetMasterServer/pom.xml b/BudgetMasterServer/pom.xml index 982d787d3..658ae891c 100644 --- a/BudgetMasterServer/pom.xml +++ b/BudgetMasterServer/pom.xml @@ -26,19 +26,21 @@ <properties> <jlibs.version>3.2.0</jlibs.version> <versionizer.version>3.0.1</versionizer.version> - <webjars-locator.version>0.42</webjars-locator.version> + <webjars-locator.version>0.45</webjars-locator.version> <jquery.version>3.6.0</jquery.version> <materializecss.version>1.0.0</materializecss.version> - <fontawesome.version>6.0.0</fontawesome.version> + <fontawesome.version>6.1.0</fontawesome.version> <sortablejs.version>1.14.0</sortablejs.version> <mousetrap.version>1.6.5</mousetrap.version> <codemirror.version>5.62.2</codemirror.version> - <selenium.version>4.1.2</selenium.version> - <jgit.version>6.0.0.202111291000-r</jgit.version> + <selenium.version>4.1.3</selenium.version> + <assertj-core.version>3.22.0</assertj-core.version> + <jgit.version>6.1.0.202203080745-r</jgit.version> <natorder.version>1.1.2</natorder.version> - <itextpdf.version>5.5.13.2</itextpdf.version> + <h2database.version>1.4.199</h2database.version> + <itextpdf.version>5.5.13.3</itextpdf.version> <vanilla-picker.version>2.12.1</vanilla-picker.version> - <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version> + <jacoco-maven-plugin.version>0.8.8</jacoco-maven-plugin.version> <dependency-check-maven.version>6.5.3</dependency-check-maven.version> <project.outputDirectory>build/${project.version}</project.outputDirectory> diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java similarity index 100% rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java index f6802ec39..b32b09ce9 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java @@ -35,6 +35,7 @@ import de.deadlocker8.budgetmaster.transactions.Transaction; import de.deadlocker8.budgetmaster.transactions.TransactionRepository; import de.deadlocker8.budgetmaster.utils.Strings; import de.thecodelabs.utils.util.Localization; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -42,14 +43,21 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.transaction.annotation.Transactional; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import javax.persistence.EntityManager; import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.text.MessageFormat; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -59,9 +67,38 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = Main.class) @ActiveProfiles("test") @Transactional +@Testcontainers @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class ImportServiceTest { + @Container + static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2") + .withDatabaseName("budgetmaster-tests-db") + .withUsername("budgetmaster") + .withPassword("BudgetMaster"); + + @DynamicPropertySource + static void properties(DynamicPropertyRegistry registry) + { + registry.add("spring.datasource.url", postgresDB::getJdbcUrl); + registry.add("spring.datasource.username", postgresDB::getUsername); + registry.add("spring.datasource.password", postgresDB::getPassword); + } + + @BeforeEach + void beforeEach() + { + final List<String> tableNames = List.of("template"); + for(String tableName : tableNames) + { + entityManager.createNativeQuery(MessageFormat.format("ALTER SEQUENCE {0}_id_seq RESTART WITH 1", tableName)) + .executeUpdate(); + } + } + + @Autowired + private EntityManager entityManager; + @Autowired private CategoryRepository categoryRepository; @@ -466,8 +503,6 @@ class ImportServiceTest defaultGroup.setName(Localization.getString(Strings.TEMPLATE_GROUP_DEFAULT)); defaultGroup.setType(TemplateGroupType.DEFAULT); - Mockito.verify(templateGroupRepository, Mockito.times(1)).save(defaultGroup); - Template expectedTemplate = new Template(); expectedTemplate.setID(1); expectedTemplate.setTemplateName("myTemplate"); diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java similarity index 93% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java index 10c6ec4a4..6a6247c2e 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java @@ -11,21 +11,20 @@ import de.deadlocker8.budgetmaster.icon.IconRepository; import de.deadlocker8.budgetmaster.services.EntityType; import de.deadlocker8.budgetmaster.services.ImportResultItem; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class AccountImporterTest +class AccountImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("account"); + } + @Autowired private IconRepository iconRepository; diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java similarity index 89% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java index de51e3ed3..27ee178ae 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java @@ -9,21 +9,20 @@ import de.deadlocker8.budgetmaster.icon.IconRepository; import de.deadlocker8.budgetmaster.services.EntityType; import de.deadlocker8.budgetmaster.services.ImportResultItem; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class CategoryImporterTest +class CategoryImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("category"); + } + @Autowired private CategoryRepository categoryRepository; @@ -83,7 +82,7 @@ class CategoryImporterTest @Test void test_importCategories_skipExisting_custom() { - final Category categoryExisting= new Category("Category1", "#ff0000", CategoryType.CUSTOM); + final Category categoryExisting = new Category("Category1", "#ff0000", CategoryType.CUSTOM); categoryExisting.setID(3); final Category categoryToImport = new Category("Category1", "#ff0000", CategoryType.CUSTOM); diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java similarity index 80% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java index c2d5eb9b7..a53ffe578 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java @@ -1,36 +1,50 @@ package de.deadlocker8.budgetmaster.unit.database.importer; import de.deadlocker8.budgetmaster.Main; -import de.deadlocker8.budgetmaster.categories.Category; -import de.deadlocker8.budgetmaster.categories.CategoryType; import de.deadlocker8.budgetmaster.charts.Chart; import de.deadlocker8.budgetmaster.charts.ChartService; import de.deadlocker8.budgetmaster.charts.ChartType; -import de.deadlocker8.budgetmaster.database.importer.CategoryImporter; import de.deadlocker8.budgetmaster.database.importer.ChartImporter; -import de.deadlocker8.budgetmaster.database.importer.ImageImporter; -import de.deadlocker8.budgetmaster.images.Image; -import de.deadlocker8.budgetmaster.images.ImageFileExtension; -import de.deadlocker8.budgetmaster.images.ImageRepository; import de.deadlocker8.budgetmaster.services.EntityType; import de.deadlocker8.budgetmaster.services.ImportResultItem; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.transaction.annotation.Transactional; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = Main.class) +@ActiveProfiles("test") +@Transactional +@Testcontainers @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class ChartImporterTest { + @Container + static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2") + .withDatabaseName("budgetmaster-tests-db") + .withUsername("budgetmaster") + .withPassword("BudgetMaster"); + + @DynamicPropertySource + static void properties(DynamicPropertyRegistry registry) + { + registry.add("spring.datasource.url", postgresDB::getJdbcUrl); + registry.add("spring.datasource.username", postgresDB::getUsername); + registry.add("spring.datasource.password", postgresDB::getPassword); + } + @Autowired private ChartService chartService; diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java similarity index 83% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java index 3b30ace7e..d1a9b4d16 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java @@ -9,21 +9,20 @@ import de.deadlocker8.budgetmaster.images.ImageRepository; import de.deadlocker8.budgetmaster.services.EntityType; import de.deadlocker8.budgetmaster.services.ImportResultItem; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class IconImporterTest +class IconImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("icon"); + } + @Autowired private ImageRepository imageRepository; diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java similarity index 82% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java index 9b4254ba7..ffd17a3bb 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java @@ -7,21 +7,20 @@ import de.deadlocker8.budgetmaster.images.ImageRepository; import de.deadlocker8.budgetmaster.services.EntityType; import de.deadlocker8.budgetmaster.services.ImportResultItem; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class ImageImporterTest +class ImageImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("image"); + } + @Autowired private ImageRepository imageRepository; diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java new file mode 100644 index 000000000..8413d4bdd --- /dev/null +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java @@ -0,0 +1,55 @@ +package de.deadlocker8.budgetmaster.unit.database.importer; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import javax.persistence.EntityManager; +import java.text.MessageFormat; +import java.util.List; + +@ExtendWith(SpringExtension.class) +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +@Testcontainers +abstract class ImporterTestBase +{ + @Container + static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2") + .withDatabaseName("budgetmaster-tests-db") + .withUsername("budgetmaster") + .withPassword("BudgetMaster"); + + @DynamicPropertySource + static void properties(DynamicPropertyRegistry registry) + { + registry.add("spring.datasource.url", postgresDB::getJdbcUrl); + registry.add("spring.datasource.username", postgresDB::getUsername); + registry.add("spring.datasource.password", postgresDB::getPassword); + } + + @BeforeEach + void beforeEach() + { + for(String tableName : getTableNamesToResetSequence()) + { + entityManager.createNativeQuery(MessageFormat.format("ALTER SEQUENCE {0}_id_seq RESTART WITH 1", tableName)) + .executeUpdate(); + } + } + + abstract List<String> getTableNamesToResetSequence(); + + @Autowired + private EntityManager entityManager; +} \ No newline at end of file diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java similarity index 85% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java index b9332d26f..63a0ec9aa 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java @@ -6,22 +6,22 @@ import de.deadlocker8.budgetmaster.services.ImportResultItem; import de.deadlocker8.budgetmaster.templategroup.TemplateGroup; import de.deadlocker8.budgetmaster.templategroup.TemplateGroupRepository; import de.deadlocker8.budgetmaster.templategroup.TemplateGroupType; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class TemplateGroupImporterTest +class TemplateGroupImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("template_group"); + } + @Autowired private TemplateGroupRepository templateGroupRepository; @@ -38,7 +38,7 @@ class TemplateGroupImporterTest assertThat(resultItem).isEqualTo(expected); final List<TemplateGroup> templateGroups = templateGroupRepository.findAll(); - assertThat(templateGroups) + Assertions.assertThat(templateGroups) .hasSize(1) .containsExactly(defaultTemplateGroup); } @@ -56,7 +56,7 @@ class TemplateGroupImporterTest assertThat(resultItem).isEqualTo(expected); final List<TemplateGroup> templateGroups = templateGroupRepository.findAll(); - assertThat(templateGroups) + Assertions.assertThat(templateGroups) .hasSize(1) .containsExactly(templateGroup); } @@ -75,7 +75,7 @@ class TemplateGroupImporterTest final TemplateGroup expectedTemplateGroup = new TemplateGroup(1, "My group", TemplateGroupType.CUSTOM); final List<TemplateGroup> templateGroups = templateGroupRepository.findAll(); - assertThat(templateGroups) + Assertions.assertThat(templateGroups) .hasSize(1) .containsExactly(expectedTemplateGroup); } diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java similarity index 94% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java index 2217f5b39..b26a60e35 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java @@ -19,22 +19,22 @@ import de.deadlocker8.budgetmaster.templategroup.TemplateGroupRepository; import de.deadlocker8.budgetmaster.templategroup.TemplateGroupType; import de.deadlocker8.budgetmaster.templates.Template; import de.deadlocker8.budgetmaster.templates.TemplateRepository; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class TemplateImporterTest +class TemplateImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("template", "account", "category", "tag", "icon", "template_group"); + } + @Autowired private AccountRepository accountRepository; @@ -92,7 +92,7 @@ class TemplateImporterTest assertThat(resultItem).isEqualTo(expected); final List<Template> templates = templateRepository.findAll(); - assertThat(templates).hasSize(1); + Assertions.assertThat(templates).hasSize(1); final Template actualTemplate = templates.get(0); assertThat(actualTemplate) .hasFieldOrPropertyWithValue("ID", 1) @@ -150,7 +150,7 @@ class TemplateImporterTest assertThat(resultItem).isEqualTo(expected); final List<Template> templates = templateRepository.findAll(); - assertThat(templates).hasSize(1); + Assertions.assertThat(templates).hasSize(1); final Template actualTemplate = templates.get(0); assertThat(actualTemplate) .hasFieldOrPropertyWithValue("ID", 1) @@ -196,7 +196,7 @@ class TemplateImporterTest template.setTags(List.of()); template.setDescription("Lorem Ipsum"); template.setIconReference(icon); - template.setTags(List.of( new Tag("0815"), new Tag("Apple Pie"))); + template.setTags(List.of(new Tag("0815"), new Tag("Apple Pie"))); final Template template2 = new Template(); template2.setID(16); @@ -205,7 +205,7 @@ class TemplateImporterTest template2.setTags(List.of()); template2.setDescription("Lorem Ipsum"); template2.setIconReference(icon); - template2.setTags(List.of( new Tag("0815"))); + template2.setTags(List.of(new Tag("0815"))); TemplateGroup defaultTemplateGroup = new TemplateGroup("Default group", TemplateGroupType.DEFAULT); defaultTemplateGroup = templateGroupRepository.save(defaultTemplateGroup); @@ -218,7 +218,7 @@ class TemplateImporterTest assertThat(resultItem).isEqualTo(expected); final List<Template> templates = templateRepository.findAll(); - assertThat(templates).hasSize(2); + Assertions.assertThat(templates).hasSize(2); final Template actualTemplate = templates.get(0); assertThat(actualTemplate) .hasFieldOrPropertyWithValue("ID", 1) @@ -268,7 +268,7 @@ class TemplateImporterTest assertThat(resultItem).isEqualTo(expected); final List<Template> templates = templateRepository.findAll(); - assertThat(templates).hasSize(1); + Assertions.assertThat(templates).hasSize(1); final Template actualTemplate = templates.get(0); assertThat(actualTemplate) .hasFieldOrPropertyWithValue("ID", 1) @@ -301,7 +301,7 @@ class TemplateImporterTest assertThat(resultItem).isEqualTo(expected); final List<Template> templates = templateRepository.findAll(); - assertThat(templates).hasSize(1); + Assertions.assertThat(templates).hasSize(1); final Template actualTemplate = templates.get(0); assertThat(actualTemplate) .hasFieldOrPropertyWithValue("ID", 1) diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java similarity index 90% rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java index 959cf44fb..22d63f916 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java @@ -6,14 +6,8 @@ import de.deadlocker8.budgetmaster.accounts.AccountType; import de.deadlocker8.budgetmaster.categories.Category; import de.deadlocker8.budgetmaster.categories.CategoryRepository; import de.deadlocker8.budgetmaster.categories.CategoryType; -import de.deadlocker8.budgetmaster.database.importer.IconImporter; import de.deadlocker8.budgetmaster.database.importer.TagImporter; import de.deadlocker8.budgetmaster.database.importer.TransactionImporter; -import de.deadlocker8.budgetmaster.icon.Icon; -import de.deadlocker8.budgetmaster.icon.IconRepository; -import de.deadlocker8.budgetmaster.images.Image; -import de.deadlocker8.budgetmaster.images.ImageFileExtension; -import de.deadlocker8.budgetmaster.images.ImageRepository; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes; import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays; @@ -23,24 +17,23 @@ import de.deadlocker8.budgetmaster.tags.Tag; import de.deadlocker8.budgetmaster.tags.TagRepository; import de.deadlocker8.budgetmaster.transactions.Transaction; import de.deadlocker8.budgetmaster.transactions.TransactionRepository; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.time.LocalDate; import java.util.List; -import static org.assertj.core.api.Assertions.as; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) -@DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -class TransactionImporterTest +class TransactionImporterTest extends ImporterTestBase { + @Override + List<String> getTableNamesToResetSequence() + { + return List.of("transaction", "account", "category", "tag"); + } + @Autowired private AccountRepository accountRepository; @@ -81,7 +74,7 @@ class TransactionImporterTest assertThat(resultItem).isEqualTo(expected); final List<Transaction> transactions = transactionRepository.findAll(); - assertThat(transactions).hasSize(1); + Assertions.assertThat(transactions).hasSize(1); final Transaction actualTransaction = transactions.get(0); assertThat(actualTransaction) .hasFieldOrPropertyWithValue("ID", 1) @@ -91,7 +84,7 @@ class TransactionImporterTest .hasFieldOrPropertyWithValue("category", category) .hasFieldOrPropertyWithValue("account", account) .hasFieldOrPropertyWithValue("date", LocalDate.of(2022, 3, 30)) - .hasFieldOrPropertyWithValue("description","Lorem Ipsum") + .hasFieldOrPropertyWithValue("description", "Lorem Ipsum") .hasFieldOrPropertyWithValue("repeatingOption", null) .hasFieldOrPropertyWithValue("transferAccount", null); assertThat(actualTransaction.getTags()).isEmpty(); @@ -129,7 +122,7 @@ class TransactionImporterTest assertThat(resultItem).isEqualTo(expected); final List<Transaction> transactions = transactionRepository.findAll(); - assertThat(transactions).hasSize(1); + Assertions.assertThat(transactions).hasSize(1); final Transaction actualTransaction = transactions.get(0); assertThat(actualTransaction) .hasFieldOrPropertyWithValue("ID", 1) @@ -139,7 +132,7 @@ class TransactionImporterTest .hasFieldOrPropertyWithValue("category", category) .hasFieldOrPropertyWithValue("account", account) .hasFieldOrPropertyWithValue("date", LocalDate.of(2022, 3, 30)) - .hasFieldOrPropertyWithValue("description","Lorem Ipsum") + .hasFieldOrPropertyWithValue("description", "Lorem Ipsum") .hasFieldOrPropertyWithValue("repeatingOption", null) .hasFieldOrPropertyWithValue("transferAccount", transferAccount); assertThat(actualTransaction.getTags()).isEmpty(); @@ -177,7 +170,7 @@ class TransactionImporterTest assertThat(resultItem).isEqualTo(expected); final List<Transaction> transactions = transactionRepository.findAll(); - assertThat(transactions).hasSize(1); + Assertions.assertThat(transactions).hasSize(1); final Transaction actualTransaction = transactions.get(0); assertThat(actualTransaction) .hasFieldOrPropertyWithValue("ID", 1) @@ -187,7 +180,7 @@ class TransactionImporterTest .hasFieldOrPropertyWithValue("category", category) .hasFieldOrPropertyWithValue("account", account) .hasFieldOrPropertyWithValue("date", date) - .hasFieldOrPropertyWithValue("description","Lorem Ipsum") + .hasFieldOrPropertyWithValue("description", "Lorem Ipsum") .hasFieldOrPropertyWithValue("repeatingOption", repeatingOption) .hasFieldOrPropertyWithValue("transferAccount", null); assertThat(actualTransaction.getTags()).isEmpty(); @@ -225,7 +218,7 @@ class TransactionImporterTest assertThat(resultItem).isEqualTo(expected); final List<Transaction> transactions = transactionRepository.findAll(); - assertThat(transactions).hasSize(1); + Assertions.assertThat(transactions).hasSize(1); final Transaction actualTransaction = transactions.get(0); assertThat(actualTransaction) .hasFieldOrPropertyWithValue("ID", 1) @@ -235,7 +228,7 @@ class TransactionImporterTest .hasFieldOrPropertyWithValue("category", category) .hasFieldOrPropertyWithValue("account", account) .hasFieldOrPropertyWithValue("date", LocalDate.of(2022, 3, 30)) - .hasFieldOrPropertyWithValue("description","Lorem Ipsum") + .hasFieldOrPropertyWithValue("description", "Lorem Ipsum") .hasFieldOrPropertyWithValue("repeatingOption", null) .hasFieldOrPropertyWithValue("transferAccount", null); @@ -285,7 +278,7 @@ class TransactionImporterTest assertThat(resultItem).isEqualTo(expected); final List<Transaction> transactions = transactionRepository.findAll(); - assertThat(transactions).hasSize(2); + Assertions.assertThat(transactions).hasSize(2); final Transaction actualTransaction = transactions.get(0); assertThat(actualTransaction) .hasFieldOrPropertyWithValue("ID", 1) -- GitLab