From 19737f01d181da4ea4ddbbe7f6d24024aace1eac Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Fri, 30 Jan 2026 15:34:16 +0000 Subject: [PATCH] Initial upload: gitignore-generator-cli v1.0.0 with CI/CD workflow --- tests/test_generator.py | 151 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 tests/test_generator.py diff --git a/tests/test_generator.py b/tests/test_generator.py new file mode 100644 index 0000000..9b09e07 --- /dev/null +++ b/tests/test_generator.py @@ -0,0 +1,151 @@ +"""Tests for generator.py.""" + +import tempfile +from pathlib import Path +from unittest.mock import patch, MagicMock + +import pytest + +from gitignore_generator.generator import ( + GitignoreGenerator, + generate_gitignore +) + + +class TestGitignoreGenerator: + """Tests for GitignoreGenerator class.""" + + @pytest.fixture + def generator(self): + """Create generator instance.""" + return GitignoreGenerator() + + @pytest.fixture + def generator_with_custom(self, temp_dir): + """Create generator with custom patterns file.""" + custom_file = temp_dir / "custom.txt" + custom_file.write_text("*.custom\ncustom/") + return GitignoreGenerator(custom_patterns_file=str(custom_file)) + + def test_combine_patterns_single_tech(self, generator): + """Test combining patterns for single technology.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = { + 'python': '# Python\n__pycache__/\n*.pyc\n' + } + result = generator.combine_patterns(['python']) + assert '__pycache__' in result + assert '*.pyc' in result + + def test_combine_patterns_multiple_techs(self, generator): + """Test combining patterns for multiple technologies.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = { + 'node': '# Node\nnode_modules/\n*.log\n', + 'python': '# Python\n__pycache__/\n*.pyc\n' + } + result = generator.combine_patterns(['node', 'python']) + assert 'node_modules' in result + assert '__pycache__' in result + + def test_combine_patterns_handles_duplicates(self, generator): + """Test that duplicate patterns are handled.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = { + 'node': '# Node\n*.log\n', + 'python': '# Python\n*.log\n' + } + result = generator.combine_patterns(['node', 'python']) + lines = [l for l in result.splitlines() if l and not l.startswith('#')] + assert lines.count('*.log') == 1 + + def test_combine_patterns_add_patterns(self, generator): + """Test adding custom patterns.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator.combine_patterns(['python'], add_patterns=['*.custom']) + assert '*.custom' in result + + def test_generate_file_to_stdout(self, generator): + """Test generating gitignore to stdout.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator.generate_file(['python'], preview=True) + assert '__pycache__' in result + + def test_generate_file_to_path(self, generator, temp_dir): + """Test generating gitignore to file.""" + output_path = temp_dir / '.gitignore' + + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator.generate_file(['python'], output_path=str(output_path)) + + assert output_path.exists() + content = output_path.read_text() + assert '__pycache__' in content + + def test_generate_file_preview_mode(self, generator, temp_dir): + """Test preview mode doesn't write file.""" + output_path = temp_dir / '.gitignore' + + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator.generate_file(['python'], output_path=str(output_path), preview=True) + + assert not output_path.exists() + + def test_load_custom_patterns(self, generator_with_custom): + """Test loading custom patterns from file.""" + patterns = generator_with_custom.load_custom_patterns() + assert '*.custom' in patterns + + def test_generate_file_with_custom_patterns(self, generator_with_custom): + """Test generating with custom patterns file.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator_with_custom.generate_file(['python']) + assert '__pycache__' in result + assert '*.custom' in result + + def test_merge_with_existing(self, generator, temp_dir): + """Test merging with existing .gitignore.""" + existing = temp_dir / '.gitignore' + existing.write_text('# Existing\nexisting.txt\n') + + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator.merge_with_existing( + str(existing), ['python'] + ) + + assert 'existing.txt' in result + assert '__pycache__' in result + + def test_combine_patterns_adds_comments(self, generator): + """Test that technology comments are added.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'python': '__pycache__/\n'} + result = generator.combine_patterns(['python']) + assert '# --- PYTHON ---' in result + + +class TestGenerateGitignoreFunction: + """Tests for generate_gitignore convenience function.""" + + def test_generate_gitignore(self): + """Test generate_gitignore function.""" + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'node': 'node_modules/\n'} + result = generate_gitignore(['node']) + assert 'node_modules' in result + + def test_generate_gitignore_with_output(self, temp_dir): + """Test generate_gitignore with output path.""" + output_path = temp_dir / '.gitignore' + + with patch('gitignore_generator.generator.get_patterns_batch') as mock: + mock.return_value = {'node': 'node_modules/\n'} + result = generate_gitignore(['node'], output_path=str(output_path)) + + assert output_path.exists()