Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
8d4c9fe
Coverage for Issue 52142
labkey-chrisj May 13, 2025
5ae1d5a
Merge remote-tracking branch 'origin/develop' into develop
labkey-chrisj May 14, 2025
9a85233
coverage for Issue 49511
labkey-chrisj May 14, 2025
8a3fd54
properly enquote tsv
labkey-chrisj May 14, 2025
dbc978d
coverage for Issue 52171
labkey-chrisj May 15, 2025
e43f02c
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj May 19, 2025
445de90
coverage for Issue 51843
labkey-chrisj May 19, 2025
dc7ae47
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj May 27, 2025
d2f55d4
coverage for Issue 52390
labkey-chrisj May 27, 2025
bba2a97
coverage for Issue 50774
labkey-chrisj May 28, 2025
eac0a0c
make pipeline root matching case-insensitive
labkey-chrisj May 28, 2025
c86e1b1
Coverage for Issue 52661
labkey-chrisj May 28, 2025
28efd4b
add comments
labkey-chrisj May 28, 2025
20b8840
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj May 28, 2025
a28df84
Update src/org/labkey/test/tests/MenuBarTest.java
labkey-chrisj May 28, 2025
0710109
Update src/org/labkey/test/tests/component/GridPanelViewTest.java
labkey-chrisj May 28, 2025
fd9d3d3
Merge remote-tracking branch 'origin/fb_chris_misc_issues' into fb_ch…
labkey-chrisj May 28, 2025
0222bc8
longer sleep so we know the cancel gets there before the transform is…
labkey-chrisj May 29, 2025
909c44f
feedback
labkey-chrisj May 29, 2025
bfe1a4b
update import
labkey-chrisj May 29, 2025
7394ef7
cr/feedback
labkey-chrisj May 29, 2025
95117f7
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj May 29, 2025
5743df7
Use DateString class to smuggle arbitrary date strings into date colu…
labkey-chrisj May 29, 2025
bf576f6
coverage for Issue 52729
labkey-chrisj May 29, 2025
9132cda
fix banner test
labkey-chrisj May 30, 2025
6a79957
use FieldInfo for constants
labkey-chrisj May 30, 2025
9de90b0
use new syntax to avoid casting instanceof
labkey-chrisj May 30, 2025
1c0d238
clear up unused imports
labkey-chrisj May 30, 2025
7b9d0a9
save the view before attempting to edit
labkey-chrisj May 30, 2025
c730914
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj May 30, 2025
0f659ae
revert attempt to make pipelineroot matching case insensitive
labkey-chrisj May 30, 2025
fb02c34
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj Jun 2, 2025
a86dbe9
try to avoid csp violations in banner
labkey-chrisj Jun 2, 2025
ea17ebc
fix test so it deletes broken view
labkey-chrisj Jun 2, 2025
e7b9dfc
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj Jun 3, 2025
378c0e3
Merge branch 'develop' into fb_chris_misc_issues
labkey-jeckels Jun 3, 2025
cd3dd2b
Merge remote-tracking branch 'origin/fb_chris_misc_issues' into fb_ch…
labkey-chrisj Jun 4, 2025
83af6b6
Merge branch 'develop' into fb_chris_misc_issues
labkey-chrisj Jun 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,19 @@ public void setFilter(int index, Object operator, Object value1, Object value2)
}
else if (value1 instanceof Date dateVal1)
{
final String dateStr1 = DATE_FORMAT.format(dateVal1);
String dateStr1;
if (value1 instanceof DateString ds1)
dateStr1 = ds1.getDateStr(); // use the test-supplied date string
else
dateStr1 = DATE_FORMAT.format(dateVal1); // format the supplied date value to string
elementCache().dateValues.get(index).set(dateStr1);
if (value2 instanceof Date dateVal2)
{
final String dateStr2 = DATE_FORMAT.format(dateVal2);
String dateStr2;
if (value2 instanceof DateString ds2)
dateStr2 = ds2.getDateStr();
else
dateStr2 = DATE_FORMAT.format(dateVal2);
elementCache().dateValuesSecond.get(index).set(dateStr2);
}
else if (value2 != null)
Expand Down Expand Up @@ -176,6 +184,20 @@ protected class ElementCache extends Component<?>.ElementCache
RadioButton.RadioButton(Locator.radioButtonByNameAndValue("field-value-bool-1", "false")).refindWhenNeeded(this));
}

