|
19 | 19 | RequestInternalDereferencedToolState, |
20 | 20 | RequestInternalToolState, |
21 | 21 | RequestToolState, |
| 22 | + seed_repeat_defaults, |
22 | 23 | strictify, |
23 | 24 | ) |
24 | 25 | from galaxy.tool_util.parser.util import parse_profile_version |
@@ -452,6 +453,36 @@ def _strict_async_decode_and_dereference( |
452 | 453 | return dereference(request_internal_state, bundle, _fake_dereference, _fake_collection_deference) |
453 | 454 |
|
454 | 455 |
|
| 456 | +def test_seed_repeat_defaults(): |
| 457 | + # <repeat min="0" default="2">: the async execution path materializes an omitted repeat to [] |
| 458 | + # before fill_static_defaults runs, so the default must be seeded earlier - while the omission |
| 459 | + # is still visible. Regression for the bigscape async failure (default="1" with no min => an |
| 460 | + # empty --cutoffs argument => argparse exit 2). |
| 461 | + bundle = input_models_for_tool_source(tool_source_for("parameters/gx_repeat_boolean_default")) |
| 462 | + |
| 463 | + # Omitted -> seeded with `default` instances. |
| 464 | + omitted: dict[str, Any] = {} |
| 465 | + seed_repeat_defaults(omitted, bundle) |
| 466 | + assert omitted["parameter"] == [{}, {}] |
| 467 | + |
| 468 | + # Explicit [] still means zero (the omitted-vs-empty distinction is preserved). |
| 469 | + explicit_empty: dict[str, Any] = {"parameter": []} |
| 470 | + seed_repeat_defaults(explicit_empty, bundle) |
| 471 | + assert explicit_empty["parameter"] == [] |
| 472 | + |
| 473 | + # Explicit instances are left untouched. |
| 474 | + explicit_one: dict[str, Any] = {"parameter": [{"boolean_parameter": True}]} |
| 475 | + seed_repeat_defaults(explicit_one, bundle) |
| 476 | + assert explicit_one["parameter"] == [{"boolean_parameter": True}] |
| 477 | + |
| 478 | + # Seeded instances then get their params filled by fill_static_defaults. |
| 479 | + seeded = {} |
| 480 | + seed_repeat_defaults(seeded, bundle) |
| 481 | + profile = parse_profile_version(tool_source_for("parameters/gx_repeat_boolean_default")) |
| 482 | + filled = fill_static_defaults(seeded, bundle, profile, partial=True) |
| 483 | + assert filled["parameter"] == [{"boolean_parameter": False}, {"boolean_parameter": False}] |
| 484 | + |
| 485 | + |
455 | 486 | def fill_state_for(tool_state: dict[str, Any], tool_path: str, partial: bool = False) -> dict[str, Any]: |
456 | 487 | tool_source = tool_source_for(tool_path) |
457 | 488 | bundle = input_models_for_tool_source(tool_source) |
|
0 commit comments