From 868f339778897c1d8e6cea0ede054382ee1a481b Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 21 Jan 2023 12:02:20 +0100
Subject: [PATCH] #724 - added tests for TransactionImportService

---
 .../TransactionImportService.java             |   4 -
 .../unit/TransactionImportServiceTest.java    | 167 ++++++++++++++++++
 2 files changed, 167 insertions(+), 4 deletions(-)
 create mode 100644 BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java

diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java
index 1b6e23923..eaf3ecde7 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java
@@ -7,8 +7,6 @@ import de.deadlocker8.budgetmaster.services.HelpersService;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
 import de.deadlocker8.budgetmaster.transactions.csvimport.*;
 import de.thecodelabs.utils.util.Localization;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -18,8 +16,6 @@ import java.util.Optional;
 @Service
 public class TransactionImportService
 {
-	private static final Logger LOGGER = LoggerFactory.getLogger(TransactionImportService.class);
-
 	private final HelpersService helpersService;
 	private final SettingsService settingsService;
 	private final CategoryService categoryService;
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java
new file mode 100644
index 000000000..d94dc12ca
--- /dev/null
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java
@@ -0,0 +1,167 @@
+package de.deadlocker8.budgetmaster.unit;
+
+import de.deadlocker8.budgetmaster.accounts.Account;
+import de.deadlocker8.budgetmaster.accounts.AccountType;
+import de.deadlocker8.budgetmaster.categories.Category;
+import de.deadlocker8.budgetmaster.categories.CategoryService;
+import de.deadlocker8.budgetmaster.categories.CategoryType;
+import de.deadlocker8.budgetmaster.services.HelpersService;
+import de.deadlocker8.budgetmaster.settings.Settings;
+import de.deadlocker8.budgetmaster.settings.SettingsService;
+import de.deadlocker8.budgetmaster.transactions.Transaction;
+import de.deadlocker8.budgetmaster.transactions.TransactionImportService;
+import de.deadlocker8.budgetmaster.transactions.csvimport.*;
+import de.deadlocker8.budgetmaster.unit.helpers.LocalizedTest;
+import de.deadlocker8.budgetmaster.utils.LanguageType;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+
+@ExtendWith(SpringExtension.class)
+@LocalizedTest
+class TransactionImportServiceTest
+{
+	private static final Category CATEGORY_NONE = new Category("No category", "#FFFFFF", CategoryType.NONE);
+	private static final Category CATEGORY_CUSTOM = new Category("CustomCategory", "#0F0F0F", CategoryType.CUSTOM);
+	private static final Account ACCOUNT = new Account("MyAccount", AccountType.CUSTOM);
+
+	@Mock
+	private HelpersService helpersService;
+
+	@Mock
+	private SettingsService settingsService;
+
+	@Mock
+	private CategoryService categoryService;
+
+	@InjectMocks
+	private TransactionImportService transactionImportService;
+
+	@Test
+	void test_createTransactionFromCsvTransaction_income()
+	{
+		final LocalDate date = LocalDate.of(2023, 1, 21);
+		final CsvTransaction csvTransaction = new CsvTransaction(date, "Awesome", 750, "Lorem Ipsum", CsvTransactionStatus.PENDING, CATEGORY_NONE);
+
+		final Transaction expectedTransaction = new Transaction();
+		expectedTransaction.setID(null);
+		expectedTransaction.setName("Awesome");
+		expectedTransaction.setAmount(750);
+		expectedTransaction.setCategory(CATEGORY_NONE);
+		expectedTransaction.setAccount(ACCOUNT);
+		expectedTransaction.setIsExpenditure(false);
+		expectedTransaction.setDate(date);
+		expectedTransaction.setDescription("Lorem Ipsum");
+
+		Mockito.when(helpersService.getCurrentAccountOrDefault()).thenReturn(ACCOUNT);
+
+		assertThat(transactionImportService.createTransactionFromCsvTransaction(csvTransaction))
+				.isEqualTo(expectedTransaction);
+	}
+
+	@Test
+	void test_createTransactionFromCsvTransaction_expenditure()
+	{
+		final LocalDate date = LocalDate.of(2023, 1, 21);
+		final CsvTransaction csvTransaction = new CsvTransaction(date, "Awesome", -1200, "Lorem Ipsum", CsvTransactionStatus.PENDING, CATEGORY_NONE);
+
+		final Transaction expectedTransaction = new Transaction();
+		expectedTransaction.setID(null);
+		expectedTransaction.setName("Awesome");
+		expectedTransaction.setAmount(-1200);
+		expectedTransaction.setCategory(CATEGORY_NONE);
+		expectedTransaction.setAccount(ACCOUNT);
+		expectedTransaction.setIsExpenditure(true);
+		expectedTransaction.setDate(date);
+		expectedTransaction.setDescription("Lorem Ipsum");
+
+		Mockito.when(helpersService.getCurrentAccountOrDefault()).thenReturn(ACCOUNT);
+
+		assertThat(transactionImportService.createTransactionFromCsvTransaction(csvTransaction))
+				.isEqualTo(expectedTransaction);
+	}
+
+	@Test
+	void test_updateCsvTransaction()
+	{
+		final LocalDate date = LocalDate.of(2023, 1, 21);
+		final CsvTransaction existingCsvTransaction = new CsvTransaction(date, "Awesome", -1200, "Lorem Ipsum", CsvTransactionStatus.IMPORTED, CATEGORY_NONE);
+		final CsvTransaction csvTransactionWithNewAttributes = new CsvTransaction(date, "Over 9000", -1200, "dolor sit amet", CsvTransactionStatus.PENDING, CATEGORY_CUSTOM);
+
+		final CsvTransaction expectedCsvTransaction = new CsvTransaction(date, "Over 9000", -1200, "dolor sit amet", CsvTransactionStatus.IMPORTED, CATEGORY_CUSTOM);
+
+		transactionImportService.updateCsvTransaction(existingCsvTransaction, csvTransactionWithNewAttributes);
+		assertThat(existingCsvTransaction)
+				.isEqualTo(expectedCsvTransaction);
+	}
+
+	@Test
+	void test_createCsvTransactionFromCsvRow() throws CsvTransactionParseException
+	{
+		final LocalDate date = LocalDate.of(2023, 1, 21);
+
+		final CsvRow csvRow = new CsvRow("21.01.2023", "Groceries", "-12.00", "dolor sit amet");
+		final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.yyyy", 2, 3, 4);
+
+		final CsvTransaction expectedCsvTransaction = new CsvTransaction(date, "Groceries", -1200, "dolor sit amet", CsvTransactionStatus.PENDING, CATEGORY_NONE);
+
+		final Settings settings = new Settings();
+		settings.setLanguage(LanguageType.ENGLISH);
+		Mockito.when(settingsService.getSettings()).thenReturn(settings);
+		Mockito.when(categoryService.findByType(CategoryType.NONE)).thenReturn(CATEGORY_NONE);
+
+		final CsvTransaction csvTransaction = transactionImportService.createCsvTransactionFromCsvRow(csvRow, csvColumnSettings, 0);
+
+		assertThat(csvTransaction)
+				.isEqualTo(expectedCsvTransaction);
+	}
+
+	@Test
+	void test_createCsvTransactionFromCsvRow_dateParseException()
+	{
+		final LocalDate date = LocalDate.of(2023, 1, 21);
+
+		final CsvRow csvRow = new CsvRow("21.01.2023", "Groceries", "-12.00", "dolor sit amet");
+		final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.", 2, 3, 4);
+
+		final CsvTransaction expectedCsvTransaction = new CsvTransaction(date, "Groceries", -1200, "dolor sit amet", CsvTransactionStatus.PENDING, CATEGORY_NONE);
+
+		final Settings settings = new Settings();
+		settings.setLanguage(LanguageType.ENGLISH);
+		Mockito.when(settingsService.getSettings()).thenReturn(settings);
+		Mockito.when(categoryService.findByType(CategoryType.NONE)).thenReturn(CATEGORY_NONE);
+
+		assertThatThrownBy(() -> transactionImportService.createCsvTransactionFromCsvRow(csvRow, csvColumnSettings, 0))
+				.isInstanceOf(CsvTransactionParseException.class)
+				.hasMessageContaining("Error parsing the date in line 1");
+	}
+
+	@Test
+	void test_createCsvTransactionFromCsvRow_amountParseException()
+	{
+		final LocalDate date = LocalDate.of(2023, 1, 21);
+
+		final CsvRow csvRow = new CsvRow("21.01.2023", "Groceries", "non_amount", "dolor sit amet");
+		final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.yyyy", 2, 3, 4);
+
+		final CsvTransaction expectedCsvTransaction = new CsvTransaction(date, "Groceries", -1200, "dolor sit amet", CsvTransactionStatus.PENDING, CATEGORY_NONE);
+
+		final Settings settings = new Settings();
+		settings.setLanguage(LanguageType.ENGLISH);
+		Mockito.when(settingsService.getSettings()).thenReturn(settings);
+		Mockito.when(categoryService.findByType(CategoryType.NONE)).thenReturn(CATEGORY_NONE);
+
+		assertThatThrownBy(() -> transactionImportService.createCsvTransactionFromCsvRow(csvRow, csvColumnSettings, 0))
+				.isInstanceOf(CsvTransactionParseException.class)
+				.hasMessageContaining("Error parsing the amount in line 1");
+	}
+}
-- 
GitLab