From 0b49501d2e02029af5564ec35f17e97b00ca8df4 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 27 Jul 2026 13:43:53 -0700 Subject: [PATCH 1/6] GH Issue 1257: Check for duplicates among field names, import aliases, and parent import aliases --- .../test/tests/SampleTypeParentColumnTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java index 3cb68c6e6a..4648602aad 100644 --- a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java +++ b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java @@ -699,8 +699,6 @@ public void testAliasNameConflictsWithFieldName() goToProjectHome(); projectMenu().navigateToFolder(PROJECT_NAME, SUB_FOLDER_NAME); - String path = PROJECT_NAME + "/" + SUB_FOLDER_NAME; - List fields = new ArrayList<>(); fields.add(new FieldDefinition(ALIAS_NAME_CONFLICT, FieldDefinition.ColumnType.String)); @@ -726,7 +724,7 @@ public void testAliasNameConflictsWithFieldName() String.join("\n", errors)); updatePage.removeParentAlias(0); - log("Now add a valid parent column and check that you cannot now add a field in the sample type with the same name."); + log("Now add a valid parent column and check that you cannot not add a field in the sample type with the same name."); updatePage.addParentAlias(GOOD_PARENT_NAME, SampleTypeDesigner.CURRENT_SAMPLE_TYPE); updatePage.clickSave(); @@ -751,7 +749,17 @@ public void testAliasNameConflictsWithFieldName() updatePage.clickCancel(); - log("Validated name conflicts."); + // GH Issue 1257 + log("Check that you cannot add a field with an import alias that conflicts with the parent import alias"); + waitAndClickAndWait(Locator.lkButton("Edit Type")); + updatePage = new UpdateSampleTypePage(getDriver()); + updatePage.getFieldsPanel().addField("DupeAliasCheck") + .setImportAliases(ALIAS_NAME_CONFLICT); + errors = updatePage.clickSaveExpectingErrors(); + errorMsgExpectedTxt = "Import alias " + ALIAS_NAME_CONFLICT + " on field DupeAliasCheck conflicts with a field name."; + assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); + + updatePage.clickCancel(); } @Test From c32433ebb7ac3a907b31a48fcf349120a7d18d9b Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 27 Jul 2026 14:20:25 -0700 Subject: [PATCH 2/6] Revert change to log message --- src/org/labkey/test/tests/SampleTypeParentColumnTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java index 4648602aad..ba488fe46c 100644 --- a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java +++ b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java @@ -724,7 +724,7 @@ public void testAliasNameConflictsWithFieldName() String.join("\n", errors)); updatePage.removeParentAlias(0); - log("Now add a valid parent column and check that you cannot not add a field in the sample type with the same name."); + log("Now add a valid parent column and check that you cannot add a field in the sample type with the same name."); updatePage.addParentAlias(GOOD_PARENT_NAME, SampleTypeDesigner.CURRENT_SAMPLE_TYPE); updatePage.clickSave(); @@ -750,9 +750,9 @@ public void testAliasNameConflictsWithFieldName() updatePage.clickCancel(); // GH Issue 1257 + clickFolder(SUB_FOLDER_NAME); log("Check that you cannot add a field with an import alias that conflicts with the parent import alias"); - waitAndClickAndWait(Locator.lkButton("Edit Type")); - updatePage = new UpdateSampleTypePage(getDriver()); + updatePage = sampleHelper.goToEditSampleType(SAMPLE_TYPE_NAME); updatePage.getFieldsPanel().addField("DupeAliasCheck") .setImportAliases(ALIAS_NAME_CONFLICT); errors = updatePage.clickSaveExpectingErrors(); From 599d66e180fcacea86575c4e0d51c0364a6c4e27 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 27 Jul 2026 15:47:40 -0700 Subject: [PATCH 3/6] Move field validation to DomainUtil.validateProperties to be applicable to all domains and tap into domain designer error messaging --- src/org/labkey/test/tests/SampleTypeParentColumnTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java index ba488fe46c..59a8994a0c 100644 --- a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java +++ b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java @@ -754,9 +754,9 @@ public void testAliasNameConflictsWithFieldName() log("Check that you cannot add a field with an import alias that conflicts with the parent import alias"); updatePage = sampleHelper.goToEditSampleType(SAMPLE_TYPE_NAME); updatePage.getFieldsPanel().addField("DupeAliasCheck") - .setImportAliases(ALIAS_NAME_CONFLICT); + .setImportAliases(GOOD_PARENT_NAME); errors = updatePage.clickSaveExpectingErrors(); - errorMsgExpectedTxt = "Import alias " + ALIAS_NAME_CONFLICT + " on field DupeAliasCheck conflicts with a field name."; + errorMsgExpectedTxt = "Field DupeAliasCheck has an import alias " + GOOD_PARENT_NAME+ " that conflicts with a parent alias header."; assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); updatePage.clickCancel(); From 6b4517532bac661e6905a2aeb42e563ecf1c580a Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 27 Jul 2026 16:01:11 -0700 Subject: [PATCH 4/6] spacing --- src/org/labkey/test/tests/SampleTypeParentColumnTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java index 59a8994a0c..b03a1091d6 100644 --- a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java +++ b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java @@ -756,7 +756,7 @@ public void testAliasNameConflictsWithFieldName() updatePage.getFieldsPanel().addField("DupeAliasCheck") .setImportAliases(GOOD_PARENT_NAME); errors = updatePage.clickSaveExpectingErrors(); - errorMsgExpectedTxt = "Field DupeAliasCheck has an import alias " + GOOD_PARENT_NAME+ " that conflicts with a parent alias header."; + errorMsgExpectedTxt = "Field DupeAliasCheck has an import alias " + GOOD_PARENT_NAME + " that conflicts with a parent alias header."; assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); updatePage.clickCancel(); From 4d4333b6250732b8292a2ea7c43a363cccc71db0 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 29 Jul 2026 20:12:04 -0700 Subject: [PATCH 5/6] Remove protection against existing parent aliases colliding field names --- src/org/labkey/test/tests/SampleTypeParentColumnTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java index b03a1091d6..ad068278b9 100644 --- a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java +++ b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java @@ -756,7 +756,7 @@ public void testAliasNameConflictsWithFieldName() updatePage.getFieldsPanel().addField("DupeAliasCheck") .setImportAliases(GOOD_PARENT_NAME); errors = updatePage.clickSaveExpectingErrors(); - errorMsgExpectedTxt = "Field DupeAliasCheck has an import alias " + GOOD_PARENT_NAME + " that conflicts with a parent alias header."; + errorMsgExpectedTxt = "Field 'DupeAliasCheck' has an import alias '" + GOOD_PARENT_NAME + "' that conflicts with a parent alias header."; assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); updatePage.clickCancel(); From 5e9b6345de054ef4602f7045fb7f7132e78b0454 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Jul 2026 09:43:41 -0700 Subject: [PATCH 6/6] Add Unit tests and one designer test for overlapping aliases --- .../tests/SampleTypeParentColumnTest.java | 26 +++++++- src/org/labkey/test/tests/SampleTypeTest.java | 64 ++++++++++++++++++- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java index ad068278b9..402129f106 100644 --- a/src/org/labkey/test/tests/SampleTypeParentColumnTest.java +++ b/src/org/labkey/test/tests/SampleTypeParentColumnTest.java @@ -27,6 +27,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.categories.Daily; +import org.labkey.test.components.domain.DomainFieldRow; import org.labkey.test.components.ui.domainproperties.samples.SampleTypeDesigner; import org.labkey.test.pages.ImportDataPage; import org.labkey.test.pages.experiment.CreateSampleTypePage; @@ -753,12 +754,33 @@ public void testAliasNameConflictsWithFieldName() clickFolder(SUB_FOLDER_NAME); log("Check that you cannot add a field with an import alias that conflicts with the parent import alias"); updatePage = sampleHelper.goToEditSampleType(SAMPLE_TYPE_NAME); - updatePage.getFieldsPanel().addField("DupeAliasCheck") - .setImportAliases(GOOD_PARENT_NAME); + DomainFieldRow fieldRow = updatePage.getFieldsPanel().addField("DupeAliasCheck"); + fieldRow.setImportAliases(GOOD_PARENT_NAME); errors = updatePage.clickSaveExpectingErrors(); errorMsgExpectedTxt = "Field 'DupeAliasCheck' has an import alias '" + GOOD_PARENT_NAME + "' that conflicts with a parent alias header."; assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); + log("Check that you cannot add a parent import alias that conflicts with a field alias"); + String fieldAlias1 = "Alias1"; + String fieldAlias2 = "Alias2"; + fieldRow.setImportAliases(fieldAlias1 + " " + fieldAlias2); + updatePage.removeParentAlias(GOOD_PARENT_NAME); + updatePage.addParentAlias(fieldAlias2); + errors = updatePage.clickSaveExpectingErrors(); + errorMsgExpectedTxt = "Field 'DupeAliasCheck' has an import alias '" + fieldAlias2 + "' that conflicts with a parent alias header."; + assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); + updatePage.removeParentAlias(fieldAlias2); + log("Save with the import aliases defined for a field."); + updatePage.clickSave(); + + log("Verify an update to add a conflicting alias for an existing field alias also fails"); + clickFolder(SUB_FOLDER_NAME); + updatePage = sampleHelper.goToEditSampleType(SAMPLE_TYPE_NAME); + updatePage.addParentAlias(fieldAlias1); + errors = updatePage.clickSaveExpectingErrors(); + errorMsgExpectedTxt = "Field 'DupeAliasCheck' has an import alias '" + fieldAlias1 + "' that conflicts with a parent alias header."; + assertThat("Error message", String.join("\n", errors), CoreMatchers.containsString(errorMsgExpectedTxt)); + updatePage.clickCancel(); } diff --git a/src/org/labkey/test/tests/SampleTypeTest.java b/src/org/labkey/test/tests/SampleTypeTest.java index 8e01befc55..79f6264e96 100644 --- a/src/org/labkey/test/tests/SampleTypeTest.java +++ b/src/org/labkey/test/tests/SampleTypeTest.java @@ -301,7 +301,69 @@ public void testCustomProperties() assertTextPresent(stringCol1.getLabel(), stringCol2.getLabel(), stringCol3.getLabel(), calcCol.getLabel(), "PlainValue", "PercentValue", "PlainValueConcat"); } - // Issue 47280: LKSM: Trailing/Leading whitespace in Source name won't resolve when deriving samples + @Test // GH Issue 1257 + public void testOverlappingAliases() + { + final String sampleTypeName = "OverlappingAliasSampleType"; + final String fieldOne = "AliasFieldOne"; + final String fieldTwo = "AliasFieldTwo"; + final String sharedAlias = "sharedAlias"; + + SampleTypeHelper sampleHelper = new SampleTypeHelper(this); + + clickProject(PROJECT_NAME); + CreateSampleTypePage createPage = sampleHelper + .goToCreateNewSampleType() + .setName(sampleTypeName); + DomainFormPanel fieldsPanel = createPage.getFieldsPanel(); + + log("Verify there can be no duplicate import aliases for different fields in a sample type (case-insensitive). "); + fieldsPanel.addField(fieldOne).setImportAliases(sharedAlias); + fieldsPanel.addField(fieldTwo).setImportAliases(sharedAlias); + + checker().verifyThat("Expected an error when two fields share an import alias", + String.join("\n", createPage.clickSaveExpectingErrors()), + containsString("You have 2 field errors.")); + checker().screenShotIfNewError("duplicateImportAlias"); + + log("Aliases differing only by case are still duplicates."); + createPage = new CreateSampleTypePage(this.getDriver()); + fieldsPanel.getField(fieldTwo).setImportAliases(sharedAlias.toUpperCase()); + checker().verifyThat("Expected an error when two fields share an import alias differing only by case", + String.join("\n", createPage.clickSaveExpectingErrors()), + containsString("You have 2 field errors.")); + checker().screenShotIfNewError("duplicateImportAliasIgnoringCase"); + + log("Verify there can be no import aliases that collide with field names (case-insensitive)."); + createPage = new CreateSampleTypePage(this.getDriver()); + fieldsPanel.getField(fieldTwo).setImportAliases(""); + fieldsPanel.getField(fieldOne).setImportAliases(fieldTwo); + checker().verifyThat("Expected an error when an import alias matches another field's name", + String.join("\n", createPage.clickSaveExpectingErrors()), + containsString("Import alias '" + fieldTwo + "' on field '" + fieldOne + "' conflicts with a field name.")); + checker().screenShotIfNewError("importAliasConflictsWithFieldName"); + + log("An alias that matches a field name except for case is still a conflict."); + createPage = new CreateSampleTypePage(this.getDriver()); + fieldsPanel.getField(fieldOne).setImportAliases(fieldTwo.toLowerCase()); + checker().verifyThat("Expected an error when an import alias matches another field's name except for case", + String.join("\n", createPage.clickSaveExpectingErrors()), + containsString("Import alias '" + fieldTwo.toLowerCase() + "' on field '" + fieldOne + "' conflicts with a field name.")); + checker().screenShotIfNewError("importAliasConflictsWithFieldNameIgnoringCase"); + + log("An alias that repeats its own field's name is redundant but not ambiguous, so it should be allowed."); + fieldsPanel.getField(fieldOne).setImportAliases(fieldOne); + createPage.clickSave(); + + clickProject(PROJECT_NAME); + UpdateSampleTypePage updatePage = sampleHelper.goToEditSampleType(sampleTypeName); + checker().verifyEquals("Import alias matching its own field name was not saved", + fieldOne, updatePage.getFieldsPanel().getField(fieldOne).getImportAliases()); + checker().screenShotIfNewError("selfReferencingImportAlias"); + updatePage.clickCancel(); + } + + // Issue 47280: LKSM: Trailing/Leading whitespace in Source name won't resolve when deriving samples @Test public void testImportSamplesWithTrailingSpace() throws IOException, CommandException {