From 479d8e4669079ecf37eaf230e7415931be46eed1 Mon Sep 17 00:00:00 2001 From: lda Date: Wed, 9 Sep 2026 21:31:46 +0700 Subject: [PATCH] fix: validate schedule update bounds --- src/wf_transport_rpc_http/models.py | 6 ++-- .../wf_transport_rpc_http/test_rpc_models.py | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/wf_transport_rpc_http/models.py b/src/wf_transport_rpc_http/models.py index 0a408476..4d9f45cd 100644 --- a/src/wf_transport_rpc_http/models.py +++ b/src/wf_transport_rpc_http/models.py @@ -498,9 +498,9 @@ class UpdateScheduleParams(RpcParamsModel): input_bindings: list[dict[str, Any]] | None = None overlap: str | None = None misfire: str | None = None - max_active_runs: int | None = None - lateness_allowance_s: float | None = None - max_steps: int | None = None + max_active_runs: int | None = Field(default=None, ge=1) + lateness_allowance_s: float | None = Field(default=None, ge=0) + max_steps: int | None = Field(default=None, ge=1, strict=True) enabled: bool | None = None diff --git a/tests/wf_transport_rpc_http/test_rpc_models.py b/tests/wf_transport_rpc_http/test_rpc_models.py index fcbbd332..610563b7 100644 --- a/tests/wf_transport_rpc_http/test_rpc_models.py +++ b/tests/wf_transport_rpc_http/test_rpc_models.py @@ -12,6 +12,7 @@ from wf_transport_rpc_http.models import ( SetWorkflowOutputBindingsParams, StartRunParams, TraceRangeParams, + UpdateScheduleParams, ) @@ -61,6 +62,38 @@ def test_run_params_are_explicit_models() -> None: assert trace.trace_range.limit == 1 +def test_update_schedule_params_match_create_numeric_constraints() -> None: + valid = UpdateScheduleParams( + schedule_id="schedule", + expected_revision=1, + max_active_runs=2, + lateness_allowance_s=0, + max_steps=10, + ) + assert valid.max_active_runs == 2 + assert valid.lateness_allowance_s == 0 + assert valid.max_steps == 10 + + with pytest.raises(ValidationError): + UpdateScheduleParams( + schedule_id="schedule", expected_revision=1, max_active_runs=0 + ) + with pytest.raises(ValidationError): + UpdateScheduleParams( + schedule_id="schedule", expected_revision=1, lateness_allowance_s=-1 + ) + with pytest.raises(ValidationError): + UpdateScheduleParams(schedule_id="schedule", expected_revision=1, max_steps=0) + with pytest.raises(ValidationError): + UpdateScheduleParams( + schedule_id="schedule", expected_revision=1, max_steps=True + ) + with pytest.raises(ValidationError): + UpdateScheduleParams( + schedule_id="schedule", expected_revision=1, max_steps="10" + ) + + def test_step_input_params_accept_composite_bindings_but_workflow_output_does_not() -> ( None ):