From 2879f378187a4ad373b9513581704816e7602ce9 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 5 Feb 2026 08:48:55 +0000 Subject: [PATCH] Add test suite with fixtures and tests for all modules --- tests/test_config.py | 132 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/test_config.py diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..db29809 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,132 @@ +"""Tests for configuration loading.""" + +from pathlib import Path + +import pytest + +from src.auto_readme.config import ConfigLoader, ConfigValidator, ReadmeConfig + + +class TestConfigLoader: + """Tests for ConfigLoader.""" + + def test_find_config_yaml(self, tmp_path): + """Test finding YAML configuration file.""" + (tmp_path / ".readmerc.yaml").write_text("project_name: test") + + config_path = ConfigLoader.find_config(tmp_path) + assert config_path is not None + assert config_path.name == ".readmerc.yaml" + + def test_find_config_yml(self, tmp_path): + """Test finding YML configuration file.""" + (tmp_path / ".readmerc.yml").write_text("project_name: test") + + config_path = ConfigLoader.find_config(tmp_path) + assert config_path is not None + + def test_find_config_toml(self, tmp_path): + """Test finding TOML configuration file.""" + (tmp_path / ".readmerc").write_text("project_name = 'test'") + + config_path = ConfigLoader.find_config(tmp_path) + assert config_path is not None + + def test_load_yaml_config(self, tmp_path): + """Test loading YAML configuration file.""" + config_file = tmp_path / ".readmerc.yaml" + config_file.write_text(""" +project_name: "My Test Project" +description: "A test description" +template: "minimal" +interactive: true + +sections: + order: + - title + - description + - overview + +custom_fields: + author: "Test Author" + email: "test@example.com" +""") + + config = ConfigLoader.load(config_file) + + assert config.project_name == "My Test Project" + assert config.description == "A test description" + assert config.template == "minimal" + assert config.interactive is True + assert "author" in config.custom_fields + + def test_load_toml_config(self, tmp_path): + """Test loading TOML configuration file.""" + config_file = tmp_path / "pyproject.toml" + config_file.write_text(""" +[tool.auto-readme] +filename = "README.md" +sections = ["title", "description", "overview"] +""") + + config = ConfigLoader.load(config_file) + + assert config.output_filename == "README.md" + + def test_load_nonexistent_file(self): + """Test loading nonexistent configuration file.""" + config = ConfigLoader.load(Path("/nonexistent/config.yaml")) + assert config.project_name is None + + def test_load_invalid_yaml(self, tmp_path): + """Test loading invalid YAML raises error.""" + config_file = tmp_path / ".readmerc.yaml" + config_file.write_text("invalid: yaml: content: [") + + with pytest.raises(ValueError): + ConfigLoader.load(config_file) + + +class TestConfigValidator: + """Tests for ConfigValidator.""" + + def test_validate_valid_config(self): + """Test validating a valid configuration.""" + config = ReadmeConfig( + project_name="test", + template="base", + ) + + errors = ConfigValidator.validate(config) + assert len(errors) == 0 + + def test_validate_invalid_template(self): + """Test validating invalid template name.""" + config = ReadmeConfig( + project_name="test", + template="nonexistent", + ) + + errors = ConfigValidator.validate(config) + assert len(errors) == 1 + assert "Invalid template" in errors[0] + + def test_validate_invalid_section(self): + """Test validating invalid section name.""" + config = ReadmeConfig( + project_name="test", + sections={"order": ["invalid_section"]}, + ) + + errors = ConfigValidator.validate(config) + assert len(errors) == 1 + assert "Invalid section" in errors[0] + + def test_generate_template(self): + """Test generating configuration template.""" + template = ConfigValidator.generate_template() + + assert "project_name:" in template + assert "description:" in template + assert "template:" in template + assert "interactive:" in template