public static class DateString extends Date
{
private final String _dateStr;
public DateString(String dateStr)
{
_dateStr = dateStr;
}

public String getDateStr()
{
return _dateStr;
}
}

public static class FilterExpressionPanelFinder extends WebDriverComponentFinder<FilterExpressionPanel, FilterExpressionPanelFinder>
{
private final Locator.XPathLocator _baseLocator = Locator.byClass("filter-expression__input-wrapper").parent();
Expand Down
75 changes: 75 additions & 0 deletions src/org/labkey/test/tests/AdminConsoleTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
import org.labkey.remoteapi.CommandException;
import org.labkey.remoteapi.Connection;
import org.labkey.remoteapi.SimpleGetCommand;
import org.labkey.remoteapi.SimplePostCommand;
import org.labkey.test.BaseWebDriverTest;
import org.labkey.test.Locator;
import org.labkey.test.WebDriverWrapper;
import org.labkey.test.WebTestHelper;
import org.labkey.test.categories.Daily;
import org.labkey.test.pages.core.admin.CustomizeSitePage;
Expand All @@ -33,11 +35,13 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

@Category({Daily.class})
@BaseWebDriverTest.ClassTimeout(minutes = 3)
Expand Down Expand Up @@ -151,6 +155,77 @@ public void testRibbonBar()
assertElementNotPresent(ribbonLink);
}

// Issue 51843 allow site banner configuration via api
@Test
public void testSiteBannerAPIConfiguration() throws Exception
{
goToAdminConsole();

String bannerMessage = "test banner message" + TRICKY_CHARACTERS;
Comment thread
labkey-chrisj marked this conversation as resolved.
Locator bannerLoc = Locator.tagWithClass("div", "lk-dismissable-warn")
.containing("test banner message" + TRICKY_CHARACTERS);

//As site admin
// set the message and show it
var showBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
showBannerCmd.setParameters(Map.of("message", bannerMessage,
"show", true));
showBannerCmd.execute(createDefaultConnection(), "/");
refresh();
// verify it is shown
WebDriverWrapper.waitFor(()-> bannerLoc.isDisplayed(getDriver()), 1000);
if (checker().withScreenshot("banner not shown or not as expected")
.verifyTrue("expect banner to be shown", bannerLoc.isDisplayed(getDriver())))
{
// hide the banner
var hideBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
hideBannerCmd.setParameters(Map.of("show", false));
hideBannerCmd.execute(createDefaultConnection(), "/");
refresh();
WebDriverWrapper.waitFor(()-> !bannerLoc.isDisplayed(getDriver()), 1000);
// verify it is hidden
checker().withScreenshot("banner is shown when not expected")
.verifyFalse("expect banner not to be shown", bannerLoc.isDisplayed(getDriver()));
}

// restore it with the previous banner value
var restoreBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
restoreBannerCmd.setParameters(Map.of("show", true));
restoreBannerCmd.execute(createDefaultConnection(), "/");
refresh();
// verify it is restored with the previous value
checker().withScreenshot("banner not shown or not as expected")
.verifyTrue("expect banner to be shown", bannerLoc.isDisplayed(getDriver()));

// as app admin
impersonateRole("Application Admin");
var reHideBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
reHideBannerCmd.setParameters(Map.of("show", false));
try
{
reHideBannerCmd.execute(createDefaultConnection(), "/");
fail("expect exception trying to call this API as app admin");
}
catch (CommandException e)
{
// success, caller with app admin failed to hit this api
}
refresh();
// verify it remains shown
checker().withScreenshot("banner is hidden when not expected")
.verifyTrue("expect banner to be shown", bannerLoc.isDisplayed(getDriver()));

stopImpersonating();

// clean up after ourselves as site admin
var clearAndHideBannerCmd = new SimplePostCommand("admin", "setRibbonMessage.api");
clearAndHideBannerCmd.setParameters(Map.of("show", false, "message", ""));
Comment thread
labkey-tchad marked this conversation as resolved.
clearAndHideBannerCmd.execute(createDefaultConnection(), "/");
refresh();
checker().withScreenshot("banner is shown when not expected")
.verifyFalse("expect banner not to be shown", bannerLoc.isDisplayed(getDriver()));
}

