diff --git a/src/org/labkey/test/tests/list/ListTest.java b/src/org/labkey/test/tests/list/ListTest.java index 418b3cbfc0..d82d02ce62 100644 --- a/src/org/labkey/test/tests/list/ListTest.java +++ b/src/org/labkey/test/tests/list/ListTest.java @@ -1654,7 +1654,6 @@ public void testAutoIncrementKeyEncoded() // setup a list with an auto-increment key that we need to make sure is encoded in the form input String encodedListName = "autoIncrementEncodeList"; String keyName = "'>'"; - String encodedKeyFieldName = EscapeUtil.getFormFieldName(keyName); _listHelper.createList(PROJECT_VERIFY, encodedListName, keyName, col("Name", ColumnType.String)); _listHelper.goToList(encodedListName); @@ -1666,7 +1665,7 @@ public void testAutoIncrementKeyEncoded() // insert a new row and verify the key field is not present table.clickInsertNewRow(); - checker().withScreenshot().verifyEquals("List fields on insert form.", List.of("quf_Name"), getQueryFormFieldNames()); + checker().withScreenshot().verifyEquals("List fields on insert form.", List.of("Name"), getQueryFormFieldNamesDecoded()); String nameValue = "test"; setFormElement(Locator.name(EscapeUtil.getFormFieldName("Name")), nameValue); clickButton("Submit"); @@ -1678,7 +1677,7 @@ public void testAutoIncrementKeyEncoded() // verify name value can be updated table.clickEditRow(0); - checker().withScreenshot().verifyEquals("List fields on update form.", List.of("quf_Name", encodedKeyFieldName), getQueryFormFieldNames()); + checker().withScreenshot().verifyEquals("List fields on update form.", List.of("Name", keyName), getQueryFormFieldNamesDecoded()); nameValue = "test updated"; setFormElement(Locator.name(EscapeUtil.getFormFieldName("Name")), nameValue); clickButton("Submit"); @@ -1728,12 +1727,20 @@ public void testMultiChoiceValues() _listHelper.deleteList(); } - private List getQueryFormFieldNames() + private List getQueryFormFieldNamesDecoded() { - return Locator.tag("input").attributeStartsWith("name", "quf_") - .findElements(getDriver()).stream() - .map(el -> el.getDomAttribute("name")) - .toList(); + ArrayList ret = new ArrayList<>(); + Locator.tag("input").attributeStartsWith("name", "quf_") + .findElements(getDriver()).stream() + .map(el -> el.getDomAttribute("name")) + .map(s -> s.substring(4)) + .forEach(name -> ret.add(name)); + Locator.tag("input").attributeStartsWith("name", "%_quf_") + .findElements(getDriver()).stream() + .map(el -> el.getDomAttribute("name")) + .map(name -> EscapeUtil.decode(name.substring(6))) + .forEach(name -> ret.add(name)); + return ret; } private void viewRawTableMetadata(String listName) diff --git a/src/org/labkey/test/util/EscapeUtil.java b/src/org/labkey/test/util/EscapeUtil.java index 6977dd0ba9..3ce61ed502 100644 --- a/src/org/labkey/test/util/EscapeUtil.java +++ b/src/org/labkey/test/util/EscapeUtil.java @@ -15,6 +15,7 @@ */ package org.labkey.test.util; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; import org.apache.poi.ss.util.WorkbookUtil; import org.eclipse.jetty.util.URIUtil; @@ -271,20 +272,25 @@ public static String getFormFieldName(String columnName, boolean multiValue) return getFormFieldName(columnName, (multiValue ? "[]" : "") + FORM_FIELD_PREFIX); } + + + static final String FIELD_ENCODED_PREFIX = "%_"; + /** * Escapes special characters in a column name to be used as a form field name. - * See associated {@link org.labkey.api.query.QueryUpdateForm#getFormFieldName} + * See associated {@link org.labkey.api.util.PageFlowUtil#encodeFormName} */ public static String getFormFieldName(String columnName, @Nullable String prefix) { - StringBuilder fieldName = new StringBuilder(); - for (char c : columnName.toCharArray()) - { - if (SPECIAL_CHARS.indexOf(c) >= 0) - fieldName.append(BACKSLASH); - fieldName.append(c); - } + String name = Objects.toString(prefix,"") + columnName; - return prefix == null ? fieldName.toString() : prefix + fieldName; + final String escapeChar = "%"; + final String problemChars = "\\\""; + final String unclean = escapeChar + problemChars; + if (!StringUtils.containsAny(name, unclean)) + return name; + var ret = FIELD_ENCODED_PREFIX + encode(name); + assert !StringUtils.containsAny(ret, problemChars); + return ret; } }