Update to pass selenium tests on custom filter panel

This commit is contained in:
2023-06-20 08:33:15 -05:00
parent 8b38cf8fa3
commit dc00144209
5 changed files with 61 additions and 21 deletions

View File

@ -475,7 +475,7 @@ export function FilterCriteriaRow({id, index, tableMetaData, metaData, criteria,
} }
return ( return (
<Box pt={0.5} display="flex" alignItems="flex-end"> <Box className="filterCriteriaRow" pt={0.5} display="flex" alignItems="flex-end">
<Box display="inline-block"> <Box display="inline-block">
<Tooltip title="Remove this condition from your filter" enterDelay={750} placement="left"> <Tooltip title="Remove this condition from your filter" enterDelay={750} placement="left">
<IconButton onClick={removeCriteria}><Icon fontSize="small">close</Icon></IconButton> <IconButton onClick={removeCriteria}><Icon fontSize="small">close</Icon></IconButton>
@ -491,7 +491,7 @@ export function FilterCriteriaRow({id, index, tableMetaData, metaData, criteria,
</FormControl> </FormControl>
: <span />} : <span />}
</Box> </Box>
<Box display="inline-block" width={250}> <Box display="inline-block" width={250} className="fieldColumn">
<Autocomplete <Autocomplete
id={`field-${id}`} id={`field-${id}`}
renderInput={(params) => (<TextField {...params} label={"Field"} variant="standard" autoComplete="off" type="search" InputProps={{...params.InputProps}} />)} renderInput={(params) => (<TextField {...params} label={"Field"} variant="standard" autoComplete="off" type="search" InputProps={{...params.InputProps}} />)}
@ -508,7 +508,7 @@ export function FilterCriteriaRow({id, index, tableMetaData, metaData, criteria,
slotProps={{popper: {style: {padding: 0, width: "250px"}}}} slotProps={{popper: {style: {padding: 0, width: "250px"}}}}
/> />
</Box> </Box>
<Box display="inline-block" width={200}> <Box display="inline-block" width={200} className="operatorColumn">
<Tooltip title={criteria.fieldName == null ? "You must select a field before you can select an operator" : null} enterDelay={750}> <Tooltip title={criteria.fieldName == null ? "You must select a field before you can select an operator" : null} enterDelay={750}>
<Autocomplete <Autocomplete
id={"criteriaOperator"} id={"criteriaOperator"}

View File

@ -10,5 +10,5 @@ public interface QQQMaterialDashboardSelectors
String BREADCRUMB_HEADER = ".MuiToolbar-root h5"; String BREADCRUMB_HEADER = ".MuiToolbar-root h5";
String QUERY_GRID_CELL = ".MuiDataGrid-root .MuiDataGrid-cellContent"; String QUERY_GRID_CELL = ".MuiDataGrid-root .MuiDataGrid-cellContent";
String QUERY_FILTER_INPUT = ".MuiDataGrid-filterForm input.MuiInput-input"; String QUERY_FILTER_INPUT = ".customFilterPanel input.MuiInput-input";
} }

View File

@ -116,6 +116,26 @@ public class QSeleniumLib
/*******************************************************************************
**
*******************************************************************************/
public void waitForMillis(int n)
{
try
{
new WebDriverWait(driver, Duration.ofMillis(n))
.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".wontEverBePresent")));
}
catch(Exception e)
{
///////////////////
// okay, resume. //
///////////////////
}
}
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/

View File

