diff --git a/src/agentready/assessors/stub_assessors.py b/src/agentready/assessors/stub_assessors.py index 51a6f418..9d9935d5 100644 --- a/src/agentready/assessors/stub_assessors.py +++ b/src/agentready/assessors/stub_assessors.py @@ -236,8 +236,25 @@ def attribute(self) -> Attribute: ) def assess(self, repository: Repository) -> Finding: - # Simplified: Check if commitlint or husky is configured - has_commitlint = (repository.path / ".commitlintrc.json").exists() + commitlint_configs = [ + ".commitlintrc", + ".commitlintrc.json", + ".commitlintrc.yaml", + ".commitlintrc.yml", + ".commitlintrc.js", + ".commitlintrc.cjs", + ".commitlintrc.mjs", + ".commitlintrc.ts", + ".commitlintrc.cts", + "commitlint.config.js", + "commitlint.config.cjs", + "commitlint.config.mjs", + "commitlint.config.ts", + "commitlint.config.cts", + ] + has_commitlint = any( + (repository.path / cfg).exists() for cfg in commitlint_configs + ) has_husky = (repository.path / ".husky").exists() if has_commitlint or has_husky: diff --git a/tests/unit/test_assessors_stub.py b/tests/unit/test_assessors_stub.py index 2a274e62..938a15fb 100644 --- a/tests/unit/test_assessors_stub.py +++ b/tests/unit/test_assessors_stub.py @@ -2,7 +2,10 @@ import subprocess +import pytest + from agentready.assessors.stub_assessors import ( + ConventionalCommitsAssessor, DependencyPinningAssessor, FileSizeLimitsAssessor, GitignoreAssessor, @@ -675,3 +678,71 @@ def test_respects_gitignore_node_modules(self, tmp_path): assert finding.status == "pass" assert "3000" not in str(finding.evidence) + + +class TestConventionalCommitsAssessor: + """Test ConventionalCommitsAssessor config file detection.""" + + def _make_repo(self, tmp_path): + (tmp_path / ".git").mkdir(exist_ok=True) + return Repository( + path=tmp_path, + name="test-repo", + url=None, + branch="main", + commit_hash="abc123", + languages={"Python": 100}, + total_files=10, + total_lines=100, + ) + + @pytest.mark.parametrize( + "config_file", + [ + ".commitlintrc", + ".commitlintrc.json", + ".commitlintrc.yaml", + ".commitlintrc.yml", + ".commitlintrc.js", + ".commitlintrc.cjs", + ".commitlintrc.mjs", + ".commitlintrc.ts", + ".commitlintrc.cts", + "commitlint.config.js", + "commitlint.config.cjs", + "commitlint.config.mjs", + "commitlint.config.ts", + "commitlint.config.cts", + ], + ) + def test_detects_all_config_formats(self, tmp_path, config_file): + """Each supported commitlint config format should be detected.""" + (tmp_path / config_file).touch() + repo = self._make_repo(tmp_path) + assessor = ConventionalCommitsAssessor() + finding = assessor.assess(repo) + + assert finding.status == "pass" + assert finding.score == 100.0 + assert finding.measured_value == "configured" + + def test_detects_husky_directory(self, tmp_path): + """A .husky directory should also count as configured.""" + (tmp_path / ".husky").mkdir() + repo = self._make_repo(tmp_path) + assessor = ConventionalCommitsAssessor() + finding = assessor.assess(repo) + + assert finding.status == "pass" + assert finding.score == 100.0 + + def test_fails_with_no_config(self, tmp_path): + """Without any config files, the check must fail.""" + repo = self._make_repo(tmp_path) + assessor = ConventionalCommitsAssessor() + finding = assessor.assess(repo) + + assert finding.status == "fail" + assert finding.score == 0.0 + assert finding.measured_value == "not configured" + assert finding.remediation is not None