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) 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 f684b03d0c..97ddce324e 100644 --- a/src/org/labkey/test/util/AuditLogHelper.java +++ b/src/org/labkey/test/util/AuditLogHelper.java @@ -36,6 +36,20 @@ 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; @@ -53,11 +67,13 @@ 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"); + SAMPLE_WORKFLOW_AUDIT_EVENT("SamplesWorkflowAuditEvent"), + FILE_SYSTEM_EVENT("FileSystem"); private final String _name; @@ -124,12 +140,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) @@ -149,10 +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 : expectedValues.get(i).keySet()) + assertEquals("Event " + i + " value for " + key + " not as expected", expectedValues.get(i).get(key), events.get(i).get(key)); } }