From 693fe4b7c22b72fc0ab63d43f1da49916e028ecb Mon Sep 17 00:00:00 2001 From: Trey Chadick Date: Tue, 4 Feb 2025 11:20:38 -0800 Subject: [PATCH 1/4] Add tests for escaped characters in markdown (#2256) --- .../labkey/test/tests/MessagesLongTest.java | 30 ++++++++++++------- .../labkey/test/tests/wiki/WikiLongTest.java | 14 +++++++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/org/labkey/test/tests/MessagesLongTest.java b/src/org/labkey/test/tests/MessagesLongTest.java index cf780b2f74..9bdbc372fd 100644 --- a/src/org/labkey/test/tests/MessagesLongTest.java +++ b/src/org/labkey/test/tests/MessagesLongTest.java @@ -74,8 +74,11 @@ public class MessagesLongTest extends BaseWebDriverTest private static final String USER3 = "messageslong_user3@messages.test"; private static final String NOT_A_USER = "Squirrel"; private static final String RESPONDER = "responder@messages.test"; + private static final String MACRO_WEBPART = "${labkey.webPart(partName='Lists')}"; private static final String HTML_BODY = "1 x\n" + - "${labkey.webPart(partName='Lists')}\n"; + "" + + MACRO_WEBPART + + "\n"; private static final String HTML_BODY_WEBPART_TEST = "manage lists"; private static final String MEMBER_LIST = "memberListInput"; private static final String TEMPLATE_TEXT = "***Please do not reply to this email notification. Replies to this email are routed to an unmonitored mailbox. Instead, please use the link below.***"; @@ -224,15 +227,19 @@ public void testSteps() InsertPage markdownPage = new InsertPage(getDriver()); assertEquals("default selection should be 'Markdown'",markdownPage.getRenderAs(), WikiHelper.WikiRendererType.MARKDOWN); markdownPage.setTitle("Markdown is a thing now") - .setBody("# Holy Header, Batman!\n" + - "**bold as bold can possibly be**\n" + - "\n" + - "```var foo = bar.fooValue;```\n" + - "\n" + - "## List of things I don't like \n" + - "+ hair clogs\n" + - "+ stinky feet\n" + - "+ internet trolls"); + .setBody(""" + # Holy Header, Batman! + **bold as bold can possibly be** + + ```var foo = bar.fooValue;``` + + ## List of things I don't like\s + + hair clogs + + stinky feet + + internet trolls + + escaped""" + + "\n" + MACRO_WEBPART); // now look at the preview pane markdownPage.selectPreviewTab(); @@ -240,6 +247,9 @@ public void testSteps() assertElementPresent(Locator.tagWithText("li", "hair clogs")); assertElementPresent(Locator.tagWithText("li", "stinky feet")); assertElementPresent(Locator.tagWithText("li", "internet trolls")); + assertElementPresent(Locator.tagWithText("p", "escaped")); + assertElementPresent(PortalHelper.Locators.webPart("Lists")); + assertElementPresent(Locator.linkWithText("manage lists")); clickButton("Submit"); assertElementPresent(Locator.tagWithText("h1", "Holy Header, Batman!")); assertElementPresent(Locator.tagWithText("strong", "bold as bold can possibly be")); diff --git a/src/org/labkey/test/tests/wiki/WikiLongTest.java b/src/org/labkey/test/tests/wiki/WikiLongTest.java index 071d826468..29de42d71c 100644 --- a/src/org/labkey/test/tests/wiki/WikiLongTest.java +++ b/src/org/labkey/test/tests/wiki/WikiLongTest.java @@ -25,6 +25,7 @@ import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.categories.Wiki; +import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.PortalHelper; import org.labkey.test.util.WikiHelper; import org.openqa.selenium.WebElement; @@ -121,6 +122,10 @@ public class WikiLongTest extends BaseWebDriverTest # Title MD ## Subtitle MD *italic text MD* + + escaped + + ${labkey.webPart(partName='Query', title='WebPart Macro', schemaName='core', queryName='containers', allowChooseQuery='true', allowChooseView='true')} """; private static final String SAFE_LINK_HTML = "Safe link"; @@ -222,13 +227,18 @@ public void testSteps() _wikiHelper.setWikiBody(WIKI_PAGE7_CONTENT); _wikiHelper.saveWikiPage(); // verify that after saving the markdown that it is rendered as html that does not include the markdown symbols - assertTextPresent("Title MD"); + assertElementPresent(Locator.tagWithText("h1", "Title MD")); + assertElementPresent(Locator.tagWithText("p", "escaped")); + assertElementPresent(PortalHelper.Locators.webPart("WebPart Macro")); + assertElementPresent(DataRegionTable.Locators.dataRegionTable().descendant(Locator.linkWithText(getProjectName()))); assertTextNotPresent("# Title MD"); clickAndWait(Locator.linkWithText("Edit")); _wikiHelper.convertWikiFormat("HTML"); // verify that after converting the markdown to html that it is rendered as html that does not include the markdown symbols _wikiHelper.saveWikiPage(); - assertTextPresent("Title MD"); + assertElementPresent(Locator.tagWithText("h1", "Title MD")); + assertElementPresent(Locator.tagWithText("p", "escaped")); + // Webpart macro assertTextNotPresent("# Title MD"); searchFor(PROJECT_NAME, "italic text MD", 1, WIKI_PAGE7_TITLE); From f56e42006885127995ac524dbfc7e03bf8b04d34 Mon Sep 17 00:00:00 2001 From: Trey Chadick Date: Tue, 4 Feb 2025 13:28:03 -0800 Subject: [PATCH 2/4] Add getTableData method to html Table component (#2257) --- .../labkey/test/components/html/Table.java | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/org/labkey/test/components/html/Table.java b/src/org/labkey/test/components/html/Table.java index ddfc74e2f8..b7dfdfaf3c 100644 --- a/src/org/labkey/test/components/html/Table.java +++ b/src/org/labkey/test/components/html/Table.java @@ -26,7 +26,9 @@ import org.openqa.selenium.WebElement; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class Table extends WebDriverComponent { @@ -62,7 +64,7 @@ protected Elements newElementCache() return new Elements(); } - protected class Elements extends Component.ElementCache + protected class Elements extends Component.ElementCache { List rows; @@ -86,7 +88,7 @@ public int getRowCount() */ public List getTableHeaderTexts() { - List headerEls = Locator.xpath("//thead//th").findElements(this); + List headerEls = Locator.xpath("./thead/tr[1]/th").findElements(this); List columnHeaders = new ArrayList<>(); for(WebElement headerEl : headerEls){columnHeaders.add(headerEl.getText());} return columnHeaders; @@ -94,7 +96,7 @@ public List getTableHeaderTexts() public int getTableHeaderIndex(String headerText) { - List headerEls = Locator.xpath("//thead//th").findElements(this); + List headerEls = Locator.xpath("./thead/tr[1]/th").findElements(this); int counter = 1; for(WebElement headerEl : headerEls) { @@ -105,6 +107,36 @@ public int getTableHeaderIndex(String headerText) throw new RuntimeException( headerText + " column not found"); } + /** + * Get table data as a list of maps. Each map represents a row.
+ * Assumes a simple table with a single header row with no colspans and unique header labels + * @return table data + */ + public List> getTableData() + { + List> data = new ArrayList<>(); + + List headerTexts = getTableHeaderTexts(); + List rows = elementCache().getRows(); + + for (WebElement row : rows) + { + List dataTexts = getWrapper().getTexts(Locator.tag("td").findElements(row)); + if (headerTexts.size() != dataTexts.size()) + { + throw new IllegalStateException("Size of row %s doesn't match table header %s".formatted(dataTexts, headerTexts)); + } + Map rowMap = new LinkedHashMap<>(); + for (int i = 0; i < headerTexts.size(); i++) + { + rowMap.put(headerTexts.get(i), dataTexts.get(i)); + } + data.add(rowMap); + } + + return data; + } + public List getTableHeaderColumnData(String headerText) { List columnData = new ArrayList<>(); From 9dcdc82ce4df21b5850d0ed75d42337c4290a0b1 Mon Sep 17 00:00:00 2001 From: RosalineP Date: Mon, 10 Feb 2025 08:40:45 -0800 Subject: [PATCH 3/4] Issue 51620: Remove the UI for Object-level discussions Test Updates (#2262) --- .../labkey/test/tests/announcements/DiscussionLinkTest.java | 4 ++-- src/org/labkey/test/tests/wiki/WikiLongTest.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java b/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java index 164cdeacf0..ca79cdfcf9 100644 --- a/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java +++ b/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java @@ -23,6 +23,7 @@ import org.labkey.test.Locator; import org.labkey.test.categories.Daily; import org.labkey.test.pages.core.admin.ProjectSettingsPage; +import org.labkey.test.util.OptionalFeatureHelper; import org.labkey.test.util.PortalHelper; import org.labkey.test.util.WikiHelper; @@ -50,8 +51,7 @@ private void doSetup() _containerHelper.createProject(getProjectName()); // Issue 51620: Remove the UI for Object-level discussions - goToAdminConsole().clickDeprecatedFeatures(); - click(Locator.inputById("deprecatedObjectLevelDiscussions")); + OptionalFeatureHelper.enableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); } @Before diff --git a/src/org/labkey/test/tests/wiki/WikiLongTest.java b/src/org/labkey/test/tests/wiki/WikiLongTest.java index 071d826468..28f1ec11a5 100644 --- a/src/org/labkey/test/tests/wiki/WikiLongTest.java +++ b/src/org/labkey/test/tests/wiki/WikiLongTest.java @@ -25,6 +25,7 @@ import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.categories.Wiki; +import org.labkey.test.util.OptionalFeatureHelper; import org.labkey.test.util.PortalHelper; import org.labkey.test.util.WikiHelper; import org.openqa.selenium.WebElement; @@ -157,6 +158,9 @@ protected String getProjectName() @Test public void testSteps() { + // Issue 51620: Remove the UI for Object-level discussions + OptionalFeatureHelper.enableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); + enableEmailRecorder(); _containerHelper.createProject(PROJECT2_NAME, null); _containerHelper.enableModule(PROJECT2_NAME, "MS2"); From f4c2298eb14d81ff00a760b8f80a6cc61726e696 Mon Sep 17 00:00:00 2001 From: RosalineP Date: Mon, 10 Feb 2025 14:54:55 -0800 Subject: [PATCH 4/4] Issue 51620: Remove the UI for Object-level discussions Test Updates (#2266) --- src/org/labkey/test/pages/core/admin/ShowAdminPage.java | 6 +++--- src/org/labkey/test/tests/NonStudyReportsTest.java | 5 +++++ .../test/tests/announcements/DiscussionLinkTest.java | 8 ++++++++ src/org/labkey/test/tests/wiki/WikiLongTest.java | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/org/labkey/test/pages/core/admin/ShowAdminPage.java b/src/org/labkey/test/pages/core/admin/ShowAdminPage.java index 5f295cf577..d820f6a97a 100644 --- a/src/org/labkey/test/pages/core/admin/ShowAdminPage.java +++ b/src/org/labkey/test/pages/core/admin/ShowAdminPage.java @@ -23,6 +23,7 @@ import org.labkey.test.pages.LabKeyPage; import org.labkey.test.pages.compliance.ComplianceSettingsAccountsPage; import org.labkey.test.pages.core.login.LoginConfigurePage; +import org.labkey.test.util.OptionalFeatureHelper; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -133,8 +134,8 @@ public DomainDesignerPage clickChangeUserProperties() public void clickDeprecatedFeatures() { - goToSettingsSection(); - clickAndWait(elementCache().deprecatedFeaturesLink); + throw new UnsupportedOperationException("Use %s to manage experimental/optional/deprecated features" + .formatted(OptionalFeatureHelper.class.getSimpleName())); } public void clickEmailCustomization() @@ -267,7 +268,6 @@ protected class ElementCache extends LabKeyPage.ElementCache protected WebElement configurePageElements = Locator.linkWithText("configure page elements").findWhenNeeded(this); protected WebElement complianceSettings = Locator.linkWithText("Compliance Settings").findWhenNeeded(this); protected WebElement changeUserPropertiesLink = Locator.linkWithText("change user properties").findWhenNeeded(this); - protected WebElement deprecatedFeaturesLink = Locator.linkWithText("deprecated features").findWhenNeeded(this); protected WebElement emailCustomizationLink = Locator.linkWithText("email customization").findWhenNeeded(this); protected WebElement notificationServiceAdminLink = Locator.linkWithText("notification service admin").findWhenNeeded(this); protected WebElement filesLink = Locator.linkWithText("files").findWhenNeeded(this); diff --git a/src/org/labkey/test/tests/NonStudyReportsTest.java b/src/org/labkey/test/tests/NonStudyReportsTest.java index 5d3949800b..8ea6bbb740 100644 --- a/src/org/labkey/test/tests/NonStudyReportsTest.java +++ b/src/org/labkey/test/tests/NonStudyReportsTest.java @@ -26,6 +26,7 @@ import org.labkey.test.categories.Reports; import org.labkey.test.components.html.BootstrapMenu; import org.labkey.test.util.LogMethod; +import org.labkey.test.util.OptionalFeatureHelper; import org.labkey.test.util.PortalHelper; import org.labkey.test.util.RReportHelper; import org.labkey.test.util.ext4cmp.Ext4FileFieldRef; @@ -65,6 +66,7 @@ public class NonStudyReportsTest extends ReportTest protected void doCleanup(boolean afterTest) throws TestTimeoutException { _userHelper.deleteUsers(false, ATTACHMENT_USER); + OptionalFeatureHelper.disableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); super.doCleanup(afterTest); } @@ -258,6 +260,9 @@ private void doThumbnailChangeTest() @LogMethod private void doReportDiscussionTest() { + // Issue 51620: Remove the UI for Object-level discussions + OptionalFeatureHelper.enableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); + clickProject(getProjectName()); goToManageViews(); diff --git a/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java b/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java index ca79cdfcf9..7e9fa26382 100644 --- a/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java +++ b/src/org/labkey/test/tests/announcements/DiscussionLinkTest.java @@ -21,6 +21,7 @@ import org.junit.experimental.categories.Category; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; +import org.labkey.test.TestTimeoutException; import org.labkey.test.categories.Daily; import org.labkey.test.pages.core.admin.ProjectSettingsPage; import org.labkey.test.util.OptionalFeatureHelper; @@ -54,6 +55,13 @@ private void doSetup() OptionalFeatureHelper.enableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); } + @Override + protected void doCleanup(boolean afterTest) throws TestTimeoutException + { + OptionalFeatureHelper.disableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); + super.doCleanup(afterTest); + } + @Before public void preTest() { diff --git a/src/org/labkey/test/tests/wiki/WikiLongTest.java b/src/org/labkey/test/tests/wiki/WikiLongTest.java index 28f1ec11a5..2129fcbd53 100644 --- a/src/org/labkey/test/tests/wiki/WikiLongTest.java +++ b/src/org/labkey/test/tests/wiki/WikiLongTest.java @@ -781,6 +781,7 @@ protected void selectRenderType(String renderType) @Override protected void doCleanup(boolean afterTest) throws TestTimeoutException { + OptionalFeatureHelper.disableOptionalFeature(createDefaultConnection(), "deprecatedObjectLevelDiscussions"); deleteUsersIfPresent(USER1); _containerHelper.deleteProject(PROJECT2_NAME, afterTest); _containerHelper.deleteProject(PROJECT_NAME, afterTest);