@ -29,8 +29,8 @@ import com.kingsrook.qqq.materialdashboard.lib.javalin.CapturedContext;
import com.kingsrook.qqq.materialdashboard.lib.javalin.QSeleniumJavalin; import com.kingsrook.qqq.materialdashboard.lib.javalin.QSeleniumJavalin;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.openqa.selenium.By; import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement; import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -49,7 +49,8 @@ public class QueryScreenTest extends QBaseSeleniumTest
super.addJavalinRoutes(qSeleniumJavalin); super.addJavalinRoutes(qSeleniumJavalin);
qSeleniumJavalin qSeleniumJavalin
.withRouteToFile("/data/person/count", "data/person/count.json") .withRouteToFile("/data/person/count", "data/person/count.json")
.withRouteToFile("/data/person/query", "data/person/index.json"); .withRouteToFile("/data/person/query", "data/person/index.json")
.withRouteToFile("/processes/querySavedFilter/init", "processes/querySavedFilter/init.json");
} }
@ -62,15 +63,18 @@ public class QueryScreenTest extends QBaseSeleniumTest
{ {
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person", "Person"); qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person", "Person");
qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_GRID_CELL); qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_GRID_CELL);
qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filters").click(); qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filter").click();
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// open the filter window, enter a value, wait for query to re-run // // open the filter window, enter a value, wait for query to re-run //
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
WebElement filterInput = qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_FILTER_INPUT); WebElement filterInput = qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_FILTER_INPUT);
qSeleniumLib.waitForElementToHaveFocus(filterInput); qSeleniumLib.waitForElementToHaveFocus(filterInput);
filterInput.sendKeys("id");
filterInput.sendKeys("\t");
driver.switchTo().activeElement().sendKeys("\t");
qSeleniumJavalin.beginCapture(); qSeleniumJavalin.beginCapture();
filterInput.sendKeys("1"); driver.switchTo().activeElement().sendKeys("1");
/////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////
// assert that query & count both have the expected filter value // // assert that query & count both have the expected filter value //
@ -117,10 +121,10 @@ public class QueryScreenTest extends QBaseSeleniumTest
{ {
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person", "Person"); qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person", "Person");
qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_GRID_CELL); qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_GRID_CELL);
qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filters").click(); qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filter").click();
addQueryFilterInput(qSeleniumLib, 0, "First Name", "contains", "Dar", "Or");
qSeleniumJavalin.beginCapture(); qSeleniumJavalin.beginCapture();
addQueryFilterInput(qSeleniumLib, 0, "First Name", "contains", "Dar", "Or");
addQueryFilterInput(qSeleniumLib, 1, "First Name", "contains", "Jam", "Or"); addQueryFilterInput(qSeleniumLib, 1, "First Name", "contains", "Jam", "Or");
String expectedFilterContents0 = """ String expectedFilterContents0 = """
@ -145,27 +149,43 @@ public class QueryScreenTest extends QBaseSeleniumTest
{ {
if(index > 0) if(index > 0)
{ {
qSeleniumLib.waitForSelectorContaining("BUTTON", "Add filter").click(); qSeleniumLib.waitForSelectorContaining("BUTTON", "Add condition").click();
} }
WebElement subFormForField = qSeleniumLib.waitForSelectorAll(".MuiDataGrid-filterForm", index + 1).get(index); WebElement subFormForField = qSeleniumLib.waitForSelectorAll(".filterCriteriaRow", index + 1).get(index);
if(index == 1) if(index == 1)
{ {
Select linkOperatorSelect = new Select(subFormForField.findElement(By.cssSelector(".MuiDataGrid-filterFormLinkOperatorInput SELECT"))); WebElement booleanOperatorInput = subFormForField.findElement(By.cssSelector(".booleanOperatorColumn .MuiInput-input"));
linkOperatorSelect.selectByVisibleText(booleanOperator); booleanOperatorInput.click();
qSeleniumLib.waitForMillis(100);
subFormForField.findElement(By.cssSelector(".booleanOperatorColumn .MuiInput-input"));
qSeleniumLib.waitForSelectorContaining("li", booleanOperator).click();
qSeleniumLib.waitForMillis(100);
} }
Select fieldSelect = new Select(subFormForField.findElement(By.cssSelector(".MuiDataGrid-filterFormColumnInput SELECT"))); WebElement fieldInput = subFormForField.findElement(By.cssSelector(".fieldColumn INPUT"));
fieldSelect.selectByVisibleText(fieldLabel); fieldInput.click();
qSeleniumLib.waitForMillis(100);
fieldInput.clear();
fieldInput.sendKeys(fieldLabel);
qSeleniumLib.waitForMillis(100);
fieldInput.sendKeys("\n");
qSeleniumLib.waitForMillis(100);
Select operatorSelect = new Select(subFormForField.findElement(By.cssSelector(".MuiDataGrid-filterFormOperatorInput SELECT"))); WebElement operatorInput = subFormForField.findElement(By.cssSelector(".operatorColumn INPUT"));
operatorSelect.selectByVisibleText(operator); operatorInput.click();
qSeleniumLib.waitForMillis(100);
operatorInput.sendKeys(Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, Keys.BACK_SPACE, operator);
qSeleniumLib.waitForMillis(100);
operatorInput.sendKeys("\n");
qSeleniumLib.waitForMillis(100);
WebElement valueInput = subFormForField.findElement(By.cssSelector(".MuiDataGrid-filterFormValueInput INPUT")); WebElement valueInput = subFormForField.findElement(By.cssSelector(".filterValuesColumn INPUT"));
valueInput.click(); valueInput.click();
valueInput.sendKeys(value); valueInput.sendKeys(value);
qSeleniumLib.waitForSeconds(1); qSeleniumLib.waitForMillis(100);
} }
} }

View File

@ -109,7 +109,7 @@ public class SavedFiltersTest extends QBaseSeleniumTest
////////////////////// //////////////////////
// modify the query // // modify the query //
////////////////////// //////////////////////
qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filters").click(); qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filter").click();
addQueryFilterInput(qSeleniumLib, 1, "First Name", "contains", "Jam", "Or"); addQueryFilterInput(qSeleniumLib, 1, "First Name", "contains", "Jam", "Or");
qSeleniumLib.waitForSelectorContaining("H5", "Person").click(); qSeleniumLib.waitForSelectorContaining("H5", "Person").click();
qSeleniumLib.waitForSelectorContaining("DIV", "Current Filter: Some People") qSeleniumLib.waitForSelectorContaining("DIV", "Current Filter: Some People")