From 248f0b079d550bc5eeb4683d6c7936d1ae0f69a0 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Wed, 30 Mar 2022 22:10:02 +0200 Subject: [PATCH] #691 - importer for template groups --- .../database/importer/ItemImporter.java | 1 - .../importer/TemplateGroupImporter.java | 53 +++++++++ .../budgetmaster/services/ImportService.java | 111 +----------------- .../unit/database/ImportServiceTest.java | 49 -------- .../importer/AccountImporterTest.java | 2 +- .../importer/CategoryImporterTest.java | 2 +- .../database/importer/ChartImporterTest.java | 2 +- .../database/importer/IconImporterTest.java | 2 +- .../database/importer/ImageImporterTest.java | 2 +- .../importer/TemplateGroupImporterTest.java | 82 +++++++++++++ .../importer/TemplateImporterTest.java | 2 +- .../importer/TransactionImporterTest.java | 2 +- 12 files changed, 143 insertions(+), 167 deletions(-) create mode 100644 src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java create mode 100644 src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java b/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java index 12182a9ad..03323fcc3 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java @@ -37,7 +37,6 @@ public abstract class ItemImporter<T extends ProvidesID> try { - int oldID = item.getID(); int newID = importSingleItem(item); item.setID(newID); diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java b/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java new file mode 100644 index 000000000..b5de025e0 --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java @@ -0,0 +1,53 @@ +package de.deadlocker8.budgetmaster.database.importer; + +import de.deadlocker8.budgetmaster.services.EntityType; +import de.deadlocker8.budgetmaster.templategroup.TemplateGroup; +import de.deadlocker8.budgetmaster.templategroup.TemplateGroupRepository; +import de.deadlocker8.budgetmaster.templategroup.TemplateGroupType; + +public class TemplateGroupImporter extends ItemImporter<TemplateGroup> +{ + public TemplateGroupImporter(TemplateGroupRepository templateGroupRepository) + { + super(templateGroupRepository, EntityType.TEMPLATE_GROUP); + } + + @Override + protected int importSingleItem(TemplateGroup templateGroup) + { + if(!(repository instanceof TemplateGroupRepository repository)) + { + throw new IllegalArgumentException("Invalid repository type"); + } + + TemplateGroup existingTemplateGroup; + if(templateGroup.getType().equals(TemplateGroupType.DEFAULT)) + { + existingTemplateGroup = repository.findFirstByType(TemplateGroupType.DEFAULT); + } + else + { + existingTemplateGroup = repository.findByNameAndType(templateGroup.getName(), templateGroup.getType()); + } + + if(existingTemplateGroup == null) + { + // template group does not exist --> create it + TemplateGroup templateGroupToCreate = new TemplateGroup(templateGroup.getName(), templateGroup.getType()); + TemplateGroup savedTemplateGroup = repository.save(templateGroupToCreate); + + return savedTemplateGroup.getID(); + } + else + { + // template group already exists + return existingTemplateGroup.getID(); + } + } + + @Override + protected String getNameForItem(TemplateGroup item) + { + return item.getName(); + } +} diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java index eabdb2449..b5d2603e2 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java @@ -1,31 +1,19 @@ package de.deadlocker8.budgetmaster.services; -import de.deadlocker8.budgetmaster.accounts.Account; import de.deadlocker8.budgetmaster.accounts.AccountRepository; import de.deadlocker8.budgetmaster.categories.CategoryRepository; -import de.deadlocker8.budgetmaster.charts.Chart; import de.deadlocker8.budgetmaster.charts.ChartService; import de.deadlocker8.budgetmaster.database.InternalDatabase; -import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch; import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList; import de.deadlocker8.budgetmaster.database.importer.*; -import de.deadlocker8.budgetmaster.icon.Icon; import de.deadlocker8.budgetmaster.icon.IconRepository; -import de.deadlocker8.budgetmaster.icon.IconService; -import de.deadlocker8.budgetmaster.icon.Iconizable; -import de.deadlocker8.budgetmaster.images.Image; import de.deadlocker8.budgetmaster.images.ImageRepository; -import de.deadlocker8.budgetmaster.images.ImageService; import de.deadlocker8.budgetmaster.repeating.RepeatingTransactionUpdater; -import de.deadlocker8.budgetmaster.tags.Tag; import de.deadlocker8.budgetmaster.tags.TagRepository; import de.deadlocker8.budgetmaster.templategroup.TemplateGroup; 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 de.deadlocker8.budgetmaster.transactions.Transaction; -import de.deadlocker8.budgetmaster.transactions.TransactionBase; import de.deadlocker8.budgetmaster.transactions.TransactionRepository; import de.deadlocker8.budgetmaster.utils.DateHelper; import org.slf4j.Logger; @@ -33,8 +21,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.text.MessageFormat; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -92,7 +78,7 @@ public class ImportService if(importTemplateGroups) { - importResultItems.add(importTemplateGroups()); + importResultItems.add(new TemplateGroupImporter(templateGroupRepository).importItems(database.getTemplateGroups())); } else { @@ -134,99 +120,4 @@ public class ImportService { return collectedErrorMessages; } - - private String formatErrorMessage(String errorMessage, Exception e) - { - return MessageFormat.format("{0}: {1} ({2})", errorMessage, e.getClass().getName(), e.getMessage()); - } - - private ImportResultItem importTemplateGroups() - { - List<TemplateGroup> templateGroups = database.getTemplateGroups(); - LOGGER.debug(MessageFormat.format("Importing {0} template groups...", templateGroups.size())); - List<Template> alreadyUpdatedTemplates = new ArrayList<>(); - int numberOfImportedTemplateGroups = 0; - - for(TemplateGroup templateGroup : templateGroups) - { - LOGGER.debug(MessageFormat.format("Importing template group {0}", templateGroup.getName())); - - try - { - int oldGroupID = templateGroup.getID(); - int newGroupID = importTemplateGroup(templateGroup); - - if(oldGroupID == newGroupID) - { - numberOfImportedTemplateGroups++; - continue; - } - - List<Template> templates = new ArrayList<>(database.getTemplates()); - templates.removeAll(alreadyUpdatedTemplates); - alreadyUpdatedTemplates.addAll(updateTemplateGroupsForTemplates(templates, oldGroupID, newGroupID)); - - numberOfImportedTemplateGroups++; - } - catch(Exception e) - { - final String errorMessage = MessageFormat.format("Error while importing template group with name \"{0}\"", templateGroup.getName()); - LOGGER.error(errorMessage, e); - collectedErrorMessages.add(formatErrorMessage(errorMessage, e)); - } - } - - LOGGER.debug(MessageFormat.format("Importing template groups DONE ({0}/{1})", numberOfImportedTemplateGroups, templateGroups.size())); - return new ImportResultItem(EntityType.TEMPLATE_GROUP, numberOfImportedTemplateGroups, templateGroups.size(), collectedErrorMessages); - } - - private int importTemplateGroup(TemplateGroup templateGroup) - { - TemplateGroup existingTemplateGroup; - if(templateGroup.getType().equals(TemplateGroupType.DEFAULT)) - { - existingTemplateGroup = templateGroupRepository.findFirstByType(TemplateGroupType.DEFAULT); - } - else - { - existingTemplateGroup = templateGroupRepository.findByNameAndType(templateGroup.getName(), templateGroup.getType()); - } - - int newGroupID; - if(existingTemplateGroup == null) - { - // template group does not exist --> create it - TemplateGroup templateGroupToCreate = new TemplateGroup(templateGroup.getName(), templateGroup.getType()); - TemplateGroup savedTemplateGroup = templateGroupRepository.save(templateGroupToCreate); - - newGroupID = savedTemplateGroup.getID(); - } - else - { - // template group already exists - newGroupID = existingTemplateGroup.getID(); - } - return newGroupID; - } - - public List<Template> updateTemplateGroupsForTemplates(List<Template> items, int oldGroupID, int newGroupID) - { - List<Template> updatedItems = new ArrayList<>(); - for(Template item : items) - { - final TemplateGroup templateGroup = item.getTemplateGroup(); - if(templateGroup == null) - { - continue; - } - - if(templateGroup.getID() == oldGroupID) - { - templateGroup.setID(newGroupID); - updatedItems.add(item); - } - } - - return updatedItems; - } } diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java index 6996d9e22..e24535d2f 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java @@ -358,53 +358,4 @@ class ImportServiceTest // assert Mockito.verify(chartRepositoryMock, Mockito.never()).save(Mockito.any()); } - - @Test - void test_updateTemplateGroupsForTemplates() - { - TemplateGroup templateGroup1 = new TemplateGroup(2, "Template Group 1", TemplateGroupType.CUSTOM); - TemplateGroup templateGroup2 = new TemplateGroup(3, "Template Group 2", TemplateGroupType.CUSTOM); - - Template template1 = new Template(); - template1.setTemplateName("MyTemplate"); - template1.setTemplateGroup(templateGroup1); - template1.setTags(new ArrayList<>()); - - Template template2 = new Template(); - template2.setTemplateName("MyTemplate_2"); - template2.setTemplateGroup(templateGroup2); - template2.setTags(new ArrayList<>()); - - List<Template> updatedTemplates = importService.updateTemplateGroupsForTemplates(List.of(template1, template2), 2, 5); - assertThat(updatedTemplates).hasSize(1); - assertThat(updatedTemplates.get(0).getTemplateGroup()).hasFieldOrPropertyWithValue("ID", 5); - } - - @Test - void test_importTemplateGroups_alreadyExisting() - { - TemplateGroup templateGroup = new TemplateGroup(2, "Template Group 1", TemplateGroupType.CUSTOM); - - TemplateGroup newTemplateGroup = new TemplateGroup(5, "Template Group 1", TemplateGroupType.CUSTOM); - Mockito.when(templateGroupRepository.save(Mockito.any())).thenReturn(newTemplateGroup); - - InternalDatabase database = new InternalDatabase(List.of(), List.of(), List.of(), List.of(templateGroup), List.of(), List.of(), List.of(), List.of()); - importService.importDatabase(database, new AccountMatchList(List.of()), true, true, true); - - TemplateGroup expectedTemplateGroup = new TemplateGroup(templateGroup.getName(), templateGroup.getType()); - Mockito.verify(templateGroupRepository, Mockito.atLeast(1)).save(expectedTemplateGroup); - } - - @Test - void test_importTemplateGroups_skipDefault() - { - TemplateGroup templateGroup = new TemplateGroup(1, "Default", TemplateGroupType.DEFAULT); - - Mockito.when(templateGroupRepository.findFirstByType(TemplateGroupType.DEFAULT)).thenReturn(templateGroup); - - InternalDatabase database = new InternalDatabase(List.of(), List.of(), List.of(), List.of(templateGroup), List.of(), List.of(), List.of(), List.of()); - importService.importDatabase(database, new AccountMatchList(List.of()), true, true, true); - - Mockito.verify(templateGroupRepository, Mockito.never()).save(Mockito.any()); - } } \ No newline at end of file diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java index d8a26f1c1..2c63d3493 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java @@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class AccountImporterTest { @Autowired diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java index f7603d31b..43b13a2a9 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class CategoryImporterTest { @Autowired diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java index 129d1b3bd..0b690815d 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java @@ -24,7 +24,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = Main.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class ChartImporterTest { @Autowired diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java index d7faaf516..3b30ace7e 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class IconImporterTest { @Autowired diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java index 0d0dd1398..9b4254ba7 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class ImageImporterTest { @Autowired diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java new file mode 100644 index 000000000..b9332d26f --- /dev/null +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java @@ -0,0 +1,82 @@ +package de.deadlocker8.budgetmaster.unit.database.importer; + +import de.deadlocker8.budgetmaster.database.importer.TemplateGroupImporter; +import de.deadlocker8.budgetmaster.services.EntityType; +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.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 +{ + @Autowired + private TemplateGroupRepository templateGroupRepository; + + @Test + void test_importTemplateGroupDefault() + { + TemplateGroup defaultTemplateGroup = new TemplateGroup("Default group", TemplateGroupType.DEFAULT); + defaultTemplateGroup = templateGroupRepository.save(defaultTemplateGroup); + + final TemplateGroupImporter importer = new TemplateGroupImporter(templateGroupRepository); + final ImportResultItem resultItem = importer.importItems(List.of(defaultTemplateGroup)); + + final ImportResultItem expected = new ImportResultItem(EntityType.TEMPLATE_GROUP, 1, 1, List.of()); + assertThat(resultItem).isEqualTo(expected); + + final List<TemplateGroup> templateGroups = templateGroupRepository.findAll(); + assertThat(templateGroups) + .hasSize(1) + .containsExactly(defaultTemplateGroup); + } + + @Test + void test_importTemplateGroupAlreadyExisting() + { + TemplateGroup templateGroup = new TemplateGroup("My group", TemplateGroupType.CUSTOM); + templateGroup = templateGroupRepository.save(templateGroup); + + final TemplateGroupImporter importer = new TemplateGroupImporter(templateGroupRepository); + final ImportResultItem resultItem = importer.importItems(List.of(templateGroup)); + + final ImportResultItem expected = new ImportResultItem(EntityType.TEMPLATE_GROUP, 1, 1, List.of()); + assertThat(resultItem).isEqualTo(expected); + + final List<TemplateGroup> templateGroups = templateGroupRepository.findAll(); + assertThat(templateGroups) + .hasSize(1) + .containsExactly(templateGroup); + } + + @Test + void test_importTemplateGroupNotExisting() + { + final TemplateGroup defaultTemplateGroup = new TemplateGroup(15, "My group", TemplateGroupType.CUSTOM); + + final TemplateGroupImporter importer = new TemplateGroupImporter(templateGroupRepository); + final ImportResultItem resultItem = importer.importItems(List.of(defaultTemplateGroup)); + + final ImportResultItem expected = new ImportResultItem(EntityType.TEMPLATE_GROUP, 1, 1, List.of()); + assertThat(resultItem).isEqualTo(expected); + + final TemplateGroup expectedTemplateGroup = new TemplateGroup(1, "My group", TemplateGroupType.CUSTOM); + + final List<TemplateGroup> templateGroups = templateGroupRepository.findAll(); + assertThat(templateGroups) + .hasSize(1) + .containsExactly(expectedTemplateGroup); + } +} \ No newline at end of file diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java index f5df78182..c3f2d9b00 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java @@ -32,7 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class TemplateImporterTest { @Autowired diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java index 575a5540e..525378f37 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java @@ -38,7 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) class TransactionImporterTest { @Autowired -- GitLab