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 12182a9ad58939865383ec7ccdced652c443748c..03323fcc34c531df344e82a5a6e1e27eeb29b18b 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 0000000000000000000000000000000000000000..b5de025e0ece794fe0dd7c1297dfdea908fe5666 --- /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 eabdb24495f3620b0cf95234cfc696c72dc0b249..b5d2603e2c2465735e5500d77ef360b1874b3e83 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 6996d9e2282da1fe3e0403cebee11cf8a19d4d08..e24535d2ff7e46e5384941252814368c75670a0a 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 d8a26f1c17fcbf69e3b94bf2d5c32ce48eb03e8e..2c63d349351fc1d9467de12b860b6071456c7fbb 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 f7603d31be4684926cd15559ce02c64a32470479..43b13a2a92d991954676008c478f30a736bc4a81 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 129d1b3bdd134e16217c6873e09d07db9cd444be..0b690815d36193f57f59adce4fb4dee314158f4f 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 d7faaf516b79f0a8e50f5ba7c6700eae3341723e..3b30ace7ee777b9e514baf74e9f5f30d49204aae 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 0d0dd1398d03bd2f8a599d6a906d868e289d5adb..9b4254ba730cde17883d23ef44cb2b3d9d5f25ad 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 0000000000000000000000000000000000000000..b9332d26fcb17d59cfc535254338030d6dcf8c36 --- /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 f5df78182073a456ae3c7f0d190aa59de5693bff..c3f2d9b00e974e0570aa21c26e4d89092baada8f 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 575a5540e5c70f490c2940514bbf1852d6a7a713..525378f37190381c1efcee8f9748a32152568172 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