galaxy-test-api 26.0.1.dev0__tar.gz → 26.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. galaxy_test_api-26.0.1.dev0/galaxy_test_api.egg-info/PKG-INFO → galaxy_test_api-26.0.2/HISTORY.rst +73 -34
  2. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/PKG-INFO +95 -4
  3. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/conftest.py +2 -4
  4. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_authenticate.py +5 -4
  5. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_dataset_collections.py +32 -0
  6. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_datasets.py +73 -0
  7. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_framework.py +12 -0
  8. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_history_contents.py +12 -0
  9. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_jobs.py +51 -3
  10. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_pages.py +21 -1
  11. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tool_execute.py +21 -0
  12. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tools.py +154 -2
  13. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tools_upload.py +19 -0
  14. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_users.py +39 -1
  15. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_wes.py +57 -18
  16. galaxy_test_api-26.0.2/galaxy_test/api/test_workflow_build_module.py +46 -0
  17. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_workflows.py +275 -22
  18. galaxy_test_api-26.0.1.dev0/HISTORY.rst → galaxy_test_api-26.0.2/galaxy_test_api.egg-info/PKG-INFO +131 -3
  19. galaxy_test_api-26.0.2/pyproject.toml +33 -0
  20. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/setup.cfg +1 -18
  21. galaxy_test_api-26.0.1.dev0/galaxy_test/api/test_workflow_build_module.py +0 -19
  22. galaxy_test_api-26.0.1.dev0/pyproject.toml +0 -16
  23. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/LICENSE +0 -0
  24. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/MANIFEST.in +0 -0
  25. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/README.rst +0 -0
  26. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/dev-requirements.txt +0 -0
  27. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/__init__.py +0 -0
  28. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/__init__.py +0 -0
  29. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/_framework.py +0 -0
  30. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/cwl/__init__.py +0 -0
  31. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/embed_test_1.gxwf.yml +0 -0
  32. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/embed_test_1_tool.gxtool.yml +0 -0
  33. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/sharable.py +0 -0
  34. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_configuration.py +0 -0
  35. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_container_resolution.py +0 -0
  36. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_datatypes.py +0 -0
  37. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_display_applications.py +0 -0
  38. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_drs.py +0 -0
  39. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_exports.py +0 -0
  40. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_folder_contents.py +0 -0
  41. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_folders.py +0 -0
  42. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_group_roles.py +0 -0
  43. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_group_users.py +0 -0
  44. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_groups.py +0 -0
  45. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_histories.py +0 -0
  46. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_history_contents_provenance.py +0 -0
  47. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_item_tags.py +0 -0
  48. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_landing.py +0 -0
  49. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_libraries.py +0 -0
  50. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_library_contents.py +0 -0
  51. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_licenses.py +0 -0
  52. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_page_revisions.py +0 -0
  53. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_proxy.py +0 -0
  54. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_roles.py +0 -0
  55. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_short_term_storage.py +0 -0
  56. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tags.py +0 -0
  57. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tool_data.py +0 -0
  58. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tool_execution.py +0 -0
  59. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tool_output_tagging.py +0 -0
  60. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_tours.py +0 -0
  61. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_unprivileged_tools.py +0 -0
  62. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_visualizations.py +0 -0
  63. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_webhooks.py +0 -0
  64. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_workflow_completion.py +0 -0
  65. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_workflow_extraction.py +0 -0
  66. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_workflows_cwl.py +0 -0
  67. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/api/test_workflows_from_yaml.py +0 -0
  68. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test/py.typed +0 -0
  69. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test_api.egg-info/SOURCES.txt +0 -0
  70. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test_api.egg-info/dependency_links.txt +0 -0
  71. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test_api.egg-info/requires.txt +0 -0
  72. {galaxy_test_api-26.0.1.dev0 → galaxy_test_api-26.0.2}/galaxy_test_api.egg-info/top_level.txt +0 -0
@@ -1,50 +1,89 @@
1
- Metadata-Version: 2.4
2
- Name: galaxy-test-api
3
- Version: 26.0.1.dev0
4
- Summary: Galaxy API tests
5
- Home-page: https://github.com/galaxyproject/galaxy
6
- Author: Galaxy Project and Community
7
- Author-email: galaxy-committers@lists.galaxyproject.org
8
- License: MIT
9
- Requires-Python: >=3.10
10
- Description-Content-Type: text/x-rst
11
- License-File: LICENSE
12
- Requires-Dist: galaxy-test-base
13
- Requires-Dist: pytest
14
- Requires-Dist: python-dateutil
15
- Requires-Dist: requests
16
- Requires-Dist: tuspy
17
- Provides-Extra: driver
18
- Requires-Dist: galaxy-test-driver; extra == "driver"
19
- Provides-Extra: test
20
- Requires-Dist: pytest; extra == "test"
21
- Dynamic: license-file
1
+ History
2
+ -------
22
3
 
4
+ .. to_doc
23
5
 
24
- .. image:: https://badge.fury.io/py/galaxy-test-api.svg
25
- :target: https://pypi.org/project/galaxy-test-api/
6
+ -------------------
7
+ 26.0.2 (2026-10-25)
8
+ -------------------
26
9
 
27
10
 
11
+ =========
12
+ Bug fixes
13
+ =========
28
14
 
