From e83bab8304932fb21d21c3a1701a25028af23766 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 27 Oct 2021 23:07:34 +0200
Subject: [PATCH] #646 - fixed wrong transaction date after midnight in
 timezone Berlin

---
 .../authentication/LoginController.java       |  4 +--
 .../budgetmaster/utils/DateHelper.java        | 14 ++++++++++
 .../selenium/LoginControllerTest.java         | 26 +++++++++++++++++++
 3 files changed, 42 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java

diff --git a/src/main/java/de/deadlocker8/budgetmaster/authentication/LoginController.java b/src/main/java/de/deadlocker8/budgetmaster/authentication/LoginController.java
index a6b133113..b1e314f2e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/authentication/LoginController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/authentication/LoginController.java
@@ -1,8 +1,8 @@
 package de.deadlocker8.budgetmaster.authentication;
 
 import de.deadlocker8.budgetmaster.controller.BaseController;
+import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.deadlocker8.budgetmaster.utils.Mappings;
-import org.joda.time.DateTime;
 import org.springframework.security.web.savedrequest.DefaultSavedRequest;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -37,7 +37,7 @@ public class LoginController extends BaseController
 			request.getSession().setAttribute("preLoginURL", savedRequest.getRequestURL());
 		}
 
-		model.addAttribute("currentDate", DateTime.now());
+		model.addAttribute("currentDate", DateHelper.getCurrentDate());
 		return "login";
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java b/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java
new file mode 100644
index 000000000..0392eb885
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java
@@ -0,0 +1,14 @@
+package de.deadlocker8.budgetmaster.utils;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
+import java.util.TimeZone;
+
+public class DateHelper
+{
+	public static DateTime getCurrentDate()
+	{
+		return DateTime.now(DateTimeZone.forTimeZone(TimeZone.getDefault()));
+	}
+}
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
index 6c592c174..a0fe1141a 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
@@ -4,6 +4,8 @@ import de.deadlocker8.budgetmaster.authentication.UserService;
 import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTestBase;
 import de.thecodelabs.utils.util.Localization;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeUtils;
 import org.junit.jupiter.api.Test;
 import org.openqa.selenium.By;
 import org.openqa.selenium.Cookie;
@@ -15,6 +17,7 @@ import org.openqa.selenium.support.ui.WebDriverWait;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.util.Date;
+import java.util.TimeZone;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -78,6 +81,29 @@ class LoginControllerTest extends SeleniumTestBase
 		assertThat(driver.manage().getCookies()).contains(expectedCookie);
 	}
 
+	@Test
+	void successLogin_cookieShortlyAfterMidnightInSystemTimezone()
+	{
+		// override system time to setup midnight scenario
+		// DateTime.now() will return the time in UTC --> shortly before midnight
+		DateTimeUtils.setCurrentMillisFixed(new DateTime(2021, 10, 24, 23, 10, 0).getMillis());
+
+		// system time zone is Berlin --> at least +1 hour --> after midnight
+		TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
+
+		IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
+		helper.start();
+		helper.login(UserService.DEFAULT_PASSWORD);
+		helper.hideBackupReminder();
+		helper.hideWhatsNewDialog();
+
+		WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
+		wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("logo-home")));
+
+		Cookie expectedCookie = new Cookie("currentDate", "25.10.21", "localhost", "/", null, false, false, "None");
+		assertThat(driver.manage().getCookies()).contains(expectedCookie);
+	}
+
 	@Test
 	void logout()
 	{
-- 
GitLab