Skip to content

Commit f043b03

Browse files
Test coverage for 54156, test code cleanup
1 parent ccecad8 commit f043b03

10 files changed

Lines changed: 160 additions & 65 deletions

src/org/labkey/test/components/assay/AssayConstants.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public class AssayConstants
1212
public static final Locator COMMENTS_FIELD_LOCATOR = Locator.name("Comments");
1313
public static final Locator TARGET_STUDY_FIELD_LOCATOR = Locator.name(TARGET_STUDY_FIELD_NAME);
1414
public static final Locator TEXT_AREA_DATA_PROVIDER_LOCATOR = Locator.xpath("//input[@value='textAreaDataProvider']");
15-
public static final Locator TEXT_AREA_DATA_COLLECTOR_LOCATOR = Locator.textarea("TextAreaDataCollector.textArea");
15+
public static final String TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME = "TextAreaDataCollector.textArea";
16+
public static final Locator TEXT_AREA_DATA_COLLECTOR_LOCATOR = Locator.textarea(TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME);
1617
}

src/org/labkey/test/tests/SampleTypeRemoteAPITest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.labkey.test.TestTimeoutException;
3838
import org.labkey.test.categories.Daily;
3939
import org.labkey.test.components.CustomizeView;
40+
import org.labkey.test.components.assay.AssayConstants;
4041
import org.labkey.test.components.domain.DomainFormPanel;
4142
import org.labkey.test.pages.ReactAssayDesignerPage;
4243
import org.labkey.test.pages.assay.AssayImportPage;
@@ -766,7 +767,7 @@ private void insertAssayData(String assayName, List<TestDataGenerator> dataGener
766767
for(TestDataGenerator dataGen : dataGenerators)
767768
{
768769
AssayImportPage page = new AssayImportPage(getDriver())
769-
.setNamedTextAreaValue("TextAreaDataCollector.textArea",
770+
.setNamedTextAreaValue(AssayConstants.TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME,
770771
dataGen.getDataAsTsv());
771772
imported++;
772773

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.labkey.test.tests.assay;
2+
3+
import org.junit.BeforeClass;
4+
import org.labkey.test.BaseWebDriverTest;
5+
import org.labkey.test.util.RReportHelper;
6+
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
/**
11+
* Shared setup/cleanup helpers for assay transform-related WebDriver tests.
12+
* Consolidates common project creation, R configuration, and project cleanup.
13+
*/
14+
public abstract class AbstractAssayTransformTest extends BaseWebDriverTest
15+
{
16+
@BeforeClass
17+
public static void setupProject()
18+
{
19+
AbstractAssayTransformTest init = getCurrentTest();
20+
init.doSetup();
21+
}
22+
23+
protected void doSetup()
24+
{
25+
new RReportHelper(this).ensureRConfig();
26+
_containerHelper.createProject(getProjectName(), "Assay");
27+
}
28+
29+
@Override
30+
protected void doCleanup(boolean afterTest)
31+
{
32+
_containerHelper.deleteProject(getProjectName(), afterTest);
33+
}
34+
35+
@Override
36+
protected String getProjectName()
37+
{
38+
return getClass().getSimpleName() + " Project";
39+
}
40+
41+
@Override
42+
public List<String> getAssociatedModules()
43+
{
44+
return Collections.emptyList();
45+
}
46+
}

src/org/labkey/test/tests/assay/AssayMissingValuesTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ public void testAssayMV()
9797
setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, ASSAY_RUN_SINGLE_COLUMN);
9898
click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR);
9999

100-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), TEST_DATA_SINGLE_COLUMN_ASSAY_BAD);
100+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_DATA_SINGLE_COLUMN_ASSAY_BAD);
101101
clickButton("Save and Finish");
102102
assertLabKeyErrorPresent();
103103