29
- Overview
30
- --------
15
+ * Fix WES workflow completion and add missing WES docs by `@jmchilton <https://github.com/jmchilton>`_ in `#22857 <https://github.com/galaxyproject/galaxy/pull/22857>`_
16
+ * Fix fasta preview rendering for sequences larger than 100 KB by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23163 <https://github.com/galaxyproject/galaxy/pull/23163>`_
17
+ * Use pydantic-aware serializer for celery control replies by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23525 <https://github.com/galaxyproject/galaxy/pull/23525>`_
18
+ * Fix 500 on the dataset tool-markdown report endpoint by `@jmchilton <https://github.com/jmchilton>`_ in `#23599 <https://github.com/galaxyproject/galaxy/pull/23599>`_
19
+ * Serialize runtime values of unresolved conditionals in populate_state by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23649 <https://github.com/galaxyproject/galaxy/pull/23649>`_
20
+ * Fix wait_on callback in test_delete_job_with_message by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23687 <https://github.com/galaxyproject/galaxy/pull/23687>`_
21
+ * Return 400 for request bodies that webob cannot parse by `@rmz-oz <https://github.com/rmz-oz>`_ in `#23839 <https://github.com/galaxyproject/galaxy/pull/23839>`_
22
+ * Fix 500 on reading pages with non-ASCII slugs by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23854 <https://github.com/galaxyproject/galaxy/pull/23854>`_
23
+ * Respect allow_uri_if_protocol for single deferred data inputs by `@davelopez <https://github.com/davelopez>`_ in `#24001 <https://github.com/galaxyproject/galaxy/pull/24001>`_
24
+ * Fix CI failures and flaky tests by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24028 <https://github.com/galaxyproject/galaxy/pull/24028>`_
25
+ * De-race test_workflow_with_deleted_dataset_step_parameter by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24083 <https://github.com/galaxyproject/galaxy/pull/24083>`_
26
+ * Show workflow integer/float input bounds on the run form by `@jmchilton <https://github.com/jmchilton>`_ in `#24212 <https://github.com/galaxyproject/galaxy/pull/24212>`_
27
+ * Fix dataset permissions set when upload and discovery jobs finish by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24233 <https://github.com/galaxyproject/galaxy/pull/24233>`_
28
+ * Apply default permissions to discovered collection elements by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24284 <https://github.com/galaxyproject/galaxy/pull/24284>`_
29
+ * Don't overwrite inputs when skipping database operations on nested collections by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24286 <https://github.com/galaxyproject/galaxy/pull/24286>`_
30
+ * Better API Handling for Custom Builds by `@jmchilton <https://github.com/jmchilton>`_ in `#24310 <https://github.com/galaxyproject/galaxy/pull/24310>`_
31
+ * Return 400 when a custom build's dataset can't be converted to len by `@jmchilton <https://github.com/jmchilton>`_ in `#24313 <https://github.com/galaxyproject/galaxy/pull/24313>`_
32
+ * Fix numeric column stats in tabular raw_data requests by `@davelopez <https://github.com/davelopez>`_ in `#24359 <https://github.com/galaxyproject/galaxy/pull/24359>`_
33
+ * Import unregistered dataset extensions from model stores as data by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24433 <https://github.com/galaxyproject/galaxy/pull/24433>`_
31
34
 
32
- The Galaxy_ API tests.
35
+ -------------------
36
+ 25.1.3 (2026-10-25)
37
+ -------------------
33
38
 
34
- * Code: https://github.com/galaxyproject/galaxy
35
39
 
36
- .. _Galaxy: http://galaxyproject.org/
40
+ =========
41
+ Bug fixes
42
+ =========
37
43
 
38
- History
39
- -------
44
+ * Fix dataset collection tag duplication when copying a history by `@mvdbeek <https://github.com/mvdbeek>`_ in `#21984 <https://github.com/galaxyproject/galaxy/pull/21984>`_
45
+ * Restore file doesn't match sniffed datatype message by `@mvdbeek <https://github.com/mvdbeek>`_ in `#21988 <https://github.com/galaxyproject/galaxy/pull/21988>`_
46
+ * Use base64 URL instead of GitHub URL in test_stage_fetch_decompress_true by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22069 <https://github.com/galaxyproject/galaxy/pull/22069>`_
47
+ * Backport FastAPI/Starlette upgrade for BadHost (CVE-2026-48710) by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22778 <https://github.com/galaxyproject/galaxy/pull/22778>`_
48
+ * Use pydantic-aware serializer for celery control replies by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23525 <https://github.com/galaxyproject/galaxy/pull/23525>`_
49
+ * Serialize runtime values of unresolved conditionals in populate_state by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23649 <https://github.com/galaxyproject/galaxy/pull/23649>`_
50
+ * Return 400 for request bodies that webob cannot parse by `@rmz-oz <https://github.com/rmz-oz>`_ in `#23839 <https://github.com/galaxyproject/galaxy/pull/23839>`_
51
+ * Fix 500 on reading pages with non-ASCII slugs by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23854 <https://github.com/galaxyproject/galaxy/pull/23854>`_
52
+ * Respect allow_uri_if_protocol for single deferred data inputs by `@davelopez <https://github.com/davelopez>`_ in `#24001 <https://github.com/galaxyproject/galaxy/pull/24001>`_
53
+ * Fix CI failures and flaky tests by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24028 <https://github.com/galaxyproject/galaxy/pull/24028>`_
54
+ * Fix dataset permissions set when upload and discovery jobs finish by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24233 <https://github.com/galaxyproject/galaxy/pull/24233>`_
55
+ * Apply default permissions to discovered collection elements by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24284 <https://github.com/galaxyproject/galaxy/pull/24284>`_
56
+ * Don't overwrite inputs when skipping database operations on nested collections by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24286 <https://github.com/galaxyproject/galaxy/pull/24286>`_
57
+ * Better API Handling for Custom Builds by `@jmchilton <https://github.com/jmchilton>`_ in `#24310 <https://github.com/galaxyproject/galaxy/pull/24310>`_
58
+ * Fix numeric column stats in tabular raw_data requests by `@davelopez <https://github.com/davelopez>`_ in `#24359 <https://github.com/galaxyproject/galaxy/pull/24359>`_
59
+ * Import unregistered dataset extensions from model stores as data by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24433 <https://github.com/galaxyproject/galaxy/pull/24433>`_
60
+
61
+ -------------------
62
+ 26.0.1 (2026-06-04)
63
+ -------------------
40
64
 
