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