import pytest from apps.skills.models import SkillDefinition, SkillVersion from apps.skills.services import ( SkillValidationError, render_prompt, validate_skill_version, ) VALID_INPUT_SCHEMA = { "type": "object", "properties": {"problem": {"type": "string"}}, "required": ["problem"], } VALID_OUTPUT_SCHEMA = { "type": "object", "properties": {"summary": {"type": "string"}}, "required": ["summary"], } def make_version(**overrides): definition = SkillDefinition.objects.create(code="summarize", name="问题摘要") values = { "definition": definition, "version": 1, "prompt_template": "请总结:{{ input.problem }}", "input_schema": VALID_INPUT_SCHEMA, "output_schema": VALID_OUTPUT_SCHEMA, "example_input": {"problem": "无法登录"}, } values.update(overrides) return SkillVersion.objects.create(**values) def test_validates_and_renders_restricted_template(db): version = make_version() validate_skill_version(version) assert render_prompt(version.prompt_template, {"problem": "无法登录"}) == "请总结:无法登录" def test_rejects_expression_or_missing_variable(db): version = make_version(prompt_template="{{ steps.previous.output }}") with pytest.raises(SkillValidationError, match="不允许的模板变量"): validate_skill_version(version) with pytest.raises(SkillValidationError, match="模板变量不存在"): render_prompt("{{ input.environment }}", {"problem": "无法登录"}) def test_rejects_example_that_does_not_match_schema(db): version = make_version(example_input={"problem": 123}) with pytest.raises(SkillValidationError, match="示例输入不符合"): validate_skill_version(version)