From 555c121e157f5218aa4d986bdef3298edd81befb Mon Sep 17 00:00:00 2001 From: cnathe Date: Fri, 11 Sep 2026 17:05:04 -0500 Subject: [PATCH] NabAssayDefaultValuesTest test case for the run and sample default value save / replacement regerssion --- .../tests/nab/NabAssayDefaultValuesTest.java | 115 ++++++++++++++++++ .../labkey/test/util/AbstractAssayHelper.java | 1 + 2 files changed, 116 insertions(+) create mode 100644 src/org/labkey/test/tests/nab/NabAssayDefaultValuesTest.java diff --git a/src/org/labkey/test/tests/nab/NabAssayDefaultValuesTest.java b/src/org/labkey/test/tests/nab/NabAssayDefaultValuesTest.java new file mode 100644 index 0000000000..e75744fbb7 --- /dev/null +++ b/src/org/labkey/test/tests/nab/NabAssayDefaultValuesTest.java @@ -0,0 +1,115 @@ +package org.labkey.test.tests.nab; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.labkey.test.BaseWebDriverTest; +import org.labkey.test.Locator; +import org.labkey.test.categories.Assays; +import org.labkey.test.categories.Daily; +import org.labkey.test.pages.ReactAssayDesignerPage; +import org.labkey.test.params.FieldDefinition; +import org.labkey.test.util.AbstractAssayHelper; + +import java.util.List; + +import static org.junit.Assert.assertEquals; + +/** + * GitHub Issue #1569: every domain of an assay design shares the assay name as its typeURI objectId, so before the fix + * they all resolved to one default-value object and saving one domain's defaults destroyed another's. + */ +@Category({Daily.class, Assays.class}) +public class NabAssayDefaultValuesTest extends BaseWebDriverTest +{ + private static final String NAB_ASSAY_TYPE = "TZM-bl Neutralization (NAb)"; + private static final String ASSAY_NAME = "DefaultValuesNab"; + private static final String CUTOFF1 = "Cutoff1"; + private static final String CUTOFF1_VALUE = "77"; + private static final String INITIAL_DILUTION = "InitialDilution"; + private static final String INITIAL_DILUTION_VALUE = "20.0"; + + @BeforeClass + public static void setupProject() + { + NabAssayDefaultValuesTest init = getCurrentTest(); + init.doSetup(); + } + + private void doSetup() + { + _containerHelper.createProject(getProjectName(), "Assay"); + goToProjectHome(); + + ReactAssayDesignerPage designer = _assayHelper.createAssayDesign(NAB_ASSAY_TYPE, ASSAY_NAME); + + // need to use FIXED_EDITABLE for folder level defaults that test the regression case + designer.goToRunFields().getField(CUTOFF1).clickAdvancedSettings() + .setDefaultValueType(FieldDefinition.DefaultType.FIXED_EDITABLE).apply(); + designer.expandFieldsPanel("Sample").getField(INITIAL_DILUTION).clickAdvancedSettings() + .setDefaultValueType(FieldDefinition.DefaultType.FIXED_EDITABLE).apply(); + + designer.clickFinish(); + } + + @Test + public void testDefaultsOnOneDomainIsNotClearedBySavingAnother() + { + goToProjectHome(); + + setDefault(AbstractAssayHelper.AssayDefaultAreas.RUN_FIELDS, CUTOFF1, CUTOFF1_VALUE); + setDefault(AbstractAssayHelper.AssayDefaultAreas.SAMPLE_FIELDS, INITIAL_DILUTION, INITIAL_DILUTION_VALUE); + + assertEquals("Run Fields default was cleared by saving Sample Fields defaults", + CUTOFF1_VALUE, readDefault(AbstractAssayHelper.AssayDefaultAreas.RUN_FIELDS, CUTOFF1)); + + // Re-save Run Fields + setDefault(AbstractAssayHelper.AssayDefaultAreas.RUN_FIELDS, CUTOFF1, CUTOFF1_VALUE); + + assertEquals("Sample Fields default was cleared by saving Run Fields defaults", + INITIAL_DILUTION_VALUE, readDefault(AbstractAssayHelper.AssayDefaultAreas.SAMPLE_FIELDS, INITIAL_DILUTION)); + } + + private void setDefault(AbstractAssayHelper.AssayDefaultAreas area, String fieldName, String value) + { + goToProjectHome(); + clickAndWait(Locator.linkWithText("Assay List")); + clickAndWait(Locator.linkWithText(ASSAY_NAME)); + _assayHelper.setDefaultValues(ASSAY_NAME, area); + setFormElement(Locator.name(fieldName), value); + clickButton("Save Defaults"); + } + + private String readDefault(AbstractAssayHelper.AssayDefaultAreas area, String fieldName) + { + goToProjectHome(); + clickAndWait(Locator.linkWithText("Assay List")); + clickAndWait(Locator.linkWithText(ASSAY_NAME)); + _assayHelper.setDefaultValues(ASSAY_NAME, area); + return getFormElement(Locator.name(fieldName)); + } + + @Override + protected void doCleanup(boolean afterTest) + { + _containerHelper.deleteProject(getProjectName(), afterTest); + } + + @Override + protected String getProjectName() + { + return "NabAssayDefaultValuesTest"; + } + + @Override + public List getAssociatedModules() + { + return List.of("nab"); + } + + @Override + public BrowserType bestBrowser() + { + return BrowserType.CHROME; + } +} diff --git a/src/org/labkey/test/util/AbstractAssayHelper.java b/src/org/labkey/test/util/AbstractAssayHelper.java index 4d58e13662..b00cd2590b 100644 --- a/src/org/labkey/test/util/AbstractAssayHelper.java +++ b/src/org/labkey/test/util/AbstractAssayHelper.java @@ -157,6 +157,7 @@ public enum AssayDefaultAreas DATA_FIELDS("Data Fields"), ANALYTE_PROPERTIES("Analyte Properties"), RUN_FIELDS("Run Fields"), + SAMPLE_FIELDS("Sample Fields"), EXCEL_FILE_RUN_PROPERTIES("Excel File Run Properties"); private final String menuSuffix;