From 45f7bb858122afb7f0ad992652a8922c0c6e9f61 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 24 Jul 2025 10:43:38 -0700 Subject: [PATCH 1/7] Add FileSystem event --- src/org/labkey/test/util/AuditLogHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index f684b03d0c..b9374587f1 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -57,7 +57,8 @@ public enum AuditEvent INVENTORY_AUDIT_EVENT("InventoryAuditEvent"), LIST_AUDIT_EVENT("ListAuditEvent"), EXPERIMENT_AUDIT_EVENT("ExperimentAuditEvent"), - SAMPLE_WORKFLOW_AUDIT_EVENT("SamplesWorkflowAuditEvent"); + SAMPLE_WORKFLOW_AUDIT_EVENT("SamplesWorkflowAuditEvent"), + FILE_SYSTEM_EVENT("FileSystem"); private final String _name; From b78bf824d9c57e755d05b0f38bfe17c90d76748f Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 24 Jul 2025 10:43:54 -0700 Subject: [PATCH 2/7] Make `isSelected` public --- src/org/labkey/test/components/ui/grids/TabbedGridPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/components/ui/grids/TabbedGridPanel.java b/src/org/labkey/test/components/ui/grids/TabbedGridPanel.java index beb2d0cbe6..a3132e9d45 100644 --- a/src/org/labkey/test/components/ui/grids/TabbedGridPanel.java +++ b/src/org/labkey/test/components/ui/grids/TabbedGridPanel.java @@ -85,10 +85,10 @@ public Map getTabsWithCounts() } - private boolean isSelected(String tabText) + public boolean isSelected(String tabText) { String tabClass = elementCache().navTab(tabText).getAttribute("class"); - return tabClass.toLowerCase().contains("active"); + return tabClass != null && tabClass.toLowerCase().contains("active"); } public QueryGrid selectGrid(String tabText) From b4be6f5f8c521a4515dc424254ed4a27a0c6f1b3 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 24 Jul 2025 15:09:08 -0700 Subject: [PATCH 3/7] Add tests for audit entries for file fields in sample types --- .../test/params/experiment/SampleTypeDefinition.java | 11 +++++++++++ src/org/labkey/test/util/AuditLogHelper.java | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/org/labkey/test/params/experiment/SampleTypeDefinition.java b/src/org/labkey/test/params/experiment/SampleTypeDefinition.java index 5ec903a07a..16e30b2568 100644 --- a/src/org/labkey/test/params/experiment/SampleTypeDefinition.java +++ b/src/org/labkey/test/params/experiment/SampleTypeDefinition.java @@ -186,6 +186,17 @@ public SampleTypeDefinition addParentAlias(@NotNull String columnName) return addParentAlias(columnName, SampleTypeDesigner.CURRENT_SAMPLE_TYPE); } + + public FieldDefinition getFieldByNamePart(String namePart) + { + for (FieldDefinition field : _fields) + { + if (field.isNamePartMatch(namePart)) + return field; + } + throw new IllegalArgumentException("No field found with name part: " + namePart); + } + /* DomainProps */ diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index b9374587f1..4a4d09535e 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -157,6 +157,18 @@ public void checkAuditEventValuesForTransactionId(String containerPath, AuditEve } } + public void checkAuditEventValuesForTransactionId(String containerPath, AuditEvent auditEventName, Integer transactionId, int rowCount, List> expectedValues) throws IOException, CommandException + { + List columnNames = expectedValues.get(0).keySet().stream().map(Object::toString).toList(); + List> events = getAuditLogsForTransactionId(containerPath, auditEventName, columnNames, transactionId, ContainerFilter.CurrentAndSubfolders); + assertEquals("Unexpected number of events for transactionId " + transactionId, rowCount, events.size()); + for (int i = 0; i < rowCount; i++) + { + for (String key : columnNames) + assertEquals("Event value for " + key + " not as expected", expectedValues.get(i).get(key), events.get(i).get(key)); + } + } + /** * Check the number of diffs in the audit event. This is a helper function to check the number of diffs in the * newRecordMap for an audit entry. If a transactionId is provided, it will check all rows for that From 8173ab67998834dba2db227862524dd6b54c1cbf Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Fri, 25 Jul 2025 12:39:27 -0700 Subject: [PATCH 4/7] Add tests for assay file audit logs --- src/org/labkey/test/util/AuditLogHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index 4a4d09535e..f3f594b4eb 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -53,9 +53,10 @@ public AuditLogHelper(WebDriverWrapper wrapper) public enum AuditEvent { SAMPLE_TIMELINE_EVENT("SampleTimelineEvent"), - SOURCES_AUDIT_EVENT("SourcesAuditEvent"), + SOURCES_AUDIT_EVENT("SourcesAuditEvent"), // avaialble with SampleManagement module INVENTORY_AUDIT_EVENT("InventoryAuditEvent"), LIST_AUDIT_EVENT("ListAuditEvent"), + ASSAY_AUDIT_EVENT("AssayAuditEvent"), // avaialble with SampleManagement module EXPERIMENT_AUDIT_EVENT("ExperimentAuditEvent"), SAMPLE_WORKFLOW_AUDIT_EVENT("SamplesWorkflowAuditEvent"), FILE_SYSTEM_EVENT("FileSystem"); From b815579a8447d2fbb0d31f48ba33cf7fbe337c0e Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 28 Jul 2025 11:06:22 -0700 Subject: [PATCH 5/7] Add some constants. Remove unnecessary parameter --- src/org/labkey/test/util/AuditLogHelper.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index f3f594b4eb..150f9b71fd 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -36,6 +36,10 @@ public class AuditLogHelper { + public static final String COL_FILE_AUDIT_FILE = "File"; + public static final String COL_FILE_AUDIT_PROVIDED_FILE = "ProvidedFileName"; + public static final String COL_FILE_AUDIT_FIELD_NAME = "FieldName"; + private final WebDriverWrapper _wrapper; private final ConnectionSupplier _connectionSupplier; @@ -158,12 +162,12 @@ public void checkAuditEventValuesForTransactionId(String containerPath, AuditEve } } - public void checkAuditEventValuesForTransactionId(String containerPath, AuditEvent auditEventName, Integer transactionId, int rowCount, List> expectedValues) throws IOException, CommandException + public void checkAuditEventValuesForTransactionId(String containerPath, AuditEvent auditEventName, Integer transactionId, List> expectedValues) throws IOException, CommandException { List columnNames = expectedValues.get(0).keySet().stream().map(Object::toString).toList(); List> events = getAuditLogsForTransactionId(containerPath, auditEventName, columnNames, transactionId, ContainerFilter.CurrentAndSubfolders); - assertEquals("Unexpected number of events for transactionId " + transactionId, rowCount, events.size()); - for (int i = 0; i < rowCount; i++) + assertEquals("Unexpected number of events for transactionId " + transactionId, expectedValues.size(), events.size()); + for (int i = 0; i < expectedValues.size(); i++) { for (String key : columnNames) assertEquals("Event value for " + key + " not as expected", expectedValues.get(i).get(key), events.get(i).get(key)); From 7de66bc84c1c691841fc6aacab82c7ee441dab81 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 28 Jul 2025 16:31:11 -0700 Subject: [PATCH 6/7] Add tests for data set file field auditing --- src/org/labkey/test/util/AuditLogHelper.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index 150f9b71fd..7e791465c3 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -130,12 +130,13 @@ public DataRegionTable goToAuditEventView(String eventType) * @throws CommandException Can be thrown by the SelectRowsCommand. */ public SelectRowsResponse getAuditLogsFromLKS(String containerPath, AuditEvent auditEventName, List columnNames, - List filters, @Nullable Integer maxRows, @Nullable ContainerFilter containerFilter) throws IOException, CommandException + @Nullable List filters, @Nullable Integer maxRows, @Nullable ContainerFilter containerFilter) throws IOException, CommandException { SelectRowsCommand cmd = new SelectRowsCommand("auditLog", auditEventName.getName()); cmd.setColumns(columnNames); cmd.addFilter("ProjectId/Name", _wrapper.getCurrentProject(), Filter.Operator.EQUAL); - filters.forEach(cmd::addFilter); + if (filters != null) + filters.forEach(cmd::addFilter); if (maxRows != null) cmd.setMaxRows(maxRows); if (containerFilter != null) From 38b440030d0c4acf167202f6c5bcc0e42b2c44d2 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Tue, 29 Jul 2025 13:59:23 -0700 Subject: [PATCH 7/7] Adjust container for move audit events and add test for assay run moves --- src/org/labkey/test/util/AuditLogHelper.java | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/org/labkey/test/util/AuditLogHelper.java b/src/org/labkey/test/util/AuditLogHelper.java index 7e791465c3..97ddce324e 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -39,6 +39,16 @@ public class AuditLogHelper public static final String COL_FILE_AUDIT_FILE = "File"; public static final String COL_FILE_AUDIT_PROVIDED_FILE = "ProvidedFileName"; public static final String COL_FILE_AUDIT_FIELD_NAME = "FieldName"; + public static final String COL_FILE_AUDIT_DIRECTORY = "Directory"; + // commonly used fields for validating file audit events + public static final List FILE_AUDIT_COLUMNS = List.of( + AuditLogHelper.COL_FILE_AUDIT_FILE, + AuditLogHelper.COL_FILE_AUDIT_PROVIDED_FILE, + AuditLogHelper.COL_FILE_AUDIT_FIELD_NAME, + AuditLogHelper.COL_FILE_AUDIT_DIRECTORY, + "Container", + "Comment" + ); private final WebDriverWrapper _wrapper; private final ConnectionSupplier _connectionSupplier; @@ -156,22 +166,27 @@ public void checkAuditEventValuesForTransactionId(String containerPath, AuditEve List columnNames = expectedValues.keySet().stream().map(Object::toString).toList(); List> events = getAuditLogsForTransactionId(containerPath, auditEventName, columnNames, transactionId, ContainerFilter.CurrentAndSubfolders); assertEquals("Unexpected number of events for transactionId " + transactionId, rowCount, events.size()); - for (Map event : events) + for (int i = 0; i < rowCount; i++) { for (String key : columnNames) - assertEquals("Event value for " + key + " not as expected", expectedValues.get(key), event.get(key)); + assertEquals("Event " + i + " value for " + key + " not as expected", expectedValues.get(key), events.get(i).get(key)); } } public void checkAuditEventValuesForTransactionId(String containerPath, AuditEvent auditEventName, Integer transactionId, List> expectedValues) throws IOException, CommandException { List columnNames = expectedValues.get(0).keySet().stream().map(Object::toString).toList(); + checkAuditEventValuesForTransactionId(containerPath, auditEventName, columnNames, transactionId, expectedValues); + } + + public void checkAuditEventValuesForTransactionId(String containerPath, AuditEvent auditEventName, List columnNames, Integer transactionId, List> expectedValues) throws IOException, CommandException + { List> events = getAuditLogsForTransactionId(containerPath, auditEventName, columnNames, transactionId, ContainerFilter.CurrentAndSubfolders); assertEquals("Unexpected number of events for transactionId " + transactionId, expectedValues.size(), events.size()); for (int i = 0; i < expectedValues.size(); i++) { - for (String key : columnNames) - assertEquals("Event value for " + key + " not as expected", expectedValues.get(i).get(key), events.get(i).get(key)); + for (String key : expectedValues.get(i).keySet()) + assertEquals("Event " + i + " value for " + key + " not as expected", expectedValues.get(i).get(key), events.get(i).get(key)); } }