This commit is contained in:
143
.tests/test_refactoring.py
Normal file
143
.tests/test_refactoring.py
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
"""Tests for ShellGenius refactoring module."""
|
||||||
|
|
||||||
|
from shellgenius.refactoring import (
|
||||||
|
RefactoringAnalyzer,
|
||||||
|
RefactoringResult,
|
||||||
|
SecurityRulesDB,
|
||||||
|
refactor_script,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestSecurityRulesDB:
|
||||||
|
"""Test security rules database."""
|
||||||
|
|
||||||
|
def test_get_rules(self):
|
||||||
|
"""Test getting all rules."""
|
||||||
|
rules = SecurityRulesDB.get_rules()
|
||||||
|
assert isinstance(rules, list)
|
||||||
|
assert len(rules) > 0
|
||||||
|
|
||||||
|
def test_check_rule_match(self):
|
||||||
|
"""Test rule matching."""
|
||||||
|
rule = SecurityRulesDB.check_rule("rm $USER_VAR")
|
||||||
|
assert rule is not None
|
||||||
|
assert rule["severity"] == "high"
|
||||||
|
|
||||||
|
def test_check_rule_no_match(self):
|
||||||
|
"""Test no false positives."""
|
||||||
|
rule = SecurityRulesDB.check_rule("ls -la")
|
||||||
|
assert rule is None
|
||||||
|
|
||||||
|
def test_chmod_777_detection(self):
|
||||||
|
"""Test chmod 777 detection."""
|
||||||
|
rule = SecurityRulesDB.check_rule("chmod 777 /path")
|
||||||
|
assert rule is not None
|
||||||
|
assert "777" in rule["pattern"]
|
||||||
|
|
||||||
|
def test_eval_detection(self):
|
||||||
|
"""Test eval with variable detection."""
|
||||||
|
rule = SecurityRulesDB.check_rule("eval $USER_INPUT")
|
||||||
|
assert rule is not None
|
||||||
|
|
||||||
|
|
||||||
|
class TestRefactoringAnalyzer:
|
||||||
|
"""Test refactoring analyzer."""
|
||||||
|
|
||||||
|
def test_analyzer_initialization(self):
|
||||||
|
"""Test analyzer creates properly."""
|
||||||
|
analyzer = RefactoringAnalyzer()
|
||||||
|
assert analyzer.parser is not None
|
||||||
|
assert analyzer.rules_db is not None
|
||||||
|
|
||||||
|
def test_analyze_safe_script(self):
|
||||||
|
"""Test analyzing safe script."""
|
||||||
|
analyzer = RefactoringAnalyzer()
|
||||||
|
script = "#!/bin/bash
|
||||||
|
echo \"Hello\"
|
||||||
|
ls -la
|
||||||
|
"
|
||||||
|
result = analyzer.analyze(script, include_suggestions=False)
|
||||||
|
|
||||||
|
assert isinstance(result, RefactoringResult)
|
||||||
|
assert result.shell_type == "bash"
|
||||||
|
assert result.score > 0
|
||||||
|
|
||||||
|
def test_calculate_score(self):
|
||||||
|
"""Test score calculation."""
|
||||||
|
analyzer = RefactoringAnalyzer()
|
||||||
|
|
||||||
|
from shellgenius.refactoring import RefactoringIssue
|
||||||
|
|
||||||
|
issues = [
|
||||||
|
RefactoringIssue(
|
||||||
|
line_number=1,
|
||||||
|
original="rm -rf /",
|
||||||
|
issue_type="CWE-78",
|
||||||
|
severity="high",
|
||||||
|
description="Test",
|
||||||
|
risk_assessment="Test",
|
||||||
|
suggestion="Test",
|
||||||
|
safer_alternative="",
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
score = analyzer._calculate_score(issues, "rm -rf /")
|
||||||
|
assert score < 100
|
||||||
|
|
||||||
|
def test_generate_suggestions(self):
|
||||||
|
"""Test suggestion generation."""
|
||||||
|
analyzer = RefactoringAnalyzer()
|
||||||
|
|
||||||
|
from shellgenius.refactoring import RefactoringIssue
|
||||||
|
|
||||||
|
issues = [
|
||||||
|
RefactoringIssue(
|
||||||
|
line_number=1,
|
||||||
|
original="rm -rf /",
|
||||||
|
issue_type="Test",
|
||||||
|
severity="high",
|
||||||
|
description="Test",
|
||||||
|
risk_assessment="Test",
|
||||||
|
suggestion="Test",
|
||||||
|
safer_alternative="",
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
suggestions = analyzer._generate_suggestions(issues, "script")
|
||||||
|
assert isinstance(suggestions, list)
|
||||||
|
assert len(suggestions) > 0
|
||||||
|
|
||||||
|
def test_check_improvements(self):
|
||||||
|
"""Test code quality improvement detection."""
|
||||||
|
analyzer = RefactoringAnalyzer()
|
||||||
|
|
||||||
|
backtick_result = analyzer._check_improvements("echo `date`")
|
||||||
|
assert backtick_result is not None
|
||||||
|
assert "backtick" in backtick_result["description"].lower()
|
||||||
|
|
||||||
|
def test_refactor_script_function(self):
|
||||||
|
"""Test convenience function."""
|
||||||
|
result = refactor_script("echo test", include_suggestions=False)
|
||||||
|
assert result is not None
|
||||||
|
assert hasattr(result, "shell_type")
|
||||||
|
assert hasattr(result, "issues")
|
||||||
|
assert hasattr(result, "score")
|
||||||
|
assert hasattr(result, "suggestions")
|
||||||
|
|
||||||
|
|
||||||
|
class TestRefactoringResult:
|
||||||
|
"""Test refactoring result dataclass."""
|
||||||
|
|
||||||
|
def test_result_creation(self):
|
||||||
|
"""Test creating result."""
|
||||||
|
result = RefactoringResult(
|
||||||
|
shell_type="bash",
|
||||||
|
issues=[],
|
||||||
|
score=100,
|
||||||
|
suggestions=["Use set -e"],
|
||||||
|
safer_script="#!/bin/bash\necho test",
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.shell_type == "bash"
|
||||||
|
assert result.score == 100
|
||||||
|
assert len(result.suggestions) == 1
|
||||||
Reference in New Issue
Block a user