Files
git-diff-explainer-cli/tests/test_cli.py
7000pctAUTO a007304aa7
Some checks failed
CI / test (3.10) (push) Has been cancelled
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / build (push) Has been cancelled
fix: resolve CI linting errors - remove unused imports and update type annotations
2026-02-02 14:39:11 +00:00

176 lines
4.6 KiB
Python

"""Tests for the CLI module."""
import sys
from pathlib import Path
from click.testing import CliRunner
sys.path.insert(0, str(Path(__file__).parent.parent / 'src'))
from gdiffer.cli import main
class TestCLIMain:
"""Tests for the main CLI command."""
def test_main_help(self):
"""Test that --help works."""
runner = CliRunner()
result = runner.invoke(main, ["--help"])
assert result.exit_code == 0
assert "Git Diff Explainer" in result.output or "diff" in result.output.lower()
def test_main_version(self):
"""Test that --version works."""
runner = CliRunner()
result = runner.invoke(main, ["--version"])
assert result.exit_code == 0
assert "0.1.0" in result.output
class TestExplainCommand:
"""Tests for the explain command."""
def test_explain_simple_diff(self):
"""Test explaining a simple diff."""
diff = """diff --git a/test.py b/test.py
index 123..456 100644
--- a/test.py
+++ b/test.py
@@ -1,3 +1,3 @@
-def hello():
- print("Hello")
+def hello():
+ print("Hello, World!")
"""
runner = CliRunner()
result = runner.invoke(main, ["explain", diff])
assert result.exit_code == 0
assert "test.py" in result.output or "Files" in result.output
def test_explain_no_input(self):
"""Test explaining with no input shows error."""
runner = CliRunner()
result = runner.invoke(main, ["explain"])
assert result.exit_code != 0
def test_explain_invalid_diff(self):
"""Test explaining an invalid diff."""
runner = CliRunner()
result = runner.invoke(main, ["explain", "not a valid diff"])
assert result.exit_code != 0
def test_explain_json_format(self):
"""Test explaining in JSON format."""
diff = """diff --git a/test.py b/test.py
new file mode 100644
--- /dev/null
+++ b/test.py
@@ -0,0 +1 @@
+print("hello")
"""
runner = CliRunner()
result = runner.invoke(main, ["--output", "json", "explain", diff])
assert result.exit_code == 0
assert "{" in result.output
def test_explain_plain_format(self):
"""Test explaining in plain text format."""
diff = """diff --git a/test.py b/test.py
--- a/test.py
+++ b/test.py
@@ -1 +1 @@
-old
+new
"""
runner = CliRunner()
result = runner.invoke(main, ["--output", "plain", "explain", diff])
assert result.exit_code == 0
class TestIssuesCommand:
"""Tests for the issues command."""
def test_issues_with_security_issue(self):
"""Test detecting security issues."""
diff = """diff --git a/db.py b/db.py
--- a/db.py
+++ b/db.py
@@ -1,2 +1,3 @@
def get_user(username):
query = "SELECT * FROM users WHERE name = '" + username + "'"
+ query = "SELECT * FROM users WHERE id = " + user_id
"""
runner = CliRunner()
result = runner.invoke(main, ["issues"], input=diff)
assert result.exit_code == 0
class TestSummarizeCommand:
"""Tests for the summarize command."""
def test_summarize_simple_diff(self):
"""Test summarizing a simple diff."""
diff = """diff --git a/test.py b/test.py
--- a/test.py
+++ b/test.py
@@ -1 +1 @@
-old
+new
"""
runner = CliRunner()
result = runner.invoke(main, ["summarize"], input=diff)
assert result.exit_code == 0
assert "Files" in result.output or "changed" in result.output.lower()
def test_summarize_multi_file(self):
"""Test summarizing multi-file diff."""
diff = """diff --git a/file1.py b/file1.py
new file mode 100644
--- /dev/null
+++ b/file1.py
@@ -0,0 +1 @@
+print(1)
diff --git a/file2.py b/file2.py
deleted file mode 100644
--- a/file2.py
+++ /dev/null
@@ -1 +0,0 @@
-print(2)
"""
runner = CliRunner()
result = runner.invoke(main, ["summarize"], input=diff)
assert result.exit_code == 0
class TestCLIOptions:
"""Tests for CLI options."""
def test_verbose_option(self):
"""Test verbose output option."""
diff = """diff --git a/test.py b/test.py
--- a/test.py
+++ b/test.py
@@ -1 +1 @@
-old
+new
"""
runner = CliRunner()
result = runner.invoke(main, ["--verbose", "explain", diff])
assert result.exit_code == 0
def test_output_format_option(self):
"""Test output format option."""
diff = """diff --git a/test.py b/test.py
--- a/test.py
+++ b/test.py
@@ -1 +1 @@
-old
+new
"""
for fmt in ["terminal", "json", "plain"]:
runner = CliRunner()
result = runner.invoke(main, ["--output", fmt, "explain", diff])
assert result.exit_code == 0