diff --git a/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java b/src/org/labkey/test/components/domain/AdvancedSettingsDialog.java index 6fc243a399..03d70869ce 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 = "No Index"; + 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..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().setUniqueConstraint(true).apply(); - log("Add another field with a unique constraint"); + .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().setUniqueConstraint(true).apply(); + .expand().clickAdvancedSettings().setSingleFieldIndex("Index").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("Index and require unique values") .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..cc1a347a57 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("Index").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("Index and require unique values").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("Index") .apply(); domainFormPanel.getField(fieldName3) - .expand().clickAdvancedSettings().setUniqueConstraint(true) + .expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .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..e947dff36e 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("Index and require unique values") .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName2).expand().clickAdvancedSettings().setUniqueConstraint(true) + .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("Index") .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("Index") .apply(); listDefinitionPage.getFieldsPanel() - .getField(fieldName3).expand().clickAdvancedSettings().setUniqueConstraint(true) + .getField(fieldName3).expand().clickAdvancedSettings().setSingleFieldIndex("Index and require unique values") .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.