Some checks failed
Tests / e2e (pull_request) Successful in 1m39s
Tests / test (pull_request) Failing after 1h7m45s
Docker Build and Publish / build-and-push (pull_request) Has been skipped
Contributor Attribution Check / check-attribution (pull_request) Successful in 24s
Supply Chain Audit / Scan PR for supply chain risks (pull_request) Successful in 28s
Research reports: - Vector DB research - Workflow orchestration research - Fleet knowledge graph SOTA research - LLM inference optimization - Local model crisis quality - Memory systems SOTA - Multi-agent coordination - R5 vs E2E gap analysis - Text-to-music-video Test: - test_skill_manager_error_context.py [Allegro] Forge workers — 2026-04-16
112 lines
4.1 KiB
Python
112 lines
4.1 KiB
Python
"""
|
|
Tests for improved error messages in skill_manager_tool (issue #624).
|
|
Verifies that error messages include file paths, context, and suggestions.
|
|
"""
|
|
|
|
import pytest
|
|
from pathlib import Path
|
|
from unittest.mock import patch, MagicMock
|
|
from tools.skill_manager_tool import _format_error, _edit_skill, _patch_skill
|
|
|
|
|
|
class TestFormatError:
|
|
"""Test the _format_error helper function."""
|
|
|
|
def test_basic_error(self):
|
|
"""Test basic error formatting."""
|
|
result = _format_error("Something went wrong")
|
|
assert result["success"] is False
|
|
assert "Something went wrong" in result["error"]
|
|
assert result["skill_name"] is None
|
|
assert result["file_path"] is None
|
|
|
|
def test_with_skill_name(self):
|
|
"""Test error with skill name."""
|
|
result = _format_error("Failed", skill_name="test-skill")
|
|
assert "test-skill" in result["error"]
|
|
assert result["skill_name"] == "test-skill"
|
|
|
|
def test_with_file_path(self):
|
|
"""Test error with file path."""
|
|
result = _format_error("Failed", file_path="/path/to/SKILL.md")
|
|
assert "/path/to/SKILL.md" in result["error"]
|
|
assert result["file_path"] == "/path/to/SKILL.md"
|
|
|
|
def test_with_suggestion(self):
|
|
"""Test error with suggestion."""
|
|
result = _format_error("Failed", suggestion="Try again")
|
|
assert "Suggestion: Try again" in result["error"]
|
|
assert result["suggestion"] == "Try again"
|
|
|
|
def test_with_context(self):
|
|
"""Test error with context dict."""
|
|
result = _format_error("Failed", context={"line": 5, "found": "x"})
|
|
assert "line: 5" in result["error"]
|
|
assert "found: x" in result["error"]
|
|
|
|
def test_all_fields(self):
|
|
"""Test error with all fields."""
|
|
result = _format_error(
|
|
"Pattern match failed",
|
|
skill_name="my-skill",
|
|
file_path="/skills/my-skill/SKILL.md",
|
|
suggestion="Check whitespace",
|
|
context={"expected": "foo", "found": "bar"}
|
|
)
|
|
assert "Pattern match failed" in result["error"]
|
|
assert "Skill: my-skill" in result["error"]
|
|
assert "File: /skills/my-skill/SKILL.md" in result["error"]
|
|
assert "Suggestion: Check whitespace" in result["error"]
|
|
assert "expected: foo" in result["error"]
|
|
|
|
|
|
class TestEditSkillErrors:
|
|
"""Test improved error messages in _edit_skill."""
|
|
|
|
@patch('tools.skill_manager_tool._find_skill')
|
|
def test_skill_not_found(self, mock_find):
|
|
"""Test skill not found error includes suggestion."""
|
|
mock_find.return_value = None
|
|
# Provide valid content with frontmatter so it passes validation
|
|
valid_content = """---
|
|
name: test
|
|
description: Test skill
|
|
---
|
|
Body content here.
|
|
"""
|
|
result = _edit_skill("nonexistent", valid_content)
|
|
assert result["success"] is False
|
|
assert "nonexistent" in result["error"]
|
|
assert "skills_list()" in result.get("suggestion", "")
|
|
|
|
|
|
class TestPatchSkillErrors:
|
|
"""Test improved error messages in _patch_skill."""
|
|
|
|
def test_old_string_required(self):
|
|
"""Test old_string required error includes suggestion."""
|
|
result = _patch_skill("test-skill", None, "new")
|
|
assert result["success"] is False
|
|
assert "old_string is required" in result["error"]
|
|
assert "suggestion" in result
|
|
|
|
def test_new_string_required(self):
|
|
"""Test new_string required error includes suggestion."""
|
|
result = _patch_skill("test-skill", "old", None)
|
|
assert result["success"] is False
|
|
assert "new_string is required" in result["error"]
|
|
assert "suggestion" in result
|
|
|
|
@patch('tools.skill_manager_tool._find_skill')
|
|
def test_skill_not_found(self, mock_find):
|
|
"""Test skill not found error includes suggestion."""
|
|
mock_find.return_value = None
|
|
result = _patch_skill("nonexistent", "old", "new")
|
|
assert result["success"] is False
|
|
assert "nonexistent" in result["error"]
|
|
assert "skills_list()" in result.get("suggestion", "")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__, "-v"])
|