From e3ab5d1fb13d4a700525972ea4984649acc90241 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Thu, 10 Apr 2025 23:29:40 +0200 Subject: [PATCH] #774 - fix tests --- .../resources/templates/accounts/accounts.ftl | 2 +- .../templates/templates/templates.ftl | 2 +- .../transactions/transactionImport.ftl | 4 +- .../integration/selenium/AccountTest.java | 63 +++++++++++++------ .../integration/selenium/CsvImportTest.java | 1 + .../integration/selenium/MediaTest.java | 11 ++-- .../importer/AccountImporterTest.java | 3 + .../importer/CategoryImporterTest.java | 4 +- .../database/importer/IconImporterTest.java | 1 + .../database/importer/ImageImporterTest.java | 1 + .../TransactionNameKeywordImporterTest.java | 2 +- 11 files changed, 63 insertions(+), 31 deletions(-) diff --git a/BudgetMasterServer/src/main/resources/templates/accounts/accounts.ftl b/BudgetMasterServer/src/main/resources/templates/accounts/accounts.ftl index baf58c7e5..67c142258 100644 --- a/BudgetMasterServer/src/main/resources/templates/accounts/accounts.ftl +++ b/BudgetMasterServer/src/main/resources/templates/accounts/accounts.ftl @@ -47,7 +47,7 @@ <div> <label> <input type="checkbox" name="includeHidden" <#if accountsFilterConfiguration?? && accountsFilterConfiguration.includeHidden>checked</#if>/> - <span><i class="far fa-eye-slash placeholder-icon-right"></i>${locale.getString("account.state.hidden")}</span> + <span id="includeHidden"><i class="far fa-eye-slash placeholder-icon-right"></i>${locale.getString("account.state.hidden")}</span> </label> </div> </th> diff --git a/BudgetMasterServer/src/main/resources/templates/templates/templates.ftl b/BudgetMasterServer/src/main/resources/templates/templates/templates.ftl index e93cef1c0..88ce5b639 100644 --- a/BudgetMasterServer/src/main/resources/templates/templates/templates.ftl +++ b/BudgetMasterServer/src/main/resources/templates/templates/templates.ftl @@ -53,7 +53,7 @@ <#import "../helpers/scripts.ftl" as scripts> <@scripts.scripts/> - <script src="<@s.url '/webjars/sortablejs/1.15.3/Sortable.min.js'/>"></script> + <script src="<@s.url '/webjars/sortablejs/Sortable.min.js'/>"></script> <script src="<@s.url '/js/templates.js'/>"></script> </@header.body> </html> \ No newline at end of file diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl index c8f4ea6a7..95512785d 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl @@ -8,7 +8,7 @@ <@header.style "transactionImport"/> <@header.style "collapsible"/> <#import "/spring.ftl" as s> - <link rel="stylesheet" href="<@s.url '/webjars/datatables/2.1.0/css/dataTables.dataTables.min.css'/>"/> + <link rel="stylesheet" href="<@s.url '/webjars/datatables/css/dataTables.dataTables.min.css'/>"/> </head> <@header.body> <#import "../helpers/navbar.ftl" as navbar> @@ -73,7 +73,7 @@ <!-- Scripts--> <#import "../helpers/scripts.ftl" as scripts> <@scripts.scripts/> - <script src="<@s.url '/webjars/datatables/2.1.0/js/dataTables.min.js'/>"></script> + <script src="<@s.url '/webjars/datatables/js/dataTables.min.js'/>"></script> <script src="<@s.url '/js/transactionImport.js'/>"></script> </@header.body> </html> diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java index 82ce13441..61f9d77c8 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java @@ -45,15 +45,21 @@ class AccountTest extends SeleniumTestBase // delete account "zzzz" if existing driver.get(helper.getUrl() + "/accounts"); + ensureHiddenAccountsAreIncludedInFilter(); List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr")); for(WebElement row : accountRows) { final List<WebElement> columns = row.findElements(By.tagName("td")); - final String name = columns.get(2).getText(); + if(columns.isEmpty()) + { + continue; + } + + final String name = columns.get(3).getText(); if(name.equals("zzzz")) { - columns.get(4).findElements(By.tagName("a")).get(1).click(); + columns.get(5).findElements(By.tagName("a")).get(1).click(); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5)); wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector(".modal-content h4"), "Delete Account")); @@ -90,6 +96,7 @@ class AccountTest extends SeleniumTestBase // assert assertThat(driver.getCurrentUrl()).endsWith("/accounts"); + ensureHiddenAccountsAreIncludedInFilter(); accountRows = driver.findElements(By.cssSelector(".account-container tr")); assertThat(accountRows).hasSize(numberOfAccountsBefore); @@ -119,15 +126,17 @@ class AccountTest extends SeleniumTestBase // assert assertThat(driver.getCurrentUrl()).endsWith("/accounts"); + ensureHiddenAccountsAreIncludedInFilter(); + List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr")); - assertThat(accountRows).hasSize(6); - - assertAccountColumns(accountRows.get(0).findElements(By.tagName("td")), true, true, AccountState.FULL_ACCESS, "Default Account", ""); - assertAccountColumns(accountRows.get(1).findElements(By.tagName("td")), true, false, AccountState.FULL_ACCESS, "DefaultAccount0815", ""); - assertAccountColumns(accountRows.get(2).findElements(By.tagName("td")), false, false, AccountState.HIDDEN, "hidden account", ""); - assertAccountColumns(accountRows.get(3).findElements(By.tagName("td")), false, false, AccountState.READ_ONLY, "read only account", ""); - assertAccountColumns(accountRows.get(4).findElements(By.tagName("td")), true, false, AccountState.FULL_ACCESS, "sfsdf", ""); - assertAccountColumns(accountRows.get(5).findElements(By.tagName("td")), false, false, AccountState.READ_ONLY, name, ""); + assertThat(accountRows).hasSize(7); + + assertAccountColumns(accountRows.get(1).findElements(By.tagName("td")), true, true, AccountState.FULL_ACCESS, "Default Account", ""); + assertAccountColumns(accountRows.get(2).findElements(By.tagName("td")), true, false, AccountState.FULL_ACCESS, "DefaultAccount0815", ""); + assertAccountColumns(accountRows.get(3).findElements(By.tagName("td")), false, false, AccountState.HIDDEN, "hidden account", ""); + assertAccountColumns(accountRows.get(4).findElements(By.tagName("td")), false, false, AccountState.READ_ONLY, "read only account", ""); + assertAccountColumns(accountRows.get(5).findElements(By.tagName("td")), true, false, AccountState.FULL_ACCESS, "sfsdf", ""); + assertAccountColumns(accountRows.get(6).findElements(By.tagName("td")), false, false, AccountState.READ_ONLY, name, ""); } @Test @@ -154,11 +163,12 @@ class AccountTest extends SeleniumTestBase // assert assertThat(driver.getCurrentUrl()).endsWith("/accounts"); + ensureHiddenAccountsAreIncludedInFilter(); List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr")); - assertThat(accountRows).hasSize(6); + assertThat(accountRows).hasSize(7); - final WebElement icon = accountRows.get(5).findElements(By.tagName("td")).get(1); + final WebElement icon = accountRows.get(6).findElements(By.tagName("td")).get(0); assertThat(icon).hasFieldOrPropertyWithValue("text", name.substring(0, 1).toUpperCase()); assertThat(icon.findElement(By.tagName("span")).getCssValue("color")).isEqualTo("rgb(255, 0, 0)"); } @@ -189,11 +199,12 @@ class AccountTest extends SeleniumTestBase // assert assertThat(driver.getCurrentUrl()).endsWith("/accounts"); + ensureHiddenAccountsAreIncludedInFilter(); List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr")); - assertThat(accountRows).hasSize(6); + assertThat(accountRows).hasSize(7); - final WebElement icon = accountRows.get(5).findElements(By.tagName("td")).get(1); + final WebElement icon = accountRows.get(6).findElements(By.tagName("td")).get(0); assertThat(icon.findElement(By.cssSelector("span i")).getAttribute("class")).isEqualTo("fas fa-address-book account-select-icon"); assertThat(icon.findElement(By.tagName("span")).getCssValue("color")).isEqualTo("rgb(255, 0, 0)"); } @@ -224,11 +235,12 @@ class AccountTest extends SeleniumTestBase // assert assertThat(driver.getCurrentUrl()).endsWith("/accounts"); + ensureHiddenAccountsAreIncludedInFilter(); List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr")); - assertThat(accountRows).hasSize(6); + assertThat(accountRows).hasSize(7); - final WebElement icon = accountRows.get(5).findElements(By.tagName("td")).get(1); + final WebElement icon = accountRows.get(6).findElements(By.tagName("td")).get(0); assertThat(icon.findElement(By.cssSelector("span img")).getAttribute("src")).startsWith(helper.getUrl() + "/media/getImageByIconID/"); } @@ -375,7 +387,7 @@ class AccountTest extends SeleniumTestBase public static void assertAccountColumns(List<WebElement> columns, boolean isDefaultIconVisible, boolean isDefaultIconSelected, AccountState expectedAccountState, String name, String description) { // icons - final List<WebElement> icons = columns.get(0).findElements(By.tagName("i")); + final List<WebElement> icons = columns.get(1).findElements(By.tagName("i")); int numberOfVisibleIcons = 0; if(isDefaultIconVisible) @@ -414,10 +426,10 @@ class AccountTest extends SeleniumTestBase assertThat(icons).hasSize(numberOfVisibleIcons); // name - assertThat(columns.get(2)).hasFieldOrPropertyWithValue("text", name); + assertThat(columns.get(3)).hasFieldOrPropertyWithValue("text", name); // description - assertThat(columns.get(3)).hasFieldOrPropertyWithValue("text", description); + assertThat(columns.get(4)).hasFieldOrPropertyWithValue("text", description); } private void setAccountState(int accountID, AccountState accountState) @@ -431,4 +443,17 @@ class AccountTest extends SeleniumTestBase driver.findElement(By.id("button-save-account")).click(); } + + private void ensureHiddenAccountsAreIncludedInFilter() + { + WebDriverWait wait; + final WebElement checkboxIncludeHidden = driver.findElement(By.name("includeHidden")); + if(!checkboxIncludeHidden.isSelected()) + { + driver.findElement(By.id("includeHidden")).click(); + driver.findElement(By.id("accounts-filter-button")).click(); + wait = new WebDriverWait(driver, Duration.ofSeconds(5)); + wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector(".headline"), "Accounts")); + } + } } \ No newline at end of file diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java index 0d79a7a2d..9ea838c2f 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CsvImportTest.java @@ -14,6 +14,7 @@ import org.openqa.selenium.support.ui.WebDriverWait; import java.io.File; import java.time.Duration; import java.util.List; +import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java index 1758ffcae..b509c91cd 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java @@ -43,18 +43,19 @@ class MediaTest extends SeleniumTestBase wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector(".headline"), "Accounts")); List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr")); - assertThat(accountRows).hasSize(4); + assertThat(accountRows).hasSize(5); - checkImageLoaded(accountRows.get(0), "JPG"); - checkImageLoaded(accountRows.get(1), "PNG"); - checkImageLoaded(accountRows.get(2), "SVG"); + // the first row is the table header + checkImageLoaded(accountRows.get(1), "JPG"); + checkImageLoaded(accountRows.get(2), "PNG"); + checkImageLoaded(accountRows.get(3), "SVG"); // the last account ist the default account created on database creation and has no image } private void checkImageLoaded(WebElement accountRow, String imageType) { final List<WebElement> columns = accountRow.findElements(By.tagName("td")); - final WebElement image = columns.get(1).findElement(By.className("account-select-icon")); + final WebElement image = columns.get(0).findElement(By.className("account-select-icon")); Object result = ((JavascriptExecutor) driver).executeScript( "return arguments[0].complete && " + diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java index a91317eca..e6b966bcc 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java @@ -8,6 +8,7 @@ import de.deadlocker8.budgetmaster.services.EntityType; import de.deadlocker8.budgetmaster.services.ImportResultItem; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -55,6 +56,7 @@ class AccountImporterTest extends ImporterTestBase placeholderAccount.setID(12); final Account existingPlaceholderAccount = new Account("Placeholder", "", AccountType.ALL, null); + accountRepository.save(existingPlaceholderAccount); existingPlaceholderAccount.setID(1); accountRepository.save(existingPlaceholderAccount); @@ -73,6 +75,7 @@ class AccountImporterTest extends ImporterTestBase account.setID(12); final Account existingAccount = new Account("ABC", "", AccountType.CUSTOM, null); + accountRepository.save(existingAccount); existingAccount.setID(1); accountRepository.save(existingAccount); diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java index c6d4de314..4f1b6dceb 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java @@ -51,8 +51,8 @@ class CategoryImporterTest extends ImporterTestBase void test_importCategories_skipExisting_defaultNone() { final Category category = new Category("No category", "#ff0000", CategoryType.NONE); + categoryRepository.save(category); category.setID(1); - categoryRepository.save(category); final CategoryImporter importer = new CategoryImporter(categoryRepository); @@ -67,8 +67,8 @@ class CategoryImporterTest extends ImporterTestBase void test_importCategories_skipExisting_defaultRest() { final Category category = new Category("Balance", "#ff0000", CategoryType.REST); + categoryRepository.save(category); category.setID(1); - categoryRepository.save(category); final CategoryImporter importer = new CategoryImporter(categoryRepository); diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java index d1a9b4d16..0d384b063 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java @@ -54,6 +54,7 @@ class IconImporterTest extends ImporterTestBase void test_importIcons_alreadyExisting() { final Icon icon = new Icon("fas fa-icons"); + iconRepository.save(icon); icon.setID(1); iconRepository.save(icon); diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java index ffd17a3bb..deb8d81dd 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java @@ -46,6 +46,7 @@ class ImageImporterTest extends ImporterTestBase void test_importImages_alreadyExisting() { final Image image = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG); + imageRepository.save(image); image.setID(1); imageRepository.save(image); diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionNameKeywordImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionNameKeywordImporterTest.java index 489d35ca6..29a0c74d0 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionNameKeywordImporterTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionNameKeywordImporterTest.java @@ -49,7 +49,7 @@ class TransactionNameKeywordImporterTest extends ImporterTestBase @Test void test_importKeywords_skipAlreadyExisting() { - final TransactionNameKeyword existingKeyword = new TransactionNameKeyword(12, "income"); + final TransactionNameKeyword existingKeyword = new TransactionNameKeyword(null, "income"); keywordRepository.save(existingKeyword); final TransactionNameKeywordImporter importer = new TransactionNameKeywordImporter(keywordRepository); -- GitLab