104104
click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR);
105-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), TEST_DATA_SINGLE_COLUMN_ASSAY);
105+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_DATA_SINGLE_COLUMN_ASSAY);
106106
clickButton("Save and Finish");
107107
assertNoLabKeyErrors();
108108
clickAndWait(Locator.linkWithText(ASSAY_RUN_SINGLE_COLUMN));

src/org/labkey/test/tests/assay/AssayTransformImportUpdateTest.java

Lines changed: 10 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import org.assertj.core.api.Assertions;
44
import org.junit.Assume;
5-
import org.junit.BeforeClass;
65
import org.junit.Test;
76
import org.junit.experimental.categories.Category;
87
import org.labkey.test.BaseWebDriverTest;
@@ -11,6 +10,7 @@
1110
import org.labkey.test.WebTestHelper;
1211
import org.labkey.test.categories.Assays;
1312
import org.labkey.test.categories.Daily;
13+
import org.labkey.test.components.assay.AssayConstants;
1414
import org.labkey.test.pages.ReactAssayDesignerPage;
1515
import org.labkey.test.pages.admin.UsageStatisticsPage;
1616
import org.labkey.test.pages.assay.AssayImportPage;
@@ -19,13 +19,10 @@
1919
import org.labkey.test.pages.pipeline.PipelineStatusDetailsPage;
2020
import org.labkey.test.params.FieldDefinition;
2121
import org.labkey.test.params.assay.GeneralAssayDesign;
22-
import org.labkey.test.util.PipelineStatusTable;
23-
import org.labkey.test.util.RReportHelper;
2422

2523
import java.io.File;
2624
import java.time.Duration;
2725
import java.time.Instant;
28-
import java.util.Arrays;
2926
import java.util.List;
3027

3128
import static org.labkey.test.pages.ReactAssayDesignerPage.ScriptFileEvent.Edit;
@@ -34,29 +31,8 @@
3431

