2323import org .labkey .test .BaseWebDriverTest ;
2424import org .labkey .test .Locator ;
2525import org .labkey .test .categories .Daily ;
26+ import org .labkey .test .pages .ReactAssayDesignerPage ;
2627import org .labkey .test .pages .signaldata .SignalDataAssayBeginPage ;
2728import org .labkey .test .pages .signaldata .SignalDataRunViewerPage ;
2829import org .labkey .test .pages .signaldata .SignalDataUploadPage ;
30+ import org .labkey .test .params .FieldDefinition ;
2931import org .labkey .test .util .DataRegionTable ;
3032import org .labkey .test .util .Ext4Helper ;
33+ import org .labkey .test .components .ext4 .Window ;
3134import org .labkey .test .util .PostgresOnlyTest ;
35+ import org .labkey .test .util .data .TestDataUtils ;
3236import org .labkey .test .util .signaldata .SignalDataInitializer ;
3337import org .openqa .selenium .WebElement ;
3438
3539import java .io .File ;
40+ import java .io .IOException ;
41+ import java .util .ArrayList ;
3642import java .util .Collections ;
3743import java .util .List ;
3844import 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