# retoor import pytest from devplacepy.services.devii.errors import ToolInputError from devplacepy.services.devii.interaction.schema import ( validate_prompt_args, ) def test_valid_confirm_prompt(): req = validate_prompt_args( { "title": "Delete archive row?", "description": "Remote files are untouched.", "widgets": [ { "type": "confirm", "name": "delete", "label": "Delete archive row", "default": False, } ], "submit_label": "Delete", "cancel_label": "Keep", } ) assert req.title.startswith("Delete") assert req.widgets[0].type == "confirm" assert req.widgets[0].name == "delete" def test_choice_requires_options(): with pytest.raises(ToolInputError): validate_prompt_args( { "title": "Env?", "widgets": [{"type": "choice", "name": "env", "label": "Env"}], } ) def test_rejects_empty_widgets(): with pytest.raises(ToolInputError): validate_prompt_args({"title": "x", "widgets": []}) def test_rejects_bad_option_value(): with pytest.raises(ToolInputError): validate_prompt_args( { "title": "Pick", "widgets": [ { "type": "choice", "name": "x", "label": "X", "options": [{"value": "BAD VALUE!", "label": "Bad"}], } ], } ) def test_group_nesting_limit(): leaf = { "type": "text", "name": "a", "label": "A", "required": False, } deep = { "type": "group", "label": "G1", "widgets": [ { "type": "group", "label": "G2", "widgets": [ { "type": "group", "label": "G3", "widgets": [ { "type": "group", "label": "G4", "widgets": [leaf], } ], } ], } ], } with pytest.raises(ToolInputError): validate_prompt_args({"title": "Deep", "widgets": [deep]})