From a5201cab01dd6d0b885a0e91eace567e3e6b41cb Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Sat, 31 Jan 2026 21:39:54 +0000 Subject: [PATCH] Initial upload: man-card CLI tool with PDF/PNG generation, templates, and tests --- tests/test_cli.py | 127 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 tests/test_cli.py diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..6e76ffd --- /dev/null +++ b/tests/test_cli.py @@ -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