Initial upload: man-card CLI tool with PDF/PNG generation, templates, and tests
Some checks failed
CI / test (push) Failing after 15s
Some checks failed
CI / test (push) Failing after 15s
This commit is contained in:
127
tests/test_cli.py
Normal file
127
tests/test_cli.py
Normal file
@@ -0,0 +1,127 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user