diff --git a/src/org/labkey/test/BaseWebDriverTest.java b/src/org/labkey/test/BaseWebDriverTest.java index a014c1ab9b..c1ebe5feb5 100644 --- a/src/org/labkey/test/BaseWebDriverTest.java +++ b/src/org/labkey/test/BaseWebDriverTest.java @@ -1418,7 +1418,7 @@ protected void checkLeaks() } } msSinceTestStart = System.currentTimeMillis() - previousLeakCheck; - beginAt("/admin/memTracker.view?gc=1&clearCaches=1", 120000); + beginAt(WebTestHelper.buildURL("admin", "memTracker", Map.of("gc", 1, "clearCaches", 1)), 120000); if (!isTextPresent("In-Use Objects")) throw new IllegalStateException("Asserts must be enabled to track memory leaks; add -ea to your server VM params and restart or add -DmemCheck=false to your test VM params."); leakCount = getImageWithAltTextCount("expand/collapse"); @@ -1612,7 +1612,7 @@ protected void checkActionCoverage() int rowCount, coveredActions, totalActions; double actionCoveragePercent; String actionCoveragePercentString; - beginAt("/admin/actions.view"); + beginAt(WebTestHelper.buildURL("admin", "actions")); rowCount = getTableRowCount(ACTION_SUMMARY_TABLE_NAME); if (getTableCellText(Locator.id(ACTION_SUMMARY_TABLE_NAME), rowCount - 1, 0).equals("Total")) @@ -1689,7 +1689,7 @@ public String getBaseURL() protected void setSelectedFields(String containerPath, String schema, String query, String viewName, String[] fields) { pushLocation(); - beginAt("/query" + containerPath + "/internalNewView.view"); + beginAt(WebTestHelper.buildURL("query", containerPath, "internalNewView")); setFormElement(Locator.name("ff_schemaName"), schema); setFormElement(Locator.name("ff_queryName"), query); if (viewName != null) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index de4a1135f7..e669f9f4bf 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -98,7 +98,6 @@ import static org.junit.Assert.fail; import static org.labkey.test.TestProperties.isDevModeEnabled; import static org.labkey.test.WebTestHelper.buildURL; -import static org.labkey.test.WebTestHelper.getBaseURL; import static org.labkey.test.WebTestHelper.getHttpClientBuilder; import static org.labkey.test.WebTestHelper.getHttpResponse; import static org.labkey.test.WebTestHelper.getRemoteApiConnection; @@ -435,7 +434,6 @@ public void signInShouldFail(String email, String password, String... expectedMe assertTrue(String.format("Wrong errors.\nExpected: ['%s']\nActual: '%s'", String.join("',\n'", expectedMessages), errorText), missingErrors.isEmpty()); } - @Deprecated // TODO: Call the variant that takes a userId instead protected String setInitialPassword(String email) { return setInitialPassword(_userHelper.getUserId(email)); @@ -853,9 +851,9 @@ private void verifyInitialUserRedirects() String initialText = "Welcome! We see that this is your first time logging in."; // These requests should redirect to the initial user page - beginAt("/login/resetPassword.view"); + beginAt(WebTestHelper.buildURL("login", "resetPassword")); assertTextPresent(initialText); - beginAt("/admin/maintenance.view"); + beginAt(WebTestHelper.buildURL("admin", "maintenance")); assertTextPresent(initialText); } @@ -872,14 +870,14 @@ private void verifyRedirectBehavior(String upgradeText) throws IOException { // These requests should NOT redirect to the upgrade page - method = new HttpGet(getBaseURL() + "/login/resetPassword.view"); + method = new HttpGet(WebTestHelper.buildURL("login", "resetPassword")); response = client.execute(method, WebTestHelper.getBasicHttpContext()); status = response.getCode(); assertEquals("Unexpected response", HttpStatus.SC_OK, status); assertFalse("Upgrade text found", WebTestHelper.getHttpResponseBody(response).contains(upgradeText)); EntityUtils.consume(response.getEntity()); - method = new HttpGet(getBaseURL() + "/admin/maintenance.view"); + method = new HttpGet(WebTestHelper.buildURL("admin", "maintenance")); response = client.execute(method, WebTestHelper.getBasicHttpContext()); status = response.getCode(); assertEquals("Unexpected response", HttpStatus.SC_OK, status); @@ -941,7 +939,7 @@ public boolean isRedirected(HttpRequest httpRequest, HttpResponse httpResponse, loginParams.add(new BasicNameValuePair("password", PasswordUtil.getPassword())); // Login to get CSRF token - HttpPost loginMethod = new HttpPost(getBaseURL() + "/login/loginApi.api"); + HttpPost loginMethod = new HttpPost(WebTestHelper.buildURL("login", "loginApi.api")); loginMethod.setEntity(new UrlEncodedFormEntity(loginParams)); HttpClientContext httpContext = WebTestHelper.getBasicHttpContext(); response = redirectClient.execute(loginMethod, httpContext); @@ -953,7 +951,7 @@ public boolean isRedirected(HttpRequest httpRequest, HttpResponse httpResponse, Optional csrfToken = httpContext.getCookieStore().getCookies().stream().filter(c -> c.getName().equals(Connection.X_LABKEY_CSRF)).findAny(); csrfToken.ifPresent(cookie -> logoutParams.add(new BasicNameValuePair(Connection.X_LABKEY_CSRF, cookie.getValue()))); // Logout to verify redirect - HttpPost logoutMethod = new HttpPost(getBaseURL() + "/login/logout.view"); + HttpPost logoutMethod = new HttpPost(WebTestHelper.buildURL("login", "logout")); logoutMethod.setEntity(new UrlEncodedFormEntity(logoutParams)); response = redirectClient.execute(logoutMethod, httpContext); status = response.getCode(); @@ -1096,7 +1094,7 @@ public void disableMaintenance() { if ( isGuestModeTest() ) return; - beginAt("/admin/customizeSite.view"); + beginAt(WebTestHelper.buildURL("admin", "customizeSite")); click(Locator.radioButtonByNameAndValue("systemMaintenanceInterval", "never")); clickButton("Save"); } diff --git a/src/org/labkey/test/WebDriverWrapper.java b/src/org/labkey/test/WebDriverWrapper.java index 1121adf65b..38314f6fa6 100644 --- a/src/org/labkey/test/WebDriverWrapper.java +++ b/src/org/labkey/test/WebDriverWrapper.java @@ -135,6 +135,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -188,6 +189,8 @@ public abstract class WebDriverWrapper implements WrapsDriver private final Stack _locationStack = new Stack<>(); private String _savedLocation = null; + private static final Set _controllerFirstUrls = new HashSet<>(); + static { // Eliminate noise from org.openqa.selenium.remote.ProtocolHandshake and org.openqa.selenium.interactions.Actions @@ -1210,9 +1213,10 @@ public long beginAt(String url, int millis, boolean acceptAlerts) { try { - if (new Crawler.ControllerActionId(relativeURL).isControllerFirstUrl()) + if (new Crawler.ControllerActionId(relativeURL).isControllerFirstUrl() && !_controllerFirstUrls.contains(url)) { - RuntimeException ex = new RuntimeException("Controller first url found in URL: " + relativeURL); + _controllerFirstUrls.add(url); + RuntimeException ex = new RuntimeException("Controller-first url used: " + relativeURL); if (TestProperties.isControllerFirstUrlFatal()) throw ex; else diff --git a/src/org/labkey/test/pages/OlapTestJson.java b/src/org/labkey/test/pages/OlapTestJson.java index 9e997acf97..fae6fa865a 100644 --- a/src/org/labkey/test/pages/OlapTestJson.java +++ b/src/org/labkey/test/pages/OlapTestJson.java @@ -18,6 +18,9 @@ import org.apache.commons.lang3.StringUtils; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; +import org.labkey.test.WebTestHelper; + +import java.util.Map; import static org.junit.Assert.assertEquals; @@ -35,7 +38,10 @@ public OlapTestJson(BaseWebDriverTest test) public void goToPage(String path, String configId, String schemaName, String cubeName) { - _test.beginAt("/olap/" + path + "/testJson.view?configId=" + configId + "&schemaName=" + schemaName + "&cubeName=" + cubeName); + _test.beginAt(WebTestHelper.buildURL("olap", path, "testJson", Map.of( + "configId", configId, + "schemaName", schemaName, + "cubeName", cubeName))); } public void submitQueryAsJson(String query) diff --git a/src/org/labkey/test/pages/query/ExecuteQueryPage.java b/src/org/labkey/test/pages/query/ExecuteQueryPage.java index 97abf958bd..faaadc3d61 100644 --- a/src/org/labkey/test/pages/query/ExecuteQueryPage.java +++ b/src/org/labkey/test/pages/query/ExecuteQueryPage.java @@ -44,7 +44,7 @@ public static PageFactory getPageFactory(String schemaName, St { return new RelativeUrl("query", "executeQuery") .addParameters(Maps.of("schemaName", schemaName, "query.queryName", queryName)) - .getPageFactory(wd -> new ExecuteQueryPage(wd)); + .getPageFactory(ExecuteQueryPage::new); } public DataRegionTable getDataRegion() @@ -58,7 +58,7 @@ protected ElementCache newElementCache() return new ElementCache(); } - protected class ElementCache extends LabKeyPage.ElementCache + protected class ElementCache extends LabKeyPage.ElementCache { DataRegionTable _dataRegionTable = new DataRegionTable.DataRegionFinder(getDriver()).withName("query").findWhenNeeded(this); } diff --git a/src/org/labkey/test/pages/query/UpdateQueryRowPage.java b/src/org/labkey/test/pages/query/UpdateQueryRowPage.java index 75db019cc3..d4795e5808 100644 --- a/src/org/labkey/test/pages/query/UpdateQueryRowPage.java +++ b/src/org/labkey/test/pages/query/UpdateQueryRowPage.java @@ -48,6 +48,13 @@ public static UpdateQueryRowPage beginAt(WebDriverWrapper webDriverWrapper, Stri return new UpdateQueryRowPage(webDriverWrapper.getDriver()); } + public static UpdateQueryRowPage beginAtInsertRowPage(WebDriverWrapper webDriverWrapper, String containerPath, String schemaName, String queryName) + { + webDriverWrapper.beginAt(WebTestHelper.buildURL("query", containerPath, "insertQueryRow", + Map.of("schemaName", schemaName, "query.queryName", queryName))); + return new UpdateQueryRowPage(webDriverWrapper.getDriver()); + } + public void update(Map fields) { setFields(fields); diff --git a/src/org/labkey/test/tests/AbstractQWPTest.java b/src/org/labkey/test/tests/AbstractQWPTest.java index 06aad094f6..0292e421db 100644 --- a/src/org/labkey/test/tests/AbstractQWPTest.java +++ b/src/org/labkey/test/tests/AbstractQWPTest.java @@ -19,6 +19,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.Locators; +import org.labkey.test.WebTestHelper; import org.openqa.selenium.Alert; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -39,7 +40,7 @@ public abstract class AbstractQWPTest extends BaseWebDriverTest protected void testQWPDemoPage() { log("Begin testing QWPDemo page"); - beginAt("/simpletest/" + getProjectName() + "/QWPDemo.view"); + beginAt(WebTestHelper.buildURL("simpletest", getProjectName(), "QWPDemo")); log("Drop and reload QWPDemo test data"); clickButton("Drop schema and clear test data"); @@ -60,7 +61,7 @@ protected void testQWPDemoPage() getTabSignalsPairs().stream().forEach(this::testQWPTab); log("Drop QWPDemo test data"); - beginAt("/simpletest/" + getProjectName() + "/QWPDemo.view"); + beginAt(WebTestHelper.buildURL("simpletest", getProjectName(), "QWPDemo")); clickButton("Drop schema and clear test data"); // drop domain, needed for clean up project } diff --git a/src/org/labkey/test/tests/AuditLogTest.java b/src/org/labkey/test/tests/AuditLogTest.java index 0a75098570..949a2e138d 100644 --- a/src/org/labkey/test/tests/AuditLogTest.java +++ b/src/org/labkey/test/tests/AuditLogTest.java @@ -38,6 +38,7 @@ import org.labkey.test.components.domain.DomainFormPanel; import org.labkey.test.pages.core.admin.logger.ManagerPage.LoggingLevel; import org.labkey.test.pages.list.EditListDefinitionPage; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.FieldDefinition.ColumnType; import org.labkey.test.util.ApiPermissionsHelper; @@ -526,20 +527,22 @@ private void createList(String containerPath, String listName, @Nullable String protected void verifyListAuditLogQueries(Visibility v) { - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=auditLog&query.queryName=ListAuditEvent&query.containerFilterName=CurrentAndSubfolders"); + ExecuteQueryPage.getPageFactory("auditLog", "ListAuditEvent") + .addParameter("query.containerFilterName", "CurrentAndSubfolders") + .navigate(this, getProjectName()); verifyAuditQueryEvent(this, "List", "Parent List", 1, canSeeParent(v)); verifyAuditQueryEvent(this, "List", "Child List", 1, canSeeChild(v)); } protected void verifyAuditQueries(boolean canSeeAuditLog) { - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=auditLog&query.queryName=ContainerAuditEvent"); + ExecuteQueryPage.beginAt(this, getProjectName(), "auditLog", "ContainerAuditEvent"); if (canSeeAuditLog) verifyAuditQueryEvent(this, COMMENT_COLUMN, AUDIT_TEST_PROJECT + " was created", 1); else assertTextPresent("No data to show."); - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=auditLog&query.queryName=GroupAuditEvent"); + ExecuteQueryPage.beginAt(this, getProjectName(), "auditLog", "GroupAuditEvent"); if (canSeeAuditLog) verifyAuditQueryEvent(this, COMMENT_COLUMN, "The user " + AUDIT_TEST_USER + " was assigned to the security role Editor.", 1); else diff --git a/src/org/labkey/test/tests/BaseTermsOfUseTest.java b/src/org/labkey/test/tests/BaseTermsOfUseTest.java index 8456735205..8c8d9d7e86 100644 --- a/src/org/labkey/test/tests/BaseTermsOfUseTest.java +++ b/src/org/labkey/test/tests/BaseTermsOfUseTest.java @@ -19,12 +19,14 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.TestTimeoutException; +import org.labkey.test.WebTestHelper; import org.labkey.test.util.ApiPermissionsHelper; import org.labkey.test.util.PortalHelper; import org.labkey.test.util.WikiHelper; import java.util.Collections; import java.util.List; +import java.util.Map; public class BaseTermsOfUseTest extends BaseWebDriverTest { @@ -119,7 +121,7 @@ protected void createTermsOfUsePage(String projectName, String body) else // site-wide terms of use page { message = "Create site-wide terms of use page"; - beginAt("/wiki/page.view?name=_termsOfUse"); + beginAt(WebTestHelper.buildURL("wiki", "page", Map.of("name", TERMS_OF_USE_NAME))); } if (isElementPresent(Locator.linkContainingText("add a new page"))) { diff --git a/src/org/labkey/test/tests/BasicAdminTest.java b/src/org/labkey/test/tests/BasicAdminTest.java index 8a91ea25e8..28920b0915 100644 --- a/src/org/labkey/test/tests/BasicAdminTest.java +++ b/src/org/labkey/test/tests/BasicAdminTest.java @@ -24,6 +24,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.TestProperties; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Base; import org.labkey.test.categories.DRT; import org.labkey.test.categories.Daily; @@ -108,7 +109,7 @@ public void testRedirects() goToHome(); final String expectedTitle = getDriver().getTitle(); - beginAt("/login/initialUser.view"); + beginAt(WebTestHelper.buildURL("login", "initialUser")); Assert.assertEquals("Initial user action did not redirect properly when logged in", expectedTitle, getDriver().getTitle()); } diff --git a/src/org/labkey/test/tests/ButtonCustomizationTest.java b/src/org/labkey/test/tests/ButtonCustomizationTest.java index 25c4b09a75..d6d48a6209 100644 --- a/src/org/labkey/test/tests/ButtonCustomizationTest.java +++ b/src/org/labkey/test/tests/ButtonCustomizationTest.java @@ -21,6 +21,7 @@ import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; import org.labkey.test.TestTimeoutException; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.FieldDefinition.ColumnType; @@ -107,9 +108,9 @@ public void testSteps() .update(Map.of("name", "Seattle")); new DataRegionFinder(getDriver()).find().clickInsertNewRow() .update(Map.of("name", "Portland")); - + // assert custom buttons can be added to the standard set: - beginAt("/query/" + PROJECT_NAME + "/schema.view?schemaName=lists"); + beginAt(WebTestHelper.buildURL("query", PROJECT_NAME, "schema", Map.of("schemaName", "lists"))); selectQuery("lists", "Cities"); waitForText(10000, "edit metadata"); clickAndWait(Locator.linkWithText("edit metadata")); @@ -131,7 +132,7 @@ public void testSteps() assertElementPresent(Locator.tagWithAttribute("a", "data-original-title","Insert data")); // assert custom buttons can REPLACE the standard set: - beginAt("/query/" + PROJECT_NAME + "/schema.view?schemaName=lists"); + beginAt(WebTestHelper.buildURL("query", PROJECT_NAME, "schema", Map.of("schemaName", "lists"))); selectQuery("lists", "Cities"); waitForText(10000, "edit metadata"); clickAndWait(Locator.linkWithText("edit metadata")); @@ -198,7 +199,7 @@ public void testSteps() // wait for the button to enable: waitForElement(Locator.lkButton(METADATA_GET_BUTTON), 10000); - + // Verify that GET buttons to send form values as GET parameters: clickButton(METADATA_GET_BUTTON); assertElementPresent(Locator.id("params").containing(".select: 2")); diff --git a/src/org/labkey/test/tests/ContainerContextTest.java b/src/org/labkey/test/tests/ContainerContextTest.java index 5da18dc7ef..b3f579f138 100644 --- a/src/org/labkey/test/tests/ContainerContextTest.java +++ b/src/org/labkey/test/tests/ContainerContextTest.java @@ -33,6 +33,7 @@ import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.categories.Data; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.pages.reports.ScriptReportPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.FieldKey; @@ -212,7 +213,7 @@ public void testIssue15751() throws Exception insertJobIntoSubFolder(SUB_FOLDER_B); log("** Viewing pipeline status from project container. Sort by Description (report name) and include sub-folders"); - beginAt("/" + getProjectName() + "/pipeline-status-showList.view?StatusFiles.sort=Description&StatusFiles.containerFilterName=CurrentAndSubfolders"); + beginAt(WebTestHelper.buildURL("pipeline-status", getProjectName(), "showList", Map.of("StatusFiles.sort", "Description", "StatusFiles.containerFilterName", "CurrentAndSubfolders"))); log("** Checking URLs go to correct container..."); String href = getAttribute(Locator.tagWithText("a", "COMPLETE").index(0), "href"); @@ -336,7 +337,9 @@ public void testSimpleModuleTables() throws Exception // Verify Issue 16243: Details URL creating URLs with null container unless the container column is actually added to current view log("** Removing container column and rechecking lookup URLs..."); - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=vehicle&query.queryName=EmissionTest&query.sort=RowId"); + ExecuteQueryPage.getPageFactory("vehicle", "EmissionTest") + .addParameter("query.sort", "RowId") + .navigate(this, getProjectName()); _customizeViewsHelper.openCustomizeViewPanel(); _customizeViewsHelper.showHiddenItems(); _customizeViewsHelper.removeColumn("Container"); @@ -365,7 +368,7 @@ public void testSimpleModuleTables() throws Exception overrideMetadata(getProjectName(), "vehicle", emissionTestQuery, customMetadata.apply(emissionTestQuery)); verifySimpleModuleTables(emissionTestQuery, "XXX.view", "XXX.view", max, workbookIds, emissionIds, parentRowIds, rowIdToWorkbookId, false, true, vehicleId); removeMetadata(getProjectName(), "vehicle", emissionTestQuery); - + log("** Create custom query with custom metadata over vehicle.emissiontest table WITH container"); String customQueryWithContainer = "SELECT emissiontest.rowid,\n" + @@ -504,9 +507,11 @@ private void verifySimpleModuleTables( int vehicleId) { log("** Checking containers on lookup URLs for '" + queryName + "'"); - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=vehicle&query.queryName=" + queryName + "&query.sort=RowId"); + ExecuteQueryPage queryPage = ExecuteQueryPage.getPageFactory("vehicle", queryName) + .addParameter("query.sort", "RowId") + .navigate(this, getProjectName()); - DataRegionTable dr = new DataRegionTable("query", this); + DataRegionTable dr = queryPage.getDataRegion(); for (int i = 0; i < max; i++) { diff --git a/src/org/labkey/test/tests/ExternalSchemaTest.java b/src/org/labkey/test/tests/ExternalSchemaTest.java index 5b687f6e52..46a856bc92 100644 --- a/src/org/labkey/test/tests/ExternalSchemaTest.java +++ b/src/org/labkey/test/tests/ExternalSchemaTest.java @@ -42,7 +42,9 @@ import org.labkey.test.categories.Daily; import org.labkey.test.categories.Data; import org.labkey.test.pages.core.admin.ShowAuditLogPage; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.pages.query.InsertExternalSchemaPage; +import org.labkey.test.pages.query.UpdateQueryRowPage; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.SchemaHelper; import org.labkey.test.util.SimpleHttpResponse; @@ -87,7 +89,7 @@ public Row(String text, int intNotNull, Date dateTimeNotNull) { this(null, text, intNotNull, dateTimeNotNull); } - + public Row(Integer rowid, String text, int intNotNull, Date dateTimeNotNull) { this.rowid = rowid; @@ -108,7 +110,7 @@ public Row(String test, int intNotNull) { this(test, intNotNull, null); } - + public Row(int rowid, String test, int intNotNull) { this(rowid, test, intNotNull, null); @@ -188,7 +190,7 @@ void createProject() void ensureExternalSchema(String containerPath) { log("** Create ExternalSchema: " + USER_SCHEMA_NAME); - beginAt("/query/" + containerPath + "/admin.view"); + beginAt(WebTestHelper.buildURL("query", containerPath, "admin")); if (!isElementPresent(Locator.linkWithText("reload"))) { @@ -206,7 +208,7 @@ void ensureExternalSchema(String containerPath) void setEditable(String containerPath, boolean editable) { - beginAt("/query/" + containerPath + "/admin.view"); + beginAt(WebTestHelper.buildURL("query", containerPath, "admin")); clickAndWait(Locator.linkWithText("edit")); if (editable) checkCheckbox(Locator.checkboxByName("editable")); @@ -322,10 +324,11 @@ void doTestUneditable() void doTestContainer() { log("** Trying to visit schema in container where it hasn't been configured"); - beginAt("/query/" + PROJECT_NAME + "/" + FOLDER_NAME + "/executeQuery.view?query.queryName=" + TABLE_NAME + "&schemaName=" + USER_SCHEMA_NAME); + ExecuteQueryPage.getPageFactory(USER_SCHEMA_NAME, TABLE_NAME) + .navigate(this, PROJECT_NAME + "/" + FOLDER_NAME); assertTitleEquals("404: Error Page -- The specified schema does not exist"); } - + void doTestViaForm() { String containerPath = StringUtils.join(Arrays.asList(PROJECT_NAME, FOLDER_NAME), "/"); @@ -348,7 +351,7 @@ void doTestViaForm() log("** Delete via form"); deleteViaForm(containerPath, new int[] { pk1, pk2}); } - + void doTestViaJavaApi() throws Exception { String containerPath = StringUtils.join(Arrays.asList(PROJECT_NAME, FOLDER_NAME), "/"); @@ -360,7 +363,7 @@ void doTestViaJavaApi() throws Exception Row[] selected = selectViaJavaApi(containerPath, cn, pks); for (int i = 0; i < inserted.length; i++) assertEquals(inserted[i], selected[i]); - + Row[] updated = new Row[] {new Row(pks[0], "AA", 30), new Row(pks[1], "BB", 40)}; updateViaJavaApi(containerPath, cn, updated); @@ -379,7 +382,7 @@ void doTestViaJavaApi() throws Exception } updateDuplicateRows(PROJECT_NAME, cn, updated); - + try { log("** Try to delete via api from a different container"); @@ -392,20 +395,20 @@ void doTestViaJavaApi() throws Exception // assertEquals("The row is from the wrong container.", ex.getMessage()); // assertEquals("org.labkey.api.view.UnauthorizedException", ex.getProperties().get("exceptionClass")); } - + deleteViaJavaApi(containerPath, cn, pks); } - + int[] insertViaJavaApi(String containerPath, Connection cn, Row... rows) throws IOException, CommandException { log("** Inserting via api..."); InsertRowsCommand cmd = new InsertRowsCommand(USER_SCHEMA_NAME, TABLE_NAME); for (Row row : rows) cmd.addRow(row.toMap()); - + RowsResponse resp = cmd.execute(cn, containerPath); assertEquals("Expected to insert " + rows.length + " rows", rows.length, resp.getRowsAffected().intValue()); - + int[] pks = new int[rows.length]; for (int i = 0; i < rows.length; i++) { @@ -413,10 +416,10 @@ int[] insertViaJavaApi(String containerPath, Connection cn, Row... rows) throws assertTrue(row.containsKey("rowid")); pks[i] = ((Number)row.get("rowid")).intValue(); } - + return pks; } - + Row[] selectViaJavaApi(String containerPath, Connection cn, int... pks) throws IOException, CommandException { log("** Select via api: " + join(",", pks) + "..."); @@ -433,7 +436,7 @@ Row[] selectViaJavaApi(String containerPath, Connection cn, int... pks) throws I Map row = resp.getRows().get(i); Integer rowid = (Integer)row.get("RowId"); assertEquals("Expected requested rowid and selected rowid to be the same", rowid.intValue(), pks[i]); - + String text = (String)row.get("Text"); int intNotNull = ((Number)row.get("IntNotNull")).intValue(); Date datetimeNotNull = (Date)row.get("DatetimeNotNull"); @@ -442,7 +445,7 @@ Row[] selectViaJavaApi(String containerPath, Connection cn, int... pks) throws I } return rows.toArray(new Row[0]); } - + Row[] updateViaJavaApi(String containerPath, Connection cn, Row... rows) throws ParseException, IOException, CommandException { log("** Updating via api..."); @@ -483,17 +486,17 @@ void updateDuplicateRows(String containerPath, Connection cn, Row... rows) throw } } - + void deleteViaJavaApi(String containerPath, Connection cn, int... pks) throws IOException, CommandException { log("** Deleting via api: pks=" + join(",", pks) + "..."); DeleteRowsCommand cmd = new DeleteRowsCommand(USER_SCHEMA_NAME, TABLE_NAME); for (Integer pk : pks) cmd.addRow(Collections.singletonMap("RowId", pk)); - + RowsResponse resp = cmd.execute(cn, containerPath); assertEquals("Expected to delete " + pks.length + " rows", pks.length, resp.getRowsAffected().intValue()); - + SelectRowsCommand selectCmd = new SelectRowsCommand(USER_SCHEMA_NAME, TABLE_NAME); selectCmd.addFilter("RowId", join(";", pks), Filter.Operator.IN); SelectRowsResponse selectResp = selectCmd.execute(cn, containerPath); @@ -512,17 +515,17 @@ String join(String sep, int... pks) private void _insertViaForm(String containerPath, String text, int intNotNull) { log("** Inserting via form: text='" + text + "', intNotNull=" + intNotNull + "..."); - beginAt("/query/" + containerPath + "/insertQueryRow.view?query.queryName=" + TABLE_NAME + "&schemaName=" + USER_SCHEMA_NAME); - setFormElement(Locator.name("quf_Text"), text); - setFormElement(Locator.name("quf_IntNotNull"), String.valueOf(intNotNull)); - setFormElement(Locator.name("quf_DatetimeNotNull"), "2008-09-25"); - submit(); + UpdateQueryRowPage page = UpdateQueryRowPage.beginAtInsertRowPage(this, containerPath, USER_SCHEMA_NAME, TABLE_NAME); + page.setField("Text", text); + page.setField("IntNotNull", String.valueOf(intNotNull)); + page.setField("DatetimeNotNull", "2008-09-25"); + page.submit(); } public void insertViaFormNoPerms(String containerPath, String text, int intNotNull) { log("** Inserting via form: text='" + text + "', intNotNull=" + intNotNull + "..."); - beginAt("/query/" + containerPath + "/insertQueryRow.view?query.queryName=" + TABLE_NAME + "&schemaName=" + USER_SCHEMA_NAME); + UpdateQueryRowPage.beginAtInsertRowPage(this, containerPath, USER_SCHEMA_NAME, TABLE_NAME); assertTextPresent("You do not have permission"); } @@ -552,11 +555,11 @@ public int insertViaForm(String containerPath, String text, int intNotNull) private void _updateViaForm(String containerPath, int pk, String text, int intNotNull) { log("** Updating via form: RowId=" + pk + ", text='" + text + "', intNotNull=" + intNotNull + "..."); - beginAt("/query/" + containerPath + "/updateQueryRow.view?query.queryName=" + TABLE_NAME + "&schemaName=" + USER_SCHEMA_NAME + "&RowId=" + pk); - setFormElement(Locator.name("quf_Text"), text); - setFormElement(Locator.name("quf_IntNotNull"), String.valueOf(intNotNull)); - setFormElement(Locator.name("quf_DatetimeNotNull"), "2008-09-25"); - submit(); + UpdateQueryRowPage page = UpdateQueryRowPage.beginAt(this, containerPath, USER_SCHEMA_NAME, TABLE_NAME, pk); + page.setField("Text", text); + page.setField("IntNotNull", String.valueOf(intNotNull)); + page.setField("DatetimeNotNull", "2008-09-25"); + page.submit(); } public void updateViaFormNoPerms(String containerPath, int pk, String text, int intNotNull) throws IOException @@ -585,9 +588,11 @@ public void updateViaForm(String containerPath, int pk, String text, int intNotN private void _deleteViaForm(String containerPath, int[] pk) { log("** Deleting via form: pks=" + join(",", pk) + "..."); - beginAt("/query/" + containerPath + "/executeQuery.view?query.queryName=" + TABLE_NAME + "&schemaName=" + USER_SCHEMA_NAME); + ExecuteQueryPage page = ExecuteQueryPage.getPageFactory(USER_SCHEMA_NAME, TABLE_NAME) + .setContainerPath(containerPath) + .navigate(this); - DataRegionTable drt = new DataRegionTable("query", getDriver()); + DataRegionTable drt = page.getDataRegion(); for (int aPk : pk) drt.checkCheckboxByPrimaryKey(aPk); doAndWaitForPageToLoad(() -> diff --git a/src/org/labkey/test/tests/LinkedSchemaTest.java b/src/org/labkey/test/tests/LinkedSchemaTest.java index fa7ccf7ca3..26ad54e0ba 100644 --- a/src/org/labkey/test/tests/LinkedSchemaTest.java +++ b/src/org/labkey/test/tests/LinkedSchemaTest.java @@ -29,9 +29,11 @@ import org.labkey.test.categories.Daily; import org.labkey.test.categories.Data; import org.labkey.test.components.CustomizeView; +import org.labkey.test.pages.list.BeginPage; import org.labkey.test.pages.list.EditListDefinitionPage; import org.labkey.test.pages.list.GridPage; import org.labkey.test.pages.query.QueryMetadataEditorPage; +import org.labkey.test.pages.query.SourceQueryPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.FieldInfo; import org.labkey.test.params.experiment.DataClassDefinition; @@ -44,7 +46,6 @@ import org.labkey.test.util.AuditLogHelper; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.LogMethod; -import org.labkey.test.util.PortalHelper; import org.labkey.test.util.SchemaHelper; import org.labkey.test.util.TestDataGenerator; import org.labkey.test.util.exp.DataClassAPIHelper; @@ -680,18 +681,16 @@ void createList() throws IOException, CommandException listDef.getCreateCommand().execute(createDefaultConnection(), getProjectName() + "/" + SOURCE_FOLDER); log("** Importing some data..."); - beginAt("/" + PROJECT_NAME + "/" + SOURCE_FOLDER + "/list-begin.view"); + BeginPage.beginAt(this, PROJECT_NAME + "/" + SOURCE_FOLDER); _listHelper.goToList(LIST_NAME); _listHelper.clickImportData() .setText(LIST_DATA) .submit(); log("** Applying metadata xml override to list..."); - beginAt("/query/" + PROJECT_NAME + "/" + SOURCE_FOLDER + "/sourceQuery.view?schemaName=lists&query.queryName=" + LIST_NAME + "#metadata"); - setCodeEditorValue("metadataText", LIST_METADATA_OVERRIDE); - clickButton("Save", 0); - waitForElement(Locator.id("status").withText("Saved"), WAIT_FOR_JAVASCRIPT); - waitForElementToDisappear(Locator.id("status").withText("Saved"), WAIT_FOR_JAVASCRIPT); + SourceQueryPage page = SourceQueryPage.beginAt(this, PROJECT_NAME + "/" + SOURCE_FOLDER, "lists", LIST_NAME); + page.setMetadataXml(LIST_METADATA_OVERRIDE); + page.clickSaveAndFinish(); } @LogMethod @@ -713,20 +712,15 @@ void createLinkedSchema() _schemaHelper.createLinkedSchema(getProjectName() + "/" + TARGET_FOLDER, A_PEOPLE_SCHEMA_NAME, sourceContainerPath, null, "lists", LIST_NAME + "," + QUERY_NAME, A_PEOPLE_METADATA); log("** Applying metadata to " + LIST_NAME + " in linked schema container"); - beginAt("/query/" + PROJECT_NAME + "/" + TARGET_FOLDER + "/sourceQuery.view?schemaName=" + A_PEOPLE_SCHEMA_NAME + "&query.queryName=" + LIST_NAME + "#metadata"); - setCodeEditorValue("metadataText", A_PEOPLE_LIST_METADATA_OVERRIDE); - clickButton("Save", 0); - waitForElement(Locator.id("status").withText("Saved"), WAIT_FOR_JAVASCRIPT); - waitForElementToDisappear(Locator.id("status").withText("Saved"), WAIT_FOR_JAVASCRIPT); + SourceQueryPage sourceQueryPage = SourceQueryPage.beginAt(this, PROJECT_NAME + "/" + TARGET_FOLDER, A_PEOPLE_SCHEMA_NAME, LIST_NAME); + sourceQueryPage.setMetadataXml(A_PEOPLE_LIST_METADATA_OVERRIDE); + sourceQueryPage.clickSaveAndFinish(); log("** Applying metadata to " + QUERY_NAME + " in linked schema container"); - beginAt("/query/" + PROJECT_NAME + "/" + TARGET_FOLDER + "/sourceQuery.view?schemaName=" + A_PEOPLE_SCHEMA_NAME + "&queryName=" + QUERY_NAME); + sourceQueryPage = SourceQueryPage.beginAt(this, PROJECT_NAME + "/" + TARGET_FOLDER, A_PEOPLE_SCHEMA_NAME, QUERY_NAME); assertElementPresent(Locator.tagWithClass("div", "labkey-customview-message").withText("This query is not editable")); - _ext4Helper.clickExt4Tab("XML Metadata"); - setCodeEditorValue("metadataText", A_PEOPLE_QUERY_METADATA_OVERRIDE); - clickButton("Save", 0); - waitForElement(Locator.id("status").withText("Saved"), WAIT_FOR_JAVASCRIPT); - waitForElementToDisappear(Locator.id("status").withText("Saved"), WAIT_FOR_JAVASCRIPT); + sourceQueryPage.setMetadataXml(A_PEOPLE_QUERY_METADATA_OVERRIDE); + sourceQueryPage.clickSaveAndFinish(); } @LogMethod diff --git a/src/org/labkey/test/tests/PivotQueryTest.java b/src/org/labkey/test/tests/PivotQueryTest.java index bbdd3202de..500cfd2712 100644 --- a/src/org/labkey/test/tests/PivotQueryTest.java +++ b/src/org/labkey/test/tests/PivotQueryTest.java @@ -25,6 +25,7 @@ import org.labkey.test.categories.Daily; import org.labkey.test.categories.Data; import org.labkey.test.components.ChartTypeDialog; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.pages.query.SourceQueryPage; import org.labkey.test.pages.study.DatasetDesignerPage; import org.labkey.test.params.FieldDefinition; @@ -38,8 +39,8 @@ import java.util.Arrays; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; @Category({Daily.class, Data.class}) @BaseWebDriverTest.ClassTimeout(minutes = 7) @@ -86,8 +87,8 @@ protected void doInit() @Test public void testPivotQuery() { - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=study&query.queryName=LuminexPivot"); - DataRegionTable pivotTable = new DataRegionTable("query", this); + ExecuteQueryPage queryPage = ExecuteQueryPage.beginAt(this, getProjectName(), "study", "LuminexPivot"); + DataRegionTable pivotTable = queryPage.getDataRegion(); pivotTable.setSort("ParticipantId", SortDirection.ASC); Locator.XPathLocator region = Locator.tagWithAttribute("table", "data-region-name", "query"); @@ -119,7 +120,7 @@ public void testPivotQuery() String contents = getText(ConcInRange_CONCAT_cell); assertNotNull("The GROUP_CONCAT cell is empty", contents); String[] concats = contents.split(", *"); - assertTrue("Expected 5 GROUP_CONCAT values", concats.length == 5); + assertEquals("Expected 5 GROUP_CONCAT values", 5, concats.length); } @Test diff --git a/src/org/labkey/test/tests/SampleTypeExportTest.java b/src/org/labkey/test/tests/SampleTypeExportTest.java index 034ba2f2e3..fc23d8a09b 100644 --- a/src/org/labkey/test/tests/SampleTypeExportTest.java +++ b/src/org/labkey/test/tests/SampleTypeExportTest.java @@ -19,6 +19,7 @@ import org.junit.experimental.categories.Category; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.experiment.SampleTypeDefinition; @@ -49,7 +50,7 @@ public static void doSetup() throws Exception initTest._containerHelper.createProject(initTest.getProjectName(), null); - initTest.beginAt("/" + initTest.getProjectName() + "/experiment-listSampleTypes.view"); + initTest.beginAt(WebTestHelper.buildURL("experiment", initTest.getProjectName(), "listSampleTypes")); SampleTypeHelper sampleHelper = new SampleTypeHelper(initTest); sampleHelper.createSampleType(new SampleTypeDefinition(SAMPLE_TYPE_NAME) .setFields(List.of(new FieldDefinition("Barcode", FieldDefinition.ColumnType.String))), @@ -143,7 +144,7 @@ protected String getDataRegionId() @Override protected void goToDataRegionPage() { - beginAt("/" + getProjectName() + "/experiment-listSampleTypes.view"); + beginAt(WebTestHelper.buildURL("experiment", getProjectName(), "listSampleTypes")); clickAndWait(Locator.linkWithText(SAMPLE_TYPE_NAME)); } diff --git a/src/org/labkey/test/tests/SimpleModuleTest.java b/src/org/labkey/test/tests/SimpleModuleTest.java index 202d2cf7c7..dd21f6ae3b 100644 --- a/src/org/labkey/test/tests/SimpleModuleTest.java +++ b/src/org/labkey/test/tests/SimpleModuleTest.java @@ -51,6 +51,7 @@ import org.labkey.test.pages.core.admin.BaseSettingsPage; import org.labkey.test.pages.core.admin.LookAndFeelSettingsPage; import org.labkey.test.pages.core.admin.ProjectSettingsPage; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.pages.study.DatasetDesignerPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.list.IntListDefinition; @@ -91,6 +92,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.labkey.test.TestFileUtils.getDefaultFileRoot; +import static org.labkey.test.WebTestHelper.buildURL; /** * Tests the simple module and file-based resources introduced in version 9.1 @@ -213,7 +215,7 @@ public static void initTest() SimpleModuleTest init = getCurrentTest(); init.doSetup(); } - + protected void doSetup() { assertModuleDeployed(MODULE_NAME); @@ -483,7 +485,7 @@ private void doTestCustomFolder() private void doTestSchemas() throws Exception { log("** Testing schemas in modules..."); - beginAt("/query/" + getProjectName() + "/begin.view?schemaName=" + VEHICLE_SCHEMA); + beginAt(buildURL("query", getProjectName(), "begin", Map.of("schemaName", VEHICLE_SCHEMA))); Connection cn = WebTestHelper.getRemoteApiConnection(); @@ -599,13 +601,15 @@ else if (name.equalsIgnoreCase("F150")) updateCmd.execute(cn, getProjectName()); log("** Testing vehicle.Manufacturers default queryDetailsRow.view url link..."); - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=" + VEHICLE_SCHEMA + "&query.queryName=Manufacturers&query.Name~eq=Toyota"); + ExecuteQueryPage.getPageFactory(VEHICLE_SCHEMA, "Manufacturers") + .addParameter("query.Name~eq", "Toyota") + .navigate(this, getProjectName()); DataRegionTable table = new DataRegionTable("query", getDriver()); clickAndWait(table.detailsLink(0)); assertTextPresent("Name", "Toyota"); log("** Testing vehicle.Model RowId url link..."); - beginAt(getProjectName() + "/query-begin.view"); + beginAt(buildURL("query", getProjectName(), "begin")); viewQueryData(VEHICLE_SCHEMA, "Models"); clickAndWait(Locator.linkWithText("Prius")); assertTextPresent("Hooray!"); @@ -615,7 +619,9 @@ else if (name.equalsIgnoreCase("F150")) log("** Testing url expression null behavior for null InitialReleaseYear..."); - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=vehicle&query.queryName=Models&query.InitialReleaseYear~isblank="); + ExecuteQueryPage.getPageFactory("vehicle", "Models") + .addParameter("query.InitialReleaseYear~isblank", "") + .navigate(this, getProjectName()); DataRegionTable modelsGrid = new DataRegionTable("query", this); // URLs with a bad (missing) column should result in no URL being rendered @@ -647,7 +653,9 @@ else if (name.equalsIgnoreCase("F150")) log("** Testing url expression null behavior for non-null InitialReleaseYear..."); - beginAt("/query/" + getProjectName() + "/executeQuery.view?schemaName=vehicle&query.queryName=Models&query.InitialReleaseYear~isnonblank="); + ExecuteQueryPage.getPageFactory("vehicle", "Models") + .addParameter("query.InitialReleaseYear~isnonblank", "") + .navigate(this, getProjectName()); modelsGrid = new DataRegionTable("query", this); href = modelsGrid.getHref(0, "urlNullableColumnWithDefaultBehavior"); @@ -758,7 +766,7 @@ else if (name.equalsIgnoreCase("F150")) log("** Testing vehicle.Vehicles details url link..."); - beginAt("/query/" + getProjectName() + "/schema.view?schemaName=" + VEHICLE_SCHEMA); + beginAt(buildURL("query", getProjectName(), "schema", Map.of("schemaName", VEHICLE_SCHEMA))); viewQueryData(VEHICLE_SCHEMA, "Vehicles"); DataRegionTable vehicles = new DataRegionTable("query", getDriver()); clickAndWait(vehicles.detailsLink(0)); @@ -870,23 +878,23 @@ private void validateThumbnails(String thumbnailImage, @Nullable String thumbnai @LogMethod private void doTestViewEditing() { - beginAt("/" + getProjectName() + "/query-executeQuery.view?schemaName=" + VEHICLE_SCHEMA + "&query.queryName=Vehicles"); + ExecuteQueryPage page = ExecuteQueryPage.beginAt(this, getProjectName(), VEHICLE_SCHEMA, "Vehicles"); - DataRegionTable dr = new DataRegionTable("query", this); + DataRegionTable dr = page.getDataRegion(); log("** Try to edit file-based default view"); - _customizeViewsHelper.openCustomizeViewPanel(); - _customizeViewsHelper.removeColumn("Color"); - CustomizeView.SaveWindow saveWindow = _customizeViewsHelper.clickSave(); + CustomizeView customizeView = dr.openCustomizeGrid(); + customizeView.removeColumn("Color"); + CustomizeView.SaveWindow saveWindow = customizeView.clickSave(); assertFalse("should not be able to select default view", saveWindow.defaultViewRadio.isEnabled()); saveWindow.cancel(); dr.goToView("EditableFileBasedView"); log("** Try to edit overridable file-based view"); - _customizeViewsHelper.openCustomizeViewPanel(); - _customizeViewsHelper.addColumn("Color"); - saveWindow = _customizeViewsHelper.clickSave(); + customizeView = dr.openCustomizeGrid(); + customizeView.addColumn("Color"); + saveWindow = customizeView.clickSave(); assertTrue("should be able to select default view", saveWindow.defaultViewRadio.isEnabled()); saveWindow.defaultViewRadio.check(); @@ -1023,7 +1031,7 @@ private void cleanupTable(Connection cn, String tableName) throws IOException deleteCmd.setRows(rows); deleteCmd.execute(cn, c); } - + assertEquals("Expected no rows remaining", 0, selectCmd.execute(cn, "Home").getRowCount().intValue()); } } @@ -1285,7 +1293,7 @@ private void doTestContainerColumns() throws Exception @LogMethod private void doTestRowLevelContainerPath() { - beginAt("/simpletest/" + getProjectName() + "/workbookTest.view"); + beginAt(buildURL("simpletest", getProjectName(), "workbookTest")); clickButton("RunContainerPathTest", 0); @@ -1806,7 +1814,7 @@ private void doTestCustomLogin() lookAndFeelSettingsPage.save(); signOut(); - beginAt(WebTestHelper.buildURL("login", "login")); + beginAt(buildURL("login", "login")); waitForAnyElement("Should be on login or Home portal", Locator.id("email"), SiteNavBar.Locators.userMenu); assertElementPresent(Locator.tagWithText("p", "SimpleTest Module Custom Sign In")); signIn(); @@ -1819,7 +1827,7 @@ private void doTestCustomLogin() lookAndFeelSettingsPage.save(); signOut(); - beginAt(WebTestHelper.buildURL("login", "login")); + beginAt(buildURL("login", "login")); waitForAnyElement("Should be on login or Home portal", Locator.id("email"), SiteNavBar.Locators.userMenu); assertElementPresent(Locator.tagWithText("p", "SimpleTest Module Custom Sign In With Custom ReturnUrl")); signIn(); diff --git a/src/org/labkey/test/tests/SpecimenGridExportTest.java b/src/org/labkey/test/tests/SpecimenGridExportTest.java index 0ee1cf7037..f646559ab1 100644 --- a/src/org/labkey/test/tests/SpecimenGridExportTest.java +++ b/src/org/labkey/test/tests/SpecimenGridExportTest.java @@ -21,12 +21,14 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.TestTimeoutException; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.categories.Specimen; import org.labkey.test.util.AbstractDataRegionExportOrSignHelper.ColumnHeaderType; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * Test exporting rows from a specimen grid (not folder/study specimen export.) @@ -170,7 +172,7 @@ protected String getDataRegionId() @Override protected void goToDataRegionPage() { - beginAt("/" + getProjectName() + "/specimen-specimens.view?showVials=false"); + beginAt(WebTestHelper.buildURL("specimens", getProjectName(), "specimens", Map.of("showVials", false))); } @Override diff --git a/src/org/labkey/test/tests/TimeChartImportTest.java b/src/org/labkey/test/tests/TimeChartImportTest.java index 3c54179ac5..8cab4a2f3c 100644 --- a/src/org/labkey/test/tests/TimeChartImportTest.java +++ b/src/org/labkey/test/tests/TimeChartImportTest.java @@ -23,6 +23,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Charting; import org.labkey.test.categories.Daily; import org.labkey.test.categories.Reports; @@ -34,6 +35,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * This test imports a folder archive that has 2 subfolders (a date based study and a visit based study) which have been @@ -314,8 +316,9 @@ public void verifyMaskedPtidOnPublishStudy() { clickTab("Clinical and Assay Data"); waitAndClickAndWait(Locator.linkWithText(chartInfo.getName())); - beginAt("/reports/" + getProjectName() + "/" + VISIT_STUDY_FOLDER_NAME + "/" + publishFolderName + "/reportInfo.view?reportId=" - + getUrlParam("reportId")); + beginAt(WebTestHelper.buildURL("reports", + getProjectName() + "/" + VISIT_STUDY_FOLDER_NAME + "/" + publishFolderName, + "reportInfo", Map.of("reportId", getUrlParam("reportId")))); waitForText("Report Debug Information"); for (String origMouseId : origMouseIds) { diff --git a/src/org/labkey/test/tests/TourTest.java b/src/org/labkey/test/tests/TourTest.java index 11e414fb73..156454e5c0 100644 --- a/src/org/labkey/test/tests/TourTest.java +++ b/src/org/labkey/test/tests/TourTest.java @@ -22,6 +22,7 @@ import org.junit.experimental.categories.Category; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.pages.TourEditor; import org.labkey.test.util.DataRegionTable; @@ -204,7 +205,7 @@ private TourEditor navigateToInsertTour(String folder) private DataRegionTable navigateToTours(String folder) { - beginAt("/tours/" + getProjectName() + "/" + folder + "/begin.view"); + beginAt(WebTestHelper.buildURL("tours", getProjectName() + "/" + folder, "begin")); return new DataRegionTable("query", getDriver()); } diff --git a/src/org/labkey/test/tests/UserTest.java b/src/org/labkey/test/tests/UserTest.java index b0e6d133b2..5df8e97c30 100644 --- a/src/org/labkey/test/tests/UserTest.java +++ b/src/org/labkey/test/tests/UserTest.java @@ -49,6 +49,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -222,14 +223,14 @@ public void testSelfServiceEmailSupport() goToHome(); log("Validate that only the user who requested the change can use the link"); - goToURL(resetUrl, 30000); + beginAt(resetUrl.toString(), 30000); assertTextPresent("The current user is not the same user that initiated this request. Please log in with the account you used to make this email change request."); goToHome(); log("Again impersonate user " + SELF_SERVICE_EMAIL_USER + " to validate the confirmation link."); impersonate(SELF_SERVICE_EMAIL_USER); - goToURL(resetUrl, 30000); + beginAt(resetUrl.toString(), 30000); String tempStr = AFFIRM_CHANGE_MSG.replace("@1", SELF_SERVICE_EMAIL_USER); tempStr = tempStr.replace("@2", SELF_SERVICE_EMAIL_USER_CHANGED); @@ -239,7 +240,7 @@ public void testSelfServiceEmailSupport() stopImpersonating(); log("Go to dumpster and make sure the notification email was there."); - assertTrue(null != getEmailChangeMsgBody("Notification .* Web Site email has changed.*")); + assertNotNull(getEmailChangeMsgBody("Notification .* Web Site email has changed.*")); log("Validate that the old email address has been removed."); @@ -251,7 +252,7 @@ public void testSelfServiceEmailSupport() impersonate(SELF_SERVICE_EMAIL_USER_CHANGED); log("Validate that trying to use the link from the email message again will result in an error."); - goToURL(resetUrl, 30000); + beginAt(resetUrl.toString(), 30000); assertTextPresent("Verification failed."); goToHome(); @@ -313,8 +314,7 @@ private void changeEmailAddress(String currentEmail, String newEmail) private String getEmailChangeMsgBody(String subjectRegex) { - EmailRecordTable ert = new EmailRecordTable(getDriver()); - beginAt("/dumbster-begin.view"); + EmailRecordTable ert = goToEmailRecord(); EmailRecordTable.EmailMessage eMsg = ert.getMessageRegEx(subjectRegex); ert.clickMessage(eMsg); eMsg = ert.getMessageRegEx(subjectRegex); @@ -348,7 +348,7 @@ private URL getUrlFromEmail(String subjectRegEx) } } - assertTrue("Could not find a url in the email to follow.", !urlString.isEmpty()); + assertFalse("Could not find a url in the email to follow.", urlString.isEmpty()); try { resetUrl = new URL(urlString); @@ -503,8 +503,7 @@ public void testLongUserProperties() StringBuilder sb = new StringBuilder(); final int maxFieldLength = 64; - for (int i = 0; i < maxFieldLength + 1; i++) - sb.append("X"); + sb.append("X".repeat(maxFieldLength + 1)); String illegalLongProperty = sb.toString(); log("Set illegal properties"); diff --git a/src/org/labkey/test/tests/filecontent/FilesQueryTest.java b/src/org/labkey/test/tests/filecontent/FilesQueryTest.java index 883ab16fad..7ddbe00ee4 100644 --- a/src/org/labkey/test/tests/filecontent/FilesQueryTest.java +++ b/src/org/labkey/test/tests/filecontent/FilesQueryTest.java @@ -21,11 +21,12 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import org.labkey.test.BaseWebDriverTest; -import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.categories.FileBrowser; import org.labkey.test.components.DomainDesignerPage; +import org.labkey.test.pages.query.UpdateQueryRowPage; import org.labkey.test.util.ApiPermissionsHelper; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.FileBrowserExtendedProperty; @@ -35,6 +36,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; @Category({Daily.class, FileBrowser.class}) @BaseWebDriverTest.ClassTimeout(minutes = 6) @@ -169,17 +171,17 @@ public void testNonFileBrowserFileRecords() private void ensureFilesUpToDate() { log("Clear cache so that exp.files will do a sync immediately"); - beginAt("/admin/caches.view?clearCaches=1", 120000); + beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", "1")), 120000); goToProjectHome(); } private void insertFileRecord(String absoluteFilePath, String customProp) { DataRegionTable table = new DataRegionTable.DataRegionFinder(getDriver()).find(); - table.clickInsertNewRow(); - setFormElement(Locator.name("quf_CustomProp"), customProp); - setFormElement(Locator.name("quf_AbsoluteFilePath"), absoluteFilePath); - clickButton("Submit"); + UpdateQueryRowPage page = table.clickInsertNewRow(); + page.setField("CustomProp", customProp); + page.setField("AbsoluteFilePath", absoluteFilePath); + page.submit(); } private void verifyFileRecordsGrid(boolean canSeeAbsolutePath, String filename, String customPropValue, String relativeFolder) @@ -206,9 +208,9 @@ private void verifyUpdatingCustomFileProps(String filename, String updatedCustom { DataRegionTable table = new DataRegionTable.DataRegionFinder(getDriver()).find(); int rowIndex = table.getRowIndex("Name", filename); - table.clickEditRow(rowIndex); - setFormElement(Locator.name("quf_CustomProp"), updatedCustomPropValue); - clickButton("Submit"); + UpdateQueryRowPage page = table.clickEditRow(rowIndex); + page.setField("CustomProp", updatedCustomPropValue); + page.submit(); List results = table.getRowDataAsText(rowIndex, "Custom Prop"); Assert.assertEquals("Custom Prop is not as expected", updatedCustomPropValue, results.get(0)); diff --git a/src/org/labkey/test/tests/flow/BaseFlowTest.java b/src/org/labkey/test/tests/flow/BaseFlowTest.java index 7566e3ae4a..e3de2b85c0 100644 --- a/src/org/labkey/test/tests/flow/BaseFlowTest.java +++ b/src/org/labkey/test/tests/flow/BaseFlowTest.java @@ -26,6 +26,7 @@ import org.labkey.test.pages.ImportDataPage; import org.labkey.test.pages.experiment.CreateSampleTypePage; import org.labkey.test.pages.pipeline.PipelineStatusDetailsPage; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.LogMethod; @@ -87,7 +88,6 @@ public static void setupProject() private void init() { - beginAt("/admin/begin.view"); goToAdminConsole().goToSettingsSection(); clickAndWait(Locator.linkWithText("flow cytometry")); getPipelineWorkDirectory().mkdir(); @@ -162,7 +162,7 @@ protected void doCleanup(boolean afterTest) _containerHelper.deleteProject(getProjectName(), afterTest); try { - beginAt("/admin/begin.view"); + goToAdminConsole(); clickAndWait(Locator.linkWithText("flow cytometry")); setFormElement(Locator.id("workingDirectory"), ""); clickButton("update"); @@ -179,8 +179,8 @@ protected void deleteAllRuns() return; } - beginAt("/query/" + getProjectName() + "/" + getFolderName() + "/executeQuery.view?schemaName=exp&query.queryName=Runs"); - DataRegionTable table = new DataRegionTable("query", this); + DataRegionTable table = ExecuteQueryPage.beginAt(this, getContainerPath(), "exp", "Runs") + .getDataRegion(); if (table.getDataRowCount() > 0) { // Delete all runs @@ -189,11 +189,15 @@ protected void deleteAllRuns() assertEquals("Expected all experiment Runs to be deleted", 0, table.getDataRowCount()); // Check all DataInputs were deleted - beginAt("/query/" + getProjectName() + "/" + getFolderName() + "/executeQuery.view?schemaName=exp&query.queryName=DataInputs"); + table = ExecuteQueryPage.beginAt(this, getContainerPath(), "exp", "DataInputs") + .getDataRegion(); assertEquals("Expected all experiment DataInputs to be deleted", 0, table.getDataRowCount()); // Check all Datas were deleted except for flow analysis scripts (FlowDataType.Script) - beginAt("/query/" + getProjectName() + "/" + getFolderName() + "/executeQuery.view?schemaName=exp&query.queryName=Datas&query.LSID~doesnotcontain=Flow-AnalysisScript"); + table = ExecuteQueryPage.getPageFactory("exp", "Datas") + .addParameter("query.LSID~doesnotcontain", "Flow-AnalysisScript") + .navigate(this) + .getDataRegion(); assertEquals("Expected all experiment Datas to be deleted", 0, table.getDataRowCount()); } } diff --git a/src/org/labkey/test/tests/flow/FlowSpecimenTest.java b/src/org/labkey/test/tests/flow/FlowSpecimenTest.java index 40804c54a5..756c38468f 100644 --- a/src/org/labkey/test/tests/flow/FlowSpecimenTest.java +++ b/src/org/labkey/test/tests/flow/FlowSpecimenTest.java @@ -20,6 +20,7 @@ import org.junit.experimental.categories.Category; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.categories.Flow; import org.labkey.test.categories.Specimen; @@ -28,6 +29,8 @@ import org.labkey.test.util.LogMethod; import org.labkey.test.util.PipelineStatusTable; +import java.util.Map; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -134,7 +137,7 @@ private void verifyDeleteConfirmation() assertTextPresent("Confirm Deletion"); assertTextNotPresent("One dataset(s) have one or more rows which will also be deleted", String.format("/%1$s/%2$s", getProjectName(), STUDY_FOLDER), fcsAnalysisName); clickAndWait(Locator.lkButton("Confirm Delete")); - beginAt("/study/" + getProjectName() + "/" + STUDY_FOLDER + "/dataset.view?datasetId=5001"); + beginAt(WebTestHelper.buildURL("study", getProjectName() + "/" + STUDY_FOLDER, "dataset", Map.of("datasetId", "5001"))); DataRegionTable table = new DataRegionTable(getDriver().getCurrentUrl().contains("dataset.view") ? "Dataset" : "query", this); assertEquals("Dataset data not as expected after FCSFile delete", 2, table.getDataRowCount()); log("Non-Study data delete successful"); @@ -148,7 +151,7 @@ private void verifyDeleteConfirmation() assertTextPresent("Confirm Deletion", "One dataset(s) have one or more rows which will also be deleted", String.format("/%1$s/%2$s", getProjectName(), STUDY_FOLDER)); clickAndWait(Locator.lkButton("Confirm Delete")); assertTextPresent("No data to show."); - beginAt("/study/" + getProjectName() + "/" + STUDY_FOLDER + "/dataset.view?datasetId=5001"); + beginAt(WebTestHelper.buildURL("study", getProjectName() + "/" + STUDY_FOLDER, "dataset", Map.of("datasetId", "5001"))); assertTextPresent("No data to show."); log("Study linked data delete successful"); } @@ -167,7 +170,7 @@ protected void importFCSFiles() waitForPipelineComplete(); log("** Verify Target Study is set on FCSFile run"); - beginAt("/flow-run/" + getContainerPath() + "/showRuns.view"); + beginAt(WebTestHelper.buildURL("flow-run", getContainerPath(), "showRuns")); DataRegionTable table = new DataRegionTable("query", this); assertEquals(STUDY_FOLDER + " Study", table.getDataAsText(0, "Target Study")); table.clickRowDetails(0); @@ -221,7 +224,7 @@ protected void importFlowAnalysis() private void linkFlowResultsToStudy() { // Link the sample wells to the STUDY_FOLDER - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=FCSAnalyses"); + beginAt(WebTestHelper.buildURL("flow", getContainerPath(), "query", Map.of("schemaName", "flow", "query.queryName", "FCSAnalyses"))); click(Locator.checkboxByName(".toggle")); clickButton("Link to Study"); selectOptionByText(AssayConstants.TARGET_STUDY_FIELD_LOCATOR, "/" + getProjectName() + "/" + STUDY_FOLDER + " (" + STUDY_FOLDER + " Study)"); @@ -242,7 +245,7 @@ private void linkFlowResultsToStudy() protected void verifyFCSFileSpecimenFK() { log("** Verify specimen FK from flow.FCSFile table"); - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=FCSFiles"); + beginAt(WebTestHelper.buildURL("flow", getContainerPath(), "query", Map.of("schemaName", "flow", "query.queryName", "FCSFiles"))); verifySpecimenFK(""); } @@ -250,7 +253,7 @@ protected void verifyFCSFileSpecimenFK() protected void verifyFCSAnalysisSpecimenFK() { log("** Verify specimen FK from flow.FCSAnalysis table"); - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=FCSAnalyses"); + beginAt(WebTestHelper.buildURL("flow", getContainerPath(), "query", Map.of("schemaName", "flow", "query.queryName", "FCSAnalyses"))); verifySpecimenFK("FCSFile/"); } @@ -258,7 +261,7 @@ protected void verifyFCSAnalysisSpecimenFK() protected void verifyFlowDatasetSpecimenFK() { log("** Verify specimen FK from flow dataset"); - beginAt("/study/" + getProjectName() + "/" + STUDY_FOLDER + "/dataset.view?datasetId=5001"); + beginAt(WebTestHelper.buildURL("study", getProjectName() + "/" + STUDY_FOLDER, "dataset", Map.of("datasetId", "5001"))); verifySpecimenFK("FCSFile/"); } diff --git a/src/org/labkey/test/tests/flow/FlowTest.java b/src/org/labkey/test/tests/flow/FlowTest.java index 464dd0fa0d..689c0adc39 100644 --- a/src/org/labkey/test/tests/flow/FlowTest.java +++ b/src/org/labkey/test/tests/flow/FlowTest.java @@ -38,7 +38,6 @@ import org.labkey.test.tests.AuditLogTest; import org.labkey.test.util.DataRegion; import org.labkey.test.util.DataRegionTable; -import org.labkey.test.util.EscapeUtil; import org.labkey.test.util.FileBrowserHelper; import org.labkey.test.util.LogMethod; import org.labkey.test.util.LoggedParam; @@ -59,6 +58,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.labkey.test.WebTestHelper.buildURL; @Category({Daily.class, Flow.class}) @BaseWebDriverTest.ClassTimeout(minutes = 18) @@ -250,7 +250,7 @@ public void testBulkKeywordEdit() private void beginAtFCSFileQueryView() { - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=FCSFiles"); + beginAt(buildURL("flow", getContainerPath(), "query", Map.of("schemaName", "flow", "query.queryName", "FCSFiles"))); } private void confirmKeywordValue(String keywordName, String expectedKeywordValue) @@ -581,7 +581,8 @@ public void customGraphQuery() createQuery(getProjectName(), "GraphQuery", graphQuery, null, true); log("** Executing custom query with Graph columns"); - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=GraphQuery&query.showGraphs=Inline"); + beginAt(buildURL("flow", getContainerPath(), "query", + Map.of("schemaName", "flow", "query.queryName", "GraphQuery", "query.showGraphs", "Inline"))); // verify Issue 16304: query over flow.FCSFiles doesn't include URL for Name column DataRegionTable table = new DataRegionTable("query", getDriver()); @@ -786,7 +787,7 @@ private void verifyReportError(@LoggedParam String reportName, String errorText) @LogMethod private void verifyReport(@LoggedParam String reportName) { - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=FCSAnalyses"); + beginAt(buildURL("flow", getContainerPath(), "query", Map.of("schemaName", "flow", "query.queryName", "FCSAnalyses"))); FieldKey reportNameFk = FieldKey.fromParts(reportName); @@ -817,7 +818,7 @@ private void deleteReport(@LoggedParam String reportName) @LogMethod(quiet = true) private void verifyDeleted(@LoggedParam String reportName) { - beginAt("/flow" + getContainerPath() + "/query.view?schemaName=flow&query.queryName=FCSAnalyses"); + beginAt(buildURL("flow", getContainerPath(), "query", Map.of("schemaName", "flow", "query.queryName", "FCSAnalyses"))); DataRegionTable drt = new DataRegionTable("query", getDriver()); String error = BootstrapLocators.warningBanner.findElement(drt.getComponentElement()).getText(); assertEquals("Ignoring filter/sort on column '" + reportName + ".Response' because it does not exist.", error); diff --git a/src/org/labkey/test/tests/nab/NabAssayTest.java b/src/org/labkey/test/tests/nab/NabAssayTest.java index 2ae5a72fe5..0163eac5a3 100644 --- a/src/org/labkey/test/tests/nab/NabAssayTest.java +++ b/src/org/labkey/test/tests/nab/NabAssayTest.java @@ -55,6 +55,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -493,7 +494,9 @@ public void runUITests() //Issue 17050: UnsupportedOperationException from org.labkey.nab.query.NabProtocolSchema$NabResultsQueryView.createDataView private void directBrowserQueryTest() { - beginAt("/query/Nab%20Test%20Verify%20Project/selectRows.api?schemaName=assay&queryName=TestAssayNab%20Data"); + beginAt(WebTestHelper.buildURL("query", "Nab Test Verify Project", "selectRows.api", Map.of( + "schemaName", "assay", + "queryName", "TestAssayNab Data"))); assertTextPresent("metaData"); } diff --git a/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java b/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java index 08a58dedde..af48928236 100644 --- a/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java +++ b/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java @@ -20,6 +20,7 @@ import org.labkey.serverapi.writer.PrintWriters; import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Perf; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.FieldDefinition.ColumnType; @@ -27,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.io.Writer; +import java.util.Map; // this test generates ball park times for Schema Browser use cases on a study that has 200 dataSets. // @@ -86,7 +88,7 @@ private long[] studyBaselineEmptyCache() { long[] emptyCacheOpenStudyTimes = new long[5]; // run tests for (int x = 0 ; x < 5; x++) { - beginAt("/admin/caches.view?clearCaches=1", 120000); + beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); @@ -101,7 +103,7 @@ private long[] studyBaselineEmptyCache() { private long[] studyBaselineFullCache() { long[] fullCacheOpenStudyTimes = new long[5]; // prepare cache - beginAt("/admin/caches.view?clearCaches=1", 120000); + beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); @@ -123,7 +125,7 @@ private long[] studyBaselineFullCache() { private long[] studyDataBaselineFullCache() { long[] emptyCacheOpenStudyDataTimes = new long[5]; // prepare cache - beginAt("/admin/caches.view?clearCaches=1", 120000); + beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); diff --git a/src/org/labkey/test/tests/remoteapi/BulkUpdateGroupApiTest.java b/src/org/labkey/test/tests/remoteapi/BulkUpdateGroupApiTest.java index bdef4aabf0..3d4ac3ede5 100644 --- a/src/org/labkey/test/tests/remoteapi/BulkUpdateGroupApiTest.java +++ b/src/org/labkey/test/tests/remoteapi/BulkUpdateGroupApiTest.java @@ -24,6 +24,7 @@ import org.labkey.remoteapi.security.BulkUpdateGroupResponse; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.TestTimeoutException; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.tests.AuditLogTest; import org.labkey.test.util.APIUserHelper; @@ -75,7 +76,10 @@ private void deleteTestUsers(String suffix) if (suffix.length() < 10) throw new IllegalArgumentException("Use a longer suffix for test user emails."); - beginAt("user/showUsers.view?inactive=true&Users.showRows=all&Users.Email~contains=" + suffix); + beginAt(WebTestHelper.buildURL("user", "showUsers", Map.of( + "inactive", "true", + "Users.showRows", "all", + "Users.Email~contains", suffix))); DataRegionTable usersTable = new DataRegionTable("Users", this); if (usersTable.getDataRowCount() > 0) diff --git a/src/org/labkey/test/tests/viability/ViabilityTest.java b/src/org/labkey/test/tests/viability/ViabilityTest.java index f1571204ab..b39fc5950a 100644 --- a/src/org/labkey/test/tests/viability/ViabilityTest.java +++ b/src/org/labkey/test/tests/viability/ViabilityTest.java @@ -25,6 +25,7 @@ import org.labkey.test.categories.Daily; import org.labkey.test.components.assay.AssayConstants; import org.labkey.test.pages.ReactAssayDesignerPage; +import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.QCAssayScriptHelper; @@ -226,8 +227,8 @@ protected void runReRunTest() protected void runResultSpecimenLookupTest() { log("** Checking ResultSpecimens lookups"); - beginAt("/" + getProjectName() + "/" + getFolderName() + "/query-executeQuery.view?schemaName=assay&query.queryName=" + getAssayName() + " ResultSpecimens"); - DataRegionTable table = new DataRegionTable("query", this); + ExecuteQueryPage page = ExecuteQueryPage.beginAt(this, getProjectName() + "/" + getFolderName(), "assay", getAssayName() + " ResultSpecimens"); + DataRegionTable table = page.getDataRegion(); assertTextPresent(new TextSearcher(table.getComponentElement()::getText), "foobar", "vial1", "xyzzy", "160450533-5", "161400006.11-5"); setSelectedFields("/" + getProjectName() + "/" + getFolderName(), "assay", getAssayName() + " ResultSpecimens", null, diff --git a/src/org/labkey/test/util/Crawler.java b/src/org/labkey/test/util/Crawler.java index 3da61dd9d5..2b2cef0d6b 100644 --- a/src/org/labkey/test/util/Crawler.java +++ b/src/org/labkey/test/util/Crawler.java @@ -86,6 +86,7 @@ public class Crawler private static final Set _actionsWithErrors = new HashSet<>(); private static final Set _urlsChecked = new HashSet<>(); private static final Map _crawlStats = new LinkedHashMap<>(); + private static final Set _controllerFirstUrls = new HashSet<>(); // All parameters seen by the crawler. Used to randomly attempt injection against parameters not found in UI private static final LinkedHashMap _dictionary = new LinkedHashMap<>(); @@ -609,8 +610,9 @@ public boolean underCreatedProject() private void checkControllerRelativeUrl() { - if (_actionId != null && _actionId.isControllerFirstUrl() && WebTestHelper.isUseContainerRelativeUrl()) + if (_actionId != null && _actionId.isControllerFirstUrl() && WebTestHelper.isUseContainerRelativeUrl() && !_controllerFirstUrls.contains(_actionId)) { + _controllerFirstUrls.add(_actionId); RuntimeException ex = new RuntimeException("Found a controller-first URL (%s) on %s".formatted(getUrlText(), getOrigin())); if (TestProperties.isControllerFirstUrlFatal()) throw ex; diff --git a/src/org/labkey/test/util/PageFactory.java b/src/org/labkey/test/util/PageFactory.java index 2c1a6e4b46..85fce0f41b 100644 --- a/src/org/labkey/test/util/PageFactory.java +++ b/src/org/labkey/test/util/PageFactory.java @@ -21,32 +21,42 @@ import java.util.function.Function; -public class PageFactory

+public class PageFactory

> { - private final RelativeUrl url; - private final Function pageConstructor; - private final String containerPath = null; + private final RelativeUrl _url; + private final Function _pageConstructor; PageFactory(RelativeUrl url, Function pageConstructor) { - this.url = url.copy(); - this.pageConstructor = pageConstructor; + this._url = url.copy(); + this._pageConstructor = pageConstructor; } public final PageFactory

setContainerPath(String containerPath) { - url.setContainerPath(containerPath); + _url.setContainerPath(containerPath); + return this; + } + + public final PageFactory

addParameter(String name, T value) + { + _url.addParameter(name, value); return this; } public final P navigate(WebDriverWrapper driverWrapper) { - return navigate(driverWrapper, url); + return navigate(driverWrapper, _url); + } + + public final P navigate(WebDriverWrapper driverWrapper, String containerPath) + { + return navigate(driverWrapper, _url.copy().setContainerPath(containerPath)); } public final P navigate(WebDriverWrapper driverWrapper, Integer msTimeout) { - return navigate(driverWrapper, url.copy().setTimeout(msTimeout)); + return navigate(driverWrapper, _url.copy().setTimeout(msTimeout)); } protected P navigate(WebDriverWrapper driverWrapper, RelativeUrl url) @@ -56,6 +66,6 @@ protected P navigate(WebDriverWrapper driverWrapper, RelativeUrl url) url = url.copy().setContainerPath(driverWrapper.getCurrentContainerPath()); } url.navigate(driverWrapper); - return pageConstructor.apply(driverWrapper.getDriver()); + return _pageConstructor.apply(driverWrapper.getDriver()); } } diff --git a/src/org/labkey/test/util/RelativeUrl.java b/src/org/labkey/test/util/RelativeUrl.java index 9f3fc7200a..017589603a 100644 --- a/src/org/labkey/test/util/RelativeUrl.java +++ b/src/org/labkey/test/util/RelativeUrl.java @@ -29,7 +29,7 @@ public class RelativeUrl private final String _controller; private String _containerPath = null; private final String _action; - private final Map _parameters; + private final Map _parameters; private Integer _msTimeout; public RelativeUrl(String controller, String action) @@ -66,13 +66,13 @@ public RelativeUrl addParameter(String param) return this; } - public RelativeUrl addParameters(Map params) + public RelativeUrl addParameters(Map params) { _parameters.putAll(params); return this; } - public RelativeUrl addParameter(String param, String value) + public RelativeUrl addParameter(String param, T value) { _parameters.put(param, value); return this; @@ -103,7 +103,7 @@ public RelativeUrl setTimeout(Integer msTimeout) return this; } - public

PageFactory

getPageFactory(Function pageConstructor) + public

> PageFactory

getPageFactory(Function pageConstructor) { return new PageFactory<>(this, pageConstructor); } diff --git a/src/org/labkey/test/util/SchemaHelper.java b/src/org/labkey/test/util/SchemaHelper.java index a70aabb9d2..84579aaf37 100644 --- a/src/org/labkey/test/util/SchemaHelper.java +++ b/src/org/labkey/test/util/SchemaHelper.java @@ -45,7 +45,7 @@ public void updateLinkedSchema(String targetContainerPath, String name, String s @LogMethod public void deleteSchema(String containerPath, String schemaToDelete) { - _test.beginAt("/query/" + containerPath + "/admin.view"); + _test.beginAt(WebTestHelper.buildURL("query", containerPath, "admin")); Locator link = Locator.xpath("//td[text()='" + schemaToDelete + "']/..//a[text()='delete']"); _test.waitAndClickAndWait(link); _test.assertTextPresent("Are you sure you want to delete the schema '" + schemaToDelete + "'? The tables and queries defined in this schema will no longer be accessible.");