135 lines
4.2 KiB
Python
135 lines
4.2 KiB
Python
import pytest
|
|
import json
|
|
import tempfile
|
|
import os
|
|
from errorfix.rules.rule import Rule, Severity
|
|
from errorfix.rules.loader import RuleLoader
|
|
|
|
|
|
class TestRule:
|
|
def test_rule_creation(self):
|
|
rule = Rule(
|
|
id="py001",
|
|
name="Undefined Variable",
|
|
pattern=r"NameError: name '(\w+)' is not defined",
|
|
fix="Declare '{name}' before using it or check for typos",
|
|
description="NameError occurs when trying to use an undefined variable",
|
|
severity="error",
|
|
language="python"
|
|
)
|
|
assert rule.id == "py001"
|
|
assert rule.name == "Undefined Variable"
|
|
assert rule.pattern == r"NameError: name '(\w+)' is not defined"
|
|
assert "name" in rule.fix
|
|
assert rule.language == "python"
|
|
assert rule.severity == Severity.ERROR
|
|
|
|
def test_rule_with_capture_groups(self):
|
|
rule = Rule(
|
|
id="py002",
|
|
name="Unexpected Indent",
|
|
pattern=r"SyntaxError: unexpected indent around line (?P<line>\d+)",
|
|
fix="Remove the extra indentation on line {line}",
|
|
description="Unexpected indentation error",
|
|
severity="error",
|
|
language="python"
|
|
)
|
|
assert "{line}" in rule.fix
|
|
|
|
def test_rule_to_dict(self):
|
|
rule = Rule(
|
|
id="test001",
|
|
name="Test Rule",
|
|
pattern="Test pattern",
|
|
fix="Test fix",
|
|
description="Test description"
|
|
)
|
|
data = rule.to_dict()
|
|
assert data["id"] == "test001"
|
|
assert data["name"] == "Test Rule"
|
|
assert data["severity"] == "error"
|
|
|
|
def test_rule_from_dict(self):
|
|
data = {
|
|
"id": "from_dict_test",
|
|
"name": "From Dict",
|
|
"pattern": ".*",
|
|
"fix": "fix",
|
|
"description": "desc"
|
|
}
|
|
rule = Rule.from_dict(data)
|
|
assert rule.id == "from_dict_test"
|
|
|
|
|
|
class TestRuleLoader:
|
|
def test_load_yaml_rules(self, tmp_path):
|
|
rules_file = tmp_path / "python_errors.yaml"
|
|
rules_file.write_text("""[
|
|
{
|
|
"id": "py001",
|
|
"name": "Undefined Variable",
|
|
"pattern": "NameError: name '([\\\\w]+)' is not defined",
|
|
"fix": "Declare before using",
|
|
"description": "Undefined variable error",
|
|
"severity": "error",
|
|
"language": "python"
|
|
}
|
|
]
|
|
""")
|
|
loader = RuleLoader()
|
|
rules = loader.load_yaml(str(rules_file))
|
|
assert len(rules) == 1
|
|
assert rules[0].language == "python"
|
|
|
|
def test_load_json_rules(self, tmp_path):
|
|
rules_file = tmp_path / "js_errors.json"
|
|
rules_file.write_text('''[
|
|
{
|
|
"id": "js001",
|
|
"name": "Reference Error",
|
|
"pattern": "ReferenceError: ([\\\\w]+) is not defined",
|
|
"fix": "Ensure declared before use",
|
|
"description": "Reference to undefined variable",
|
|
"severity": "error",
|
|
"language": "javascript"
|
|
}
|
|
]
|
|
''')
|
|
loader = RuleLoader()
|
|
rules = loader.load_json(str(rules_file))
|
|
assert len(rules) == 1
|
|
assert rules[0].language == "javascript"
|
|
|
|
def test_load_directory(self, tmp_path):
|
|
subdir = tmp_path / "python"
|
|
subdir.mkdir()
|
|
rules_file = subdir / "errors.yaml"
|
|
rules_file.write_text("""
|
|
- id: py_test
|
|
name: Test Rule
|
|
pattern: "TestError"
|
|
fix: "Fix the test"
|
|
description: "Test rule"
|
|
severity: "info"
|
|
language: "python"
|
|
""")
|
|
loader = RuleLoader()
|
|
rules = loader.load_directory(str(tmp_path))
|
|
assert len(rules) >= 1
|
|
|
|
def test_filter_rules_by_language(self):
|
|
loader = RuleLoader()
|
|
from errorfix.rules.rule import Rule
|
|
rules = [
|
|
Rule(id="p1", name="P1", pattern=".*", fix="f", description="d", language="python"),
|
|
Rule(id="p2", name="P2", pattern=".*", fix="f", description="d", language="javascript"),
|
|
Rule(id="p3", name="P3", pattern=".*", fix="f", description="d", language="python"),
|
|
]
|
|
filtered = loader.filter_rules(rules, language="python")
|
|
assert len(filtered) == 2
|
|
|
|
def test_load_nonexistent_file(self):
|
|
loader = RuleLoader()
|
|
with pytest.raises(FileNotFoundError):
|
|
loader.load_yaml("/nonexistent/path.yaml")
|