mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-18 13:20:43 +00:00
CE-798 Post-demo style updates; add concept of reconciling current table definition w/ view (e.g., add/delete columns from tables); test updates
This commit is contained in:
@ -63,6 +63,11 @@ public class QSeleniumLib
|
||||
|
||||
private boolean autoHighlight = false;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
// useful to use on a WebElement, in a call like: .findElement(QSeleniumLib.PARENT) //
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
public static final By PARENT = By.xpath("./..");
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
@ -245,6 +250,18 @@ public class QSeleniumLib
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public void moveMouseCursorToElement(WebElement element)
|
||||
{
|
||||
Actions actions = new Actions(driver);
|
||||
actions.moveToElement(element);
|
||||
actions.perform();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
|
@ -57,6 +57,29 @@ public class QueryScreenLib
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public void clickAdvancedFilterClearIcon()
|
||||
{
|
||||
qSeleniumLib.moveMouseCursorToElement(qSeleniumLib.waitForSelector(".filterBuilderButton"));
|
||||
qSeleniumLib.waitForSelector(".filterBuilderXIcon BUTTON").click();
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Yes").click();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public void clickQuickFilterClearIcon(String fieldName)
|
||||
{
|
||||
qSeleniumLib.moveMouseCursorToElement(qSeleniumLib.waitForSelector("#quickFilter\\." + fieldName));
|
||||
qSeleniumLib.waitForSelector("#quickFilter\\." + fieldName + "+span button").click();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -97,6 +120,16 @@ public class QueryScreenLib
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public void assertQuickFilterButtonDoesNotIndicateActiveFilter(String fieldName)
|
||||
{
|
||||
qSeleniumLib.waitForSelectorToNotExist("#quickFilter\\." + fieldName + ".filterActive");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@ -132,7 +165,26 @@ public class QueryScreenLib
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public void addQueryFilterInput(QSeleniumLib qSeleniumLib, int index, String fieldLabel, String operator, String value, String booleanOperator)
|
||||
public void assertSavedViewNameOnScreen(String savedViewName)
|
||||
{
|
||||
qSeleniumLib.waitForSelectorContaining("H3", savedViewName);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public WebElement waitForDataGridCellContaining(String containingText)
|
||||
{
|
||||
return qSeleniumLib.waitForSelectorContaining("DIV.MuiDataGrid-cell", containingText);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public void addAdvancedQueryFilterInput(QSeleniumLib qSeleniumLib, int index, String fieldLabel, String operator, String value, String booleanOperator)
|
||||
{
|
||||
if(index > 0)
|
||||
{
|
||||
|
@ -26,6 +26,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import com.kingsrook.qqq.frontend.materialdashboard.selenium.lib.QBaseSeleniumTest;
|
||||
import com.kingsrook.qqq.frontend.materialdashboard.selenium.lib.QSeleniumLib;
|
||||
import com.kingsrook.qqq.frontend.materialdashboard.selenium.lib.javalin.QSeleniumJavalin;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@ -89,7 +90,7 @@ public class DashboardTableWidgetExportTest extends QBaseSeleniumTest
|
||||
// click the export button //
|
||||
/////////////////////////////
|
||||
qSeleniumLib.waitForSelector("#SampleTableWidget h6")
|
||||
.findElement(By.xpath("./.."))
|
||||
.findElement(QSeleniumLib.PARENT)
|
||||
.findElement(By.cssSelector("button"))
|
||||
.click();
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests;
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests.query;
|
||||
|
||||
|
||||
import java.net.URLEncoder;
|
||||
@ -98,6 +98,16 @@ public class QueryScreenFilterInUrlAdvancedModeTest extends QBaseSeleniumTest
|
||||
qSeleniumLib.waitForSelector("input[value=\"1701\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"74656\"]");
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// click the x to remove a condition from the filter (in the on-screen preview) //
|
||||
// reload the page first, so filter-panel won't be up (clicking backdrop doesn't seem to be closing it like it should...) //
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeaderToContain("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
qSeleniumLib.highlightElement(qSeleniumLib.waitForSelectorContaining(".advancedQueryString DIV DIV", "1701"));
|
||||
qSeleniumLib.moveMouseCursorToElement(qSeleniumLib.waitForSelectorContaining(".advancedQueryString DIV DIV", "1701"));
|
||||
qSeleniumLib.waitForSelector(".advancedQueryPreviewX-0 button").click();
|
||||
queryScreenLib.assertNoFilterButtonBadge(1);
|
||||
|
||||
//////////////////////////////////////
|
||||
// an IN for a possible-value field //
|
||||
//////////////////////////////////////
|
||||
@ -162,8 +172,7 @@ public class QueryScreenFilterInUrlAdvancedModeTest extends QBaseSeleniumTest
|
||||
////////////////
|
||||
// remove one //
|
||||
////////////////
|
||||
qSeleniumLib.tryMultiple(3, () -> qSeleniumLib.waitForSelector(".filterBuilderXIcon BUTTON").click());
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Yes").click();
|
||||
queryScreenLib.clickAdvancedFilterClearIcon();
|
||||
queryScreenLib.assertNoFilterButtonBadge(1);
|
||||
|
||||
// qSeleniumLib.waitForever();
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests;
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests.query;
|
||||
|
||||
|
||||
import java.net.URLEncoder;
|
||||
@ -147,11 +147,15 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
qSeleniumLib.waitForSelector("input[value=\"starts with\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"Dar\"]");
|
||||
|
||||
////////////////
|
||||
// remove one //
|
||||
////////////////
|
||||
// todo! qSeleniumLib.waitForSelectorContaining(".MuiIcon-root", "close").click();
|
||||
// todo! assertQuickFilterButtonBadge(1);
|
||||
////////////////////////////////
|
||||
// remove one, then the other //
|
||||
////////////////////////////////
|
||||
qSeleniumLib.clickBackdrop();
|
||||
queryScreenLib.clickQuickFilterClearIcon("createDate");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("firstName");
|
||||
queryScreenLib.assertQuickFilterButtonDoesNotIndicateActiveFilter("createDate");
|
||||
queryScreenLib.clickQuickFilterClearIcon("firstName");
|
||||
queryScreenLib.assertQuickFilterButtonDoesNotIndicateActiveFilter("firstName");
|
||||
|
||||
// qSeleniumLib.waitForever();
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests;
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests.query;
|
||||
|
||||
|
||||
import com.kingsrook.qqq.frontend.materialdashboard.selenium.lib.QBaseSeleniumTest;
|
||||
@ -70,7 +70,7 @@ public class QueryScreenTest extends QBaseSeleniumTest
|
||||
// open the filter window, enter a value, wait for query to re-run //
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
qSeleniumJavalin.beginCapture();
|
||||
queryScreenLib.addQueryFilterInput(qSeleniumLib, 0, "Id", "equals", "1", null);
|
||||
queryScreenLib.addAdvancedQueryFilterInput(qSeleniumLib, 0, "Id", "equals", "1", null);
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// assert that query & count both have the expected filter value //
|
||||
@ -86,14 +86,13 @@ public class QueryScreenTest extends QBaseSeleniumTest
|
||||
///////////////////////////////////////
|
||||
qSeleniumLib.waitForSeconds(1); // todo grr.
|
||||
qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.BREADCRUMB_HEADER).click();
|
||||
qSeleniumLib.waitForSelectorContaining(".filterBuilderCountBadge", "1");
|
||||
queryScreenLib.assertFilterButtonBadge(1);
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// click the 'x' clear icon, then yes, then expect another query //
|
||||
///////////////////////////////////////////////////////////////////
|
||||
qSeleniumJavalin.beginCapture();
|
||||
qSeleniumLib.tryMultiple(3, () -> qSeleniumLib.waitForSelector(".filterBuilderXIcon BUTTON").click());
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Yes").click();
|
||||
queryScreenLib.clickAdvancedFilterClearIcon();
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// assert that query & count both no longer have the filter value //
|
||||
@ -121,8 +120,8 @@ public class QueryScreenTest extends QBaseSeleniumTest
|
||||
queryScreenLib.clickFilterButton();
|
||||
|
||||
qSeleniumJavalin.beginCapture();
|
||||
queryScreenLib.addQueryFilterInput(qSeleniumLib, 0, "First Name", "contains", "Dar", "Or");
|
||||
queryScreenLib.addQueryFilterInput(qSeleniumLib, 1, "First Name", "contains", "Jam", "Or");
|
||||
queryScreenLib.addAdvancedQueryFilterInput(qSeleniumLib, 0, "First Name", "contains", "Dar", "Or");
|
||||
queryScreenLib.addAdvancedQueryFilterInput(qSeleniumLib, 1, "First Name", "contains", "Jam", "Or");
|
||||
|
||||
String expectedFilterContents0 = """
|
||||
{"fieldName":"firstName","operator":"CONTAINS","values":["Dar"]}""";
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests;
|
||||
package com.kingsrook.qqq.frontend.materialdashboard.selenium.tests.query;
|
||||
|
||||
|
||||
import java.net.URLEncoder;
|
||||
@ -90,13 +90,13 @@ public class SavedViewsTest extends QBaseSeleniumTest
|
||||
/////////////////////////////////////////////////////
|
||||
qSeleniumLib.waitForSelectorContaining("LI", "Some People").click();
|
||||
qSeleniumLib.waitForCondition("Current URL should have view id", () -> driver.getCurrentUrl().endsWith("/person/savedView/2"));
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Some People");
|
||||
queryScreenLib.assertSavedViewNameOnScreen("Some People");
|
||||
|
||||
//////////////////////////////
|
||||
// click into a view screen //
|
||||
//////////////////////////////
|
||||
qSeleniumLib.waitForSeconds(1); // wait for the filters menu to fully disappear? if this doesn't work, try a different word to look for...
|
||||
qSeleniumLib.waitForSelectorContaining("DIV.MuiDataGrid-cell", "jdoe@kingsrook.com").click();
|
||||
queryScreenLib.waitForDataGridCellContaining("jdoe@kingsrook.com").click();
|
||||
qSeleniumLib.waitForSelectorContaining("H5", "Viewing Person: John Doe");
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
@ -105,7 +105,7 @@ public class SavedViewsTest extends QBaseSeleniumTest
|
||||
///////////////////////////////////////////////////
|
||||
qSeleniumLib.waitForSelectorContaining("A", "Person").click();
|
||||
qSeleniumLib.waitForCondition("Current URL should have View id", () -> driver.getCurrentUrl().endsWith("/person/savedView/2"));
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Some People");
|
||||
queryScreenLib.assertSavedViewNameOnScreen("Some People");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("firstName");
|
||||
|
||||
//////////////////////
|
||||
@ -123,7 +123,7 @@ public class SavedViewsTest extends QBaseSeleniumTest
|
||||
//////////////////////////////
|
||||
// click into a view screen //
|
||||
//////////////////////////////
|
||||
qSeleniumLib.waitForSelectorContaining("DIV.MuiDataGrid-cell", "jdoe@kingsrook.com").click();
|
||||
queryScreenLib.waitForDataGridCellContaining("jdoe@kingsrook.com").click();
|
||||
qSeleniumLib.waitForSelectorContaining("H5", "Viewing Person: John Doe");
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -133,7 +133,7 @@ public class SavedViewsTest extends QBaseSeleniumTest
|
||||
qSeleniumJavalin.beginCapture();
|
||||
qSeleniumLib.waitForSelectorContaining("A", "Person").click();
|
||||
qSeleniumLib.waitForCondition("Current URL should have filter id", () -> driver.getCurrentUrl().endsWith("/person/savedView/2"));
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Some People");
|
||||
queryScreenLib.assertSavedViewNameOnScreen("Some People");
|
||||
qSeleniumLib.waitForSelectorContaining("DIV", "Unsaved Changes");
|
||||
CapturedContext capturedContext = qSeleniumJavalin.waitForCapturedPath("/data/person/query");
|
||||
assertTrue(capturedContext.getBody().contains("Kelkhoff"));
|
||||
@ -143,16 +143,7 @@ public class SavedViewsTest extends QBaseSeleniumTest
|
||||
// navigate to the table with a View in the URL //
|
||||
//////////////////////////////////////////////////
|
||||
String filter = """
|
||||
{
|
||||
"criteria":
|
||||
[
|
||||
{
|
||||
"fieldName": "id",
|
||||
"operator": "LESS_THAN",
|
||||
"values": [10]
|
||||
}
|
||||
]
|
||||
}
|
||||
{"criteria":[{"fieldName":"id", "operator":"LESS_THAN", "values":[10]}]}
|
||||
""".replace('\n', ' ').replaceAll(" ", "");
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeaderToContain("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filter, StandardCharsets.UTF_8), "Person");
|
||||
qSeleniumLib.waitForSelectorContaining("BUTTON", "Save View As");
|
||||
@ -160,7 +151,7 @@ public class SavedViewsTest extends QBaseSeleniumTest
|
||||
//////////////////////////////
|
||||
// click into a view screen //
|
||||
//////////////////////////////
|
||||
qSeleniumLib.waitForSelectorContaining("DIV.MuiDataGrid-cell", "jdoe@kingsrook.com").click();
|
||||
queryScreenLib.waitForDataGridCellContaining("jdoe@kingsrook.com").click();
|
||||
qSeleniumLib.waitForSelectorContaining("H5", "Viewing Person: John Doe");
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
Reference in New Issue
Block a user