@Test
public void testAppAdminRole()
{
Expand Down
62 changes: 60 additions & 2 deletions src/org/labkey/test/tests/MenuBarTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
*/
package org.labkey.test.tests;

import org.assertj.core.api.Assertions;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.labkey.test.BaseWebDriverTest;
import org.labkey.test.Locator;
import org.labkey.test.TestFileUtils;
import org.labkey.test.TestTimeoutException;
import org.labkey.test.WebTestHelper;
import org.labkey.test.categories.Daily;
import org.labkey.test.util.PortalHelper;
import org.labkey.test.util.UIContainerHelper;
Expand All @@ -44,6 +47,19 @@ public class MenuBarTest extends BaseWebDriverTest
private static final String DEM_STUDY_FOLDER = "DemStudyFolder";
private static final String STUDY_FOLDER = "StudyFolder";

@BeforeClass
public static void setupProject() throws Exception
{
MenuBarTest initTest = getCurrentTest();
initTest.doSetup();
}

protected void doSetup()
{
log("Open new project");
_containerHelper.createProject(PROJECT_NAME, "Collaboration");
}

@Override
public List<String> getAssociatedModules()
{
Expand All @@ -67,8 +83,7 @@ public void testSteps()
PortalHelper portalHelper = new PortalHelper(this);
WikiHelper wikiHelper = new WikiHelper(this);

log("Open new project");
_containerHelper.createProject(PROJECT_NAME, "Collaboration");
goToProjectHome();
goToProjectSettings();
clickAndWait(Locator.linkWithText("Menu Bar"));

Expand Down Expand Up @@ -211,6 +226,49 @@ public void testSteps()
openMenu("Folders");
}

// Issue 52171: All menus that link to absolute URLs are broken
@Test
public void testDocumentationMenuLinks()
{
goToProjectHome();
clickUserMenuItem(false,"LabKey Documentation"); // expect documentation to pop in another window
switchToWindow(1);
checker().withScreenshot("unexpected_destination")
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
.as("expect navigation to labkey.org /documentation")
.contains("labkey.org/Documentation"));
switchToMainWindow();
closeExtraWindows();

goToProjectHome();
clickUserMenuItem(true,"Support");
checker().withScreenshot("unexpected_destination")
.verifyEquals("Support menu destination",
WebTestHelper.buildURL("project", "home/support", "begin"),
getDriver().getCurrentUrl());

goToProjectHome();
clickAdminMenuItem("Developer Links", "JavaScript API Reference");
checker().withScreenshot("unexpected_destination")
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
.as("expect navigation to labkey.org /download/clientapi_docs")
.endsWith("labkey.org/download/clientapi_docs/javascript-api/"));

goToProjectHome();
clickAdminMenuItem("Developer Links", "SQL Reference");
checker().withScreenshot("unexpected_destination")
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
.as("expect navigation to labkey.org /documentation")
.contains("labkey.org/Documentation"));

goToProjectHome();
clickAdminMenuItem("Developer Links", "XML Schema Reference");
checker().withScreenshot("unexpected_destination")
.wrapAssertion(()-> Assertions.assertThat(getURL().toString())
.as("expect navigation to labkey.org schema docs")
.endsWith("labkey.org/download/schema-docs/xml-schemas/"));
}

protected WebElement openMenu(String menuText)
{
WebElement menu = menuBarItem(menuText).findElement(getDriver());
Expand Down
70 changes: 70 additions & 0 deletions src/org/labkey/test/tests/SampleTypeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.labkey.test.components.html.OptionSelect;
import org.labkey.test.pages.ImportDataPage;
import org.labkey.test.pages.ReactAssayDesignerPage;
import org.labkey.test.pages.core.admin.BaseSettingsPage;
import org.labkey.test.pages.experiment.CreateSampleTypePage;
import org.labkey.test.pages.experiment.UpdateSampleTypePage;
import org.labkey.test.params.FieldDefinition;
Expand Down Expand Up @@ -137,6 +138,75 @@ protected void doCleanup(boolean afterTest)
_userHelper.deleteUsers(false, USER_FOR_FILTERTEST.getEmail());
}

