From 7b02f3907054e2440bd08ef5ab85059746d9e3fb Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Mon, 2 Feb 2026 14:00:59 +0000 Subject: [PATCH] Add code analyzer, issue detector, and CLI tests --- tests/test_issue_detector.py | 112 +++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 tests/test_issue_detector.py diff --git a/tests/test_issue_detector.py b/tests/test_issue_detector.py new file mode 100644 index 0000000..cbf19ac --- /dev/null +++ b/tests/test_issue_detector.py @@ -0,0 +1,112 @@ +"""Tests for the IssueDetector module.""" + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent.parent / 'src')) + +from gdiffer.issue_detector import IssueDetector, detect_issues, suggest_improvements + + +class TestIssueDetector: + def test_detect_sql_injection(self, issue_detector): + code = 'query = "SELECT * FROM users WHERE name = \'" + username + "\'"' + issues = issue_detector.detect_issues(code, "python") + sql_issues = [i for i in issues if i.type == "sql_injection"] + assert len(sql_issues) > 0 + + def test_detect_xss(self, issue_detector): + code = "element.innerHTML = userInput" + issues = issue_detector.detect_issues(code, "javascript") + xss_issues = [i for i in issues if i.type == "xss"] + assert len(xss_issues) > 0 + + def test_detect_command_injection(self, issue_detector): + code = "os.system('rm -rf /tmp/' + user_input)" + issues = issue_detector.detect_issues(code, "python") + cmd_issues = [i for i in issues if i.type == "command_injection"] + assert len(cmd_issues) > 0 + + def test_detect_eval_usage(self, issue_detector): + code = "result = eval(user_code)" + issues = issue_detector.detect_issues(code, "python") + eval_issues = [i for i in issues if i.type == "code_injection"] + assert len(eval_issues) > 0 + + def test_detect_hardcoded_secret(self, issue_detector): + code = 'api_key = "sk-1234567890abcdef"' + issues = issue_detector.detect_issues(code, "python") + secret_issues = [i for i in issues if i.type == "hardcoded_secret"] + assert len(secret_issues) > 0 + + def test_detect_insecure_http(self, issue_detector): + code = 'response = requests.get("http://api.example.com")' + issues = issue_detector.detect_issues(code, "python") + http_issues = [i for i in issues if i.type == "insecure_transport"] + assert len(http_issues) > 0 + + def test_detect_debug_statements(self, issue_detector): + code = "print('Debug: value =', value)" + issues = issue_detector.detect_issues(code, "python") + debug_issues = [i for i in issues if i.type == "debug_statement"] + assert len(debug_issues) > 0 + + def test_detect_todo_comments(self, issue_detector): + code = "# TODO: Fix this later" + issues = issue_detector.detect_issues(code, "python") + todo_issues = [i for i in issues if i.type == "code_tag"] + assert len(todo_issues) > 0 + + def test_detect_no_issues_in_clean_code(self, issue_detector): + code = """def calculate_sum(a, b): + result = a + b + return result +""" + issues = issue_detector.detect_issues(code, "python") + assert len(issues) == 0 + + def test_issue_line_number(self, issue_detector): + code = """line1 = 1 +line2 = 2 +password = "secret" +""" + issues = issue_detector.detect_issues(code, "python") + secret_issues = [i for i in issues if i.type == "hardcoded_secret"] + assert len(secret_issues) > 0 + assert secret_issues[0].line == 3 + + def test_suggest_improvements(self, issue_detector): + code = 'password = "secret"' + suggestions = issue_detector.suggest_improvements(code, "python") + assert isinstance(suggestions, list) + assert len(suggestions) > 0 + + +class TestDetectIssuesFunction: + def test_detect_issues_function(self): + issues = detect_issues('password = "secret"', "python") + assert isinstance(issues, list) + + def test_detect_issues_empty(self): + issues = detect_issues("def test():\n return 1", "python") + assert issues == [] + + +class TestSuggestImprovementsFunction: + def test_suggest_improvements_function(self): + suggestions = suggest_improvements('password = "secret"', "python") + assert isinstance(suggestions, list) + + def test_suggest_improvements_clean_code(self): + suggestions = suggest_improvements("def test():\n return 1", "python") + assert suggestions == [] + + +class TestIssueModel: + def test_issue_creation(self): + from gdiffer.issue_detector import Issue + issue = Issue(type="test", severity="high", title="Test Issue", + description="Test description", line=10, suggestion="Fix this") + assert issue.type == "test" + assert issue.severity == "high" + assert issue.line == 10