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