mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-21 22:58:43 +00:00
191 lines
6.1 KiB
Java
Executable File
191 lines
6.1 KiB
Java
Executable File
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<String, Object> 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<File> 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();
|
|
}
|
|
}
|
|
|
|
}
|