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; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestInfo; 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; /******************************************************************************* ** Base class for Selenium tests *******************************************************************************/ public class QBaseSeleniumTest { protected static ChromeOptions chromeOptions; protected WebDriver driver; protected QSeleniumJavalin qSeleniumJavalin; protected QSeleniumLib qSeleniumLib; /******************************************************************************* ** *******************************************************************************/ @BeforeAll static void beforeAll() { chromeOptions = new ChromeOptions(); chromeOptions.setAcceptInsecureCerts(true); chromeOptions.addArguments("--ignore-certificate-errors"); chromeOptions.addArguments("--remote-allow-origins=*"); String headless = System.getenv("QQQ_SELENIUM_HEADLESS"); if("true".equals(headless)) { chromeOptions.addArguments("--headless=new"); } WebDriverManager.chromiumdriver().setup(); } /******************************************************************************* ** *******************************************************************************/ @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); if(useInternalJavalin()) { qSeleniumJavalin = new QSeleniumJavalin(); addJavalinRoutes(qSeleniumJavalin); qSeleniumJavalin.start(); } } /******************************************************************************* ** *******************************************************************************/ 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. *******************************************************************************/ protected boolean useInternalJavalin() { return (true); } /******************************************************************************* ** meant for sub-classes to define their own javalin routes, if they need to *******************************************************************************/ protected void addJavalinRoutes(QSeleniumJavalin qSeleniumJavalin) { qSeleniumJavalin .withRouteToFile("/metaData", "metaData/index.json") .withRouteToFile("/metaData/authentication", "metaData/authentication.json") .withRouteToFile("/metaData/table/person", "metaData/table/person.json") .withRouteToFile("/metaData/table/city", "metaData/table/person.json") .withRouteToFile("/metaData/table/script", "metaData/table/script.json") .withRouteToFile("/metaData/table/scriptRevision", "metaData/table/scriptRevision.json") .withRouteToFile("/processes/querySavedFilter/init", "processes/querySavedFilter/init.json"); } /******************************************************************************* ** *******************************************************************************/ @AfterEach void afterEach(TestInfo testInfo) { if(qSeleniumLib == null) { System.err.println("Cannot take after-test screenshot, as qSeleniumLib is null."); } else { qSeleniumLib.takeScreenshotToFile(getClass().getSimpleName() + "/" + testInfo.getDisplayName()); } if(driver != null) { driver.quit(); } if(qSeleniumJavalin != null) { qSeleniumJavalin.stop(); } } }