Files
auto-gitignore-cli/tests/test_cli.py

147 lines
5.5 KiB
Python

"""Tests for CLI interface."""
from pathlib import Path
from click.testing import CliRunner
from src.cli import main
class TestCLI:
"""Tests for CLI functionality."""
def test_cli_help(self):
"""Test CLI help command."""
runner = CliRunner()
result = runner.invoke(main, ["--help"])
assert result.exit_code == 0
assert "--path" in result.output
assert "--language" in result.output
assert "--framework" in result.output
def test_cli_dry_run(self):
"""Test CLI dry-run option."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--language", "python"])
assert result.exit_code == 0
assert "__pycache__/" in result.output
def test_cli_force_overwrite(self, temp_project_dir: Path):
"""Test CLI force overwrite option."""
gitignore = temp_project_dir / ".gitignore"
gitignore.write_text("old content\n")
runner = CliRunner()
runner.invoke(main, ["--path", str(temp_project_dir), "--force", "--dry-run"])
def test_cli_output_file(self, temp_project_dir: Path):
"""Test CLI custom output file option."""
output_file = temp_project_dir / "custom.gitignore"
runner = CliRunner()
runner.invoke(main, ["--output", str(output_file), "--language", "python", "--force"])
assert output_file.exists()
def test_cli_verbose_output(self):
"""Test CLI verbose output option."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--language", "python", "--verbose"])
assert result.exit_code == 0
assert "python" in result.output.lower() or "Detected" in result.output
def test_cli_multiple_languages(self):
"""Test CLI with multiple languages."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--language", "python", "--language", "nodejs"])
assert result.exit_code == 0
def test_cli_multiple_frameworks(self):
"""Test CLI with multiple frameworks."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--framework", "django", "--framework", "react"])
assert result.exit_code == 0
def test_cli_custom_patterns(self):
"""Test CLI with custom patterns."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--custom", "custom_dir/", "--custom", "*.custom"])
assert result.exit_code == 0
assert "custom_dir/" in result.output
def test_cli_os_patterns(self):
"""Test CLI with OS patterns."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--os", "macos", "--os", "windows"])
assert result.exit_code == 0
assert ".DS_Store" in result.output
assert "Thumbs.db" in result.output
def test_cli_ide_patterns(self):
"""Test CLI with IDE patterns."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--ide", "vscode", "--ide", "jetbrains"])
assert result.exit_code == 0
assert ".vscode/" in result.output
assert ".idea/" in result.output
def test_cli_nonexistent_path(self):
"""Test CLI with nonexistent path."""
runner = CliRunner()
result = runner.invoke(main, ["--path", "/nonexistent/path"])
assert result.exit_code != 0
def test_cli_invalid_language(self):
"""Test CLI with invalid language."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--language", "invalid_language"])
assert result.exit_code != 0
def test_cli_invalid_framework(self):
"""Test CLI with invalid framework."""
runner = CliRunner()
result = runner.invoke(main, ["--dry-run", "--framework", "invalid_framework"])
assert result.exit_code != 0
def test_detect_project_stack_python(self, python_project: Path):
"""Test project stack detection for Python project."""
from src.cli import detect_project_stack
stack = detect_project_stack(python_project)
assert "python" in stack.get("languages", [])
def test_detect_project_stack_nodejs(self, nodejs_project: Path):
"""Test project stack detection for Node.js project."""
from src.cli import detect_project_stack
stack = detect_project_stack(nodejs_project)
assert "nodejs" in stack.get("languages", [])
def test_detect_project_stack_django(self, django_project: Path):
"""Test project stack detection for Django project."""
from src.cli import detect_project_stack
stack = detect_project_stack(django_project)
assert "django" in stack.get("frameworks", [])
def test_detect_project_stack_react(self, react_project: Path):
"""Test project stack detection for React project."""
from src.cli import detect_project_stack
stack = detect_project_stack(react_project)
assert "react" in stack.get("frameworks", [])
def test_detect_project_stack_vscode(self, vscode_project: Path):
"""Test IDE detection for VSCode project."""
from src.cli import detect_project_stack
stack = detect_project_stack(vscode_project)
assert "vscode" in stack.get("ides", [])
def test_detect_project_stack_jetbrains(self, jetbrains_project: Path):
"""Test IDE detection for JetBrains project."""
from src.cli import detect_project_stack
stack = detect_project_stack(jetbrains_project)
assert "jetbrains" in stack.get("ides", [])