Files
man-card/tests/test_cli.py
2026-01-31 21:39:54 +00:00

128 lines
4.6 KiB
Python

"""Tests for CLI interface."""
import pytest
from unittest.mock import patch, MagicMock
from click.testing import CliRunner
from man_card.cli import cli, generate, list_templates, preview
class TestCLI:
"""Tests for CLI interface."""
def setup_method(self):
"""Set up test fixtures."""
self.runner = CliRunner()
def test_cli_group_exists(self):
"""Test that cli group exists."""
result = self.runner.invoke(cli, ['--help'])
assert result.exit_code == 0
assert 'man-card' in result.output
def test_generate_command_exists(self):
"""Test that generate command exists."""
result = self.runner.invoke(cli, ['generate', '--help'])
assert result.exit_code == 0
def test_list_templates_command(self):
"""Test list-templates command."""
result = self.runner.invoke(list_templates)
assert result.exit_code == 0
assert 'default' in result.output
@patch('subprocess.run')
def test_preview_command(self, mock_run):
"""Test preview command."""
mock_run.return_value = MagicMock(
returncode=0,
stdout="NAME\nls - list directory contents\n\nSYNOPSIS\nls [OPTION]... [FILE]...\n"
)
result = self.runner.invoke(preview, ['ls'])
assert result.exit_code == 0
assert 'ls' in result.output
@patch('subprocess.run')
@patch('man_card.card_generator.PDFCardGenerator.generate')
def test_generate_pdf_output(self, mock_pdf_gen, mock_run):
"""Test PDF generation output."""
mock_run.return_value = MagicMock(
returncode=0,
stdout="NAME\nls - list directory contents\n\nSYNOPSIS\nls [OPTION]...\n"
)
with self.runner.isolated_filesystem():
result = self.runner.invoke(generate, ['ls', '-o', 'test_card.pdf'])
assert result.exit_code == 0
mock_pdf_gen.assert_called_once()
@patch('subprocess.run')
@patch('man_card.card_generator.PNGCardGenerator.generate')
def test_generate_png_output(self, mock_png_gen, mock_run):
"""Test PNG generation output."""
mock_run.return_value = MagicMock(
returncode=0,
stdout="NAME\nls - list directory contents\n\nSYNOPSIS\nls [OPTION]...\n"
)
with self.runner.isolated_filesystem():
result = self.runner.invoke(generate, ['ls', '--format', 'png', '-o', 'test_card.png'])
assert result.exit_code == 0
mock_png_gen.assert_called_once()
def test_generate_requires_command_or_input(self):
"""Test that generate requires command or input file."""
result = self.runner.invoke(generate, [])
assert result.exit_code != 0
assert 'Error' in result.output
def test_generate_with_input_file(self):
"""Test generation with input file."""
with self.runner.isolated_filesystem():
with open('commands.txt', 'w') as f:
f.write('ls\ngrep\n')
result = self.runner.invoke(generate, ['-i', 'commands.txt', '-o', 'output.pdf'])
assert result.exit_code == 0 or 'Error' not in result.output
def test_verbose_flag(self):
"""Test verbose flag doesn't cause errors."""
result = self.runner.invoke(cli, ['--verbose', 'list-templates'])
assert result.exit_code == 0
def test_quiet_flag(self):
"""Test quiet flag doesn't cause errors."""
result = self.runner.invoke(cli, ['--quiet', 'list-templates'])
assert result.exit_code == 0
def test_invalid_format(self):
"""Test handling of invalid format."""
result = self.runner.invoke(generate, ['ls', '--format', 'invalid'])
assert result.exit_code != 0
def test_invalid_page_size(self):
"""Test handling of invalid page size."""
result = self.runner.invoke(generate, ['ls', '--page-size', 'invalid'])
assert result.exit_code != 0
class TestCLIContext:
"""Tests for CLI context handling."""
def setup_method(self):
"""Set up test fixtures."""
self.runner = CliRunner()
def test_context_verbose_default(self):
"""Test verbose defaults to False in context."""
result = self.runner.invoke(cli, ['--help'])
assert result.exit_code == 0
def test_generate_help_contains_options(self):
"""Test generate help contains expected options."""
result = self.runner.invoke(generate, ['--help'])
assert '--output' in result.output
assert '--format' in result.output
assert '--template' in result.output