From e993fcb949531569300e3165a31d5fdb962b0a83 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 18 Oct 2023 08:53:41 -0500 Subject: [PATCH] Add better support (hopefully that works in CI) for downloads; update this test to use that. --- .../lib/QBaseSeleniumTest.java | 65 +++++++++++++++++++ .../tests/DashboardTableWidgetExportTest.java | 27 +++++--- 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java b/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java index 649d82b..4d98e70 100755 --- a/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java +++ b/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java @@ -1,6 +1,11 @@ package com.kingsrook.qqq.materialdashboard.lib; +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.materialdashboard.lib.javalin.QSeleniumJavalin; import io.github.bonigarcia.wdm.WebDriverManager; import org.junit.jupiter.api.AfterEach; @@ -11,6 +16,7 @@ import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; +import static org.junit.jupiter.api.Assertions.fail; /******************************************************************************* @@ -54,7 +60,15 @@ public class QBaseSeleniumTest @BeforeEach public void beforeEach() { + manageDownloadsDirectory(); + + HashMap chromePrefs = new HashMap<>(); + chromePrefs.put("profile.default_content_settings.popups", 0); + chromePrefs.put("download.default_directory", getDownloadsDirectory()); + chromeOptions.setExperimentalOption("prefs", chromePrefs); + driver = new ChromeDriver(chromeOptions); + driver.manage().window().setSize(new Dimension(1700, 1300)); qSeleniumLib = new QSeleniumLib(driver); @@ -68,6 +82,57 @@ public class QBaseSeleniumTest + /******************************************************************************* + ** + *******************************************************************************/ + private void manageDownloadsDirectory() + { + File downloadsDirectory = new File(getDownloadsDirectory()); + if(!downloadsDirectory.exists()) + { + if(!downloadsDirectory.mkdir()) + { + fail("Could not create downloads directory: " + downloadsDirectory); + } + } + + if(!downloadsDirectory.isDirectory()) + { + fail("Downloads directory: " + downloadsDirectory + " is not a directory."); + } + + for(File file : CollectionUtils.nonNullArray(downloadsDirectory.listFiles())) + { + if(!file.delete()) + { + fail("Could not remove a file from the downloads directory: " + file.getAbsolutePath()); + } + } + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + protected String getDownloadsDirectory() + { + return ("/tmp/selenium-downloads"); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + protected List getDownloadedFiles() + { + File[] downloadedFiles = CollectionUtils.nonNullArray((new File(getDownloadsDirectory())).listFiles()); + return (Arrays.stream(downloadedFiles).toList()); + } + + + /******************************************************************************* ** control if the test needs to start its own javalin server, or if we're running ** in an environment where an external web server is being used. diff --git a/src/test/java/com/kingsrook/qqq/materialdashboard/tests/DashboardTableWidgetExportTest.java b/src/test/java/com/kingsrook/qqq/materialdashboard/tests/DashboardTableWidgetExportTest.java index 03b9b47..bda8473 100755 --- a/src/test/java/com/kingsrook/qqq/materialdashboard/tests/DashboardTableWidgetExportTest.java +++ b/src/test/java/com/kingsrook/qqq/materialdashboard/tests/DashboardTableWidgetExportTest.java @@ -22,11 +22,16 @@ package com.kingsrook.qqq.materialdashboard.tests; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import com.kingsrook.qqq.materialdashboard.lib.QBaseSeleniumTest; import com.kingsrook.qqq.materialdashboard.lib.javalin.QSeleniumJavalin; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; /******************************************************************************* @@ -70,7 +75,7 @@ public class DashboardTableWidgetExportTest extends QBaseSeleniumTest ** *******************************************************************************/ @Test - void testDashboardTableWidgetExport() + void testDashboardTableWidgetExport() throws IOException { qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/", "Greetings App"); @@ -89,16 +94,18 @@ public class DashboardTableWidgetExportTest extends QBaseSeleniumTest .findElement(By.cssSelector("button")) .click(); - ///////////////////////////////////////////////////////////////////////////// - // assert about the file that was downloaded - its name and some contents. // - ///////////////////////////////////////////////////////////////////////////// - String latestFile = qSeleniumLib.getLatestChromeDownloadedFileInfo(); - assertThat(latestFile).contains("Sample Table Widget"); - assertThat(latestFile).contains(".csv"); - assertThat(latestFile).contains(""" - "Id"%2C"Name"%0A"1"%2C"Homer S."%0A"""); + qSeleniumLib.waitForCondition("Should have downloaded 1 file", () -> getDownloadedFiles().size() == 1); + File csvFile = getDownloadedFiles().get(0); + assertThat(csvFile.getName()).matches("Sample Table Widget.*.csv"); + String fileContents = FileUtils.readFileToString(csvFile, StandardCharsets.UTF_8); + assertEquals(""" + "Id","Name" + "1","Homer S." + "2","Marge B." + "3","Bart J." + """, fileContents); - qSeleniumLib.waitForever(); + // qSeleniumLib.waitForever(); } }