Skip to content

Commit 1565ae9

Browse files
labkey-chrisjlabkey-tchadlabkey-jeckels
authored
Chris misc issues (#2453)
Co-authored-by: Trey Chadick <tchad@labkey.com> Co-authored-by: labkey-jeckels <jeckels@labkey.com>
1 parent 591b1f3 commit 1565ae9

8 files changed

Lines changed: 569 additions & 5 deletions

File tree

src/org/labkey/test/components/ui/search/FilterExpressionPanel.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,19 @@ public void setFilter(int index, Object operator, Object value1, Object value2)
9292
}
9393
else if (value1 instanceof Date dateVal1)
9494
{
95-
final String dateStr1 = DATE_FORMAT.format(dateVal1);
95+
String dateStr1;
96+
if (value1 instanceof DateString ds1)
97+
dateStr1 = ds1.getDateStr(); // use the test-supplied date string
98+
else
99+
dateStr1 = DATE_FORMAT.format(dateVal1); // format the supplied date value to string
96100
elementCache().dateValues.get(index).set(dateStr1);
97101
if (value2 instanceof Date dateVal2)
98102
{
99-
final String dateStr2 = DATE_FORMAT.format(dateVal2);
103+
String dateStr2;
104+
if (value2 instanceof DateString ds2)
105+
dateStr2 = ds2.getDateStr();
106+
else
107+
dateStr2 = DATE_FORMAT.format(dateVal2);
100108
elementCache().dateValuesSecond.get(index).set(dateStr2);
101109
}
102110
else if (value2 != null)
@@ -176,6 +184,20 @@ protected class ElementCache extends Component<?>.ElementCache
176184
RadioButton.RadioButton(Locator.radioButtonByNameAndValue("field-value-bool-1", "false")).refindWhenNeeded(this));
177185
}
178186

187+
public static class DateString extends Date
188+
{
189+
private final String _dateStr;
190+
public DateString(String dateStr)
191+
{
192+
_dateStr = dateStr;
193+
}
194+
195+
public String getDateStr()
196+
{
197+
return _dateStr;
198+
}
199+
}
200+
179201
public static class FilterExpressionPanelFinder extends WebDriverComponentFinder<FilterExpressionPanel, FilterExpressionPanelFinder>
180202
{
181203
private final Locator.XPathLocator _baseLocator = Locator.byClass("filter-expression__input-wrapper").parent();

src/org/labkey/test/tests/AdminConsoleTest.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import org.labkey.remoteapi.CommandException;
2121
import org.labkey.remoteapi.Connection;
2222
import org.labkey.remoteapi.SimpleGetCommand;
23+
import org.labkey.remoteapi.SimplePostCommand;
2324
import org.labkey.test.BaseWebDriverTest;
2425
import org.labkey.test.Locator;
26+
import org.labkey.test.WebDriverWrapper;
2527
import org.labkey.test.WebTestHelper;
2628
import org.labkey.test.categories.Daily;
2729
import org.labkey.test.pages.core.admin.CustomizeSitePage;
@@ -33,11 +35,13 @@
3335
import java.util.ArrayList;
3436
import java.util.Arrays;
3537
import java.util.List;
38+
import java.util.Map;
3639

3740
import static org.junit.Assert.assertEquals;
3841
import static org.junit.Assert.assertFalse;
3942
import static org.junit.Assert.assertNull;
4043
import static org.junit.Assert.assertTrue;
44+
import static org.junit.Assert.fail;
4145

4246
@Category({Daily.class})
4347
@BaseWebDriverTest.ClassTimeout(minutes = 3)
@@ -151,6 +155,77 @@ public void testRibbonBar()
151155
assertElementNotPresent(ribbonLink);
152156
}
153157

