From 4165672e08d932c19bffdaf3ffbe7e699714968f Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Tue, 25 Apr 2023 00:03:32 +0200 Subject: [PATCH] Fixed #743 - use only session attributes for filter configuration --- .../reports/ReportController.java | 8 ++- .../transactions/TransactionController.java | 17 +++--- .../integration/selenium/FilterTest.java | 58 +++++++++++++++++++ 3 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FilterTest.java diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java index 41fc2321f..c8aa322c2 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java @@ -24,6 +24,9 @@ import org.springframework.web.bind.annotation.*; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.WebRequest; + import java.io.IOException; import java.text.MessageFormat; import java.time.LocalDate; @@ -68,13 +71,14 @@ public class ReportController extends BaseController } @GetMapping - public String reports(HttpServletRequest request, Model model, @CookieValue(value = "currentDate", required = false) String cookieDate) + public String reports(WebRequest webRequest, HttpServletRequest request, Model model, @CookieValue(value = "currentDate", required = false) String cookieDate) { LocalDate date = dateService.getDateTimeFromCookie(cookieDate); model.addAttribute(ModelAttributes.REPORT_SETTINGS, reportSettingsService.getReportSettings()); model.addAttribute(ModelAttributes.CURRENT_DATE, date); - model.addAttribute(ModelAttributes.FILTER_CONFIGURATION, filterHelpers.getFilterConfiguration(request)); + + webRequest.setAttribute(ModelAttributes.FILTER_CONFIGURATION, filterHelpers.getFilterConfiguration(request), RequestAttributes.SCOPE_SESSION); return ReturnValues.ALL_ENTITIES; } diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java index 8675dd7e0..68a64011b 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java @@ -88,18 +88,18 @@ public class TransactionController extends BaseController } @GetMapping - public String transactions(HttpServletRequest request, Model model, @CookieValue(value = "currentDate", required = false) String cookieDate) + public String transactions(WebRequest webRequest, HttpServletRequest request, Model model, @CookieValue(value = "currentDate", required = false) String cookieDate) { LocalDate date = dateService.getDateTimeFromCookie(cookieDate); repeatingTransactionUpdater.updateRepeatingTransactions(date.with(lastDayOfMonth())); - prepareModelTransactions(filterHelpers.getFilterConfiguration(request), model, date); + prepareModelTransactions(webRequest, filterHelpers.getFilterConfiguration(request), model, date); return ReturnValues.ALL_ENTITIES; } @GetMapping("/{ID}/requestDelete") - public String requestDeleteTransaction(HttpServletRequest request, Model model, @PathVariable("ID") Integer ID, @CookieValue("currentDate") String cookieDate) + public String requestDeleteTransaction(WebRequest webRequest, HttpServletRequest request, Model model, @PathVariable("ID") Integer ID, @CookieValue("currentDate") String cookieDate) { if(!transactionService.isDeletable(ID)) { @@ -107,13 +107,13 @@ public class TransactionController extends BaseController } LocalDate date = dateService.getDateTimeFromCookie(cookieDate); - prepareModelTransactions(filterHelpers.getFilterConfiguration(request), model, date); + prepareModelTransactions(webRequest, filterHelpers.getFilterConfiguration(request), model, date); model.addAttribute(TransactionModelAttributes.ENTITY_TO_DELETE, transactionService.getRepository().getReferenceById(ID)); return ReturnValues.DELETE_ENTITY; } - private void prepareModelTransactions(FilterConfiguration filterConfiguration, Model model, LocalDate date) + private void prepareModelTransactions(WebRequest webRequest, FilterConfiguration filterConfiguration, Model model, LocalDate date) { final Account currentAccount = helpers.getCurrentAccount(); final List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(currentAccount, date.getMonthValue(), date.getYear(), filterConfiguration); @@ -121,7 +121,8 @@ public class TransactionController extends BaseController model.addAttribute(TransactionModelAttributes.ACCOUNT, currentAccount); model.addAttribute(TransactionModelAttributes.BUDGET, helpers.getBudget(transactions, currentAccount)); model.addAttribute(TransactionModelAttributes.CURRENT_DATE, date); - model.addAttribute(TransactionModelAttributes.FILTER_CONFIGURATION, filterConfiguration); + + webRequest.setAttribute("filterConfiguration", filterConfiguration, RequestAttributes.SCOPE_SESSION); if(settingsService.getSettings().isRestActivated()) { @@ -310,7 +311,7 @@ public class TransactionController extends BaseController } @GetMapping("/{ID}/highlight") - public String highlight(Model model, @PathVariable("ID") Integer ID) + public String highlight(WebRequest webRequest, Model model, @PathVariable("ID") Integer ID) { Transaction transaction = transactionService.getRepository().getReferenceById(ID); @@ -326,7 +327,7 @@ public class TransactionController extends BaseController filterConfiguration.setFilterCategories(filterHelpers.getFilterCategories()); filterConfiguration.setFilterTags(filterHelpers.getFilterTags()); - prepareModelTransactions(filterConfiguration, model, transaction.getDate()); + prepareModelTransactions(webRequest, filterConfiguration, model, transaction.getDate()); model.addAttribute(TransactionModelAttributes.HIGHLIGHT_ID, ID); return ReturnValues.ALL_ENTITIES; } diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FilterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FilterTest.java new file mode 100644 index 000000000..a9eb4a82f --- /dev/null +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FilterTest.java @@ -0,0 +1,58 @@ +package de.deadlocker8.budgetmaster.integration.selenium; + +import de.deadlocker8.budgetmaster.authentication.UserService; +import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper; +import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTestBase; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.io.File; +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; + +class FilterTest extends SeleniumTestBase +{ + private static IntegrationTestHelper helper; + + @Override + protected void importDatabaseOnce() + { + helper = new IntegrationTestHelper(driver, port); + helper.start(); + helper.login(UserService.DEFAULT_PASSWORD); + helper.hideBackupReminder(); + helper.hideWhatsNewDialog(); + + String path = getClass().getClassLoader().getResource("SearchDatabase.json").getFile().replace("/", File.separator); + helper.uploadDatabase(path); + } + + @Test + void test_showFilterActiveButton() + { + driver.get(helper.getUrl() + "/transactions"); + + assertThat(driver.findElement(By.id("modalFilterTrigger")).getAttribute("class")).doesNotContain("background-red"); + + driver.findElement(By.id("modalFilterTrigger")).click(); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5)); + wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("modalFilter"))); + + driver.findElement(By.id("section-type")).click(); + final WebElement checkBox = driver.findElement(By.cssSelector("#section-type .text-default")); + ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", checkBox); + checkBox.click(); + + driver.findElement(By.id("buttonApplyFilter")).click(); + + wait = new WebDriverWait(driver, Duration.ofSeconds(5)); + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("modalFilter"))); + + assertThat(driver.findElement(By.id("modalFilterTrigger")).getAttribute("class")).contains("background-red"); + } +} \ No newline at end of file -- GitLab