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