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\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")