@@ -222,9 +222,10 @@ def test_site_rules_copied_to_new_projects(randstr, data_builder, file_form, as_
222
222
data_builder .delete_group (group , recursive = True )
223
223
224
224
225
- def test_rules (randstr , data_builder , file_form , as_root , as_admin , with_user , api_db ):
225
+ def test_project_rules (randstr , data_builder , file_form , as_root , as_admin , with_user , api_db ):
226
226
# create versioned gear to cover code selecting latest gear
227
- gear = data_builder .create_gear (gear = {'version' : '0.0.1' })
227
+ gear_config = {'param' : {'type' : 'string' , 'pattern' : '^default|custom$' , 'default' : 'default' }}
228
+ gear = data_builder .create_gear (gear = {'version' : '0.0.1' , 'config' : gear_config })
228
229
project = data_builder .create_project ()
229
230
230
231
bad_payload = {'test' : 'rules' }
@@ -267,19 +268,42 @@ def test_rules(randstr, data_builder, file_form, as_root, as_admin, with_user, a
267
268
'gear_id' : '000000000000000000000000' ,
268
269
'name' : 'csv-job-trigger-rule' ,
269
270
'any' : [],
270
- 'all' : [
271
- {'type' : 'file.type' , 'value' : 'tabular data' },
272
- ]
271
+ 'all' : [],
273
272
}
274
273
274
+ # try to add project rule w/ invalid rule-item (invalid type)
275
+ # NOTE this is a legacy rule
276
+ rule_json ['all' ] = [{'type' : 'invalid' , 'value' : 'test' }]
277
+ r = as_admin .post ('/projects/' + project + '/rules' , json = rule_json )
278
+ assert r .status_code == 400
279
+ assert "'invalid' is not one of" in r .json ()['message' ]
280
+
281
+ # try to add project rule w/ invalid rule-item (missing value)
282
+ # NOTE this is a legacy rule
283
+ rule_json ['all' ] = [{'type' : 'file.name' }]
284
+ r = as_admin .post ('/projects/' + project + '/rules' , json = rule_json )
285
+ assert r .status_code == 400
286
+ assert "'value' is a required property" in r .json ()['message' ]
287
+
288
+ # set valid rule-item
289
+ rule_json ['all' ] = [{'type' : 'file.type' , 'value' : 'tabular data' }]
290
+
275
291
# try to add project rule w/ non-existent gear
276
292
# NOTE this is a legacy rule
277
293
r = as_admin .post ('/projects/' + project + '/rules' , json = rule_json )
278
294
assert r .status_code == 404
279
295
280
- # add project rule w/ proper gear id
296
+ # try to add project rule w/ invalid config
281
297
# NOTE this is a legacy rule
282
298
rule_json ['gear_id' ] = gear
299
+ rule_json ['config' ] = {'param' : 'invalid' }
300
+ r = as_admin .post ('/projects/' + project + '/rules' , json = rule_json )
301
+ assert r .status_code == 422
302
+ assert r .json ()['reason' ] == 'config did not match manifest'
303
+ del rule_json ['config' ]
304
+
305
+ # add project rule w/ proper gear id
306
+ # NOTE this is a legacy rule
283
307
r = as_admin .post ('/projects/' + project + '/rules' , json = rule_json )
284
308
assert r .ok
285
309
rule = r .json ()['_id' ]
@@ -305,10 +329,15 @@ def test_rules(randstr, data_builder, file_form, as_root, as_admin, with_user, a
305
329
r = with_user .session .put ('/projects/' + project + '/rules/' + rule , json = {'gear_id' : gear })
306
330
assert r .status_code == 403
307
331
308
- # try to update rule to with invalid gear id
332
+ # try to update rule with invalid gear id
309
333
r = as_admin .put ('/projects/' + project + '/rules/' + rule , json = {'gear_id' : '000000000000000000000000' })
310
334
assert r .status_code == 404
311
335
336
+ # try to update rule with invalid gear config
337
+ r = as_admin .put ('/projects/' + project + '/rules/' + rule , json = {'config' : {'param' : 'invalid' }})
338
+ assert r .status_code == 422
339
+ assert r .json ()['reason' ] == 'config did not match manifest'
340
+
312
341
# update name of rule
313
342
rule_name = 'improved-csv-trigger-rule'
314
343
r = as_admin .put ('/projects/' + project + '/rules/' + rule , json = {'name' : rule_name })
@@ -323,11 +352,25 @@ def test_rules(randstr, data_builder, file_form, as_root, as_admin, with_user, a
323
352
r = as_admin .post ('/projects/' + project + '/files' , files = file_form ('test2.csv' ))
324
353
assert r .ok
325
354
326
- # test that job was created via rule
355
+ # test that job was created via rule and uses gear default config
327
356
gear_jobs = [job for job in api_db .jobs .find ({'gear_id' : gear })]
328
357
assert len (gear_jobs ) == 1
329
358
assert len (gear_jobs [0 ]['inputs' ]) == 1
330
359
assert gear_jobs [0 ]['inputs' ][0 ]['name' ] == 'test2.csv'
360
+ assert gear_jobs [0 ]['config' ]['config' ] == {'param' : 'default' }
361
+
362
+ # update rule to have a custom config
363
+ r = as_admin .put ('/projects/' + project + '/rules/' + rule , json = {'config' : {'param' : 'custom' }})
364
+ assert r .ok
365
+
366
+ # upload another file that matches rule
367
+ r = as_admin .post ('/projects/' + project + '/files' , files = file_form ('test3.csv' ))
368
+ assert r .ok
369
+
370
+ # test that job was created via rule and custom config
371
+ gear_jobs = [job for job in api_db .jobs .find ({'gear_id' : gear })]
372
+ assert len (gear_jobs ) == 2
373
+ assert gear_jobs [1 ]['config' ]['config' ] == {'param' : 'custom' }
331
374
332
375
# try to delete rule of non-existent project
333
376
r = as_admin .delete ('/projects/000000000000000000000000/rules/000000000000000000000000' )
@@ -368,7 +411,7 @@ def test_rules(randstr, data_builder, file_form, as_root, as_admin, with_user, a
368
411
369
412
# test that job was not created via rule
370
413
gear_jobs = [job for job in api_db .jobs .find ({'gear_id' : gear })]
371
- assert len (gear_jobs ) == 1 # still 1 from before
414
+ assert len (gear_jobs ) == 2 # still 2 from before
372
415
373
416
# update test2.csv's metadata to include a valid measurement to spawn job
374
417
metadata = {
@@ -396,9 +439,9 @@ def test_rules(randstr, data_builder, file_form, as_root, as_admin, with_user, a
396
439
397
440
# test that only one job was created via rule
398
441
gear_jobs = [job for job in api_db .jobs .find ({'gear_id' : gear })]
399
- assert len (gear_jobs ) == 2
400
- assert len (gear_jobs [1 ]['inputs' ]) == 1
401
- assert gear_jobs [1 ]['inputs' ][0 ]['name' ] == 'test3.txt'
442
+ assert len (gear_jobs ) == 3
443
+ assert len (gear_jobs [2 ]['inputs' ]) == 1
444
+ assert gear_jobs [2 ]['inputs' ][0 ]['name' ] == 'test3.txt'
402
445
403
446
# delete rule
404
447
r = as_admin .delete ('/projects/' + project + '/rules/' + rule2 )
@@ -423,7 +466,7 @@ def test_rules(randstr, data_builder, file_form, as_root, as_admin, with_user, a
423
466
424
467
# test that job was created via regex rule
425
468
gear_jobs = [job for job in api_db .jobs .find ({'gear_id' : gear })]
426
- assert len (gear_jobs ) == 3
469
+ assert len (gear_jobs ) == 4
427
470
428
471
# delete rule
429
472
r = as_admin .delete ('/projects/' + project + '/rules/' + rule3 )
0 commit comments