Skip to content

Commit f458570

Browse files
committed
Merge remote-tracking branch 'origin/develop' into fb_updateMessageWhen
2 parents 4049ead + 4180657 commit f458570

6 files changed

Lines changed: 185 additions & 36 deletions

File tree

src/org/labkey/remoteapi/plate/PlateParams.java

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,27 @@
22

33
import org.json.JSONObject;
44

5+
import java.util.List;
6+
import java.util.Map;
7+
58
public class PlateParams
69
{
10+
private boolean _archived;
11+
private String _assayType;
12+
private String _barcode;
13+
private int _columns;
14+
private String _description;
715
private String _name;
816
private String _plateId;
9-
private int _rowId;
1017
private int _plateSetId;
11-
private String _description;
12-
private int _rows;
13-
private int _columns;
1418
private int _plateType;
15-
private String _assayType;
19+
private int _rowId;
20+
private int _rows;
1621
private boolean _template;
17-
private boolean _archived;
1822

23+
private PlateParams()
24+
{
25+
}
1926

2027
public PlateParams(JSONObject json)
2128
{
@@ -45,6 +52,35 @@ public PlateParams(JSONObject json)
4552

4653
if (json.has("archived"))
4754
_archived = json.getBoolean("archived");
55+
56+
if (json.has("barcode"))
57+
_barcode = json.getString("barcode");
58+
}
59+
60+
public static final List<String> QUERY_COLUMNS = List.of("Archived", "AssayType", "Barcode", "Description", "Name", "PlateId", "PlateSet", "PlateType", "PlateType/Columns", "PlateType/Rows", "RowId", "Template");
61+
62+
public static PlateParams fromQueryRow(Map<String, Object> row)
63+
{
64+
var params = new PlateParams();
65+
params._archived = (Boolean) row.get("Archived");
66+
params._assayType = (String) row.get("AssayType");
67+
params._barcode = (String) row.get("Barcode");
68+
params._columns = (Integer) row.get("PlateType/Columns");
69+
params._description = (String) row.get("Description");
70+
params._name = (String) row.get("Name");
71+
params._plateId = (String) row.get("PlateId");
72+
params._plateSetId = (Integer) row.get("PlateSet");
73+
params._plateType = (Integer) row.get("PlateType");
74+
params._rowId = (Integer) row.get("RowId");
75+
params._rows = (Integer) row.get("PlateType/Rows");
76+
params._template = (Boolean) row.get("Template");
77+
78+
return params;
79+
}
80+
81+
public String getBarcode()
82+
{
83+
return _barcode;
4884
}
4985

5086
public String getName()

src/org/labkey/remoteapi/plate/PlateSetParams.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import org.json.JSONObject;
44

5+
import java.util.List;
6+
import java.util.Map;
7+
58
public class PlateSetParams
69
{
710
private boolean _archived;
@@ -22,6 +25,10 @@ public class PlateSetParams
2225
private boolean _template;
2326
private CreatePlateSetParams.PlateSetType _plateSetType;
2427

28+
private PlateSetParams()
29+
{
30+
}
31+
2532
public PlateSetParams(JSONObject json)
2633
{
2734
if (json.has("archived"))
@@ -58,6 +65,31 @@ public PlateSetParams(JSONObject json)
5865
_plateSetType = CreatePlateSetParams.PlateSetType.fromName(json.getString("type"));
5966
}
6067

68+
public static final List<String> QUERY_COLUMNS = List.of("Archived", "Created", "CreatedBy", "Description", "Folder/EntityId", "Folder/Name", "Folder/Path", "Modified", "ModifiedBy", "Name", "PlateCount", "PlateSetId", "PrimaryPlateSetId", "RootPlateSetId", "RowId", "Template", "Type");
69+
70+
public static PlateSetParams fromQueryRow(Map<String, Object> row)
71+
{
72+
var params = new PlateSetParams();
73+
params._containerId = (String) row.get("Folder/EntityId");
74+
params._containerName = (String) row.get("Folder/Name");
75+
params._containerPath = (String) row.get("Folder/Path");
76+
params._created = row.get("Created").toString();
77+
params._createdBy = (Integer) row.get("CreatedBy");
78+
params._description = (String) row.get("Description");
79+
params._modified = row.get("Modified").toString();
80+
params._modifiedBy = (Integer) row.get("ModifiedBy");
81+
params._name = (String) row.get("Name");
82+
params._plateCount = (Integer) row.get("PlateCount");
83+
params._plateSetId = (String) row.get("PlateSetId");
84+
params._plateSetType = CreatePlateSetParams.PlateSetType.fromName((String) row.get("Type"));
85+
params._primaryPlateSetId = (Integer) row.get("PrimaryPlateSetId");
86+
params._rootPlateSetId = (Integer) row.get("RootPlateSetId");
87+
params._rowId = (Integer) row.get("RowId");
88+
params._template = (Boolean) row.get("Template");
89+
90+
return params;
91+
}
92+
6193
public boolean getArchived()
6294
{
6395
return _archived;

src/org/labkey/test/LabKeySiteWrapper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,26 +1530,26 @@ protected SelectRowsResponse executeSelectRowCommand(String schemaName, String q
15301530
protected SelectRowsResponse executeSelectRowCommand(String schemaName, String queryName, ContainerFilter containerFilter,
15311531
String path, @Nullable List<Filter> filters, @Nullable List<String> requestedColumns)
15321532
{
1533-
Connection cn = createDefaultConnection();
15341533
SelectRowsCommand selectCmd = new SelectRowsCommand(schemaName, queryName);
15351534
selectCmd.setMaxRows(-1);
15361535
selectCmd.setContainerFilter(containerFilter);
15371536
selectCmd.setColumns(requestedColumns);
15381537
if (filters != null)
15391538
selectCmd.setFilters(filters);
15401539

1541-
SelectRowsResponse selectResp;
1540+
return executeSelectRowCommand(path, selectCmd);
1541+
}
15421542

1543+
protected SelectRowsResponse executeSelectRowCommand(String containerPath, SelectRowsCommand command)
1544+
{
15431545
try
15441546
{
1545-
selectResp = selectCmd.execute(cn, path);
1547+
return command.execute(createDefaultConnection(), containerPath);
15461548
}
15471549
catch (CommandException | IOException e)
15481550
{
15491551
throw new RuntimeException(e);
15501552
}
1551-
1552-
return selectResp;
15531553
}
15541554

15551555
// Returns the text contents of every "Status" cell in the pipeline StatusFiles grid

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ public void testSteps()
8888
clickAndWait(Locator.linkWithText("Menu Bar"));
8989

9090
log("Add menu bar webparts");
91-
portalHelper.addWebPart("AssayList2");
9291
portalHelper.addWebPart("Study List");
9392
portalHelper.addWebPart("Wiki Menu");
9493

@@ -114,7 +113,6 @@ public void testSteps()
114113

115114
//Make sure that the menus are shown, but the content is not yet loaded.
116115
assertElementPresent(Locator.tagWithClass("div", "navbar-header"));
117-
assertElementPresent(menuBarItem("Assays"));
118116
assertElementPresent(menuBarItem("Studies"));
119117
assertElementPresent(menuBarItem(WIKI_PAGE_TITLE));
120118

@@ -125,15 +123,6 @@ public void testSteps()
125123

126124
openMenu(WIKI_PAGE_TITLE);
127125
waitForElement(Locator.xpath("//div").withClass("labkey-wiki").withText(WIKI_PAGE_CONTENT));
128-
openMenu("Assays");
129-
waitForElement(Locator.lkButton("Manage Assays"), 3000);
130-
131-
_assayHelper.uploadXarFileAsAssayDesign(TestFileUtils.getSampleData("menubar/Test Assay.xar"), 1);
132-
clickProject(PROJECT_NAME);
133-
134-
assertTextNotPresent("Test Assay");
135-
openMenu("Assays");
136-
waitForElement(Locator.linkWithText("Test Assay"));
137126

138127
_containerHelper.createSubfolder(PROJECT_NAME, PROJECT_NAME, "StudyFolder", "Study", null);
139128
createDefaultStudy();
@@ -218,7 +207,6 @@ public void testSteps()
218207
// Issue 47841: verify that menu config comes through with folder export/import (via create from template)
219208
UIContainerHelper uiContainerHelper = new UIContainerHelper(this);
220209
uiContainerHelper.createProjectFromTemplate(getAltProjectName(), "/" + getProjectName());
221-
openMenu("Assays");
222210
openMenu("Studies");
223211
openMenu(WIKI_PAGE_TITLE);
224212
openMenu("Wiki Render Types");

src/org/labkey/test/tests/wiki/WikiTest.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.labkey.remoteapi.SimplePostCommand;
2727
import org.labkey.test.BaseWebDriverTest;
2828
import org.labkey.test.Locator;
29+
import org.labkey.test.TestFileUtils;
2930
import org.labkey.test.categories.Daily;
3031
import org.labkey.test.categories.Wiki;
3132
import org.labkey.test.pages.admin.ExternalSourcesPage;
@@ -38,6 +39,7 @@
3839
import org.labkey.test.util.search.SearchAdminAPIHelper;
3940

4041
import java.io.File;
42+
import java.io.IOException;
4143
import java.time.Duration;
4244
import java.util.Arrays;
4345
import java.util.List;
@@ -240,6 +242,75 @@ public void testWikiWithComma()
240242
Assert.assertEquals("Incorrect result with comma", Arrays.asList(wikiTitle + "\n/" + getProjectName() + "\n" + wikiContent), getTexts(new SearchResultsPage(getDriver()).getResults()));
241243
}
242244

245+
// Issue 49321
246+
@Test
247+
public void testDeleteUndeleteAttachment() throws IOException
248+
{
249+
String wikiName = "Wiki with attachments";
250+
String wikiTitle = "Attach Delete Undelete file";
251+
String wikiContent = "Lorem Ipsum something";
252+
String fileName = "wiki_temp_file_attachment.txt";
253+
File testAttachment = TestFileUtils.writeTempFile(fileName, "it was a dark and stormy night");
254+
Locator.XPathLocator attachmentParentLoc = Locator.id("wiki-ea-name-0");
255+
Locator.XPathLocator removeLinkLoc = Locator.tag("td").child(Locator.linkContainingText("remove"));
256+
Locator.XPathLocator deleteLinkLoc = Locator.tag("td").child(Locator.linkContainingText("delete"));
257+
Locator undeleteLinkLoc = Locator.tag("td").child("a").child("span").containing("un-delete");
258+
Locator filePickerLinkLoc = Locator.id("filePickerLink");
259+
Locator fileInputLoc = Locator.tag("input").withAttribute("type", "file")
260+
.withAttributeContaining("id", "formFile");
261+
262+
goToProjectHome();
263+
log("Creating the wiki " + wikiTitle);
264+
WikiHelper wikiHelper = new WikiHelper(this);
265+
wikiHelper.createNewWikiPage("HTML");
266+
wikiHelper.setWikiName(wikiName);
267+
wikiHelper.setWikiTitle(wikiTitle);
268+
wikiHelper.setWikiBody("<p>" + wikiContent + "</p>");
269+
wikiHelper.saveWikiPage();
270+
numberOfWikiCreated++;
271+
272+
log("adding an attachment");
273+
wikiHelper.editWikiPage();
274+
click(filePickerLinkLoc);
275+
setFormElement(fileInputLoc, testAttachment);
276+
waitForElement(removeLinkLoc); // when just attached, 'remove' will be an option but delete will not be
277+
assertElementNotPresent(deleteLinkLoc);
278+
click(removeLinkLoc); // verify remove removes the file
279+
waitForElementToDisappear(Locator.linkWithText(fileName));
280+
click(filePickerLinkLoc);
281+
setFormElement(fileInputLoc, testAttachment);
282+
wikiHelper.saveWikiPage(); // save with the attachment
283+
waitForElement(Locator.linkWithText(fileName));
284+
285+
log("Deleting attachment");
286+
wikiHelper.editWikiPage();
287+
click(deleteLinkLoc);
288+
waitForElement(attachmentParentLoc.withAttributeContaining("style", "text-decoration: line-through"));
289+
wikiHelper.saveWikiPage();
290+
// verify save while in deleted state actually deletes the attachment
291+
assertElementNotPresent(Locator.linkWithText(fileName));
292+
293+
log("prepare to delete/undelete attachment");
294+
// re-attach the file and save
295+
wikiHelper.editWikiPage();
296+
click(filePickerLinkLoc);
297+
setFormElement(fileInputLoc, testAttachment);
298+
wikiHelper.saveWikiPage();
299+
300+
log("Un-Deleting attachment");
301+
wikiHelper.editWikiPage();
302+
click(deleteLinkLoc); // delete
303+
waitForElement(attachmentParentLoc.withAttributeContaining("style", "text-decoration: line-through"));
304+
waitAndClick(undeleteLinkLoc);
305+
checker().awaiting(Duration.ofMillis(500), ()-> Assertions.assertThat(attachmentParentLoc.findElement(getDriver()).getAttribute("style"))
306+
.as("expect strikethrough style not to be present")
307+
.doesNotContain("text-decoration: line-through"));
308+
wikiHelper.saveWikiPage();
309+
310+
// verify save after undelete persists the attachment
311+
assertElementPresent(Locator.linkWithText(fileName));
312+
}
313+
243314
// Issue 51382
244315
@Test
245316
public void testCreateWikiWithHostileNameAndTitle() throws Exception

src/org/labkey/test/util/AuditLogHelper.java

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.jetbrains.annotations.NotNull;
55
import org.jetbrains.annotations.Nullable;
66
import org.json.JSONException;
7+
import org.labkey.api.collections.CaseInsensitiveHashMap;
78
import org.labkey.remoteapi.CommandException;
89
import org.labkey.remoteapi.Connection;
910
import org.labkey.remoteapi.query.ContainerFilter;
@@ -29,10 +30,10 @@
2930
import java.util.Map;
3031
import java.util.Objects;
3132
import java.util.Set;
32-
import java.util.stream.Stream;
3333

3434
import static java.lang.Integer.parseInt;
3535
import static org.junit.Assert.assertEquals;
36+
import static org.junit.Assert.assertFalse;
3637
import static org.junit.Assert.assertTrue;
3738
import static org.junit.Assert.fail;
3839
import static org.labkey.test.WebDriverWrapper.WAIT_FOR_JAVASCRIPT;
@@ -85,16 +86,19 @@ public enum AuditBehaviorType
8586

8687
public enum AuditEvent
8788
{
88-
SAMPLE_TIMELINE_EVENT("SampleTimelineEvent"),
89-
SOURCES_AUDIT_EVENT("SourcesAuditEvent"), // avaialble with SampleManagement module
89+
ASSAY_AUDIT_EVENT("AssayAuditEvent"), // available with SampleManagement module
90+
ASSAY_RESULT_AUDIT_EVENT("AssayResultAuditEvent"), // available with SampleManagement module
91+
EXPERIMENT_AUDIT_EVENT("ExperimentAuditEvent"),
92+
FILE_SYSTEM_EVENT("FileSystem"),
9093
INVENTORY_AUDIT_EVENT("InventoryAuditEvent"),
9194
LIST_AUDIT_EVENT("ListAuditEvent"),
92-
ASSAY_AUDIT_EVENT("AssayAuditEvent"), // avaialble with SampleManagement module
93-
ASSAY_RESULT_AUDIT_EVENT("AssayResultAuditEvent"), // avaialble with SampleManagement module
94-
EXPERIMENT_AUDIT_EVENT("ExperimentAuditEvent"),
95-
SAMPLE_WORKFLOW_AUDIT_EVENT("SamplesWorkflowAuditEvent"),
95+
PLATE_AUDIT_EVENT("PlateEvent"), // available in Biologics module
96+
PLATE_DATA_AUDIT_EVENT("PlateDataAuditEvent"), // available in Biologics module
97+
PLATE_SET_AUDIT_EVENT("PlateSetEvent"), // available in Biologics module
9698
QUERY_UPDATE_AUDIT_EVENT("QueryUpdateAuditEvent"),
97-
FILE_SYSTEM_EVENT("FileSystem");
99+
SAMPLE_TIMELINE_EVENT("SampleTimelineEvent"),
100+
SAMPLE_WORKFLOW_AUDIT_EVENT("SamplesWorkflowAuditEvent"),
101+
SOURCES_AUDIT_EVENT("SourcesAuditEvent"); // available with SampleManagement module
98102

99103
private final String _name;
100104

@@ -257,16 +261,16 @@ public void checkAuditEventDiffCount(String containerPath, AuditEvent auditEvent
257261
boolean isInventoryUpdateType = event.get("InventoryUpdateType") != null;
258262
int expectedDiffCount = isInventoryUpdateType ? 0 : expectedDiffCounts.get(i);
259263
String dataChangesStr = (String) event.get(eventDiffFieldName);
260-
String[] dataChanges = dataChangesStr != null ? dataChangesStr.split("&") : new String[0];
264+
Map<String, String> dataChanges = decodeValues(dataChangesStr);
261265

262266
// filter out SampleStateLabel as that is not a change, it is added for display purposes
263-
dataChanges = Stream.of(dataChanges).filter(s -> !s.toLowerCase().startsWith("samplestatelabel=")).toArray(String[]::new);
267+
dataChanges.remove("SampleStateLabel");
264268
// filter out RowId as that is not a change, it is added for display purposes
265-
dataChanges = Stream.of(dataChanges).filter(s -> !s.toLowerCase().startsWith("rowid=")).toArray(String[]::new);
269+
dataChanges.remove("RowId");
266270

267271
log("Audit record data changes diff count check (" + eventDiffFieldName + "): " + dataChangesStr);
268-
assertEquals("Audit record data changes did not include the expected number of diffs in " + eventDiffFieldName + ", expected " + expectedDiffCount + " but was " + dataChanges.length + ": " + dataChangesStr,
269-
expectedDiffCount, dataChanges.length);
272+
assertEquals("Audit record data changes did not include the expected number of diffs in " + eventDiffFieldName + ", expected " + expectedDiffCount + " but was " + dataChanges.size() + ": " + dataChangesStr,
273+
expectedDiffCount, dataChanges.size());
270274
}
271275
}
272276

@@ -527,6 +531,24 @@ public String getLogString()
527531
}
528532
}
529533

534+
public static Map<String, String> decodeValues(String recordMapString)
535+
{
536+
if (recordMapString == null || recordMapString.isEmpty())
537+
return Collections.emptyMap();
538+
539+
Map<String, String> recordMap = new CaseInsensitiveHashMap<>();
540+
for (String part : recordMapString.split("&"))
541+
{
542+
String[] keyValue = part.split("=");
543+
String key = EscapeUtil.decode(keyValue[0]);
544+
assertFalse(String.format("Audit record map already contains key for %s", key), recordMap.containsKey(key));
545+
546+
recordMap.put(key, keyValue.length > 1 ? EscapeUtil.decode(keyValue[1]) : null);
547+
}
548+
549+
return recordMap;
550+
}
551+
530552
/**
531553
* URL-encode fields and values for {@link DetailedAuditEventRow#newValues} or {@link DetailedAuditEventRow#oldValues}
532554
* @param pairs alternating field names and their associated values

0 commit comments

Comments
 (0)