158+
// Issue 51843 allow site banner configuration via api
159+
@Test
160+
public void testSiteBannerAPIConfiguration() throws Exception
161+
{
162+
goToAdminConsole();
163+
164+
String bannerMessage = "test banner message" + TRICKY_CHARACTERS;
165+
Locator bannerLoc = Locator.tagWithClass("div", "lk-dismissable-warn")
166+
.containing("test banner message" + TRICKY_CHARACTERS);
167+
168+
//As site admin
169+
// set the message and show it
170+
var showBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
171+
showBannerCmd.setParameters(Map.of("message", bannerMessage,
172+
"show", true));
173+
showBannerCmd.execute(createDefaultConnection(), "/");
174+
refresh();
175+
// verify it is shown
176+
WebDriverWrapper.waitFor(()-> bannerLoc.isDisplayed(getDriver()), 1000);
177+
if (checker().withScreenshot("banner not shown or not as expected")
178+
.verifyTrue("expect banner to be shown", bannerLoc.isDisplayed(getDriver())))
179+
{
180+
// hide the banner
181+
var hideBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
182+
hideBannerCmd.setParameters(Map.of("show", false));
183+
hideBannerCmd.execute(createDefaultConnection(), "/");
184+
refresh();
185+
WebDriverWrapper.waitFor(()-> !bannerLoc.isDisplayed(getDriver()), 1000);
186+
// verify it is hidden
187+
checker().withScreenshot("banner is shown when not expected")
188+
.verifyFalse("expect banner not to be shown", bannerLoc.isDisplayed(getDriver()));
189+
}
190+
191+
// restore it with the previous banner value
192+
var restoreBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
193+
restoreBannerCmd.setParameters(Map.of("show", true));
194+
restoreBannerCmd.execute(createDefaultConnection(), "/");
195+
refresh();
196+
// verify it is restored with the previous value
197+
checker().withScreenshot("banner not shown or not as expected")
198+
.verifyTrue("expect banner to be shown", bannerLoc.isDisplayed(getDriver()));
199+
200+
// as app admin
201+
impersonateRole("Application Admin");
202+
var reHideBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
203+
reHideBannerCmd.setParameters(Map.of("show", false));
204+
try
205+
{
206+
reHideBannerCmd.execute(createDefaultConnection(), "/");
207+
fail("expect exception trying to call this API as app admin");
208+
}
209+
catch (CommandException e)
210+
{
211+
// success, caller with app admin failed to hit this api
212+
}
213+
refresh();
214+
// verify it remains shown
215+
checker().withScreenshot("banner is hidden when not expected")
216+
.verifyTrue("expect banner to be shown", bannerLoc.isDisplayed(getDriver()));
217+
218+
stopImpersonating();
219+
220+
// clean up after ourselves as site admin
221+
var clearAndHideBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
222+
clearAndHideBannerCmd.setParameters(Map.of("show", false, "message", ""));
223+
clearAndHideBannerCmd.execute(createDefaultConnection(), "/");
224+
refresh();
225+
checker().withScreenshot("banner is shown when not expected")
226+
.verifyFalse("expect banner not to be shown", bannerLoc.isDisplayed(getDriver()));
227+
}
228+
154229
@Test
155230
public void testAppAdminRole()
156231
{

src/org/labkey/test/tests/MenuBarTest.java

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
*/
1616
package org.labkey.test.tests;
1717

18+
import org.assertj.core.api.Assertions;
19+
import org.junit.BeforeClass;
1820
import org.junit.Test;
1921
import org.junit.experimental.categories.Category;
2022
import org.labkey.test.BaseWebDriverTest;
2123
import org.labkey.test.Locator;
2224
import org.labkey.test.TestFileUtils;
2325
import org.labkey.test.TestTimeoutException;
26+
import org.labkey.test.WebTestHelper;
2427
import org.labkey.test.categories.Daily;
2528
import org.labkey.test.util.PortalHelper;
2629
import org.labkey.test.util.UIContainerHelper;
@@ -44,6 +47,19 @@ public class MenuBarTest extends BaseWebDriverTest
4447
private static final String DEM_STUDY_FOLDER = "DemStudyFolder";
4548
private static final String STUDY_FOLDER = "StudyFolder";
4649

50+
@BeforeClass
51+
public static void setupProject() throws Exception
52+
{
53+
MenuBarTest initTest = getCurrentTest();
54+
initTest.doSetup();
55+
}
56+
57+
protected void doSetup()
58+
{
59+
log("Open new project");
60+
_containerHelper.createProject(PROJECT_NAME, "Collaboration");
61+
}
62+
4763
@Override
4864
public List<String> getAssociatedModules()
4965
{
@@ -67,8 +83,7 @@ public void testSteps()
6783
PortalHelper portalHelper = new PortalHelper(this);
6884
WikiHelper wikiHelper = new WikiHelper(this);
6985

70-
log("Open new project");
71-
_containerHelper.createProject(PROJECT_NAME, "Collaboration");
86+
goToProjectHome();
7287
goToProjectSettings();
7388
clickAndWait(Locator.linkWithText("Menu Bar"));
7489

@@ -211,6 +226,49 @@ public void testSteps()
211226
openMenu("Folders");
212227
}
213228

229+
// Issue 52171: All menus that link to absolute URLs are broken
230+
@Test
231+
public void testDocumentationMenuLinks()
232+
{
233+
goToProjectHome();
234+
clickUserMenuItem(false,"LabKey Documentation"); // expect documentation to pop in another window
235+
switchToWindow(1);
236+
checker().withScreenshot("unexpected_destination")
237+
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
238+
.as("expect navigation to labkey.org /documentation")
239+
.contains("labkey.org/Documentation"));
240+
switchToMainWindow();
241+
closeExtraWindows();
242+
243+
goToProjectHome();
244+
clickUserMenuItem(true,"Support");
245+
checker().withScreenshot("unexpected_destination")
246+
.verifyEquals("Support menu destination",
247+
WebTestHelper.buildURL("project", "home/support", "begin"),
248+
getDriver().getCurrentUrl());
249+
250+
goToProjectHome();
251+
clickAdminMenuItem("Developer Links", "JavaScript API Reference");
252+
checker().withScreenshot("unexpected_destination")
253+
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
254+
.as("expect navigation to labkey.org /download/clientapi_docs")
255+
.endsWith("labkey.org/download/clientapi_docs/javascript-api/"));
256+
257+
goToProjectHome();
258+
clickAdminMenuItem("Developer Links", "SQL Reference");
259+
checker().withScreenshot("unexpected_destination")
260+
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
261+
.as("expect navigation to labkey.org /documentation")
262+
.contains("labkey.org/Documentation"));
263+
264+
goToProjectHome();
265+
clickAdminMenuItem("Developer Links", "XML Schema Reference");
266+
checker().withScreenshot("unexpected_destination")
267+
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
268+
.as("expect navigation to labkey.org schema docs")
269+
.endsWith("labkey.org/download/schema-docs/xml-schemas/"));
270+
}
271+
214272
protected WebElement openMenu(String menuText)
215273
{
216274
WebElement menu = menuBarItem(menuText).findElement(getDriver());

src/org/labkey/test/tests/SampleTypeTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.labkey.test.components.html.OptionSelect;
4343
import org.labkey.test.pages.ImportDataPage;
4444
import org.labkey.test.pages.ReactAssayDesignerPage;
45+
import org.labkey.test.pages.core.admin.BaseSettingsPage;
4546
import org.labkey.test.pages.experiment.CreateSampleTypePage;
4647
import org.labkey.test.pages.experiment.UpdateSampleTypePage;
4748
import org.labkey.test.params.FieldDefinition;
@@ -137,6 +138,75 @@ protected void doCleanup(boolean afterTest)
137138
_userHelper.deleteUsers(false, USER_FOR_FILTERTEST.getEmail());
138139
}
139140