41
- .. to_doc
42
65
 
43
- -----------
44
- 26.0.1.dev0
45
- -----------
66
+ =========
67
+ Bug fixes
68
+ =========
69
+
70
+ * Hide hidden tools in the tool form by `@bgruening <https://github.com/bgruening>`_ in `#22215 <https://github.com/galaxyproject/galaxy/pull/22215>`_
71
+ * Fix IndexError in SplitPairedAndUnpairedTool for unpaired elements by `@ernestprovo23 <https://github.com/ernestprovo23>`_ in `#22282 <https://github.com/galaxyproject/galaxy/pull/22282>`_
72
+ * Fix \`get_structure\` when it is passed a DCE with nested elements by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22453 <https://github.com/galaxyproject/galaxy/pull/22453>`_
73
+ * Treat paused inputs as not-ready in DatabaseOperationTool by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22529 <https://github.com/galaxyproject/galaxy/pull/22529>`_
74
+ * Fix crash merging structurally invalid nested collections by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22546 <https://github.com/galaxyproject/galaxy/pull/22546>`_
75
+ * Raise ToolInputsNotReady for unpopulated structured_like target by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22552 <https://github.com/galaxyproject/galaxy/pull/22552>`_
76
+ * Raises error if decoding fails during relabeling from file by `@guerler <https://github.com/guerler>`_ in `#22595 <https://github.com/galaxyproject/galaxy/pull/22595>`_
77
+ * Fix job access check for collection-only outputs by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22603 <https://github.com/galaxyproject/galaxy/pull/22603>`_
78
+ * Fix data source tool redirect back to Galaxy SPA by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22720 <https://github.com/galaxyproject/galaxy/pull/22720>`_
79
+ * Fix HDA leak in tool form for data managers (#22674) by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22724 <https://github.com/galaxyproject/galaxy/pull/22724>`_
80
+ * Backport FastAPI/Starlette upgrade for BadHost (CVE-2026-48710) by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22778 <https://github.com/galaxyproject/galaxy/pull/22778>`_
46
81
 
82
+ ============
83
+ Enhancements
84
+ ============
47
85
 
86
+ * Replace per-term joins in workflow search with EXISTS subqueries by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22548 <https://github.com/galaxyproject/galaxy/pull/22548>`_
48
87
 
49
88
  -------------------
50
89
  26.0.0 (2026-04-08)
@@ -1,11 +1,26 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: galaxy-test-api
3
- Version: 26.0.1.dev0
3
+ Version: 26.0.2
4
4
  Summary: Galaxy API tests
5
5
  Home-page: https://github.com/galaxyproject/galaxy
6
6
  Author: Galaxy Project and Community
7
7
  Author-email: galaxy-committers@lists.galaxyproject.org
8
8
  License: MIT
9
+ Keywords: Galaxy
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Natural Language :: English
14
+ Classifier: Operating System :: POSIX
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Topic :: Software Development
22
+ Classifier: Topic :: Software Development :: Code Generators
23
+ Classifier: Topic :: Software Development :: Testing
9
24
  Requires-Python: >=3.10
10
25
  Description-Content-Type: text/x-rst
11
26
  License-File: LICENSE
@@ -40,11 +55,87 @@ History
40
55
 
41
56
  .. to_doc
42
57
 
43
- -----------
44
- 26.0.1.dev0
45
- -----------
58
+ -------------------
59
+ 26.0.2 (2026-10-25)
60
+ -------------------
61
+
62
+
63
+ =========
64
+ Bug fixes
65
+ =========
66
+
67
+ * Fix WES workflow completion and add missing WES docs by `@jmchilton <https://github.com/jmchilton>`_ in `#22857 <https://github.com/galaxyproject/galaxy/pull/22857>`_
68
+ * Fix fasta preview rendering for sequences larger than 100 KB by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23163 <https://github.com/galaxyproject/galaxy/pull/23163>`_
69
+ * Use pydantic-aware serializer for celery control replies by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23525 <https://github.com/galaxyproject/galaxy/pull/23525>`_
70
+ * Fix 500 on the dataset tool-markdown report endpoint by `@jmchilton <https://github.com/jmchilton>`_ in `#23599 <https://github.com/galaxyproject/galaxy/pull/23599>`_
71
+ * Serialize runtime values of unresolved conditionals in populate_state by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23649 <https://github.com/galaxyproject/galaxy/pull/23649>`_
72
+ * Fix wait_on callback in test_delete_job_with_message by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23687 <https://github.com/galaxyproject/galaxy/pull/23687>`_
73
+ * Return 400 for request bodies that webob cannot parse by `@rmz-oz <https://github.com/rmz-oz>`_ in `#23839 <https://github.com/galaxyproject/galaxy/pull/23839>`_
74
+ * Fix 500 on reading pages with non-ASCII slugs by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23854 <https://github.com/galaxyproject/galaxy/pull/23854>`_
75
+ * Respect allow_uri_if_protocol for single deferred data inputs by `@davelopez <https://github.com/davelopez>`_ in `#24001 <https://github.com/galaxyproject/galaxy/pull/24001>`_
76
+ * Fix CI failures and flaky tests by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24028 <https://github.com/galaxyproject/galaxy/pull/24028>`_
77
+ * De-race test_workflow_with_deleted_dataset_step_parameter by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24083 <https://github.com/galaxyproject/galaxy/pull/24083>`_
78
+ * Show workflow integer/float input bounds on the run form by `@jmchilton <https://github.com/jmchilton>`_ in `#24212 <https://github.com/galaxyproject/galaxy/pull/24212>`_
79
+ * Fix dataset permissions set when upload and discovery jobs finish by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24233 <https://github.com/galaxyproject/galaxy/pull/24233>`_
80
+ * Apply default permissions to discovered collection elements by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24284 <https://github.com/galaxyproject/galaxy/pull/24284>`_
81
+ * Don't overwrite inputs when skipping database operations on nested collections by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24286 <https://github.com/galaxyproject/galaxy/pull/24286>`_
82
+ * Better API Handling for Custom Builds by `@jmchilton <https://github.com/jmchilton>`_ in `#24310 <https://github.com/galaxyproject/galaxy/pull/24310>`_
83
+ * Return 400 when a custom build's dataset can't be converted to len by `@jmchilton <https://github.com/jmchilton>`_ in `#24313 <https://github.com/galaxyproject/galaxy/pull/24313>`_
84
+ * Fix numeric column stats in tabular raw_data requests by `@davelopez <https://github.com/davelopez>`_ in `#24359 <https://github.com/galaxyproject/galaxy/pull/24359>`_
85
+ * Import unregistered dataset extensions from model stores as data by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24433 <https://github.com/galaxyproject/galaxy/pull/24433>`_
86
+
87
+ -------------------
88
+ 25.1.3 (2026-10-25)
89
+ -------------------
90
+
91
+
92
+ =========
93
+ Bug fixes
94
+ =========
46
95
 
96
+ * Fix dataset collection tag duplication when copying a history by `@mvdbeek <https://github.com/mvdbeek>`_ in `#21984 <https://github.com/galaxyproject/galaxy/pull/21984>`_
97
+ * Restore file doesn't match sniffed datatype message by `@mvdbeek <https://github.com/mvdbeek>`_ in `#21988 <https://github.com/galaxyproject/galaxy/pull/21988>`_
98
+ * Use base64 URL instead of GitHub URL in test_stage_fetch_decompress_true by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22069 <https://github.com/galaxyproject/galaxy/pull/22069>`_
99
+ * Backport FastAPI/Starlette upgrade for BadHost (CVE-2026-48710) by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22778 <https://github.com/galaxyproject/galaxy/pull/22778>`_
100
+ * Use pydantic-aware serializer for celery control replies by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23525 <https://github.com/galaxyproject/galaxy/pull/23525>`_
101
+ * Serialize runtime values of unresolved conditionals in populate_state by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23649 <https://github.com/galaxyproject/galaxy/pull/23649>`_
102
+ * Return 400 for request bodies that webob cannot parse by `@rmz-oz <https://github.com/rmz-oz>`_ in `#23839 <https://github.com/galaxyproject/galaxy/pull/23839>`_
103
+ * Fix 500 on reading pages with non-ASCII slugs by `@mvdbeek <https://github.com/mvdbeek>`_ in `#23854 <https://github.com/galaxyproject/galaxy/pull/23854>`_
104
+ * Respect allow_uri_if_protocol for single deferred data inputs by `@davelopez <https://github.com/davelopez>`_ in `#24001 <https://github.com/galaxyproject/galaxy/pull/24001>`_
105
+ * Fix CI failures and flaky tests by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24028 <https://github.com/galaxyproject/galaxy/pull/24028>`_
106
+ * Fix dataset permissions set when upload and discovery jobs finish by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24233 <https://github.com/galaxyproject/galaxy/pull/24233>`_
107
+ * Apply default permissions to discovered collection elements by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24284 <https://github.com/galaxyproject/galaxy/pull/24284>`_
108
+ * Don't overwrite inputs when skipping database operations on nested collections by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24286 <https://github.com/galaxyproject/galaxy/pull/24286>`_
109
+ * Better API Handling for Custom Builds by `@jmchilton <https://github.com/jmchilton>`_ in `#24310 <https://github.com/galaxyproject/galaxy/pull/24310>`_
110
+ * Fix numeric column stats in tabular raw_data requests by `@davelopez <https://github.com/davelopez>`_ in `#24359 <https://github.com/galaxyproject/galaxy/pull/24359>`_
111
+ * Import unregistered dataset extensions from model stores as data by `@mvdbeek <https://github.com/mvdbeek>`_ in `#24433 <https://github.com/galaxyproject/galaxy/pull/24433>`_
112
+
113
+ -------------------
114
+ 26.0.1 (2026-06-04)
115
+ -------------------
116
+
117
+
118
+ =========
119
+ Bug fixes
120
+ =========
121
+
122
+ * Hide hidden tools in the tool form by `@bgruening <https://github.com/bgruening>`_ in `#22215 <https://github.com/galaxyproject/galaxy/pull/22215>`_
123
+ * Fix IndexError in SplitPairedAndUnpairedTool for unpaired elements by `@ernestprovo23 <https://github.com/ernestprovo23>`_ in `#22282 <https://github.com/galaxyproject/galaxy/pull/22282>`_
124
+ * Fix \`get_structure\` when it is passed a DCE with nested elements by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22453 <https://github.com/galaxyproject/galaxy/pull/22453>`_
125
+ * Treat paused inputs as not-ready in DatabaseOperationTool by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22529 <https://github.com/galaxyproject/galaxy/pull/22529>`_
126
+ * Fix crash merging structurally invalid nested collections by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22546 <https://github.com/galaxyproject/galaxy/pull/22546>`_
127
+ * Raise ToolInputsNotReady for unpopulated structured_like target by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22552 <https://github.com/galaxyproject/galaxy/pull/22552>`_
128
+ * Raises error if decoding fails during relabeling from file by `@guerler <https://github.com/guerler>`_ in `#22595 <https://github.com/galaxyproject/galaxy/pull/22595>`_
129
+ * Fix job access check for collection-only outputs by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22603 <https://github.com/galaxyproject/galaxy/pull/22603>`_
130
+ * Fix data source tool redirect back to Galaxy SPA by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22720 <https://github.com/galaxyproject/galaxy/pull/22720>`_
131
+ * Fix HDA leak in tool form for data managers (#22674) by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22724 <https://github.com/galaxyproject/galaxy/pull/22724>`_
132
+ * Backport FastAPI/Starlette upgrade for BadHost (CVE-2026-48710) by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22778 <https://github.com/galaxyproject/galaxy/pull/22778>`_
133
+
134
+ ============
135
+ Enhancements
136
+ ============
47
137
 
138
+ * Replace per-term joins in workflow search with EXISTS subqueries by `@mvdbeek <https://github.com/mvdbeek>`_ in `#22548 <https://github.com/galaxyproject/galaxy/pull/22548>`_
48
139
 
49
140
  -------------------
50
141
  26.0.0 (2026-04-08)
@@ -10,6 +10,7 @@ from typing import (
10
10
 
11
11
  import pytest
12
12
 
13
+ from galaxy.celery import CELERY_APP_DEFAULTS
13
14
  from galaxy.tool_util.verify.test_data import TestDataResolver
14
15
  from galaxy_test.base.api import (
15
16
  AnonymousGalaxyInteractor,
@@ -112,10 +113,7 @@ def celery_worker_parameters():
112
113
 
113
114
  @pytest.fixture(scope="session")
114
115
  def celery_parameters():
115
- return {
116
- "task_create_missing_queues": True,
117
- "task_default_queue": "galaxy.internal",
118
- }
116
+ return CELERY_APP_DEFAULTS
119
117
 
120
118
 
121
119
  @pytest.fixture
@@ -42,13 +42,14 @@ class TestAuthenticateApi(ApiTestCase):
42
42
  tool_runner_response = get(
43
43
  urljoin(self.url, "tool_runner?tool_id=test_data_source"),
44
44
  cookies={"galaxytoolrunnersession": tool_runner_session_cookie},
45
+ allow_redirects=False,
45
46
  )
46
- tool_runner_response.raise_for_status()
47
+ # On success, the controller redirects back to the SPA so the
48
+ # frontend can surface a "tool-submitted" toast.
49
+ assert tool_runner_response.status_code == 302
50
+ assert "notification=tool-submitted" in tool_runner_response.headers["Location"]
47
51
  # Verify that we're not returning the sessioncookie
48
52
  assert "galaxysession" not in tool_runner_response.cookies
49
- # Verify text message
50
- text = tool_runner_response.text
51
- assert "A job has been successfully added to the queue." in text
52
53
  # Make sure history for original session received job
53
54
  current_history_json_response = get(
54
55
  urljoin(self.url, "history/current_history_json"), cookies={"galaxysession": galaxy_session_cookie}
@@ -7,6 +7,7 @@ from urllib.parse import quote
7
7
  from galaxy.tool_util_models.sample_sheet import SampleSheetColumnDefinitions
8
8
  from galaxy.util import galaxy_root_path
9
9
  from galaxy_test.base.api_asserts import (
10
+ assert_error_message_contains,
10
11
  assert_has_key,
11
12
  assert_object_id_error,
12
13
  assert_status_code_is,
@@ -152,6 +153,30 @@ class TestDatasetCollectionsApi(ApiTestCase):
152
153
  returned_collections = dataset_collection["elements"]
153
154
  assert len(returned_collections) == 1, dataset_collection
154
155
 
156
+ def test_create_list_paired_or_unpaired_rejects_raw_hda_child(self, history_id):
157
+ element_identifiers = self.dataset_collection_populator.list_identifiers(history_id, contents=[("el1", "hi")])
158
+ payload = dict(
159
+ instance_type="history",
160
+ history_id=history_id,
161
+ element_identifiers=element_identifiers,
162
+ collection_type="list:paired_or_unpaired",
163
+ )
164
+ create_response = self._post("dataset_collections", payload, json=True)
165
+ assert_status_code_is(create_response, 400)
166
+ assert_error_message_contains(create_response, "sub-collection of type 'paired_or_unpaired'")
167
+
168
+ def test_create_list_paired_rejects_raw_hda_child(self, history_id):
169
+ element_identifiers = self.dataset_collection_populator.list_identifiers(history_id, contents=[("el1", "hi")])
170
+ payload = dict(
171
+ instance_type="history",
172
+ history_id=history_id,
173
+ element_identifiers=element_identifiers,
174
+ collection_type="list:paired",
175
+ )
176
+ create_response = self._post("dataset_collections", payload, json=True)
177
+ assert_status_code_is(create_response, 400)
178
+ assert_error_message_contains(create_response, "sub-collection of type 'paired'")
179
+
155
180
  def test_create_record(self, history_id):
156
181
  contents = [
157
182
  ("condition", "1\t2\t3"),
@@ -750,6 +775,13 @@ class TestDatasetCollectionsApi(ApiTestCase):
750
775
  create_response = self._post("dataset_collections", payload, json=True)
751
776
  self._assert_status_code_is(create_response, 403)
752
777
 
778
+ def test_fetched_list_elements_get_default_permissions(self, history_id):
779
+ self.dataset_collection_populator.create_list_in_history(
780
+ history_id, contents=["a\n", "b\n"], direct_upload=True, wait=True
781
+ )
782
+ self.dataset_populator.wait_for_history(history_id, assert_ok=True)
783
+ self.dataset_populator.assert_history_datasets_permissions(history_id, expected_count=2, access_private=False)
784
+
753
785
  def test_dataset_collection_element_security(self):
754
786
  with self.dataset_populator.test_history(require_new=False) as history_id:
755
787
  dataset_collection = self.dataset_collection_populator.create_list_of_list_in_history(
@@ -3,6 +3,8 @@ import zipfile
3
3
  from io import BytesIO
4
4
  from urllib.parse import quote
5
5
 
6
+ import pytest
7
+
6
8
  from galaxy.model.unittest_utils.store_fixtures import (
7
9
  deferred_hda_model_store_dict,
8
10
  one_hda_model_store_dict,
@@ -309,6 +311,14 @@ class TestDatasetsApi(ApiTestCase):
309
311
  show_response = self._get(f"datasets/{hda['id']}")
310
312
  self._assert_status_code_is(show_response, 403)
311
313
 
314
+ @pytest.mark.parametrize("fetch_data", [True, False])
315
+ def test_show_upload_permissions(self, history_id, fetch_data):
316
+ role_id = self.dataset_populator.user_private_role_id()
317
+ hda = self.dataset_populator.new_dataset(history_id, fetch_data=fetch_data, wait=True)
318
+ show_response = self._get(f"datasets/{hda['id']}")
319
+ self._assert_status_code_is(show_response, 200)
320
+ assert show_response.json()["permissions"] == {"manage": [role_id], "access": []}
321
+
312
322
  @requires_admin
313
323
  def test_admin_can_update_permissions(self, history_id):
314
324
  # Create private dataset
@@ -355,6 +365,22 @@ class TestDatasetsApi(ApiTestCase):
355
365
  assert content_type.startswith("text/plain"), content_type
356
366
  assert display_response.text == contents
357
367
 
368
+ def test_display_preview_large_fasta_uses_text_plain(self, history_id):
369
+ # Regression test for https://github.com/galaxyproject/galaxy/issues/22719
370
+ # A fasta larger than the 100 KB preview limit must still be served as
371
+ # text/plain so the browser preserves newlines; otherwise the header line
372
+ # runs into the sequence and the content is rendered as HTML.
373
+ header = ">seq0 large fasta regression test\n"
374
+ contents = header + "".join(f"{'ACGT' * 20}\n" for _ in range(2000))
375
+ hda1 = self.dataset_populator.new_dataset(history_id, content=contents, file_type="fasta", wait=True)
376
+ display_response = self._get(f"histories/{history_id}/contents/{hda1['id']}/display", {"preview": "True"})
377
+ self._assert_status_code_is(display_response, 200)
378
+ content_type = display_response.headers.get("content-type", "")
379
+ assert content_type.startswith("text/plain"), content_type
380
+ assert display_response.headers.get("x-content-truncated") == "100000"
381
+ assert display_response.text.startswith(header)
382
+ assert len(display_response.text) <= 100000
383
+
358
384
  def test_display_extra_paths(self, history_id: str):
359
385
  test_data_resolver = TestDataResolver()
360
386
  with open(test_data_resolver.get_filename("1.fasta")) as fh:
@@ -514,6 +540,35 @@ class TestDatasetsApi(ApiTestCase):
514
540
  self._assert_status_code_is(response, 400)
515
541
  assert_error_message_contains(response, "Conversion")
516
542
 
543
+ def test_raw_data_tabular_numeric_column_stats(self, history_id):
544
+ # columns: even-count ints, uncastable NA among odd-count castables, all NA, non-finite floats
545
+ contents = "2\t2\tNA\tnan\n4\tNA\tNA\t3\n6\t4\tNA\tinf\n12\t9\tNA\t6\n"
546
+ hda = self.dataset_populator.new_dataset(history_id, content=contents, wait=True, file_type="tabular")
547
+ response = self._get(f"datasets/{hda['id']}", {"data_type": "raw_data", "columns": "[0,1,2,3]"})
548
+ self._assert_status_code_is(response, 200)
549
+ even, uncastable, all_na, non_finite = response.json()["meta"]
550
+
551
+ assert even["count"] == 4
552
+ assert even["min"] == 2
553
+ assert even["max"] == 12
554
+ assert even["mean"] == 6
555
+ assert even["median"] == 5
556
+
557
+ assert uncastable["count"] == 4
558
+ assert uncastable["mean"] == 5
559
+ assert uncastable["median"] == 4
560
+
561
+ assert all_na["count"] == 4
562
+ assert all_na["min"] is None
563
+ assert "mean" not in all_na
564
+ assert "median" not in all_na
565
+
566
+ assert non_finite["count"] == 4
567
+ assert non_finite["min"] == 3
568
+ assert non_finite["max"] == 6
569
+ assert non_finite["mean"] == 4.5
570
+ assert non_finite["median"] == 4.5
571
+
517
572
  def test_bam_chunking_through_display_endpoint(self, history_id):
518
573
  # This endpoint does not use data providers and instead overrides display_data
519
574
  # in the bam datatype. This is the endpoint is very close to the legacy non-API
@@ -968,6 +1023,24 @@ class TestDatasetsApi(ApiTestCase):
968
1023
  self._assert_status_code_is(response, 200)
969
1024
  assert quote(name, safe="") in response.headers["Content-Disposition"]
970
1025
 
1026
+ @skip_without_tool("markdown_report_from_script")
1027
+ def test_report_for_tool_markdown_dataset(self, history_id):
1028
+ run_response = self.dataset_populator.run_tool(
1029
+ "markdown_report_from_script", inputs={"title": "foobar"}, history_id=history_id
1030
+ )
1031
+ self.dataset_populator.wait_for_job(run_response["jobs"][0]["id"], assert_ok=True)
1032
+ report_dataset = next(o for o in run_response["outputs"] if o["output_name"] == "output_report")
1033
+ response = self._get(f"datasets/{report_dataset['id']}/report")
1034
+ self._assert_status_code_is(response, 200)
1035
+ report = response.json()
1036
+ assert report["generate_version"]
1037
+ assert report["generate_time"]
1038
+ content = report["content"]
1039
+ assert "# Dynamically Generated Report" in content
1040
+ # the endpoint returns the embed-expanded markdown, so inline directives are resolved
1041
+ assert "${galaxy generate_galaxy_version()}" not in content
1042
+ assert f"Generated by Galaxy {report['generate_version']}." in content
1043
+
971
1044
  def test_copy_dataset_from_history_with_copied_from_fields(self, history_id):
972
1045
  original_hda = self.dataset_populator.new_dataset(history_id, content="original data", wait=True)
973
1046
  self._assert_copied_from_fields(history_id, original_hda["id"], None, None, None)
@@ -1,5 +1,7 @@
1
1
  # This file doesn't test any API in particular but is meant to functionally
2
2
  # test the API framework itself.
3
+ from requests import post
4
+
3
5
  from galaxy_test.base.decorators import requires_admin
4
6
  from ._framework import ApiTestCase
5
7
 
@@ -9,6 +11,16 @@ class TestApiFramework(ApiTestCase):
9
11
  get_response = self._get("licenses")
10
12
  assert get_response.headers["x-frame-options"] == "SAMEORIGIN"
11
13
 
14
+ def test_multipart_empty_boundary(self):
15
+ # /api/tools POST is still served by the legacy WSGI app.
16
+ response = post(
17
+ self._api_url("tools"),
18
+ data=b"x",
19
+ headers={"Content-Type": "multipart/form-data; boundary="},
20
+ )
21
+ self._assert_status_code_is(response, 400)
22
+ assert "Invalid boundary" in response.text
23
+
12
24
  # Next several tests test the API's run_as functionality.
13
25
  def test_user_cannont_run_as(self):
14
26
  run_as_user = self._setup_user("for_run_as@bx.psu.edu")
@@ -5,6 +5,7 @@ from typing import (
5
5
  Union,
6
6
  )
7
7
 
8
+ from galaxy.model.unittest_utils.store_fixtures import one_hda_model_store_dict
8
9
  from galaxy_test.api._framework import ApiTestCase
9
10
  from galaxy_test.base.decorators import (
10
11
  requires_admin,
@@ -34,6 +35,17 @@ class TestHistoryContentsApi(ApiTestCase):
34
35
  self.dataset_collection_populator = DatasetCollectionPopulator(self.galaxy_interactor)
35
36
  self.library_populator = LibraryPopulator(self.galaxy_interactor)
36
37
 
38
+ def test_contents_from_store_unregistered_extension_imported_as_data(self, history_id):
39
+ store_dict = one_hda_model_store_dict()
40
+ store_dict["datasets"][0]["extension"] = "not_a_registered_datatype"
41
+ as_list = self.dataset_populator.create_contents_from_store(history_id, store_dict=store_dict)
42
+ assert len(as_list) == 1
43
+ assert as_list[0]["extension"] == "data"
44
+ response = self._get(f"histories/{history_id}/contents/archive/contents.zip", {"dry_run": True})
45
+ self._assert_status_code_is(response, 200)
46
+ archive_paths = [archive_path for _, archive_path in response.json()]
47
+ assert archive_paths == ["contents/1.my_cool_name.data"]
48
+
37
49
  def test_index_hda_summary(self, history_id):
38
50
  hda1 = self.dataset_populator.new_dataset(history_id)
39
51
  contents_response = self._get(f"histories/{history_id}/contents")
@@ -387,6 +387,54 @@ steps:
387
387
  assert show_jobs_response.json()["external_id"] is not None
388
388
  assert show_jobs_response.json()["command_line"] is not None
389
389
 
390
+ @skip_without_tool("collection_creates_pair")
391
+ @pytest.mark.require_new_history
392
+ def test_show_collection_only_job_public(self, history_id):
393
+ # Regression test for https://github.com/galaxyproject/galaxy/issues/22602.
394
+ job_id, hdca_id = self._run_collection_only_job(history_id)
395
+ hdca = self.dataset_populator.get_history_collection_details(history_id, content_id=hdca_id)
396
+ for element in hdca["elements"]:
397
+ response = self.dataset_populator.make_dataset_public_raw(history_id, element["object"]["id"])
398
+ assert_status_code_is_ok(response)
399
+ with self._different_user(anon=True):
400
+ show_jobs_response = self._get(f"jobs/{job_id}")
401
+ self._assert_status_code_is(show_jobs_response, 200)
402
+ assert show_jobs_response.json()["id"] == job_id
403
+
404
+ @skip_without_tool("collection_creates_pair")
405
+ @pytest.mark.require_new_history
406
+ def test_show_collection_only_job_private_denied(self, history_id):
407
+ job_id, hdca_id = self._run_collection_only_job(history_id)
408
+ hdca = self.dataset_populator.get_history_collection_details(history_id, content_id=hdca_id)
409
+ for element in hdca["elements"]:
410
+ self.dataset_populator.make_private(history_id, element["object"]["id"])
411
+ with self._different_user():
412
+ show_jobs_response = self._get(f"jobs/{job_id}")
413
+ self._assert_status_code_is(show_jobs_response, 403)
414
+
415
+ @pytest.mark.require_new_history
416
+ def test_show_job_accessible_via_public_history(self, history_id):
417
+ self.__history_with_new_dataset(history_id)
418
+ jobs_response = self._get("jobs", data={"history_id": history_id})
419
+ job_id = jobs_response.json()[0]["id"]
420
+ self.dataset_populator.make_public(history_id)
421
+ with self._different_user():
422
+ show_jobs_response = self._get(f"jobs/{job_id}")
423
+ self._assert_status_code_is(show_jobs_response, 200)
424
+ assert show_jobs_response.json()["id"] == job_id
425
+
426
+ def _run_collection_only_job(self, history_id):
427
+ input_id = self.dataset_populator.new_dataset(history_id, content="a\nb\nc\nd\n", wait=True)["id"]
428
+ run_response = self.dataset_populator.run_tool(
429
+ tool_id="collection_creates_pair",
430
+ inputs={"input1": {"src": "hda", "id": input_id}},
431
+ history_id=history_id,
432
+ )
433
+ job_id = run_response["jobs"][0]["id"]
434
+ self.dataset_populator.wait_for_job(job_id, assert_ok=True)
435
+ hdca_id = run_response["output_collections"][0]["id"]
436
+ return job_id, hdca_id
437
+
390
438
  def _run_detect_errors(self, history_id, inputs):
391
439
  payload = self.dataset_populator.run_tool_payload(
392
440
  tool_id="detect_errors_aggressive",
@@ -1105,7 +1153,7 @@ steps:
1105
1153
  assert len(empty_search_response.json()) == 0
1106
1154
 
1107
1155
  @pytest.mark.require_new_history
1108
- @transient_failure(issue=21242)
1156
+ @transient_failure(issue=21242, potentially_fixed=True)
1109
1157
  def test_delete_job_with_message(self, history_id):
1110
1158
  # Setup a job that will take a while to run so we can verify our cancelling
1111
1159
  input_dataset_id = self.__history_with_ok_dataset(history_id)
@@ -1132,9 +1180,9 @@ steps:
1132
1180
  # Check the output dataset is deleted and the info field contains the message
1133
1181
  dataset_details = self._get(f"histories/{history_id}/contents/{output_dataset_id}").json()
1134
1182
  if dataset_details["deleted"] is not True:
1135
- return False
1183
+ return None
1136
1184
  if dataset_details["misc_info"] != expected_message:
1137
- return False
1185
+ return None
1138
1186
  return True
1139
1187
 
1140
1188
  assert wait_on(check, "dataset to be deleted with message")
@@ -396,7 +396,9 @@ steps:
396
396
  response_json = self._create_valid_page_with_slug("pagetoupdate")
397
397
  page_id = response_json["id"]
398
398
  update_response = self._update_page(page_id, "newannotation", "new.slug", "newtitle", error_code=400)
399
- assert update_response["err_msg"] == "String should match pattern '^[a-z0-9-]+$' in ('body', 'slug')"
399
+ assert update_response["err_msg"].startswith("Page identifier must consist of")
400
+ update_response = self._update_page(page_id, "newannotation", "new/slug", "newtitle", error_code=400)
401
+ assert update_response["err_msg"] == "String should match pattern '^[^/:?#]+$' in ('body', 'slug')"
400
402
  update_response = self._update_page(page_id, "newannotation", "newslug", "", error_code=400)
401
403
  assert update_response["err_msg"] == "String should have at least 1 character in ('body', 'title')"
402
404
  update_response = self._update_page(page_id, "newannotation", "newslug", "newtitle")
@@ -407,6 +409,24 @@ steps:
407
409
  show_json = show_response.json()
408
410
  assert show_json["annotation"] == "newannotation"
409
411
 
412
+ def test_create_and_update_page_with_non_ascii_slug(self):
413
+ page_id = self._create_valid_page_with_slug("rapport-d-exécution")["id"]
414
+ update_response = self._update_page(page_id, "newannotation", "rapport-d-exécution", "newtitle")
415
+ assert update_response["slug"] == "rapport-d-exécution"
416
+ update_response = self._update_page(page_id, "newannotation", "rapport-d-exécution-2", "newtitle")
417
+ assert update_response["slug"] == "rapport-d-exécution-2"
418
+ show_response = self._get(f"pages/{page_id}")
419
+ self._assert_status_code_is(show_response, 200)
420
+ assert show_response.json()["title"] == "newtitle"
421
+
422
+ def test_show_page_with_non_ascii_slug_set_via_sharing(self):
423
+ page_id = self._create_valid_page_with_slug("pagetosetnonasciislug")["id"]
424
+ self._assert_status_code_is_ok(self._set_slug(page_id, "rapport-d-exécution-des-analyses"))
425
+ show_response = self._get(f"pages/{page_id}")
426
+ self._assert_status_code_is(show_response, 200)
427
+ assert show_response.json()["slug"] == "rapport-d-exécution-des-analyses"
428
+ assert page_id in self._index_ids()
429
+
410
430
  def test_403_on_unowner_show(self):
411
431
  response_json = self._create_valid_page_as("others_page_show@bx.psu.edu", "otherspageshow")
412
432
  show_response = self._get(f"pages/{response_json['id']}")