From 58d3b752fb08346748a4d0697527bea89d9bd35a Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 29 Dec 2025 15:47:37 -0600 Subject: [PATCH 1/2] Selenium test updates to check non-unique index for fields via the schema browser table viewer --- .../domain/AdvancedSettingsDialog.java | 16 +++----- src/org/labkey/test/tests/DataClassTest.java | 27 ++++++++---- src/org/labkey/test/tests/SampleTypeTest.java | 23 ++++++++--- src/org/labkey/test/tests/list/ListTest.java | 41 +++++++++++++------ 4 files changed, 70 insertions(+), 37 deletions(-) diff --git a/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java b/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java index 6fc243a399..227b08e222 100644 --- a/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java +++ b/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java @@ -170,16 +170,10 @@ public AdvancedSettingsDialog setRecommendedVariable(boolean checked) return this; } - public boolean isUniqueConstraint() + public AdvancedSettingsDialog setSingleFieldIndex(String type) { - return elementCache().uniqueConstraint.get(); - } - - public AdvancedSettingsDialog setUniqueConstraint(boolean checked) - { - elementCache().uniqueConstraint.set(checked); - getWrapper().waitFor(()-> elementCache().uniqueConstraint.get().equals(checked), - "uniqueConstraint checkbox was not set as expected", 1000); + if (type == null) type = "None"; + elementCache().indexSelect.selectByVisibleText(type); return this; } @@ -256,8 +250,8 @@ protected class ElementCache extends ModalDialog.ElementCache Locator.input("domainpropertiesrow-recommendedVariable").findWhenNeeded(this)); public Checkbox enableMissingValues = new Checkbox( Locator.input("domainpropertiesrow-mvEnabled").findWhenNeeded(this)); - public Checkbox uniqueConstraint = new Checkbox( - Locator.input("domainpropertiesrow-uniqueConstraint").findWhenNeeded(this)); + public Select indexSelect = SelectWrapper.Select(Locator.tagWithAttribute("select", "name", "domainpropertiesrow-singleFieldConstraint")) + .findWhenNeeded(this); } } diff --git a/src/org/labkey/test/tests/DataClassTest.java b/src/org/labkey/test/tests/DataClassTest.java index dd39eb96a4..42308e4d5a 100644 --- a/src/org/labkey/test/tests/DataClassTest.java +++ b/src/org/labkey/test/tests/DataClassTest.java @@ -262,12 +262,12 @@ public void testFieldUniqueConstraint() DomainFormPanel domainFormPanel = createPage.getDomainEditor(); domainFormPanel.manuallyDefineFields(fieldName1) .setType(FieldDefinition.ColumnType.Integer) - .expand().clickAdvancedSettings().setUniqueConstraint(true).apply(); - log("Add another field with a unique constraint"); + .expand().clickAdvancedSettings().setSingleFieldIndex("Unique").apply(); + log("Add another field with a non-unique constraint"); String fieldName2 = "fieldName_2"; domainFormPanel.addField(fieldName2) .setType(FieldDefinition.ColumnType.DateAndTime) - .expand().clickAdvancedSettings().setUniqueConstraint(true).apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique").apply(); log("Add another field which does not have a unique constraint"); String fieldName3 = "FieldName@3"; domainFormPanel.addField(fieldName3) @@ -276,21 +276,26 @@ public void testFieldUniqueConstraint() viewRawTableMetadata(dataClassName); verifyTableIndices("unique_constraint_test_", List.of("field_name1", "fieldname_2")); + assertTextNotPresent("unique_constraint_test_fieldname_3"); + verifyTableIndexNonUnique("unique_constraint_test_", "field_name1", true); + verifyTableIndexNonUnique("unique_constraint_test_", "fieldname_2", false); log("Remove a field unique constraint and add a new one"); goToProjectHome(); CreateDataClassPage updatePage = goToDataClass(dataClassName); domainFormPanel = updatePage.getDomainEditor(); - domainFormPanel.getField(fieldName2) - .expand().clickAdvancedSettings().setUniqueConstraint(false) + domainFormPanel.getField(fieldName1) + .expand().clickAdvancedSettings().setSingleFieldIndex(null) .apply(); domainFormPanel.getField(fieldName3) - .expand().clickAdvancedSettings().setUniqueConstraint(true) + .expand().clickAdvancedSettings().setSingleFieldIndex("Unique") .apply(); updatePage.clickSave(); viewRawTableMetadata(dataClassName); - verifyTableIndices("unique_constraint_test_", List.of("field_name1", "fieldname_3")); - assertTextNotPresent("unique_constraint_test_fieldname_2"); + verifyTableIndices("unique_constraint_test_", List.of("fieldname_2", "fieldname_3")); + assertTextNotPresent("unique_constraint_test_field_name1"); + verifyTableIndexNonUnique("unique_constraint_test_", "fieldname_2", false); + verifyTableIndexNonUnique("unique_constraint_test_", "fieldname_3", true); } @Test @@ -406,6 +411,12 @@ private void verifyTableIndices(String prefix, List indexSuffixes) assertTextPresentCaseInsensitive(prefix + suffix); } + private void verifyTableIndexNonUnique(String prefix, String suffix, boolean isUnique) + { + Locator locator = Locator.xpath("//td[contains(text(), '" + prefix + suffix + "')]/preceding-sibling::td[2][text()='" + !isUnique + "']"); + checker().verifyTrue("Non_Unique value not as expected in metadata for locator: " + locator, locator.existsIn(getDriver())); + } + private CreateDataClassPage goToCreateNewDataClass() { DataRegionTable drt = DataRegion(getDriver()).find(); diff --git a/src/org/labkey/test/tests/SampleTypeTest.java b/src/org/labkey/test/tests/SampleTypeTest.java index 3b2a4c8470..deab9a8482 100644 --- a/src/org/labkey/test/tests/SampleTypeTest.java +++ b/src/org/labkey/test/tests/SampleTypeTest.java @@ -1825,17 +1825,17 @@ public void testFieldUniqueConstraint() .goToCreateNewSampleType() .setName(sampleTypeName); - log("Add a field with a unique constraint"); + log("Add a field with a non-unique constraint"); String fieldName1 = "field Name1"; DomainFormPanel domainFormPanel = createPage.getFieldsPanel(); domainFormPanel.manuallyDefineFields(fieldName1) .setType(ColumnType.Integer) - .expand().clickAdvancedSettings().setUniqueConstraint(true).apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique").apply(); log("Add another field with a unique constraint"); String fieldName2 = "fieldName_2"; domainFormPanel.addField(fieldName2) .setType(ColumnType.DateAndTime) - .expand().clickAdvancedSettings().setUniqueConstraint(true).apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Unique").apply(); log("Add another field which does not have a unique constraint"); String fieldName3 = "FieldName@3"; domainFormPanel.addField(fieldName3) @@ -1844,21 +1844,26 @@ public void testFieldUniqueConstraint() viewRawTableMetadata(sampleTypeName); verifyTableIndices("unique_constraint_test_", List.of("field_name1", "fieldname_2")); + assertTextNotPresent("unique_constraint_test_fieldname_3"); + verifyTableIndexNonUnique("unique_constraint_test_", "field_name1", false); + verifyTableIndexNonUnique("unique_constraint_test_", "fieldname_2", true); log("Remove a field unique constraint and add a new one"); goToProjectHome(); UpdateSampleTypePage updatePage = sampleHelper.goToEditSampleType(sampleTypeName); domainFormPanel = updatePage.getFieldsPanel(); domainFormPanel.getField(fieldName2) - .expand().clickAdvancedSettings().setUniqueConstraint(false) + .expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique") .apply(); domainFormPanel.getField(fieldName3) - .expand().clickAdvancedSettings().setUniqueConstraint(true) + .expand().clickAdvancedSettings().setSingleFieldIndex("Unique") .apply(); updatePage.clickSave(); viewRawTableMetadata(sampleTypeName); verifyTableIndices("unique_constraint_test_", List.of("field_name1", "fieldname_3")); - assertTextNotPresent("unique_constraint_test_fieldname_2"); + verifyTableIndexNonUnique("unique_constraint_test_", "field_name1", false); + verifyTableIndexNonUnique("unique_constraint_test_", "fieldname_2", false); + verifyTableIndexNonUnique("unique_constraint_test_", "fieldname_3", true); } @Test @@ -2020,6 +2025,12 @@ private void verifyTableIndices(String prefix, List indexSuffixes) assertTextPresentCaseInsensitive(prefix + suffix); } + private void verifyTableIndexNonUnique(String prefix, String suffix, boolean isUnique) + { + Locator locator = Locator.xpath("//td[contains(text(), '" + prefix + suffix + "')]/preceding-sibling::td[2][text()='" + !isUnique + "']"); + checker().verifyTrue("Non_Unique value not as expected in metadata for locator: " + locator, locator.existsIn(getDriver())); + } + private void setFileAttachment(int index, File attachment) { DataRegionTable drt = DataRegionTable.findDataRegionWithinWebpart(this, "Sample Type Contents"); diff --git a/src/org/labkey/test/tests/list/ListTest.java b/src/org/labkey/test/tests/list/ListTest.java index f320aa3384..6f5f784cae 100644 --- a/src/org/labkey/test/tests/list/ListTest.java +++ b/src/org/labkey/test/tests/list/ListTest.java @@ -1589,45 +1589,56 @@ public void testFieldUniqueConstraint() viewRawTableMetadata(listName); verifyTableIndices("unique_constraint_list_", Collections.emptyList()); - // set two fields to have unique constraints + // set fields to have constraints EditListDefinitionPage listDefinitionPage = _listHelper.goToEditDesign(listName); listDefinitionPage.getFieldsPanel() - .getField(fieldName1).expand().clickAdvancedSettings().setUniqueConstraint(true) + .getField(fieldName1).expand().clickAdvancedSettings().setSingleFieldIndex("Unique") .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName2).expand().clickAdvancedSettings().setUniqueConstraint(true) + .getField(fieldName2).expand().clickAdvancedSettings().setSingleFieldIndex("Unique") + .apply(); + // set one field to have non-unique constraint + listDefinitionPage.getFieldsPanel() + .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique") .apply(); listDefinitionPage.clickSave(); AuditLogHelper.DetailedAuditEventRow expectedDomainEvent = new AuditLogHelper.DetailedAuditEventRow(null, listName, null, "The descriptor of domain " + listName + " was updated.", - "", null, null, "Indices: > [field Name1, unique: true, fieldName_2, unique: true]"); + "", null, null, "Indices: > [FieldName@3, unique: false, field Name1, unique: true, fieldName_2, unique: true]"); boolean pass = _auditLogHelper.validateLastDomainAuditEvents(listName, getProjectName(), expectedDomainEvent, Collections.emptyMap()); checker().verifyTrue("Domain audit comment not as expected after updating field unique constraint", pass); viewRawTableMetadata(listName); - verifyTableIndices("unique_constraint_list_", List.of("field_name1", "fieldname_2")); - assertTextNotPresent("unique_constraint_list_fieldname_3"); + verifyTableIndices("unique_constraint_list_", List.of("field_name1", "fieldname_2", "fieldname_3")); + verifyTableIndexNonUnique("unique_constraint_list_", "field_name1", true); + verifyTableIndexNonUnique("unique_constraint_list_", "fieldname_2", true); + verifyTableIndexNonUnique("unique_constraint_list_", "fieldname_3", false); - // remove a field unique constraint and add a new one + // remove a field unique constraint, change a field from unique -> non-unique, and change one from non-unique -> unique listDefinitionPage = _listHelper.goToEditDesign(listName); listDefinitionPage.getFieldsPanel() - .getField(fieldName2).expand().clickAdvancedSettings().setUniqueConstraint(false) + .getField(fieldName1).expand().clickAdvancedSettings().setSingleFieldIndex(null) + .apply(); + listDefinitionPage.getFieldsPanel() + .getField(fieldName2).expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique") .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName3).expand().clickAdvancedSettings().setUniqueConstraint(true) + .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Unique") .apply(); listDefinitionPage.clickSave(); expectedDomainEvent = new AuditLogHelper.DetailedAuditEventRow(null, listName, null, "The descriptor of domain " + listName + " was updated.", - "", null, null, "Indices: [field name1, unique: true, fieldname_2, unique: true] > [FieldName@3, unique: true, field Name1, unique: true]"); + "", null, null, "Indices: [field name1, unique: true, fieldname@3, unique: false, fieldname_2, unique: true] > [FieldName@3, unique: true, fieldName_2, unique: false]"); pass = _auditLogHelper.validateLastDomainAuditEvents(listName, getProjectName(), expectedDomainEvent, Collections.emptyMap()); checker().verifyTrue("Domain audit comment not as expected after updating field unique constraint", pass); viewRawTableMetadata(listName); - verifyTableIndices("unique_constraint_list_", List.of("field_name1", "fieldname_3")); - assertTextNotPresent("unique_constraint_list_fieldname_2"); + verifyTableIndices("unique_constraint_list_", List.of("fieldname_2", "fieldname_3")); + assertTextNotPresent("unique_constraint_list_field_name1"); + verifyTableIndexNonUnique("unique_constraint_list_", "fieldname_2", false); + verifyTableIndexNonUnique("unique_constraint_list_", "fieldname_3", true); } @Test // Issue 52247 @@ -1698,6 +1709,12 @@ private void verifyTableIndices(String prefix, List indexSuffixes) assertTextPresentCaseInsensitive(prefix + suffix); } + private void verifyTableIndexNonUnique(String prefix, String suffix, boolean isUnique) + { + Locator locator = Locator.xpath("//td[contains(text(), '" + prefix + suffix + "')]/preceding-sibling::td[2][text()='" + !isUnique + "']"); + checker().verifyTrue("Non_Unique value not as expected in metadata for locator: " + locator, locator.existsIn(getDriver())); + } + /** * Test "tricky characters" in field names, including key field. This will test CrUD operation for list items in * lists with an auto-key and user defined key. This will also use file import for validation. From a8d9a4a43bed9ca98668cd01834e47af4cf50232 Mon Sep 17 00:00:00 2001 From: cnathe Date: Tue, 30 Dec 2025 08:19:49 -0600 Subject: [PATCH 2/2] Index select option wording updates (No Index, Index, Index and require unique values) --- .../test/components/domain/AdvancedSettingsDialog.java | 2 +- src/org/labkey/test/tests/DataClassTest.java | 6 +++--- src/org/labkey/test/tests/SampleTypeTest.java | 8 ++++---- src/org/labkey/test/tests/list/ListTest.java | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java b/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java index 227b08e222..03d70869ce 100644 --- a/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java +++ b/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java @@ -172,7 +172,7 @@ public AdvancedSettingsDialog setRecommendedVariable(boolean checked) public AdvancedSettingsDialog setSingleFieldIndex(String type) { - if (type == null) type = "None"; + if (type == null) type = "No Index"; elementCache().indexSelect.selectByVisibleText(type); return this; } diff --git a/src/org/labkey/test/tests/DataClassTest.java b/src/org/labkey/test/tests/DataClassTest.java index 42308e4d5a..9891866358 100644 --- a/src/org/labkey/test/tests/DataClassTest.java +++ b/src/org/labkey/test/tests/DataClassTest.java @@ -262,12 +262,12 @@ public void testFieldUniqueConstraint() DomainFormPanel domainFormPanel = createPage.getDomainEditor(); domainFormPanel.manuallyDefineFields(fieldName1) .setType(FieldDefinition.ColumnType.Integer) - .expand().clickAdvancedSettings().setSingleFieldIndex("Unique").apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values").apply(); log("Add another field with a non-unique constraint"); String fieldName2 = "fieldName_2"; domainFormPanel.addField(fieldName2) .setType(FieldDefinition.ColumnType.DateAndTime) - .expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique").apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Index").apply(); log("Add another field which does not have a unique constraint"); String fieldName3 = "FieldName@3"; domainFormPanel.addField(fieldName3) @@ -288,7 +288,7 @@ public void testFieldUniqueConstraint() .expand().clickAdvancedSettings().setSingleFieldIndex(null) .apply(); domainFormPanel.getField(fieldName3) - .expand().clickAdvancedSettings().setSingleFieldIndex("Unique") + .expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .apply(); updatePage.clickSave(); viewRawTableMetadata(dataClassName); diff --git a/src/org/labkey/test/tests/SampleTypeTest.java b/src/org/labkey/test/tests/SampleTypeTest.java index deab9a8482..cc1a347a57 100644 --- a/src/org/labkey/test/tests/SampleTypeTest.java +++ b/src/org/labkey/test/tests/SampleTypeTest.java @@ -1830,12 +1830,12 @@ public void testFieldUniqueConstraint() DomainFormPanel domainFormPanel = createPage.getFieldsPanel(); domainFormPanel.manuallyDefineFields(fieldName1) .setType(ColumnType.Integer) - .expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique").apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Index").apply(); log("Add another field with a unique constraint"); String fieldName2 = "fieldName_2"; domainFormPanel.addField(fieldName2) .setType(ColumnType.DateAndTime) - .expand().clickAdvancedSettings().setSingleFieldIndex("Unique").apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values").apply(); log("Add another field which does not have a unique constraint"); String fieldName3 = "FieldName@3"; domainFormPanel.addField(fieldName3) @@ -1853,10 +1853,10 @@ public void testFieldUniqueConstraint() UpdateSampleTypePage updatePage = sampleHelper.goToEditSampleType(sampleTypeName); domainFormPanel = updatePage.getFieldsPanel(); domainFormPanel.getField(fieldName2) - .expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique") + .expand().clickAdvancedSettings().setSingleFieldIndex("Index") .apply(); domainFormPanel.getField(fieldName3) - .expand().clickAdvancedSettings().setSingleFieldIndex("Unique") + .expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .apply(); updatePage.clickSave(); viewRawTableMetadata(sampleTypeName); diff --git a/src/org/labkey/test/tests/list/ListTest.java b/src/org/labkey/test/tests/list/ListTest.java index 6f5f784cae..e947dff36e 100644 --- a/src/org/labkey/test/tests/list/ListTest.java +++ b/src/org/labkey/test/tests/list/ListTest.java @@ -1592,14 +1592,14 @@ public void testFieldUniqueConstraint() // set fields to have constraints EditListDefinitionPage listDefinitionPage = _listHelper.goToEditDesign(listName); listDefinitionPage.getFieldsPanel() - .getField(fieldName1).expand().clickAdvancedSettings().setSingleFieldIndex("Unique") + .getField(fieldName1).expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName2).expand().clickAdvancedSettings().setSingleFieldIndex("Unique") + .getField(fieldName2).expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .apply(); // set one field to have non-unique constraint listDefinitionPage.getFieldsPanel() - .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique") + .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Index") .apply(); listDefinitionPage.clickSave(); @@ -1621,10 +1621,10 @@ public void testFieldUniqueConstraint() .getField(fieldName1).expand().clickAdvancedSettings().setSingleFieldIndex(null) .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName2).expand().clickAdvancedSettings().setSingleFieldIndex("Non-Unique") + .getField(fieldName2).expand().clickAdvancedSettings().setSingleFieldIndex("Index") .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Unique") + .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .apply(); listDefinitionPage.clickSave();