From d27b4e19b03f16b56aaeb366d03c4f9c3682feaa Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 22:39:12 +0100 Subject: [PATCH] Added Locations E2E tests --- .../Helper/AppHelper.cs | 22 ++++++- .../Helper/LocationsHelper.cs | 62 +++++++++++++++++++ .../LocationsPageTests.cs | 58 +++++++++++++++++ 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs create mode 100644 tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index 71109c9..94ec6fd 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -69,7 +69,7 @@ public static class AppHelper public static bool TryRetryFindSuccessToast(ChromeDriver driver) { int retryCounter = 0; - retry: + retry: try { @@ -101,4 +101,24 @@ public static class AppHelper { return webElement.GetAttribute("checked") == "true"; } + + public static void ScrollIntoViewAndClick(ChromeDriver driver, IWebElement webElement) + { + driver.ExecuteScript("arguments[0].scrollIntoView();", webElement); + int retryCounter = 0; + retry: + try + { + Thread.Sleep(250); + webElement.Click(); + } + catch (Exception) + { + if (retryCounter++ < 20) + { + goto retry; + } + throw; + } + } } \ No newline at end of file diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs new file mode 100644 index 0000000..6d9f707 --- /dev/null +++ b/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs @@ -0,0 +1,62 @@ +using System.Diagnostics; +using System.Net; +using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; +using OpenQA.Selenium.Support.UI; + +namespace Berufsschule_HAM.E2ETests.Helper; + +public static class LocationsHelper +{ + public static void CreateLocation(ChromeDriver driver, string name, string room, string seat) + { + NavigateToLocationsPage(driver); + IWebElement createLocationButton = driver.FindElement(By.CssSelector("button[data-bs-target=\"#createModal\"]")); + createLocationButton.Click(); + Thread.Sleep(500); + driver.FindElement(By.Id("createLocationName")).SendKeys(name); + driver.FindElement(By.Id("createRoomNumber")).SendKeys(room); + driver.FindElement(By.Id("createSeat")).SendKeys(seat); + IWebElement createButton = driver.FindElement(By.CssSelector("#createModal .btn-primary")); + createButton.Click(); + Assert.True(AppHelper.TryRetryFindSuccessToast(driver)); + } + + public static void UpdateLocation(ChromeDriver driver, string name, string room, string seat, string newName, string newRoom, string newSeat) + { + NavigateToLocationsPage(driver); + string selector = $"button.btn-warning[data-location-name=\"{name}\"][data-room-number=\"{room}\"][data-seat=\"{seat}\"]"; + IWebElement updateLocationButton = driver.FindElement(By.CssSelector(selector)); + AppHelper.ScrollIntoViewAndClick(driver, updateLocationButton); + Thread.Sleep(500); + List ids = [["editLocationName", newName], ["editRoomNumber", newRoom], ["editSeat", newSeat]]; + ids.ForEach(id => + { + var cnInput = driver.FindElement(By.Id(id[0])); + cnInput.Click(); + cnInput.Clear(); + cnInput.SendKeys(id[1]); + }); + IWebElement updateButton = driver.FindElement(By.CssSelector("#editModal .btn-warning")); + updateButton.Click(); + Assert.True(AppHelper.TryRetryFindSuccessToast(driver)); + } + + + public static void DeleteLocation(ChromeDriver driver, string cn) + { + NavigateToLocationsPage(driver); + IWebElement deleteButton = driver.FindElement(By.CssSelector($"button.btn-danger[data-location-id=\"{cn}\"]")); + AppHelper.ScrollIntoViewAndClick(driver, deleteButton); + Thread.Sleep(1000); + driver.FindElement(By.Id("deleteModal")); + IWebElement deleteConfirmButton = driver.FindElement(By.Id("deleteForm")); + deleteConfirmButton.Click(); + Assert.True(AppHelper.TryRetryFindSuccessToast(driver)); + } + + public static void NavigateToLocationsPage(ChromeDriver driver) + { + driver.Navigate().GoToUrl(new Uri(AppHelper.ServerUri, "/Home/Locations")); + } +} \ No newline at end of file diff --git a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs new file mode 100644 index 0000000..4347766 --- /dev/null +++ b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs @@ -0,0 +1,58 @@ +using Berufsschule_HAM.E2ETests.Helper; +using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; +using System.Diagnostics; + +namespace Berufsschule_HAM.E2ETests; + +public class LocationsPageTests : IDisposable +{ + private readonly ChromeDriver _driver; + public Uri serverUri; + public string serverUrl; + public Process serverProcess; + + public LocationsPageTests() + { + serverUrl = AppHelper.ServerUrl; + serverUri = AppHelper.ServerUri; + Task app = AppHelper.StartApp(serverUrl); + _driver = AppHelper.GetChromeDriver(); + serverProcess = app.Result; + } + + [Fact] + public void LocationsPage_ShouldShowButton() + { + AppHelper.Login(_driver); + LocationsHelper.NavigateToLocationsPage(_driver); + _driver.FindElement(By.CssSelector("button[data-bs-target=\"#createModal\"]")); + } + + [Fact] + public void LocationsPage_ShouldShowCreateViewModal() + { + AppHelper.Login(_driver); + LocationsHelper.NavigateToLocationsPage(_driver); + List ids = ["createLocationName", "createRoomNumber", "createSeat"]; + List css = ["#createModal .btn-primary", "#createModal .btn-secondary"]; + ids.ForEach(id => _driver.FindElement(By.Id(id))); + css.ForEach(selector => _driver.FindElement(By.CssSelector(selector))); + } + + [Fact] + public void LocationsPage_ShouldCreateAndUpdateAndDeleteGroup() + { + AppHelper.Login(_driver); + LocationsHelper.NavigateToLocationsPage(_driver); + LocationsHelper.CreateLocation(_driver, "RESERVED_LOCATION", "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); + LocationsHelper.UpdateLocation(_driver, "RESERVED_LOCATION", "RESERVED_ROOM", "RESERVED_ROOMNUMBER", "RESERVED_LOCATION2", "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2"); + LocationsHelper.UpdateLocation(_driver, "RESERVED_LOCATION2", "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2", "RESERVED_LOCATION", "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); + LocationsHelper.DeleteLocation(_driver, "reservedlocation-reservedroom-reservedroomnumber"); + } + public void Dispose() + { + _driver.Quit(); + serverProcess.Kill(); + } +}