From 067438ee8ef34721e31d6a990ebd992b38ec8fbe Mon Sep 17 00:00:00 2001
From: labkey-nicka
Date: Tue, 9 Sep 2025 12:22:28 -0700
Subject: [PATCH 1/3] Test updates to escape special characters in form field
names
---
.../labkey/test/pages/DatasetInsertPage.java | 7 +++--
.../test/pages/query/UpdateQueryRowPage.java | 3 ++-
.../pages/user/UpdateUserDetailsPage.java | 3 ++-
.../test/tests/AttachmentFieldTest.java | 7 ++---
.../DataClassFolderExportImportTest.java | 3 ++-
.../test/tests/SampleTypeRemoteAPITest.java | 3 ++-
.../test/tests/UserDetailsPermissionTest.java | 9 ++++---
.../tests/UserTableCustomFieldUpdateTest.java | 5 ++--
src/org/labkey/test/tests/UserTest.java | 3 ++-
.../core/admin/AllowedFileExtensionTest.java | 6 +++--
.../test/tests/list/ListDateAndTimeTest.java | 7 ++---
src/org/labkey/test/tests/list/ListTest.java | 22 +++++++--------
src/org/labkey/test/util/DataClassHelper.java | 2 +-
src/org/labkey/test/util/EscapeUtil.java | 27 +++++++++++++++++++
src/org/labkey/test/util/ListHelper.java | 2 +-
.../labkey/test/util/SampleTypeHelper.java | 2 +-
16 files changed, 76 insertions(+), 35 deletions(-)
diff --git a/src/org/labkey/test/pages/DatasetInsertPage.java b/src/org/labkey/test/pages/DatasetInsertPage.java
index 3d014dc623..4651210bdf 100644
--- a/src/org/labkey/test/pages/DatasetInsertPage.java
+++ b/src/org/labkey/test/pages/DatasetInsertPage.java
@@ -18,11 +18,14 @@
import org.apache.tika.utils.StringUtils;
import org.labkey.test.Locator;
import org.labkey.test.Locators;
+import org.labkey.test.util.EscapeUtil;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.util.Map;
+import static org.labkey.test.util.EscapeUtil.FORM_FIELD_PREFIX;
+
public class DatasetInsertPage extends InsertPage
{
public DatasetInsertPage(WebDriver driver, String datasetName)
@@ -39,7 +42,7 @@ public DatasetInsertPage(WebDriver driver)
protected void waitForReady()
{
super.waitForReady();
- waitForElement(Locator.tag("*").attributeStartsWith("name", "quf_"));
+ waitForElement(Locator.tag("*").attributeStartsWith("name", FORM_FIELD_PREFIX));
}
public void insert(Map values)
@@ -79,7 +82,7 @@ private void tryInsert(Map values)
{
for (Map.Entry entry : values.entrySet())
{
- WebElement fieldInput = Locator.name("quf_" + entry.getKey()).findElement(getDriver());
+ WebElement fieldInput = Locator.name(EscapeUtil.getFormFieldName(entry.getKey())).findElement(getDriver());
String type = fieldInput.getAttribute("type");
switch (type)
{
diff --git a/src/org/labkey/test/pages/query/UpdateQueryRowPage.java b/src/org/labkey/test/pages/query/UpdateQueryRowPage.java
index d4795e5808..dcb2efa47e 100644
--- a/src/org/labkey/test/pages/query/UpdateQueryRowPage.java
+++ b/src/org/labkey/test/pages/query/UpdateQueryRowPage.java
@@ -12,6 +12,7 @@
import org.labkey.test.components.html.Input;
import org.labkey.test.components.html.OptionSelect;
import org.labkey.test.pages.LabKeyPage;
+import org.labkey.test.util.EscapeUtil;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
@@ -185,7 +186,7 @@ WebElement findField(String name)
{
if (!fieldMap.containsKey(name))
{
- fieldMap.put(name, Locator.name("quf_" + name).findElement(this));
+ fieldMap.put(name, Locator.name(EscapeUtil.getFormFieldName(name)).findElement(this));
}
return fieldMap.get(name);
}
diff --git a/src/org/labkey/test/pages/user/UpdateUserDetailsPage.java b/src/org/labkey/test/pages/user/UpdateUserDetailsPage.java
index 4f8150f4b2..9b0f0b25b5 100644
--- a/src/org/labkey/test/pages/user/UpdateUserDetailsPage.java
+++ b/src/org/labkey/test/pages/user/UpdateUserDetailsPage.java
@@ -5,6 +5,7 @@
import org.labkey.test.WebTestHelper;
import org.labkey.test.components.html.Input;
import org.labkey.test.pages.LabKeyPage;
+import org.labkey.test.util.EscapeUtil;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
@@ -109,7 +110,7 @@ protected Input findInput(String fieldName)
{
if (!formElements.containsKey(fieldName))
{
- Input input = Input.Input(Locator.name("quf_" + fieldName), getDriver()).find();
+ Input input = Input.Input(Locator.name(EscapeUtil.getFormFieldName(fieldName)), getDriver()).find();
formElements.put(fieldName, input);
}
return formElements.get(fieldName);
diff --git a/src/org/labkey/test/tests/AttachmentFieldTest.java b/src/org/labkey/test/tests/AttachmentFieldTest.java
index 673002985b..c05226b3d9 100644
--- a/src/org/labkey/test/tests/AttachmentFieldTest.java
+++ b/src/org/labkey/test/tests/AttachmentFieldTest.java
@@ -18,6 +18,7 @@
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.params.experiment.SampleTypeDefinition;
import org.labkey.test.util.DataRegionTable;
+import org.labkey.test.util.EscapeUtil;
import org.labkey.test.util.PortalHelper;
import org.labkey.test.util.SampleTypeHelper;
import org.labkey.test.util.TestDataGenerator;
@@ -78,8 +79,8 @@ public void testFileFieldInSampleType()
clickAndWait(Locator.linkWithText(sampleTypeName));
DataRegionTable samplesTable = DataRegionTable.DataRegion(getDriver()).withName("Material").waitFor();
samplesTable.clickInsertNewRow();
- setFormElement(Locator.name("quf_Name"), "S1");
- setFormElement(Locator.name("quf_" + fieldName), SAMPLE_FILE);
+ setFormElement(Locator.name(EscapeUtil.getFormFieldName("Name")), "S1");
+ setFormElement(Locator.name(EscapeUtil.getFormFieldName(fieldName)), SAMPLE_FILE);
clickButton("Submit");
assertElementPresent(Locator.tagWithAttribute("a", "title", "Download attached file"));
@@ -170,7 +171,7 @@ public void testAttachmentFieldInLists()
clickAndWait(Locator.linkWithText(listName));
DataRegionTable listTable = new DataRegionTable("query", getDriver());
listTable.clickInsertNewRow();
- setFormElement(Locator.name("quf_" + fieldName), SAMPLE_FILE);
+ setFormElement(Locator.name(EscapeUtil.getFormFieldName(fieldName)), SAMPLE_FILE);
clickButton("Submit");
log("Verify file opened in browser");
diff --git a/src/org/labkey/test/tests/DataClassFolderExportImportTest.java b/src/org/labkey/test/tests/DataClassFolderExportImportTest.java
index da3cb09146..aacd98a09e 100644
--- a/src/org/labkey/test/tests/DataClassFolderExportImportTest.java
+++ b/src/org/labkey/test/tests/DataClassFolderExportImportTest.java
@@ -14,6 +14,7 @@
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.params.experiment.DataClassDefinition;
import org.labkey.test.util.DataRegionTable;
+import org.labkey.test.util.EscapeUtil;
import org.labkey.test.util.LogMethod;
import org.labkey.test.util.PortalHelper;
import org.labkey.test.util.TestDataGenerator;
@@ -129,7 +130,7 @@ public void testExportImportSimpleDataClass() throws Exception
// issue https://www.labkey.org/home/Developer/issues/issues-details.view?issueId=42191 tracks this
// until it is fixed we will have to add attachments via the UI, like this
sourceTable.clickEditRow(i);
- setFormElement(Locator.input("quf_" + attachmentColumnName), _attachments.get(i));
+ setFormElement(Locator.input(EscapeUtil.getFormFieldName(attachmentColumnName)), _attachments.get(i));
clickButton("Submit");
}
List
- * @throws IOException Can be thrown by helper that checks if the list already exists.
- * @throws CommandException Can be thrown by helper that checks if the list already exists.
*/
@Test
- public void testDateAndTimeColumnFiltering() throws IOException, CommandException
+ public void testDateAndTimeColumnFiltering()
{
-
String listName = "Date and Time Filter List";
String dateCol = "Date";
String timeCol = "Time";
@@ -803,15 +795,15 @@ public void testDateAndTimeColumnFiltering() throws IOException, CommandExceptio
StringBuilder bulkInsertText = new StringBuilder();
bulkInsertText.append(String.format("%s\t%s\n", dateCol, timeCol));
- for(Date date : dates)
+ for (Date date : dates)
{
- if(date.equals(dateUseDateOnlyKey10))
+ if (date.equals(dateUseDateOnlyKey10))
{
// Add a line with only a date.
bulkInsertText.append(String.format("%s\t\n", _defaultDateFormat.format(date)));
}
- else if(date.equals(dateUseTimeOnlyKey11))
+ else if (date.equals(dateUseTimeOnlyKey11))
{
// Add a line with only a time.
bulkInsertText.append(String.format("\t%s\n", _defaultTimeFormat.format(date)));
@@ -821,7 +813,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
bulkInsertText.append(String.format("%s\t%s\n",
_defaultDateFormat.format(date), _defaultTimeFormat.format(date)));
}
-
}
log("Use bulk insert to populate the list.");
@@ -862,7 +853,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering date-only column to equal '%s' (duplicate values) not as expected.", filterValue01),
"Error_Date_Filter_Equals_Duplicates");
-
Date filterDate01 = new Calendar.Builder()
.setDate(2010, 1, 1)
.build().getTime();
@@ -879,7 +869,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering date-only column greater than or equal to '%s' not as expected.", filterValue01),
"Error_Date_Filter_Greater");
-
// Filter between two dates.
filterDate01 = new Calendar.Builder()
.setDate(2001, 1, 1)
@@ -904,7 +893,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering date-only column between '%s' and '%s' not as expected.", filterValue01, filterValue02),
"Error_Date_Filter_Between");
-
log("Filter the date-only is blank.");
expectedKeyCol = new ArrayList<>();
@@ -916,7 +904,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
"Filtering date-only to 'Is Blank' not as expected.",
"Error_Date_Filter_Blank");
-
log("Now filter the time-only field.");
filterValue01 = _defaultTimeFormat.format(dateKey07);
@@ -943,7 +930,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering time-only column to equal '%s' (no seconds) not as expected.", filterValue01),
"Error_Time_Filter_No_Seconds");
-
filterValue01 = _defaultTimeFormat.format(dateDuplicate);
log(String.format("Filter the time-only field equals '%s' which has duplicates.", filterValue01));
expectedKeyCol = new ArrayList<>();
@@ -956,7 +942,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering time-only column to equal '%s' (duplicate values) not as expected.", filterValue01),
"Error_Time_Filter_Equals_Duplicates");
-
filterDate01 = new Calendar.Builder()
.setTimeOfDay(14, 0, 0)
.build().getTime();
@@ -975,7 +960,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering time-only column greater than or equal to '%s' not as expected.", filterValue01),
"Error_Time_Filter_Greater");
-
filterDate01 = new Calendar.Builder()
.setTimeOfDay(9, 0, 0)
.build().getTime();
@@ -1003,7 +987,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
String.format("Filtering time-only column between '%s' and '%s' not as expected.", filterValue01, filterValue02),
"Error_Time_Filter_Between");
-
log("Filter the time-only is blank.");
expectedKeyCol = new ArrayList<>();
expectedKeyCol.add("10"); // 1989-08-12 (empty)
@@ -1013,7 +996,6 @@ else if(date.equals(dateUseTimeOnlyKey11))
null, null,
"Filtering time-only to 'Is Blank' not as expected.",
"Error_Time_Filter_Blank");
-
}
/**
@@ -1021,13 +1003,10 @@ else if(date.equals(dateUseTimeOnlyKey11))
* Validate error messages are expected for invalid values in date-only, time-only and DateTime fields.
* Validates bulk import, file (xlsx) and UI.
*
- * @throws IOException Can be thrown by helper that checks if the list already exists.
- * @throws CommandException Can be thrown by helper that checks if the list already exists.
*/
@Test
- public void testInvalidDateAndTimeInsert() throws IOException, CommandException
+ public void testInvalidDateAndTimeInsert()
{
-
String listName = "Date and Time Invalid Insert List";
String dateCol = "Date";
String timeCol = "Time";
@@ -1052,7 +1031,6 @@ public void testInvalidDateAndTimeInsert() throws IOException, CommandException
ImportDataPage importPage = _listHelper.clickImportData();
-
String bulkImportText = String.format("%s\t\n%s", dateCol, badDate);
importPage.setText(bulkImportText);
String actualErrorMsg = importPage.submitExpectingError();
@@ -1100,18 +1078,17 @@ public void testInvalidDateAndTimeInsert() throws IOException, CommandException
_listHelper.beginAtList(getProjectName(), listName);
- DataRegionTable regionTable = new DataRegionTable("query", getDriver());
- regionTable.clickInsertNewRow();
- setFormElement(Locator.name(EscapeUtil.getFormFieldName(timeCol)), badTime);
- setFormElement(Locator.name(EscapeUtil.getFormFieldName(dateCol)), badDate);
- setFormElement(Locator.name(EscapeUtil.getFormFieldName(dateTimeCol)), badDateTime);
- clickButton("Submit");
+ new DataRegionTable("query", getDriver())
+ .clickInsertNewRow()
+ .setField(timeCol, badTime)
+ .setField(dateCol, badDate)
+ .setField(dateTimeCol, badDateTime)
+ .submit();
checker().verifyTrue("Bad value error message in UI not as expected.",
isTextPresent(String.format("Could not convert value: %s", badTime),
String.format("Could not convert value: %s", badDate),
String.format("Could not convert value: %s", badDateTime)));
-
}
/**
@@ -1181,7 +1158,7 @@ public void testDateAndTimeFormat()
SimpleDateFormat inputTimeFormatter = new SimpleDateFormat("hh:mm:ss aa");
SimpleDateFormat inputDateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- for(Date date : dates)
+ for (Date date : dates)
{
bulkImportText.append(String.format("%s\t%s\t%s\n",
inputDateFormatter.format(date), inputTimeFormatter.format(date), inputDateTimeFormatter.format(date)
@@ -1194,7 +1171,7 @@ public void testDateAndTimeFormat()
List> expectedData = new ArrayList<>();
- for(Date date : dates)
+ for (Date date : dates)
{
expectedData.add(
Map.of(
@@ -1238,7 +1215,7 @@ public void testDateAndTimeFormat()
expectedData = new ArrayList<>();
- for(Date date : dates)
+ for (Date date : dates)
{
expectedData.add(
Map.of(
@@ -1257,13 +1234,10 @@ public void testDateAndTimeFormat()
* Test converting a DateTime filed to a date-only and time-only field. Test also validates that a date-only
* field can be converted to a DateTime field, but a time-only field can not.
*
- * @throws IOException Can be thrown by helper that checks if the list already exists.
- * @throws CommandException Can be thrown by helper that checks if the list already exists.
*/
@Test
- public void testConvertDateTimeField() throws IOException, CommandException
+ public void testConvertDateTimeField()
{
-
String listName = "Convert DateTime Field List";
String dateTimeToTimeCol = "DT_To_Time";
String dateTimeToDateCol = "DT_To_Date";
@@ -1322,7 +1296,7 @@ public void testConvertDateTimeField() throws IOException, CommandException
bulkImportText.append(String.format("%s\t%s\n", dateTimeToDateCol, dateTimeToTimeCol));
- for(Date date : dates)
+ for (Date date : dates)
{
bulkImportText.append(String.format("%s\t%s\n",
_defaultDateTimeFormat.format(date), formatterFormatTime.format(date)
@@ -1382,7 +1356,7 @@ public void testConvertDateTimeField() throws IOException, CommandException
List> expectedData = new ArrayList<>();
- for(Date date : dates)
+ for (Date date : dates)
{
expectedData.add(
Map.of(
@@ -1430,7 +1404,7 @@ public void testConvertDateTimeField() throws IOException, CommandException
expectedData = new ArrayList<>();
- for(Date date : dates)
+ for (Date date : dates)
{
expectedData.add(
Map.of(
@@ -1443,7 +1417,5 @@ public void testConvertDateTimeField() throws IOException, CommandException
validateListDataInUI(table, expectedData);
checker().screenShotIfNewError("Convert_To_DateTime_Error");
-
}
-
}