141+
// Issue 52390: milliseconds are truncated from time fields on update or reshow
142+
@Test
143+
public void testDateAndTimeValueUpdates() throws Exception
144+
{
145+
var projectSettingsPage = goToProjectSettings();
146+
projectSettingsPage.setDefaultDateDisplayInherited(false);
147+
projectSettingsPage.setDefaultDateDisplay(BaseSettingsPage.DATE_FORMAT.MMMM_dd_yyyy);
148+
projectSettingsPage.setDefaultDateTimeDisplayInherited(false);
149+
projectSettingsPage.setDefaultDateTimeDisplay(BaseSettingsPage.DATE_FORMAT.dd_MMM_yyyy,
150+
BaseSettingsPage.TIME_FORMAT.HH_mm_ss_SSS);
151+
projectSettingsPage.setDefaultTimeDisplayInherited(false);
152+
projectSettingsPage.setDefaultTimeDisplay(BaseSettingsPage.TIME_FORMAT.HH_mm_ss_SSS);
153+
projectSettingsPage.save();
154+
155+
final String sampleTypeName = "dateTimeEditSamples";
156+
final FieldDefinition txtField = new FieldDefinition(
157+
TestDataGenerator.randomFieldName("text"), ColumnType.String).setRequired(true);
158+
final FieldDefinition dateField = new FieldDefinition(
159+
TestDataGenerator.randomFieldName("date", ":"), ColumnType.Date);
160+
final FieldDefinition timeField = new FieldDefinition(
161+
TestDataGenerator.randomFieldName("time", ":"), ColumnType.Time);
162+
final FieldDefinition dateTimeField = new FieldDefinition(
163+
TestDataGenerator.randomFieldName("dateTime", ":"), ColumnType.DateAndTime);
164+
final List<FieldDefinition> fields = List.of(txtField, dateField, timeField, dateTimeField);
165+
166+
SampleTypeDefinition sampleTypeDefinition = new SampleTypeDefinition(sampleTypeName).setFields(fields);
167+
sampleTypeDefinition.create(createDefaultConnection(), getProjectName());
168+
169+
goToProjectHome();
170+
waitAndClickAndWait(Locator.linkWithText(sampleTypeName));
171+
var dataRegion = DataRegionTable.DataRegion(getDriver()).withName("Material").waitFor();
172+
var updatePage = dataRegion.clickInsertNewRow();
173+
String date = "January 01 2025";
174+
String time = "23:56:54.123";
175+
String dateTime = "06-May-1986 23:58:34.123";
176+
updatePage.setField("Name", "sample01");
177+
updatePage.setField(dateField.getName(), date);
178+
updatePage.setField(timeField.getName(), time);
179+
updatePage.setField(dateTimeField.getName(), dateTime);
180+
updatePage.submitExpectingError();
181+
182+
checker().wrapAssertion(()-> Assertions.assertThat(updatePage.getTextInputValue(dateField.getName()))
183+
.isEqualTo("2025-01-01")); // expect reformat of date
184+
checker().wrapAssertion(()-> Assertions.assertThat(updatePage.getTextInputValue(timeField.getName()))
185+
.as("expect time to retain milliseconds")
186+
.isEqualTo(time));
187+
checker().wrapAssertion(()-> Assertions.assertThat(updatePage.getTextInputValue(dateTimeField.getName()))
188+
.as("expect dateTime to post back as entered")
189+
.isEqualTo("1986-05-06 23:58:34.123"));
190+
checker().screenShotIfNewError("unexpected data update");
191+
192+
// fill in the required text field and submit
193+
updatePage.setField(txtField.getName(), "sample01");
194+
updatePage.submit();
195+
196+
var afterSubmit = DataRegionTable.DataRegion(getDriver()).withName("Material").waitFor();
197+
var rowData = afterSubmit.getRowDataAsText(0);
198+
checker().withScreenshot("unexpected data persisted")
199+
.wrapAssertion(()-> Assertions.assertThat(rowData)
200+
.as("Issue 52390 expect date, time, dateTime to be shown as entered")
201+
.contains(date, time, dateTime));
202+
203+
var cleanupDateFormatsPage = goToProjectSettings();
204+
cleanupDateFormatsPage.setDefaultDateDisplayInherited(true);
205+
cleanupDateFormatsPage.setDefaultDateTimeDisplayInherited(true);
206+
cleanupDateFormatsPage.setDefaultTimeDisplayInherited(true);
207+
cleanupDateFormatsPage.save();
208+
}
209+
140210
@Test
141211
public void testCreateSampleTypeNoExpression()
142212
{

0 commit comments

Comments
 (0)