From a0903b9d0394694bd5eb715f807d663c6fc0b3a8 Mon Sep 17 00:00:00 2001 From: Chris Joosse Date: Wed, 27 Nov 2024 13:26:13 -0800 Subject: [PATCH 1/4] Update SelectInputOption to use identifying fields dom (#2155) --- .../components/react/SelectInputOption.java | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/org/labkey/test/components/react/SelectInputOption.java b/src/org/labkey/test/components/react/SelectInputOption.java index 3bf144e690..32e2d23ad9 100644 --- a/src/org/labkey/test/components/react/SelectInputOption.java +++ b/src/org/labkey/test/components/react/SelectInputOption.java @@ -51,7 +51,15 @@ public boolean isFocused() public Map getData() { - return elementCache().getData(); + List fieldRows = elementCache().identifyingFieldLoc.findElements(this); + Map data = new CaseInsensitiveHashMap<>(); + for(WebElement fieldRow : fieldRows) + { + String fieldLabel = elementCache().fieldLabelLoc.findElement(fieldRow).getText(); + String fieldValue = elementCache().fieldValueLoc.findElement(fieldRow).getText(); + data.put(StringUtils.stripEnd(fieldLabel, ":"), fieldValue); + } + return data; } @Override @@ -69,21 +77,10 @@ protected ElementCache elementCache() protected class ElementCache extends Component.ElementCache { - public Locator.XPathLocator text_truncatePairLoc = Locator.tagWithClass("div", "text__truncate"); - - public Map getData() - { - Map data = new CaseInsensitiveHashMap<>(); - var elements = text_truncatePairLoc.findElements(this); - for (WebElement el : elements) - { - WebElement keyEl = Locator.tagWithClass("span", "identifying_field_label").findElement(el); - WebElement valEl = Locator.tag("span").findElements(el).get(1); - data.put(StringUtils.stripEnd(keyEl.getText(), ":"), valEl.getText()); - } - return data; - } - + public Locator.XPathLocator fieldLabelLoc = Locator.tagWithClass("span", "identifying_field_label"); + public Locator.XPathLocator identifyingFieldLoc = Locator.tag("div") + .withChild(fieldLabelLoc); + public Locator fieldValueLoc = fieldLabelLoc.followingSibling("span"); } @@ -116,10 +113,11 @@ protected SelectInputOption construct(WebElement el, WebDriver driver) protected Locator locator() { if (_key != null) - return _baseLocator.withChild(Locator.tagWithClass("div", "text__truncate") - .withChild(Locator.tagWithText("strong",_key)) - .parent() // children are siblings - .withChild(Locator.tagWithAttributeContaining("span", "title", _value))); + return _baseLocator.withChild( + Locator.tag("div").withChild( + Locator.tagWithClass("span", "identifying_field_label").withText(_key + ":") + .parent()) // children are siblings + .withChild(Locator.tagWithText("span", _value))); else return _baseLocator; } From a3e32db0782407157aa0ce7988e9039cee72282a Mon Sep 17 00:00:00 2001 From: Josh Eckels Date: Mon, 2 Dec 2024 12:36:11 -0800 Subject: [PATCH 2/4] Issue 51749: Site validator fails on some wikis (#2156) --- src/org/labkey/test/BaseWebDriverTest.java | 8 +- .../pages/core/admin/BaseSettingsPage.java | 6 +- .../test/pages/core/admin/ShowAdminPage.java | 8 ++ .../pages/core/admin/SiteValidationPage.java | 115 ++++++++++++++++++ .../test/tests/DatabaseDiagnosticsTest.java | 30 ++--- .../test/tests/wiki/EmbeddedWebPartTest.java | 2 +- .../test/tests/wiki/WikiAliasesTest.java | 2 +- .../labkey/test/tests/wiki/WikiCspTest.java | 105 ++++++++++++++++ .../test/tests/wiki/WikiHistoryTest.java | 4 +- .../labkey/test/tests/wiki/WikiLongTest.java | 60 ++++----- src/org/labkey/test/tests/wiki/WikiTest.java | 18 +-- src/org/labkey/test/util/CspLogUtil.java | 6 +- src/org/labkey/test/util/WikiHelper.java | 10 ++ 13 files changed, 304 insertions(+), 70 deletions(-) create mode 100644 src/org/labkey/test/pages/core/admin/SiteValidationPage.java create mode 100644 src/org/labkey/test/tests/wiki/WikiCspTest.java diff --git a/src/org/labkey/test/BaseWebDriverTest.java b/src/org/labkey/test/BaseWebDriverTest.java index f1e95b99ac..807e007edf 100644 --- a/src/org/labkey/test/BaseWebDriverTest.java +++ b/src/org/labkey/test/BaseWebDriverTest.java @@ -246,7 +246,7 @@ public BaseWebDriverTest() _cspCheckPageLoadListener = new CspCheckPageLoadListener(this); String seleniumBrowser = System.getProperty("selenium.browser"); - if (seleniumBrowser == null || seleniumBrowser.length() == 0) + if (seleniumBrowser == null || seleniumBrowser.isEmpty()) { if (isTestRunningOnTeamCity()) BROWSER_TYPE = BrowserType.FIREFOX; @@ -277,9 +277,9 @@ public Set getUrlsSeen() return urlsSeen; } - public static BaseWebDriverTest getCurrentTest() + public static T getCurrentTest() { - return currentTest; + return (T)currentTest; } private static Class getCurrentTestClass() @@ -2859,7 +2859,7 @@ public int hashCode() @Override public String toString() { - return getClass().getSimpleName() + "-" + _artifactCollector.getDumpDirName(); + return getClass().getSimpleName() + "-" + _artifactCollector.getDumpDirName() + "@" + System.identityHashCode(this); } } } diff --git a/src/org/labkey/test/pages/core/admin/BaseSettingsPage.java b/src/org/labkey/test/pages/core/admin/BaseSettingsPage.java index 3772153237..043d7c0d45 100644 --- a/src/org/labkey/test/pages/core/admin/BaseSettingsPage.java +++ b/src/org/labkey/test/pages/core/admin/BaseSettingsPage.java @@ -327,9 +327,9 @@ protected class ElementCache extends LabKeyPage.ElementCache WebElement defaultDateTimeTimeFormat = Locator.id("timeSelect").findWhenNeeded(this); WebElement defaultNumberFormat = Locator.inputByNameContaining("defaultNumberFormat").findWhenNeeded(this); - WebElement additionalParsingPatternDates = Locator.inputByNameContaining("extraDateParsingPattern").findElement(this); - WebElement additionalParsingPatternTimes = Locator.inputByNameContaining("extraTimeParsingPattern").findElement(this); - WebElement additionalParsingPatternDateAndTime = Locator.inputByNameContaining("extraDateTimeParsingPattern").findElement(this); + WebElement additionalParsingPatternDates = Locator.inputByNameContaining("extraDateParsingPattern").findWhenNeeded(this); + WebElement additionalParsingPatternTimes = Locator.inputByNameContaining("extraTimeParsingPattern").findWhenNeeded(this); + WebElement additionalParsingPatternDateAndTime = Locator.inputByNameContaining("extraDateTimeParsingPattern").findWhenNeeded(this); WebElement restrictChartingColsChk = Locator.checkboxByName("restrictedColumnsEnabled").findWhenNeeded(this); WebElement altLoginPageTxt = Locator.inputById("customLogin").findWhenNeeded(this); WebElement saveBtn = Locator.lkButton("Save").findWhenNeeded(this); diff --git a/src/org/labkey/test/pages/core/admin/ShowAdminPage.java b/src/org/labkey/test/pages/core/admin/ShowAdminPage.java index d27fe2cb51..c6022672f9 100644 --- a/src/org/labkey/test/pages/core/admin/ShowAdminPage.java +++ b/src/org/labkey/test/pages/core/admin/ShowAdminPage.java @@ -163,6 +163,13 @@ public FolderTypePages clickFolderType() return new FolderTypePages(getDriver()); } + public SiteValidationPage clickSiteValidation() + { + goToSettingsSection(); + clickAndWait(elementCache().siteValidationLink); + return new SiteValidationPage(getDriver()); + } + public LookAndFeelSettingsPage clickLookAndFeelSettings() { goToSettingsSection(); @@ -259,6 +266,7 @@ protected class ElementCache extends LabKeyPage.ElementCache protected WebElement filesLink = Locator.linkWithText("files").findWhenNeeded(this); protected WebElement fullTextSearchLink = Locator.linkWithText("full-text search").findWhenNeeded(this); protected WebElement folderTypeLink = Locator.linkWithText("folder types").findWhenNeeded(this); + protected WebElement siteValidationLink = Locator.linkWithText("site validation").findWhenNeeded(this); protected WebElement lookAndFeelSettingsLink = Locator.linkWithText("look and feel settings").findWhenNeeded(this); protected WebElement masterPatientIndex = Locator.linkWithText("Master Patient Index").findWhenNeeded(this); protected WebElement profilerLink = Locator.linkWithText("profiler").findWhenNeeded(this); diff --git a/src/org/labkey/test/pages/core/admin/SiteValidationPage.java b/src/org/labkey/test/pages/core/admin/SiteValidationPage.java new file mode 100644 index 0000000000..b8ea887332 --- /dev/null +++ b/src/org/labkey/test/pages/core/admin/SiteValidationPage.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2017-2019 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.labkey.test.pages.core.admin; + +import org.labkey.test.Locator; +import org.labkey.test.WebDriverWrapper; +import org.labkey.test.WebTestHelper; +import org.labkey.test.components.html.Checkbox; +import org.labkey.test.components.html.RadioButton; +import org.labkey.test.pages.pipeline.PipelineStatusDetailsPage; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class SiteValidationPage extends BaseSettingsPage +{ + public SiteValidationPage(WebDriver driver) + { + super(driver); + waitForPage(); + } + + @Override + protected void waitForPage() + { + Locator.waitForAnyElement(shortWait(), Locator.lkButton("Validate")); + } + + public static SiteValidationPage beginAt(WebDriverWrapper wrapper) + { + wrapper.beginAt(WebTestHelper.buildURL("admin", "configureSiteValidation")); + return new SiteValidationPage(wrapper.getDriver()); + } + + + public void setWholeSite(boolean wholeSite) + { + RadioButton button; + + if (wholeSite) + button = new RadioButton(elementCache().wholeSiteRadio); + else + button = new RadioButton(elementCache().projectsOnlyRadio); + + button.check(); + } + + @Override + protected ElementCache elementCache() + { + return (ElementCache) super.elementCache(); + } + + @Override + protected ElementCache newElementCache() + { + return new ElementCache(); + } + + public void setAllValidators(boolean enabled) + { + WebElement formEl = Locator.id("form").findElement(getDriver()); + // Enable all validators + Locator.tagWithAttribute("input", "name", "provider") + .findElements(formEl).forEach(x -> setCheckbox(x, enabled)); + } + + public void setBackground(boolean background) + { + // Run in background + checkCheckbox(Locator.id("background")); + new Checkbox(elementCache().backgroundCheckbox).set(background); + } + + public PipelineStatusDetailsPage clickValidateInBackground() + { + setBackground(true); + clickAndWait(elementCache().validateButton); + return new PipelineStatusDetailsPage(getDriver()); + } + + public void setWikiValidator(boolean checked) + { + new Checkbox(elementCache().wikiCheckbox).set(checked); + } + + protected class ElementCache extends BaseSettingsPage.ElementCache + { + WebElement displayFormatCheckbox = Locator.xpath("//input[@name='providers' and @value='Display Format Validator']").findWhenNeeded(this); + WebElement permissionsCheckbox = Locator.xpath("//input[@name='providers' and @value='Permissions Validator']").findWhenNeeded(this); + WebElement pipelineCheckbox = Locator.xpath("//input[@name='providers' and @value='Pipeline Validator']").findWhenNeeded(this); + WebElement fileRootSizeCheckbox = Locator.xpath("//input[@name='providers' and @value='File Root Size']").findWhenNeeded(this); + WebElement wikiCheckbox = Locator.xpath("//input[@name='providers' and @value='Wiki Validator']").findWhenNeeded(this); + + WebElement wholeSiteRadio = Locator.xpath("//input[@name='includeSubfolders' and @value='true']").findWhenNeeded(this); + WebElement projectsOnlyRadio = Locator.xpath("//input[@name='includeSubfolders' and @value='false']").findWhenNeeded(this); + + WebElement backgroundCheckbox = Locator.xpath("//input[@name='background']").findWhenNeeded(this); + + WebElement validateButton = Locator.lkButton("Validate").findWhenNeeded(this); + } + +} diff --git a/src/org/labkey/test/tests/DatabaseDiagnosticsTest.java b/src/org/labkey/test/tests/DatabaseDiagnosticsTest.java index 12e99657b2..3cbf72ecaa 100644 --- a/src/org/labkey/test/tests/DatabaseDiagnosticsTest.java +++ b/src/org/labkey/test/tests/DatabaseDiagnosticsTest.java @@ -16,6 +16,7 @@ package org.labkey.test.tests; import org.junit.Assume; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; import org.labkey.test.BaseWebDriverTest; @@ -29,12 +30,16 @@ import org.labkey.test.categories.Daily; import org.labkey.test.categories.Git; import org.labkey.test.io.Grep; +import org.labkey.test.pages.core.admin.SiteValidationPage; import org.labkey.test.pages.pipeline.PipelineStatusDetailsPage; +import org.labkey.test.util.CspLogUtil; import org.labkey.test.util.Maps; import org.labkey.test.util.Order; import org.labkey.test.util.PasswordUtil; import org.labkey.test.util.PipelineStatusTable; +import org.labkey.test.util.PortalHelper; import org.labkey.test.util.TextSearcher; +import org.labkey.test.util.WikiHelper; import org.openqa.selenium.WebElement; import java.io.File; @@ -45,6 +50,7 @@ import static org.junit.Assert.assertTrue; +/** Intended to be run at the end of suites to do some extra validation, without adding much extra overhead. */ @Category({BVT.class, Daily.class, Git.class, CustomModules.class}) @Order(1) @BaseWebDriverTest.ClassTimeout(minutes = 20) @@ -74,29 +80,18 @@ public void validateDomainsTest() @Test public void testSiteValidator() { - goToAdminConsole().goToSettingsSection(); - - clickAndWait(Locator.linkWithText("site validation")); + SiteValidationPage validationPage = goToAdminConsole().clickSiteValidation(); - WebElement formEl = Locator.id("form").findElement(getDriver()); - - // Enable all validators - Locator.tagWithAttribute("input", "type", "checkbox") - .findElements(formEl).forEach(this::checkCheckbox); + validationPage.setAllValidators(true); // Validate projects and subfolders - checkRadioButton(Locator.radioButtonByNameAndValue("includeSubfolders", "true")); - - // Run in background - checkCheckbox(Locator.id("background")); + validationPage.setWholeSite(true); - clickAndWait(Locator.lkButton("Validate")); + PipelineStatusDetailsPage jobPage = validationPage.clickValidateInBackground(); - new PipelineStatusDetailsPage(getDriver()) - .waitForComplete(300_000) + jobPage.waitForComplete(300_000) .assertLogTextContains("Site validation complete"); - - clickAndWait(Locator.lkButton("Data")); + jobPage.clickDataLink(); assertNoLabKeyErrors(); TextSearcher textSearcher = new TextSearcher(getText(Locators.bodyPanel())); @@ -104,6 +99,7 @@ public void testSiteValidator() "Site Level Validation Results", "Folder Validation Results", "Module: Core", "Permissions Validator", "Display Format Validator", "Module: Pipeline", "Pipeline Validator"); + assertTextNotPresent(textSearcher, "Error"); } diff --git a/src/org/labkey/test/tests/wiki/EmbeddedWebPartTest.java b/src/org/labkey/test/tests/wiki/EmbeddedWebPartTest.java index ac40ecb670..0c92de1c38 100644 --- a/src/org/labkey/test/tests/wiki/EmbeddedWebPartTest.java +++ b/src/org/labkey/test/tests/wiki/EmbeddedWebPartTest.java @@ -71,7 +71,7 @@ private void embeddedQueryWebPartDoesNotRefreshOnChange() //embed query part in wiki page portalHelper.addWebPart("Wiki"); wikiHelper.createNewWikiPage(); - setFormElement(Locator.name("name"), TRICKY_CHARACTERS + "wiki page"); + wikiHelper.setWikiName(TRICKY_CHARACTERS + "wiki page"); wikiHelper.setWikiBody(TestFileUtils.getFileContents(TestFileUtils.getSampleData("api/EmbeddedQueryWebPart.html"))); diff --git a/src/org/labkey/test/tests/wiki/WikiAliasesTest.java b/src/org/labkey/test/tests/wiki/WikiAliasesTest.java index 86a6c280b9..25bc661a97 100644 --- a/src/org/labkey/test/tests/wiki/WikiAliasesTest.java +++ b/src/org/labkey/test/tests/wiki/WikiAliasesTest.java @@ -33,7 +33,7 @@ public class WikiAliasesTest extends BaseWebDriverTest @BeforeClass public static void setupProject() { - WikiAliasesTest init = (WikiAliasesTest) getCurrentTest(); + WikiAliasesTest init = getCurrentTest(); init.doSetup(); } diff --git a/src/org/labkey/test/tests/wiki/WikiCspTest.java b/src/org/labkey/test/tests/wiki/WikiCspTest.java new file mode 100644 index 0000000000..79d09e60b6 --- /dev/null +++ b/src/org/labkey/test/tests/wiki/WikiCspTest.java @@ -0,0 +1,105 @@ +package org.labkey.test.tests.wiki; + +import org.jetbrains.annotations.Nullable; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.labkey.test.BaseWebDriverTest; +import org.labkey.test.Locators; +import org.labkey.test.categories.Daily; +import org.labkey.test.categories.Wiki; +import org.labkey.test.pages.core.admin.SiteValidationPage; +import org.labkey.test.pages.pipeline.PipelineStatusDetailsPage; +import org.labkey.test.util.CspLogUtil; +import org.labkey.test.util.TextSearcher; +import org.labkey.test.util.WikiHelper; + +import java.util.Arrays; +import java.util.List; + +@Category({Daily.class, Wiki.class}) +@BaseWebDriverTest.ClassTimeout(minutes = 2) +public class WikiCspTest extends BaseWebDriverTest +{ + private static final String PROJECT_NAME = TRICKY_CHARACTERS_FOR_PROJECT_NAMES + "WikiCspTest"; + private static final String WIKI_PAGE_TITLE = "TOC_with_inline"; + private static final String WIKI_PAGE_BODY = "${labkey.webPart(partName='Wiki TOC', showFrame='false')}\n" + + "
Click me
"; + + @BeforeClass + public static void setupProject() + { + WikiCspTest init = getCurrentTest(); + init.doSetup(); + } + + @Override + public List getAssociatedModules() + { + return List.of("Wiki"); + } + + @Override + protected @Nullable String getProjectName() + { + return PROJECT_NAME; + } + + private void doSetup() + { + _containerHelper.createProject(PROJECT_NAME, null); + _containerHelper.enableModules(Arrays.asList("Wiki")); + goToProjectHome(); + } + + @Override + protected void checkLeaks() + { + // No-op to avoid triggering the CSP violation during the crawl + } + + @Test + public void testCspChecks() + { + goToProjectHome(PROJECT_NAME); + + // Issue 51749 - Create a CSP problem and a Wiki table of contents that caused a problem when checked in the background + WikiHelper wikiHelper = new WikiHelper(this); + wikiHelper.createNewWikiPage("HTML"); + wikiHelper.setWikiName(WIKI_PAGE_TITLE); + wikiHelper.setWikiTitle(WIKI_PAGE_TITLE); + wikiHelper.setWikiBody(WIKI_PAGE_BODY); + wikiHelper.saveWikiPage(); + + waitForText("Click me"); + + try + { + CspLogUtil.checkNewCspWarnings(getArtifactCollector()); + } + catch (CspLogUtil.CspWarningDetectedException ignore) {} + + goToAdminConsole().goToSettingsSection(); + + SiteValidationPage validationPage = goToAdminConsole().clickSiteValidation(); + validationPage.setAllValidators(false); + validationPage.setWikiValidator(true); + + PipelineStatusDetailsPage jobPage = validationPage.clickValidateInBackground(); + + jobPage.waitForComplete(60_000) + .assertLogTextContains("Site validation complete"); + jobPage.clickDataLink(); + + assertNoLabKeyErrors(); + TextSearcher textSearcher = new TextSearcher(getText(Locators.bodyPanel())); + assertTextPresent(textSearcher, + "Wiki Validator"); + + assertTextNotPresent(textSearcher, "Error"); + + // Issue 51749 - check for expected CSP problem + assertTextPresent(textSearcher, WIKI_PAGE_TITLE + " (" + WIKI_PAGE_TITLE + "): onclick"); + } +} diff --git a/src/org/labkey/test/tests/wiki/WikiHistoryTest.java b/src/org/labkey/test/tests/wiki/WikiHistoryTest.java index 52483a5e9e..c2d9c32346 100644 --- a/src/org/labkey/test/tests/wiki/WikiHistoryTest.java +++ b/src/org/labkey/test/tests/wiki/WikiHistoryTest.java @@ -83,8 +83,8 @@ public void testSteps() log("test create new html page with a webpart"); wikiHelper.createNewWikiPage("HTML"); - setFormElement(Locator.name("name"), WIKI_PAGE_TITLE); - setFormElement(Locator.name("title"), WIKI_PAGE_TITLE); + wikiHelper.setWikiName(WIKI_PAGE_TITLE); + wikiHelper.setWikiTitle(WIKI_PAGE_TITLE); wikiHelper.setWikiBody(WIKI_PAGE_CONTENT); wikiHelper.saveWikiPage(); diff --git a/src/org/labkey/test/tests/wiki/WikiLongTest.java b/src/org/labkey/test/tests/wiki/WikiLongTest.java index c626d547ce..071d826468 100644 --- a/src/org/labkey/test/tests/wiki/WikiLongTest.java +++ b/src/org/labkey/test/tests/wiki/WikiLongTest.java @@ -191,9 +191,9 @@ public void testSteps() log("Test new wiki page"); _wikiHelper.createNewWikiPage("RADEOX"); - setFormElement(Locator.name("name"), WIKI_PAGE1_NAME); - setFormElement(Locator.name("title"), WIKI_PAGE1_TITLE); - setFormElement(Locator.name("body"), WIKI_PAGE1_CONTENT); + _wikiHelper.setWikiName(WIKI_PAGE1_NAME); + _wikiHelper.setWikiTitle(WIKI_PAGE1_TITLE); + _wikiHelper.setWikiBody(WIKI_PAGE1_CONTENT); _wikiHelper.saveWikiPage(); searchFor(PROJECT_NAME, "normal normal normal", 1, WIKI_PAGE1_TITLE); @@ -206,8 +206,8 @@ public void testSteps() clickAndWait(Locator.linkWithText("add content")); _wikiHelper.convertWikiFormat("RADEOX"); - setFormElement(Locator.name("title"), WIKI_PAGE2_TITLE); - setFormElement(Locator.name("body"), WIKI_PAGE2_CONTENT); + _wikiHelper.setWikiTitle(WIKI_PAGE2_TITLE); + _wikiHelper.setWikiBody(WIKI_PAGE2_CONTENT); _wikiHelper.saveWikiPage(); clickAndWait(Locator.linkWithText("Welcome to the WikiLongTest")); @@ -217,9 +217,9 @@ public void testSteps() log("Test new wiki page using markdown"); _wikiHelper.createNewWikiPage("MARKDOWN"); - setFormElement(Locator.name("name"), WIKI_PAGE7_NAME); - setFormElement(Locator.name("title"), WIKI_PAGE7_TITLE); - setFormElement(Locator.name("body"), WIKI_PAGE7_CONTENT); + _wikiHelper.setWikiName(WIKI_PAGE7_NAME); + _wikiHelper.setWikiTitle(WIKI_PAGE7_TITLE); + _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"); @@ -234,8 +234,8 @@ public void testSteps() log("test html wiki containing malformed javascript entities... we should allow this, see #12268"); _wikiHelper.createNewWikiPage(); - setFormElement(Locator.name("name"), WIKI_PAGE5_NAME); - setFormElement(Locator.name("title"), WIKI_PAGE5_TITLE); + _wikiHelper.setWikiName(WIKI_PAGE5_NAME); + _wikiHelper.setWikiTitle(WIKI_PAGE5_TITLE); _wikiHelper.setWikiBody(WIKI_PAGE5_CONTENT); _wikiHelper.saveWikiPage(); assertTextNotPresent("New Page"); // Should not be an error, so should have left the editor @@ -243,8 +243,8 @@ public void testSteps() log("test create new html page with a webpart"); _wikiHelper.createNewWikiPage("HTML"); - setFormElement(Locator.name("name"), WIKI_PAGE3_NAME_TITLE); - setFormElement(Locator.name("title"), WIKI_PAGE3_NAME_TITLE); + _wikiHelper.setWikiName(WIKI_PAGE3_NAME_TITLE); + _wikiHelper.setWikiTitle(WIKI_PAGE3_NAME_TITLE); selectOptionByText(Locator.name("parent"), WIKI_PAGE2_TITLE + " (" + WIKI_PAGE2_NAME + ")"); _wikiHelper.setWikiBody(WIKI_PAGE3_CONTENT); log("test attachments in wiki"); @@ -261,7 +261,7 @@ public void testSteps() log("test edit"); clickAndWait(Locator.linkWithText("Edit")); - setFormElement(Locator.name("title"), WIKI_PAGE3_ALTTITLE); + _wikiHelper.setWikiTitle(WIKI_PAGE3_ALTTITLE); String wikiPage3ContentEdited = "Some HTML content
\n" + "More HTML content
\n" + @@ -272,7 +272,7 @@ public void testSteps() assertTextPresent("More HTML content"); clickAndWait(Locator.linkWithText("Edit")); _wikiHelper.setWikiBody(WIKI_PAGE3_CONTENT_NO_QUERY); - setFormElement(Locator.name("title"), WIKI_PAGE3_NAME_TITLE); + _wikiHelper.setWikiTitle(WIKI_PAGE3_NAME_TITLE); _wikiHelper.saveWikiPage(); log("test change renderer type"); @@ -329,7 +329,7 @@ public void testSteps() click(Locator.linkWithText("discussions")); waitForElement(Locator.linkWithText("Start new discussion"), defaultWaitForPage); clickAndWait(Locator.linkWithText("Start new discussion")); - setFormElement(Locator.name("title"), DISC1_TITLE); + _wikiHelper.setWikiTitle(DISC1_TITLE); setFormElement(Locator.id("body"), DISC1_BODY); submit(); _ext4Helper.waitForOnReady(); @@ -341,7 +341,7 @@ public void testSteps() log("Check response on discussion board works"); clickButton("Respond"); - setFormElement(Locator.name("title"), RESP1_TITLE); + _wikiHelper.setWikiTitle(RESP1_TITLE); setFormElement(Locator.id("body"), RESP1_BODY); submit(); assertTextPresent(RESP1_TITLE, @@ -352,8 +352,8 @@ public void testSteps() log("test navTree and header"); _wikiHelper.createNewWikiPage("RADEOX"); - setFormElement(Locator.name("name"), "_navTree"); - setFormElement(Locator.name("title"), WIKI_NAVTREE_TITLE); + _wikiHelper.setWikiName("_navTree"); + _wikiHelper.setWikiTitle(WIKI_NAVTREE_TITLE); _wikiHelper.setWikiBody(NAVBAR1_CONTENT); _wikiHelper.saveWikiPage(); @@ -373,8 +373,8 @@ public void testSteps() assertElementNotPresent(Locator.linkWithText(WIKI_NAVTREE_TITLE)); _wikiHelper.createNewWikiPage("HTML"); - setFormElement(Locator.name("name"), "_header"); - setFormElement(Locator.name("title"), "Header"); + _wikiHelper.setWikiName("_header"); + _wikiHelper.setWikiTitle("Header"); _wikiHelper.setWikiBody(HEADER_CONTENT); _wikiHelper.saveWikiPage(); @@ -510,7 +510,7 @@ public void testSteps() log("test fixup for unsafe _blank targets, see #33356"); _wikiHelper.createNewWikiPage(); - setFormElement(Locator.name("name"), WIKI_PAGE9_NAME); + _wikiHelper.setWikiName(WIKI_PAGE9_NAME); _wikiHelper.setWikiBody(WIKI_PAGE9_CONTENT); _wikiHelper.saveWikiPage(); assertTextNotPresent("New Page"); // Should not be an error, so should have left the editor @@ -522,7 +522,7 @@ public void testSteps() log("Ensure non-developer can't save script"); _wikiHelper.createNewWikiPage(); - setFormElement(Locator.name("name"), "Unsaveable"); + _wikiHelper.setWikiName("Unsaveable"); _wikiHelper.setWikiBody(WIKI_PAGE5_CONTENT); _wikiHelper.saveWikiPage(false); waitForText("There was a problem while saving: Illegal element "; @@ -125,8 +127,8 @@ private boolean checkDataInList(String projectName, String listName, List> lis public void testSiteSettingOverride() throws IOException, CommandException { - BaseSettingsPage.DATE_FORMAT dateDisplay = BaseSettingsPage.DATE_FORMAT.yyyy_MMM_dd; - BaseSettingsPage.TIME_FORMAT timeDisplay = BaseSettingsPage.TIME_FORMAT.hh_mm_a; - BaseSettingsPage.DATE_FORMAT dtDateDisplay = BaseSettingsPage.DATE_FORMAT.dd_MMM_yy; - BaseSettingsPage.TIME_FORMAT dtTimeDisplay = BaseSettingsPage.TIME_FORMAT.hh_mm_a; + DATE_FORMAT dateDisplay = DATE_FORMAT.yyyy_MMM_dd; + TIME_FORMAT timeDisplay = TIME_FORMAT.hh_mm_a; + DATE_FORMAT dtDateDisplay = DATE_FORMAT.dd_MMM_yy; + TIME_FORMAT dtTimeDisplay = TIME_FORMAT.hh_mm_a; boolean siteHelpMenuState = false; String siteSupportLink = ""; @@ -304,7 +306,7 @@ public void testSiteSettingOverride() throws IOException, CommandException projectSettingsPage.setSupportLink(supportLink); projectSettingsPage.setDefaultDateDisplayInherited(false); - projectSettingsPage.setDefaultDateDisplay(BaseSettingsPage.DATE_FORMAT.yyyy_MM_dd); + projectSettingsPage.setDefaultDateDisplay(DATE_FORMAT.yyyy_MM_dd); projectSettingsPage.setDefaultTimeDisplayInherited(false); projectSettingsPage.setDefaultTimeDisplay(DEFAULT_TIME_FORMAT); @@ -335,30 +337,45 @@ public void testSiteSettingOverride() throws IOException, CommandException resetProjectSettings(); } - // The injectionTest needs to be changed to an API tests. - // That will be done in another story along with the non-standard tests. - @Ignore @Test public void testInjection() throws IOException, CommandException { resetSiteSettings(); resetProjectSettings(); + String dateFormatInjection = DATE_FORMAT.yyyy_MM_dd + "'" + INJECT_CHARS + "'"; + String timeFormatInjection = TIME_FORMAT.HH_mm + "'" + INJECT_CHARS + "'"; + + new APIContainerHelper(this).setDateAndTimeFormats(createDefaultConnection(), PROJ_CHANGE, + dateFormatInjection, timeFormatInjection, String.format("%s %s", dateFormatInjection, timeFormatInjection)); + var projectSettingPage = ProjectSettingsPage.beginAt(this, PROJ_CHANGE); -// projectSettingPage.setDefaultDateTimeDisplay(DT_DATE_FORMAT_INJECTION, DT_TIME_FORMAT_INJECTION); - projectSettingPage.save(); + log("DateTime format: " + projectSettingPage.getDefaultDateTimeDateDisplay() + " " + projectSettingPage.getDefaultDateTimeTimeDisplay()); + log("Date format: " + projectSettingPage.getDefaultDateDisplay()); + log("Time format: " + projectSettingPage.getDefaultTimeDisplay()); _listHelper.createList(getProjectName(), "IceCream", "IceCreamID", - new FieldDefinition("IceCreamDate", ColumnType.DateAndTime)); + new FieldDefinition("IceCreamDateTime", ColumnType.DateAndTime), + new FieldDefinition("IceCreamDate", ColumnType.Date), + new FieldDefinition("IceCreamTime", ColumnType.Time)); + goToProjectHome(); clickAndWait(Locator.linkWithText("IceCream")); Map testRow = new HashMap<>(); - String testDate = "1800-05-10 10:32"; + String testDate = "1800-05-10"; + String testTime = "10:32"; + String testDateTime = String.format("%s %s", testDate, testTime); + testRow.put("IceCreamDateTime", testDateTime); testRow.put("IceCreamDate", testDate); + testRow.put("IceCreamTime", testTime); _listHelper.insertNewRow(testRow); DataRegionTable list = new DataRegionTable("query", getDriver()); String attemptedInjection = list.getDataAsText(0, 0); - assertEquals("Wrong list data from injection attempt", testDate + INJECT_CHARS, attemptedInjection); + assertEquals("Wrong list data from DateTime injection attempt", testDate + INJECT_CHARS + " " + testTime + INJECT_CHARS, attemptedInjection); + attemptedInjection = list.getDataAsText(0, 1); + assertEquals("Wrong list data from Date injection attempt", testDate + INJECT_CHARS, attemptedInjection); + attemptedInjection = list.getDataAsText(0, 2); + assertEquals("Wrong list data from Time injection attempt", testTime + INJECT_CHARS, attemptedInjection); } @Override diff --git a/src/org/labkey/test/tests/ReportAndDatasetNotificationTest.java b/src/org/labkey/test/tests/ReportAndDatasetNotificationTest.java index 5a13c45003..24f4872d7d 100644 --- a/src/org/labkey/test/tests/ReportAndDatasetNotificationTest.java +++ b/src/org/labkey/test/tests/ReportAndDatasetNotificationTest.java @@ -15,11 +15,8 @@ */ package org.labkey.test.tests; -import org.json.JSONObject; import org.junit.experimental.categories.Category; import org.labkey.remoteapi.CommandException; -import org.labkey.remoteapi.Connection; -import org.labkey.remoteapi.SimplePostCommand; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; @@ -31,6 +28,7 @@ import org.labkey.test.components.dumbster.EmailRecordTable; import org.labkey.test.components.html.BootstrapMenu; import org.labkey.test.pages.TimeChartWizard; +import org.labkey.test.util.APIContainerHelper; import org.labkey.test.util.Ext4Helper; import org.labkey.test.util.LogMethod; import org.labkey.test.util.PortalHelper; @@ -171,15 +169,9 @@ protected void verifyContentModified() throws IOException, CommandException // This test depends on a non-standard date format, one that contains a timestamp, to validate the reports are // shown as updated. The non-standard format can only be set by an API call to UpdateContainerSettings. - Connection cn = createDefaultConnection(); - SimplePostCommand command = new SimplePostCommand("admin", "UpdateContainerSettings"); - JSONObject json = new JSONObject(); - json.put("defaultDateFormat", NON_STANDARD_DATEFORMAT); - json.put("defaultDateFormatInherited", false); - json.put("defaultDateTimeFormatInherited", true); - json.put("defaultTimeFormatInherited", true); - command.setJsonObject(json); - command.execute(cn, getCurrentContainerPath()); + APIContainerHelper apiContainerHelper = new APIContainerHelper(this); + apiContainerHelper.setDateAndTimeFormats(createDefaultConnection(), getCurrentContainerPath(), + NON_STANDARD_DATEFORMAT, null, null); clickTab("Clinical and Assay Data"); waitForElement(Locator.linkWithText("GenericAssay")); diff --git a/src/org/labkey/test/tests/SimpleModuleTest.java b/src/org/labkey/test/tests/SimpleModuleTest.java index 91771335e9..548beb4fd4 100644 --- a/src/org/labkey/test/tests/SimpleModuleTest.java +++ b/src/org/labkey/test/tests/SimpleModuleTest.java @@ -233,7 +233,7 @@ protected void doSetup() ProjectSettingsPage projectSettingsPage = goToProjectSettings(); projectSettingsPage.setDefaultDateTimeDisplayInherited(false); - projectSettingsPage.setDefaultDateTimeDisplay(BaseSettingsPage.DATE_FORMAT.yyyy_MM_dd, BaseSettingsPage.TIME_FORMAT.Default); + projectSettingsPage.setDefaultDateTimeDisplay(BaseSettingsPage.DATE_FORMAT.MMMM_dd_yyyy, BaseSettingsPage.TIME_FORMAT.Default); projectSettingsPage.save(); // images for thumbnails diff --git a/src/org/labkey/test/tests/list/ListDateAndTimeTest.java b/src/org/labkey/test/tests/list/ListDateAndTimeTest.java index 77751cbf46..756df52ae5 100644 --- a/src/org/labkey/test/tests/list/ListDateAndTimeTest.java +++ b/src/org/labkey/test/tests/list/ListDateAndTimeTest.java @@ -22,6 +22,8 @@ import org.labkey.test.components.domain.DomainFormPanel; import org.labkey.test.pages.ImportDataPage; import org.labkey.test.pages.core.admin.BaseSettingsPage; +import org.labkey.test.pages.core.admin.BaseSettingsPage.DATE_FORMAT; +import org.labkey.test.pages.core.admin.BaseSettingsPage.TIME_FORMAT; import org.labkey.test.pages.core.admin.LookAndFeelSettingsPage; import org.labkey.test.pages.list.EditListDefinitionPage; import org.labkey.test.params.FieldDefinition; @@ -79,6 +81,7 @@ private void doSetup() throws IOException, CommandException _defaultTimeFormat = new SimpleDateFormat(settingsPage.getDefaultTimeDisplay()); _defaultDateTimeFormat = new SimpleDateFormat(String.format("%s %s", settingsPage.getDefaultDateTimeDateDisplay(), settingsPage.getDefaultDateTimeTimeDisplay())); + } @AfterClass @@ -1116,10 +1119,10 @@ public void testInvalidDateAndTimeInsert() throws IOException, CommandException @Test public void testDateAndTimeFormat() throws IOException, CommandException { - BaseSettingsPage.DATE_FORMAT dateFormat01 = BaseSettingsPage.DATE_FORMAT.Default; - BaseSettingsPage.TIME_FORMAT timeFormat01 = BaseSettingsPage.TIME_FORMAT.hh_mm_a; + DATE_FORMAT dateFormat01 = DATE_FORMAT.Default; + TIME_FORMAT timeFormat01 = TIME_FORMAT.hh_mm_a; String dateTimeFormat01 = String.format("%s %s", - BaseSettingsPage.DATE_FORMAT.Default, BaseSettingsPage.TIME_FORMAT.hh_mm_a); + DATE_FORMAT.Default, TIME_FORMAT.hh_mm_a); SimpleDateFormat formatterDate = new SimpleDateFormat(dateFormat01.toString()); SimpleDateFormat formatterTime = new SimpleDateFormat(timeFormat01.toString()); @@ -1201,13 +1204,14 @@ public void testDateAndTimeFormat() throws IOException, CommandException validateListDataInUI(table, expectedData); checker().screenShotIfNewError("Format01_Error"); - String dateFormat02 = "ddMMMyy"; - String timeFormat02 = "HH:mm:ss"; - String dateTimeFormat02 = "dd-MMM-yyyy HH:mm:ss"; + DATE_FORMAT dateFormat02 = DATE_FORMAT.ddMMMyy; + TIME_FORMAT timeFormat02 = TIME_FORMAT.HH_mm_ss; + DATE_FORMAT dateTimeDateFormat02 = DATE_FORMAT.dd_MMM_yyyy; + TIME_FORMAT dateTimeTimeFormat02 = TIME_FORMAT.HH_mm_ss; - formatterDate = new SimpleDateFormat(dateFormat02); - formatterTime = new SimpleDateFormat(timeFormat02); - formatterDateTime = new SimpleDateFormat(dateTimeFormat02); + formatterDate = new SimpleDateFormat(dateFormat02.toString()); + formatterTime = new SimpleDateFormat(timeFormat02.toString()); + formatterDateTime = new SimpleDateFormat(String.format("%s %s", dateTimeDateFormat02, dateTimeTimeFormat02)); clickAndWait(table.getHeaderButton("Design")); EditListDefinitionPage listDefinitionPage = new EditListDefinitionPage(getDriver()); @@ -1215,7 +1219,7 @@ public void testDateAndTimeFormat() throws IOException, CommandException DomainFormPanel domainEditor = listDefinitionPage.getFieldsPanel(); domainEditor.getField(timeCol).setTimeFormat(timeFormat02); domainEditor.getField(dateCol).setDateFormat(dateFormat02); - domainEditor.getField(dateTimeCol).setDateTimeFormat(dateTimeFormat02); + domainEditor.getField(dateTimeCol).setDateTimeFormat(dateTimeDateFormat02, dateTimeTimeFormat02); listDefinitionPage.clickSave(); @@ -1253,10 +1257,11 @@ public void testConvertDateTimeField() throws IOException, CommandException log(String.format("Create a list named '%s' with two DateTime fields that will be converted to date-only and time-only fields.", listName)); + // For dtFormatDate use a date format that has spaces. String dtFormatDate = String.format("%s %s", - BaseSettingsPage.DATE_FORMAT.yyyy_MMM_dd, BaseSettingsPage.TIME_FORMAT.HH_mm); + DATE_FORMAT.MMMM_dd_yyyy, TIME_FORMAT.HH_mm); String dtFormatTime = String.format("%s %s", - BaseSettingsPage.DATE_FORMAT.yyyy_MMM_dd, BaseSettingsPage.TIME_FORMAT.HH_mm_ss); + DATE_FORMAT.yyyy_MMM_dd, TIME_FORMAT.HH_mm_ss); SimpleDateFormat formatterFormatTime = new SimpleDateFormat(dtFormatTime); @@ -1347,8 +1352,8 @@ public void testConvertDateTimeField() throws IOException, CommandException listDefinitionPage.clickSave(); // Update default format after changing the types. - BaseSettingsPage.DATE_FORMAT dateFormat = BaseSettingsPage.DATE_FORMAT.Default; - BaseSettingsPage.TIME_FORMAT timeFormat = BaseSettingsPage.TIME_FORMAT.Default; + DATE_FORMAT dateFormat = DATE_FORMAT.Default; + TIME_FORMAT timeFormat = TIME_FORMAT.Default; SimpleDateFormat formatterDate = new SimpleDateFormat(dateFormat.toString()); SimpleDateFormat formatterTime = new SimpleDateFormat(timeFormat.toString()); diff --git a/src/org/labkey/test/tests/query/QueryMetadataTest.java b/src/org/labkey/test/tests/query/QueryMetadataTest.java index ad016f8cc1..b9e393f1b2 100644 --- a/src/org/labkey/test/tests/query/QueryMetadataTest.java +++ b/src/org/labkey/test/tests/query/QueryMetadataTest.java @@ -7,7 +7,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.categories.Daily; import org.labkey.test.components.domain.DomainFieldRow; -import org.labkey.test.pages.core.admin.BaseSettingsPage; +import org.labkey.test.pages.core.admin.BaseSettingsPage.DATE_FORMAT; import org.labkey.test.pages.query.QueryMetadataEditorPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.experiment.SampleTypeDefinition; @@ -217,7 +217,7 @@ public void testEnsureOnlyModifiedColumnAppearsInMetadataXML() var editPage = QueryMetadataEditorPage.beginAt(this, getProjectName(), "lists", TEST_LIST); DomainFieldRow fieldRow = editPage.fieldsPanel().getField("Created"); fieldRow.setDateTimeInherited(false); - fieldRow.setDateTimeFormatDate(BaseSettingsPage.DATE_FORMAT.ddMMMyy.toString()); + fieldRow.setDateTimeFormat(DATE_FORMAT.ddMMMyy); editPage.clickSave(); var queryXmlPage = editPage.clickEditSource(); @@ -244,7 +244,7 @@ public void testAssayQueryMetadata() var editPage = QueryMetadataEditorPage.beginAt(this, getProjectName(), "assay.General." + TEST_ASSAY, "Data"); DomainFieldRow fieldRow = editPage.fieldsPanel().getField("Created"); fieldRow.setDateTimeInherited(false); - fieldRow.setDateTimeFormatDate(BaseSettingsPage.DATE_FORMAT.ddMMMyy.toString()); + fieldRow.setDateTimeFormat(DATE_FORMAT.ddMMMyy); editPage.aliasField("Row Id"); editPage.clickSave(); diff --git a/src/org/labkey/test/util/APIContainerHelper.java b/src/org/labkey/test/util/APIContainerHelper.java index 676e4b4cc9..63d57a8d68 100644 --- a/src/org/labkey/test/util/APIContainerHelper.java +++ b/src/org/labkey/test/util/APIContainerHelper.java @@ -19,6 +19,7 @@ import org.jetbrains.annotations.Nullable; import org.json.JSONObject; import org.labkey.remoteapi.CommandException; +import org.labkey.remoteapi.CommandResponse; import org.labkey.remoteapi.Connection; import org.labkey.remoteapi.SimplePostCommand; import org.labkey.remoteapi.security.CreateContainerCommand; @@ -279,4 +280,57 @@ public String getContainerId(String containerPath) throws CommandException throw new RuntimeException("Unable to get container ID for: " + containerPath, e); } } + + public CommandResponse setDateAndTimeFormats(Connection connection, String containerPath, + @Nullable String dateFormat, + @Nullable String timeFormat, + @Nullable String dateTimeFormat) throws IOException, CommandException + { + + JSONObject json = new JSONObject(); + + if(null != dateFormat) + { + json.put("defaultDateFormat", dateFormat); + json.put("defaultDateFormatInherited", false); + } + else + { + json.put("defaultDateFormatInherited", true); + } + + if(null != timeFormat) + { + json.put("defaultTimeFormat", timeFormat); + json.put("defaultTimeFormatInherited", false); + } + else + { + json.put("defaultTimeFormatInherited", true); + } + + if(null != dateTimeFormat) + { + json.put("defaultDateTimeFormat", dateTimeFormat); + json.put("defaultDateTimeFormatInherited", false); + } + else + { + json.put("defaultDateTimeFormatInherited", true); + } + + return setDateAndTimeFormats(connection, containerPath, json); + + } + + public CommandResponse setDateAndTimeFormats(Connection connection, String containerPath, JSONObject json) throws IOException, CommandException + { + + SimplePostCommand command = new SimplePostCommand("admin", "UpdateContainerSettings"); + command.setJsonObject(json); + + return command.execute(connection, containerPath); + + } + } From 4985b2c877295fa080c71d7f349dbbf89632c629 Mon Sep 17 00:00:00 2001 From: Dan Duffek Date: Thu, 5 Dec 2024 18:51:52 -0800 Subject: [PATCH 4/4] Fix error when splitting DateTime format string (#2173) --- src/org/labkey/test/LabKeySiteWrapper.java | 2 ++ .../components/domain/DomainFormPanel.java | 25 ++++++++++++------- .../labkey/test/tests/SimpleModuleTest.java | 3 ++- .../test/tests/list/ListDateAndTimeTest.java | 4 +-- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/org/labkey/test/LabKeySiteWrapper.java b/src/org/labkey/test/LabKeySiteWrapper.java index d5795ad8a7..0c41cfc185 100644 --- a/src/org/labkey/test/LabKeySiteWrapper.java +++ b/src/org/labkey/test/LabKeySiteWrapper.java @@ -1320,6 +1320,8 @@ public void clickProject(String project) public void clickProject(String project, boolean assertDestination) { projectMenu().navigateToProject(project); + // After clicking menu item mouse could be left in a position that would be over an element that could have a pop-up. + mouseOut(); if (assertDestination) { acceptTermsOfUse(null, true); diff --git a/src/org/labkey/test/components/domain/DomainFormPanel.java b/src/org/labkey/test/components/domain/DomainFormPanel.java index 5510089b57..b51dc31e86 100644 --- a/src/org/labkey/test/components/domain/DomainFormPanel.java +++ b/src/org/labkey/test/components/domain/DomainFormPanel.java @@ -139,21 +139,28 @@ else if (fieldDefinition.getType().equals(FieldDefinition.ColumnType.Time)) else if (fieldDefinition.getType().equals(FieldDefinition.ColumnType.DateAndTime)) { - // Identify the part of the format that is the date and the part that is the time. Take into account - // a data format may include spaces (time does not). - String format = fieldDefinition.getFormat().trim(); - int index = format.lastIndexOf(" "); + // Identify the part of the format that is the date and the part that is the time. + String formatStr = fieldDefinition.getFormat().trim(); + int index = formatStr.indexOf(":"); - if (format.substring(index + 1).contains(":")) + if (index == -1) { - fieldRow.setDateTimeFormat( - DATE_FORMAT.get(format.substring(0, index)), - TIME_FORMAT.get(format.substring(index + 1))); + // If there is no ':' then it is a date only format. + fieldRow.setDateTimeFormat(DATE_FORMAT.get(formatStr)); } else { - fieldRow.setDateTimeFormat(DATE_FORMAT.get(format)); + // Split the format into the date part and the time part. Take into account that the date part may + // have several spaces and the time part may have a space if there is an am/pm indicator. + // Find the last index of the ' ' before the ':'. + String tmpStr = formatStr.substring(0, index); + index = tmpStr.lastIndexOf(" "); + + fieldRow.setDateTimeFormat( + DATE_FORMAT.get(formatStr.substring(0, index)), + TIME_FORMAT.get(formatStr.substring(index + 1))); } + } else { diff --git a/src/org/labkey/test/tests/SimpleModuleTest.java b/src/org/labkey/test/tests/SimpleModuleTest.java index 548beb4fd4..7ee7f3e233 100644 --- a/src/org/labkey/test/tests/SimpleModuleTest.java +++ b/src/org/labkey/test/tests/SimpleModuleTest.java @@ -936,6 +936,7 @@ private void doTestTableAudit() // check the row level audit details popLocation(); + waitForElement(Locator.linkWithText("vehicle.Models")); selectSchema(VEHICLE_SCHEMA); selectQuery(VEHICLE_SCHEMA, "Models"); assertElementPresent(Locator.linkWithText("view data")); @@ -1214,7 +1215,7 @@ private void doTestReportCreatedDate() { log("Verify module report \"created\" date"); click(Locator.tag("span").withClass("fa-list-ul").notHidden()); - waitForText("2015-08-01"); + waitForText("August 01 2015"); } @LogMethod diff --git a/src/org/labkey/test/tests/list/ListDateAndTimeTest.java b/src/org/labkey/test/tests/list/ListDateAndTimeTest.java index 756df52ae5..feb673adeb 100644 --- a/src/org/labkey/test/tests/list/ListDateAndTimeTest.java +++ b/src/org/labkey/test/tests/list/ListDateAndTimeTest.java @@ -1113,11 +1113,9 @@ public void testInvalidDateAndTimeInsert() throws IOException, CommandException *

* Test setting the format property on a date-only, time-only and DateTime field. *

- * @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 testDateAndTimeFormat() throws IOException, CommandException + public void testDateAndTimeFormat() { DATE_FORMAT dateFormat01 = DATE_FORMAT.Default; TIME_FORMAT timeFormat01 = TIME_FORMAT.hh_mm_a;