// Issue 52390: milliseconds are truncated from time fields on update or reshow
@Test
public void testDateAndTimeValueUpdates() throws Exception
{
Comment thread
labkey-tchad marked this conversation as resolved.
var projectSettingsPage = goToProjectSettings();
projectSettingsPage.setDefaultDateDisplayInherited(false);
projectSettingsPage.setDefaultDateDisplay(BaseSettingsPage.DATE_FORMAT.MMMM_dd_yyyy);
projectSettingsPage.setDefaultDateTimeDisplayInherited(false);
projectSettingsPage.setDefaultDateTimeDisplay(BaseSettingsPage.DATE_FORMAT.dd_MMM_yyyy,
BaseSettingsPage.TIME_FORMAT.HH_mm_ss_SSS);
projectSettingsPage.setDefaultTimeDisplayInherited(false);
projectSettingsPage.setDefaultTimeDisplay(BaseSettingsPage.TIME_FORMAT.HH_mm_ss_SSS);
projectSettingsPage.save();

final String sampleTypeName = "dateTimeEditSamples";
final FieldDefinition txtField = new FieldDefinition(
TestDataGenerator.randomFieldName("text"), ColumnType.String).setRequired(true);
final FieldDefinition dateField = new FieldDefinition(
TestDataGenerator.randomFieldName("date", ":"), ColumnType.Date);
final FieldDefinition timeField = new FieldDefinition(
TestDataGenerator.randomFieldName("time", ":"), ColumnType.Time);
final FieldDefinition dateTimeField = new FieldDefinition(
TestDataGenerator.randomFieldName("dateTime", ":"), ColumnType.DateAndTime);
final List<FieldDefinition> fields = List.of(txtField, dateField, timeField, dateTimeField);

SampleTypeDefinition sampleTypeDefinition = new SampleTypeDefinition(sampleTypeName).setFields(fields);
sampleTypeDefinition.create(createDefaultConnection(), getProjectName());

goToProjectHome();
waitAndClickAndWait(Locator.linkWithText(sampleTypeName));
var dataRegion = DataRegionTable.DataRegion(getDriver()).withName("Material").waitFor();
var updatePage = dataRegion.clickInsertNewRow();
String date = "January 01 2025";
String time = "23:56:54.123";
String dateTime = "06-May-1986 23:58:34.123";
updatePage.setField("Name", "sample01");
updatePage.setField(dateField.getName(), date);
updatePage.setField(timeField.getName(), time);
updatePage.setField(dateTimeField.getName(), dateTime);
updatePage.submitExpectingError();

checker().wrapAssertion(()-> Assertions.assertThat(updatePage.getTextInputValue(dateField.getName()))
.isEqualTo("2025-01-01")); // expect reformat of date
checker().wrapAssertion(()-> Assertions.assertThat(updatePage.getTextInputValue(timeField.getName()))
.as("expect time to retain milliseconds")
.isEqualTo(time));
checker().wrapAssertion(()-> Assertions.assertThat(updatePage.getTextInputValue(dateTimeField.getName()))
.as("expect dateTime to post back as entered")
.isEqualTo("1986-05-06 23:58:34.123"));
Comment thread
labkey-chrisj marked this conversation as resolved.
checker().screenShotIfNewError("unexpected data update");

// fill in the required text field and submit
updatePage.setField(txtField.getName(), "sample01");
updatePage.submit();

var afterSubmit = DataRegionTable.DataRegion(getDriver()).withName("Material").waitFor();
var rowData = afterSubmit.getRowDataAsText(0);
checker().withScreenshot("unexpected data persisted")
Comment thread
labkey-tchad marked this conversation as resolved.
.wrapAssertion(()-> Assertions.assertThat(rowData)
.as("Issue 52390 expect date, time, dateTime to be shown as entered")
.contains(date, time, dateTime));

var cleanupDateFormatsPage = goToProjectSettings();
cleanupDateFormatsPage.setDefaultDateDisplayInherited(true);
cleanupDateFormatsPage.setDefaultDateTimeDisplayInherited(true);
cleanupDateFormatsPage.setDefaultTimeDisplayInherited(true);
cleanupDateFormatsPage.save();
}

@Test
public void testCreateSampleTypeNoExpression()
{
Expand Down
Loading