# retoor <retoor@molodetz.nl>
|
|
|
|
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]})
|