mirror of
https://github.com/github/spec-kit.git
synced 2026-07-03 12:28:06 +08:00
fix(workflows): gate validate() must not crash on non-string options (#3233)
GateStep.validate() reports non-string options as an error, but then -- when on_reject is 'abort'/'retry' -- still runs the reject-choice check 'any(o.lower() in ... for o in options)'. For a non-string option (e.g. options: [123]) o.lower() raised AttributeError, which escaped validate() and broke validate_workflow's documented 'return a list of errors, never raise' contract. Guard the check so it only runs when every option is a string (the non-string case is already reported above). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1455,6 +1455,23 @@ class TestGateStep:
|
||||
})
|
||||
assert any("on_reject" in e for e in errors)
|
||||
|
||||
def test_validate_non_string_options_does_not_raise(self):
|
||||
"""Non-string options with on_reject=abort/retry must be REPORTED as an
|
||||
error, not crash: the reject-choice check calls o.lower() on each option,
|
||||
which previously raised AttributeError on a non-string option and broke
|
||||
validate_workflow's 'return errors, never raise' contract."""
|
||||
from specify_cli.workflows.steps.gate import GateStep
|
||||
|
||||
step = GateStep()
|
||||
# on_reject defaults to "abort", which triggers the option-text check.
|
||||
errors = step.validate({"id": "test", "message": "Review", "options": [123]})
|
||||
assert any("must be strings" in e for e in errors)
|
||||
# also with an explicit retry on_reject
|
||||
errors = step.validate(
|
||||
{"id": "test", "message": "Review", "options": [True], "on_reject": "retry"}
|
||||
)
|
||||
assert any("must be strings" in e for e in errors)
|
||||
|
||||
def test_interactive_prompt_renders_show_file(self, tmp_path, monkeypatch, capsys):
|
||||
from specify_cli.workflows.steps.gate import GateStep
|
||||
from specify_cli.workflows.base import StepContext, StepStatus
|
||||
|
||||
Reference in New Issue
Block a user