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:
2024-02-08 20:09:30 -06:00
parent fc238127a7
commit 3f3b188a9d
16 changed files with 449 additions and 232 deletions

View File

@ -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();
}
/*******************************************************************************
**
*******************************************************************************/

View File

@ -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)
{

View File

@ -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();

View File

@ -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();

View File

@ -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();
}

View File

@ -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"]}""";

View File

@ -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");
/////////////////////////////////////////////////////////////////////////////////