Skip to content

Commit bca56c1

Browse files
Add error tests for Signal Data tests. Cover Issue 53786
1 parent 03cf08a commit bca56c1

2 files changed

Lines changed: 146 additions & 18 deletions

File tree

signalData/test/src/org/labkey/test/pages/signaldata/SignalDataUploadPage.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
import org.labkey.test.BaseWebDriverTest;
1919
import org.labkey.test.Locator;
2020
import org.labkey.test.WebDriverWrapper;
21+
import org.labkey.test.components.bootstrap.ModalDialog;
2122
import org.labkey.test.components.ext4.Window;
2223
import org.labkey.test.util.Ext4Helper;
2324
import org.openqa.selenium.Keys;
25+
import org.openqa.selenium.WebDriver;
2426
import org.openqa.selenium.WebElement;
2527
import org.openqa.selenium.support.ui.ExpectedConditions;
2628

@@ -111,6 +113,15 @@ public void saveRun()
111113
_test.clickAndWait(Locators.saveButton);
112114
}
113115

116+
public Window saveRunExpectingError(WebDriver webDriver)
117+
{
118+
WebElement saveButton = Locators.saveButton.findElement(_test.getDriver());
119+
WebDriverWrapper.waitFor(() -> !saveButton.getAttribute("class").contains("disabled"), "Unable to save, button is disabled", 1000);
120+
_test.click(Locators.saveButton);
121+
122+
return Window(_test.getDriver()).withTitle("Error").waitFor();
123+
}
124+
114125
private static class Locators
115126
{
116127
static final Locator.XPathLocator runIdentifier = Locator.input("RunIdentifier").notHidden();

signalData/test/src/org/labkey/test/tests/signaldata/SignalDataRawTest.java

Lines changed: 135 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,22 @@
2323
import org.labkey.test.BaseWebDriverTest;
2424
import org.labkey.test.Locator;
2525
import org.labkey.test.categories.Daily;
26+
import org.labkey.test.pages.ReactAssayDesignerPage;
2627
import org.labkey.test.pages.signaldata.SignalDataAssayBeginPage;
2728
import org.labkey.test.pages.signaldata.SignalDataRunViewerPage;
2829
import org.labkey.test.pages.signaldata.SignalDataUploadPage;
30+
import org.labkey.test.params.FieldDefinition;
2931
import org.labkey.test.util.DataRegionTable;
3032
import org.labkey.test.util.Ext4Helper;
33+
import org.labkey.test.components.ext4.Window;
3134
import org.labkey.test.util.PostgresOnlyTest;
35+
import org.labkey.test.util.data.TestDataUtils;
3236
import org.labkey.test.util.signaldata.SignalDataInitializer;
3337
import org.openqa.selenium.WebElement;
3438

3539
import java.io.File;
40+
import java.io.IOException;
41+
import java.util.ArrayList;
3642
import java.util.Collections;
3743
import java.util.List;
3844
import java.util.Map;
@@ -84,14 +90,14 @@ public static void doSetup() throws Exception
8490
@Before
8591
public void preTest()
8692
{
87-
// Reset to the original run/data file set created in the initialize
88-
navigateToAssayLandingPage().resetUploadedData(DEFAULT_RUN);
93+
// Reset to the original run/data file set created in the initializing
94+
navigateToAssayLandingPage(SignalDataInitializer.RAW_SignalData_ASSAY).resetUploadedData(DEFAULT_RUN);
8995
}
9096

9197
@Test
9298
public void testRunsSearch()
9399
{
94-
SignalDataAssayBeginPage beginPage = navigateToAssayLandingPage();
100+
SignalDataAssayBeginPage beginPage = navigateToAssayLandingPage(SignalDataInitializer.RAW_SignalData_ASSAY);
95101

96102
//Test search by file
97103
beginPage.setSearchBox(RESULT_FILENAME_1);
@@ -107,7 +113,7 @@ public void testRunsSearch()
107113
public void testRunViewer()
108114
{
109115
// TODO: Test the run viewer. See FormulationsTest.qualityControlHPLCData for guidance.
110-
SignalDataAssayBeginPage beginPage = navigateToAssayLandingPage();
116+
SignalDataAssayBeginPage beginPage = navigateToAssayLandingPage(SignalDataInitializer.RAW_SignalData_ASSAY);
111117

112118
beginPage.selectData(RESULT_FILENAME_1, DEFAULT_RUN);
113119
beginPage.selectData(RESULT_FILENAME_2, DEFAULT_RUN);
@@ -132,7 +138,8 @@ public void testFileImport()
132138
File metadataFile = getFile("RunsMetadata/datafiles.tsv");
133139
Map<String, List<String>> expectedData = Map.of("StringValue", List.of("StringOne", "StringTwo", "StringThree"),
134140
"IntegerValue", List.of("1", "2", "3"));
135-
SignalDataAssayBeginPage beginPage = importRun("importTest1",
141+
SignalDataAssayBeginPage beginPage = importRun(SignalDataInitializer.RAW_SignalData_ASSAY,
142+
"importTest1",
136143
metadataFile,
137144
List.of(getFile(String.join("/", ASSAY_DATA_LOC, "BLANK235.TXT"))),
138145
List.of(
@@ -150,10 +157,11 @@ public void testFileImport()
150157
uploadPage.setRunIDField("cleared run");
151158
assertElementPresent(Ext4Helper.Locators.getGridRow()); //Check grid has elements
152159
uploadPage.clearRun();
153-
navigateToAssayLandingPage(); //Should not cause unload warning
160+
navigateToAssayLandingPage(SignalDataInitializer.RAW_SignalData_ASSAY); //Should not cause unload warning
154161

155162
// test upload of metadata file with full data file paths
156-
importRun("importTest2",
163+
importRun(SignalDataInitializer.RAW_SignalData_ASSAY,
164+
"importTest2",
157165
getFile("RunsMetadata/datafiles2.tsv"),
158166
Collections.emptyList(),
159167
List.of(
@@ -164,7 +172,8 @@ public void testFileImport()
164172
), Collections.EMPTY_MAP, 4);
165173

166174
// test import of files with a subset of the metadata files
167-
importRun("importTest3",
175+
importRun(SignalDataInitializer.RAW_SignalData_ASSAY,
176+
"importTest3",
168177
getFile("RunsMetadata/datafiles.tsv"),
169178
List.of(getFile(String.join("/", ASSAY_DATA_LOC, "BLANK235.TXT"))),
170179
List.of(
@@ -173,7 +182,8 @@ public void testFileImport()
173182
),
174183
expectedData, 3);
175184

176-
importRun("importTest4",
185+
importRun(SignalDataInitializer.RAW_SignalData_ASSAY,
186+
"importTest4",
177187
getFile("RunsMetadata/datafiles2.tsv"),
178188
Collections.emptyList(),
179189
List.of(
@@ -182,16 +192,123 @@ public void testFileImport()
182192
), Collections.EMPTY_MAP, 4);
183193
}
184194

195+
@Test
196+
public void testErrorConditions() throws IOException
197+
{
198+
199+
String errorAssay = "Test Errors Conditions";
200+
201+
goToProjectHome();
202+
203+
log("Defining Error Assay");
204+
goToManageAssays();
205+
206+
// We don't handle tricky characters well.
207+
// Uncomment these lines once Issue 53965 is fixed.
208+
// String strFieldName = TestDataGenerator.randomFieldName("Str");
209+
// String intFieldName = TestDataGenerator.randomFieldName("Int");
210+
String strFieldName = "Str";
211+
String intFieldName = "Int";
212+
213+
FieldDefinition strField = new FieldDefinition(strFieldName, FieldDefinition.ColumnType.String)
214+
.setRequired(true);
215+
216+
FieldDefinition intField = new FieldDefinition(intFieldName, FieldDefinition.ColumnType.Integer)
217+
.setValidators(List.of(new FieldDefinition.RangeValidator("Large", "Must be greater than 5.",
218+
"Value must be greater than 5.",
219+
FieldDefinition.RangeType.GT, "5")));
220+
221+
ReactAssayDesignerPage assayDesigner = _assayHelper.createAssayDesign("Signal Data", errorAssay);
222+
assayDesigner.setDescription("Testing error condition are handled correctly.");
223+
assayDesigner.setEditableRuns(true);
224+
assayDesigner.setEditableResults(true);
225+
assayDesigner.goToResultsFields()
226+
.addField(strField)
227+
.addField(intField);
228+
assayDesigner.clickFinish();
229+
230+
List<List<String>> fileData = new ArrayList<>();
231+
fileData.add(List.of("Name", "DataFile", strField.getName(), intField.getName()));
232+
fileData.add(List.of("Missing Required", RESULT_FILENAME_1, "", "123"));
233+
fileData.add(List.of("Has All", RESULT_FILENAME_2, "DEF", "456"));
234+
File metadataFile = TestDataUtils.writeRowsToTsv("Missing Require Result Field.tsv", fileData);
235+
236+
uploadWithErrorAction(errorAssay,
237+
metadataFile,
238+
"Missing Required Run",
239+
String.format("Missing value for required property: %s", strField.getName()));
240+
241+
fileData = new ArrayList<>();
242+
fileData.add(List.of("Name", "DataFile", strField.getName(), intField.getName()));
243+
fileData.add(List.of("Valid Entry", RESULT_FILENAME_1, "ABC", "123"));
244+
fileData.add(List.of("Incompatible Data Type", RESULT_FILENAME_2, "DEF", "GHI"));
245+
metadataFile = TestDataUtils.writeRowsToTsv("Invalid Data Type.tsv", fileData);
246+
247+
uploadWithErrorAction(errorAssay,
248+
metadataFile,
249+
"Invalid Data Type",
250+
String.format("Int: Value 'GHI' for field '%s' is invalid. Value must be greater than 5.", intField.getName()));
251+
252+
fileData = new ArrayList<>();
253+
fileData.add(List.of("Name", "DataFile", strField.getName(), intField.getName()));
254+
fileData.add(List.of("Valid Entry Again", RESULT_FILENAME_1, "ABC", "123"));
255+
fileData.add(List.of("Range Validation Error", RESULT_FILENAME_2, "DEF", "2"));
256+
metadataFile = TestDataUtils.writeRowsToTsv("Range Validation Error.tsv", fileData);
257+
258+
uploadWithErrorAction(errorAssay,
259+
metadataFile,
260+
"Invalid Data Type",
261+
String.format("Int: Value '2' for field '%s' is invalid. Value must be greater than 5.", intField.getName()));
262+
263+
}
264+
265+
private void uploadWithErrorAction(String assayName,
266+
File metadataFile,
267+
String runId, String expectedMsg)
268+
{
269+
270+
// If there is ever a desire to expand the error testing to include errors in the data files, then this list of
271+
// data files should be identified in the test and passed in as a parameter.
272+
List<File> dataFiles = List.of(
273+
getFile(String.join("/", ASSAY_DATA_LOC, RESULT_FILENAME_1)),
274+
getFile(String.join("/", ASSAY_DATA_LOC, RESULT_FILENAME_2)));
275+
276+
SignalDataUploadPage uploadPage = navigateToAssayLandingPage(assayName).navigateToImportPage();
277+
278+
log(String.format("Uploading metadata file: %s", metadataFile.getName()));
279+
uploadPage.uploadMetadataFile(metadataFile);
280+
281+
log("Uploading data files.");
282+
int uploadCount = dataFiles.size();
283+
uploadPage.uploadFile(dataFiles);
284+
uploadPage.waitForProgressBars(uploadCount);
285+
286+
uploadPage.setRunIDField(runId);
287+
Window dialog = uploadPage.saveRunExpectingError(getDriver());
288+
289+
String actualMsg = dialog.getBody();
290+
291+
if (checker().withScreenshot()
292+
.verifyTrue(String.format("Error dialog message '%s' does not contain expected message: %s", actualMsg, expectedMsg),
293+
actualMsg.contains(expectedMsg)))
294+
{
295+
dialog.clickButton("OK", true);
296+
uploadPage.clearRun();
297+
}
298+
299+
}
300+
185301
private SignalDataAssayBeginPage importRun(
186-
String runName,
187-
File metadataFile,
188-
List<File> unspecifiedDataFiles,
189-
List<File> dataFiles,
190-
Map<String, List<String>> expectedData,
191-
int expectedResultRows
302+
String assayName,
303+
String runName,
304+
File metadataFile,
305+
List<File> unspecifiedDataFiles,
306+
List<File> dataFiles,
307+
Map<String, List<String>> expectedData,
308+
int expectedResultRows
192309
)
193310
{
194-
SignalDataAssayBeginPage beginPage = navigateToAssayLandingPage();
311+
SignalDataAssayBeginPage beginPage = navigateToAssayLandingPage(assayName);
195312
SignalDataUploadPage uploadPage = beginPage.navigateToImportPage();
196313

197314
log("Uploading metadata file");
@@ -236,11 +353,11 @@ private File getFile(String relativePath)
236353
return file;
237354
}
238355

239-
private SignalDataAssayBeginPage navigateToAssayLandingPage()
356+
private SignalDataAssayBeginPage navigateToAssayLandingPage(String assayName)
240357
{
241358
//Navigate to Landing Page
242359
goToProjectHome();
243-
clickAndWait(Locator.linkWithText(SignalDataInitializer.RAW_SignalData_ASSAY));
360+
clickAndWait(Locator.linkWithText(assayName));
244361
SignalDataAssayBeginPage page = new SignalDataAssayBeginPage(this);
245362
page.waitForPageLoad();
246363
return page;

0 commit comments

Comments
 (0)