3532
@Category({Assays.class, Daily.class})
3633
@BaseWebDriverTest.ClassTimeout(minutes = 4)
37-
public class AssayTransformImportUpdateTest extends BaseWebDriverTest
34+
public class AssayTransformImportUpdateTest extends AbstractAssayTransformTest
3835
{
39-
40-
@Override
41-
protected void doCleanup(boolean afterTest)
42-
{
43-
_containerHelper.deleteProject(getProjectName(), afterTest);
44-
}
45-
46-
@BeforeClass
47-
public static void setupProject()
48-
{
49-
AssayTransformImportUpdateTest init = getCurrentTest();
50-
51-
init.doSetup();
52-
}
53-
54-
private void doSetup()
55-
{
56-
new RReportHelper(this).ensureRConfig();
57-
_containerHelper.createProject(getProjectName(), "Assay");
58-
}
59-
6036
@Test
6137
public void testEnableTransformForUpdate() throws Exception
6238
{
@@ -89,6 +65,7 @@ public void testEnableTransformForUpdate() throws Exception
8965
var assayDesignerPage = ReactAssayDesignerPage.beginAt(this, getProjectName(), protocolResponse.getProtocolId(),
9066
"general", getURL().toString());
9167
assayDesignerPage.addTransformScript(transformFile, true);
68+
assayDesignerPage.goToBatchFields().removeAllFields(true);
9269

9370
checker().verifyTrue("expect run on import to be enabled by default",
9471
assayDesignerPage.isScriptActionCheckboxEnabled(insertOrUpdateTransform, Import));
@@ -129,11 +106,10 @@ public void testEnableTransformForUpdate() throws Exception
129106
""";
130107

131108
clickAndWait(Locator.linkWithText(insertOrUpdateTransformAssay));
132-
new AssayRunsPage(getDriver()).getTable().clickHeaderButton("Import Data");
133-
clickButton("Next");
109+
new AssayRunsPage(getDriver()).getTable().clickHeaderButtonAndWait("Import Data");
134110
var importPage = new AssayImportPage(getDriver());
135111
importPage.setNamedInputText("Name", "transformTestImport");
136-
importPage.setNamedTextAreaValue("TextAreaDataCollector.textArea", importData);
112+
importPage.setNamedTextAreaValue(AssayConstants.TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME, importData);
137113
importPage.clickSaveAndFinish();
138114

139115
var assayDataPage = new AssayRunsPage(getDriver()).clickAssayIdLink("transformTestImport");
@@ -166,11 +142,10 @@ public void testEnableTransformForUpdate() throws Exception
166142
// now import some data to a new run called non_transform_import
167143
goToProjectHome();
168144
clickAndWait(Locator.linkWithText(insertOrUpdateTransformAssay));
169-
new AssayRunsPage(getDriver()).getTable().clickHeaderButton("Import Data");
170-
clickButton("Next");
145+
new AssayRunsPage(getDriver()).getTable().clickHeaderButtonAndWait("Import Data");
171146
importPage = new AssayImportPage(getDriver());
172147
importPage.setNamedInputText("Name", "non_transform_import");
173-
importPage.setNamedTextAreaValue("TextAreaDataCollector.textArea", importData);
148+
importPage.setNamedTextAreaValue(AssayConstants.TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME, importData);
174149
importPage.clickSaveAndFinish();
175150

176151
var assayDataPage2 = new AssayRunsPage(getDriver()).clickAssayIdLink("non_transform_import");
@@ -270,6 +245,7 @@ public void testCancelAsyncAssayTransformJob() throws Exception
270245
var assayDesignerPage = ReactAssayDesignerPage.beginAt(this, getProjectName(), protocolResponse.getProtocolId(),
271246
"general", getURL().toString());
272247
assayDesignerPage.addTransformScript(transformFile, true);
248+
assayDesignerPage.goToBatchFields().removeAllFields(true);
273249
assayDesignerPage.setBackgroundImport(true);
274250
assayDesignerPage.clickSave();
275251

@@ -278,11 +254,10 @@ public void testCancelAsyncAssayTransformJob() throws Exception
278254
importDataBuilder.append(String.format("%d\t%d\tComment-%d\n", i, i, i));
279255

280256
clickAndWait(Locator.linkWithText(importCancelTransformAssay));
281-
new AssayRunsPage(getDriver()).getTable().clickHeaderButton("Import Data");
282-
clickButton("Next");
257+
new AssayRunsPage(getDriver()).getTable().clickHeaderButtonAndWait("Import Data");
283258
var importPage = new AssayImportPage(getDriver());
284259
importPage.setNamedInputText("Name", "cancelTransformTestImport");
285-
importPage.setNamedTextAreaValue("TextAreaDataCollector.textArea", importDataBuilder.toString());
260+
importPage.setNamedTextAreaValue(AssayConstants.TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME, importDataBuilder.toString());
286261
Instant before = Instant.now();
287262
importPage.clickSaveAndFinish();
288263

@@ -311,16 +286,4 @@ public void testCancelAsyncAssayTransformJob() throws Exception
311286

312287
resetErrors();
313288
}
314-
315-
@Override
316-
protected String getProjectName()
317-
{
318-
return "AssayTransformImportUpdateTest Project";
319-
}
320-
321-
@Override
322-
public List<String> getAssociatedModules()
323-
{
324-
return Arrays.asList();
325-
}
326289
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.labkey.test.tests.assay;
2+
3+
import org.junit.Test;
4+
import org.junit.experimental.categories.Category;
5+
import org.labkey.api.util.FileUtil;
6+
import org.labkey.test.Locator;
7+
import org.labkey.test.TestFileUtils;
8+
import org.labkey.test.categories.Assays;
9+
import org.labkey.test.components.assay.AssayConstants;
10+
import org.labkey.test.pages.ReactAssayDesignerPage;
11+
import org.labkey.test.pages.assay.AssayImportPage;
12+
import org.labkey.test.pages.assay.AssayRunsPage;
13+
import org.labkey.test.params.assay.GeneralAssayDesign;
14+
15+
import java.io.File;
16+
import java.nio.file.Files;
17+
import java.nio.file.Path;
18+
19+
/**
20+
* Issue 54156: Regression test to ensure a reasonable error message is shown when an assay design references
21+
* a transform script whose parent directory has since been deleted, and that the assay design can be fixed by removing the script.
22+
*/
23+
@Category({Assays.class})
24+
public class AssayTransformMissingParentDirTest extends AbstractAssayTransformTest
25+
{
26+
@Test
27+
public void testMissingParentDirectoryRegression() throws Exception
28+
{
29+
// Create a nested directory and an R transform script within it
30+
String assayName = "missingParentDirAssay";
31+
Path parentDir = Files.createTempDirectory("assay-transform-parent-");
32+
Path nestedDir = FileUtil.createDirectories(parentDir.resolve("child"), false);
33+
String scriptName = "transformMissingParent.R";
34+
String transformContent = "library(Rlabkey);";
35+
File transformFile = nestedDir.resolve(scriptName).toFile();
36+
TestFileUtils.writeFile(transformFile, transformContent);
37+
38+
// Create a General assay and add the transform by absolute path (not upload)
39+
var protocolResponse = new GeneralAssayDesign(assayName).createAssay(getProjectName(), createDefaultConnection());
40+
var assayDesignerPage = ReactAssayDesignerPage.beginAt(this, getProjectName(), protocolResponse.getProtocolId(),
41+
"general", getURL().toString());
42+
assayDesignerPage.goToBatchFields().removeAllFields(true);
43+
// add by path so the absolute path is stored; this allows reproducing the missing parent dir scenario
44+
assayDesignerPage.addTransformScript(transformFile);
45+
assayDesignerPage.clickSave();
46+
47+
// Now delete the parent dir to ensure we handle it reasonably
48+
TestFileUtils.deleteDir(parentDir.toFile());
49+
50+
// Attempt to import data and verify a reasonable error message is shown
51+
String importData = """
52+
VisitID\tParticipantID\tComment
53+
1\tP1\timport after parent deleted
54+
""";
55+
56+
clickAndWait(Locator.linkWithText(assayName));
57+
new AssayRunsPage(getDriver()).getTable().clickHeaderButtonAndWait("Import Data");
58+
var importPage = new AssayImportPage(getDriver());
59+
importPage.setNamedInputText("Name", "missingParentImport");
60+
importPage.setNamedTextAreaValue(AssayConstants.TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME, importData);
61+
importPage.clickSaveAndFinish();
62+
63+
// Expect an error page/message indicating the transform script path cannot be used
64+
// Be tolerant to platform-specific phrasing; assert any of these appear
65+
String expectedPath = transformFile.getAbsolutePath();
66+
checker().withScreenshot("missing-parent-error")
67+
.verifyTrue("Expect an error message about the transform script path not being found",
68+
isTextPresent("transformMissingParent.R, configured for this assay does not exist."));
69+
70+
// Fix the assay design by removing the transform script
71+
goToProjectHome();
72+
assayDesignerPage = ReactAssayDesignerPage.beginAt(this, getProjectName(), protocolResponse.getProtocolId(),
73+
"general", getURL().toString());
74+
assayDesignerPage.removeTransformScript(scriptName);
75+
assayDesignerPage.clickSave();
76+
77+
// Retry the import and verify it succeeds without the transform
78+
clickAndWait(Locator.linkWithText(assayName));
79+
new AssayRunsPage(getDriver()).getTable().clickHeaderButtonAndWait("Import Data");
80+
importPage = new AssayImportPage(getDriver());
81+
importPage.setNamedInputText("Name", "fixedAssayImport");
82+
importPage.setNamedTextAreaValue(AssayConstants.TEXT_AREA_DATA_COLLECTOR_TEXT_AREA_NAME, importData);
83+
importPage.clickSaveAndFinish();
84+
85+
// Verify we land on the run details page and can see the run name (no transform needed)
86+
new AssayRunsPage(getDriver()).clickAssayIdLink("fixedAssayImport");
87+
}
88+
89+
}

src/org/labkey/test/tests/assay/AssayTransformWarningTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.labkey.test.TestTimeoutException;
2727
import org.labkey.test.categories.Assays;
2828
import org.labkey.test.categories.Daily;
29+
import org.labkey.test.components.assay.AssayConstants;
2930
import org.labkey.test.pages.ReactAssayDesignerPage;
3031
import org.labkey.test.pages.files.WebDavPage;
3132
import org.labkey.test.params.FieldDefinition;
@@ -113,7 +114,7 @@ public void testJavaTransformWarning() throws Exception
113114
clickButton("Import Data");
114115
clickButton("Next");
115116
setFormElement(ASSAY_NAME_FIELD_LOCATOR, runName);
116-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), importData);
117+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, importData);
117118

118119
clickButton("Save and Finish");
119120
assertElementPresent(Locators.labkeyError.containing("Inline warning from Java transform."));
@@ -156,7 +157,7 @@ public void testRTransformWarning()
156157

157158
// Use this file as a sample upload file parameter
158159
setFormElement(Locator.name("myFile"), JAVA_TRANSFORM_SCRIPT);
159-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), importData);
160+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, importData);
160161

161162
clickButton("Save and Finish");
162163
assertElementPresent(Locators.labkeyError.containing("Inline warning from R transform."));
@@ -216,7 +217,7 @@ public void testRTransformUpdateWarning() throws Exception
216217
clickButton("Import Data");
217218
clickButton("Next");
218219
setFormElement(ASSAY_NAME_FIELD_LOCATOR, runName);
219-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), importData);
220+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, importData);
220221
clickButton("Save and Finish");
221222

222223
// edit the result, expect warning
@@ -251,7 +252,7 @@ public void testRTransformError()
251252
clickButton("Next");
252253
setFormElement(ASSAY_NAME_FIELD_LOCATOR, runName);
253254

254-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), importData);
255+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, importData);
255256

256257
clickButton("Save and Finish");
257258
assertTextPresent("There are errors in the input file");
@@ -287,7 +288,7 @@ public void testTransformErrorOnUpdate() throws Exception
287288
clickButton("Import Data");
288289
clickButton("Next");
289290
setFormElement(ASSAY_NAME_FIELD_LOCATOR, runName);
290-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), importData);
291+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, importData);
291292

292293
clickButton("Save and Finish");
293294

src/org/labkey/test/tests/pipeline/PipelineProtocolArchiveTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ private void archiveSelected(DataRegionTable protocols)
160160
{
161161
doAndWaitForPageToLoad(()->
162162
{
163-
protocols.clickHeaderButtonByText("archive");
163+
protocols.clickHeaderButton("archive");
164164
assertAlert("Are you sure you want to archive the selected protocol?");
165165
});
166166
}
@@ -169,7 +169,7 @@ private void unarchiveSelected(DataRegionTable protocols)
169169
{
170170
doAndWaitForPageToLoad(()->
171171
{
172-
protocols.clickHeaderButtonByText("unarchive");
172+
protocols.clickHeaderButton("unarchive");
173173
assertAlert("Are you sure you want to unarchive the selected protocol?");
174174
});
175175
}

src/org/labkey/test/tests/study/StudyMissingValuesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public void testAssayLinkToStudyMV()
207207
clickButton("Next");
208208
setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, ASSAY_RUN_SINGLE_COLUMN);
209209
click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR);
210-
setFormElement(Locator.name("TextAreaDataCollector.textArea"), TEST_DATA_SINGLE_COLUMN_ASSAY);
210+
setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_DATA_SINGLE_COLUMN_ASSAY);
211211
clickButton("Save and Finish");
212212
assertNoLabKeyErrors();
213213

0 commit comments

Comments
 (0)