[Test Improver] test: add unit tests for AgentsCompiler (65%→82% coverage)#221
Conversation
Cover previously untested branches in agents_compiler.py: - CompilationConfig.from_apm_yml(): target, strategy, single_file legacy, min_instructions_per_file, source_attribution fields, exception fallback, no-file fallback, single_agents override, None override ignored - CompilationConfig.__post_init__: single_agents and exclude=None paths - AgentsCompiler.compile(): exception handling and local_only discovery path - AgentsCompiler.validate_primitives(): primitive errors → warnings, absolute-path fallback, link validation errors - AgentsCompiler._write_output_file(): OSError adds compiler error - AgentsCompiler._write_distributed_file(): full method coverage (dir creation, no-constitution, constitution injection failure fallback, OSError re-raise) - AgentsCompiler._generate_placement_summary(): relative and absolute path cases - AgentsCompiler._generate_distributed_summary(): format and path fallback - AgentsCompiler._merge_results(): empty list, single pass-through, two-result merge (content, warnings, stats), failure propagation, empty-path exclusion - compile_agents_md(): error path raises RuntimeError, success returns content 34 new tests, all pass. Overall agents_compiler coverage: 65% → 82%. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ced329c to
99bd0cd
Compare
There was a problem hiding this comment.
Pull request overview
Adds a dedicated unit test module to increase branch/edge-case coverage for apm_cli.compilation.agents_compiler—the main orchestration layer for AGENTS.md/CLAUDE.md compilation—focusing on error handling, config loading, and distributed write helpers.
Changes:
- Add new unit tests covering
CompilationConfig.from_apm_yml()overrides/legacy fields and failure fallbacks. - Add tests for
AgentsCompilerexception handling, primitive validation warnings (including link validation), and output write error paths. - Add tests for distributed write helpers and summary/merge helpers, plus
compile_agents_md()failure/success behavior.
| import tempfile | ||
| import unittest | ||
| from pathlib import Path | ||
| from unittest.mock import MagicMock, PropertyMock, patch |
There was a problem hiding this comment.
Unused import: PropertyMock is imported but never used in this test module. Removing it will reduce noise and avoid unused-import warnings in editors/linting.
| from unittest.mock import MagicMock, PropertyMock, patch | |
| from unittest.mock import MagicMock, patch |
| "apm_cli.compilation.agents_compiler.AgentsCompiler._write_distributed_file", | ||
| wraps=compiler._write_distributed_file, | ||
| ): | ||
| with patch( | ||
| "apm_cli.compilation.injector.ConstitutionInjector.inject", | ||
| side_effect=RuntimeError("injection error"), | ||
| ): | ||
| compiler._write_distributed_file(target, "original content", config) |
There was a problem hiding this comment.
This nested patch of AgentsCompiler._write_distributed_file wraps the method under test but doesn't assert on the mock or change behavior. It can be removed to simplify the test and avoid accidental recursion/patching complexity.
| "apm_cli.compilation.agents_compiler.AgentsCompiler._write_distributed_file", | |
| wraps=compiler._write_distributed_file, | |
| ): | |
| with patch( | |
| "apm_cli.compilation.injector.ConstitutionInjector.inject", | |
| side_effect=RuntimeError("injection error"), | |
| ): | |
| compiler._write_distributed_file(target, "original content", config) | |
| "apm_cli.compilation.injector.ConstitutionInjector.inject", | |
| side_effect=RuntimeError("injection error"), | |
| ): | |
| compiler._write_distributed_file(target, "original content", config) |
🤖 Test Improver – automated AI assistant
Goal & Rationale
src/apm_cli/compilation/agents_compiler.pyis the main orchestrator for all AGENTS.md/CLAUDE.md compilation. At 65% coverage, many important error-handling and edge-case branches were untested, including:apm.yml(legacysingle_fileflag, placement settings, source attribution)_write_distributed_file()method (0% covered)Approach
Added 34 focused unit tests in
tests/unit/compilation/test_agents_compiler_coverage.py, complementing the existingtest_compilation.py:TestCompilationConfigFromApmYmlAdditionaltarget,strategy, legacysingle_file,min_instructions_per_file,source_attribution, exception fallback, no-file defaultsTestCompilationConfigPostInitsingle_agents→ strategy,exclude=NoneinitTestAgentsCompilerCompileExceptionlocal_onlyuses basic discoverTestValidatePrimitivesErrorsTestWriteOutputFileTestWriteDistributedFileTestGenerateSummariesTestMergeResultsTestCompileAgentsMdFunctionCoverage Impact
agents_compiler.pyRemaining uncovered lines (264-275, 278-280, 294-295, 312-333, 436-437, 467-468, 472-473, 501, 503, 517-518, 759-774, 783-801) are inside
_compile_distributed()and_compile_claude_md()display/formatting paths that require a full distributed compiler stack — not targeted in this PR.Test Status
The pre-existing failure (
test_install_no_apm_yml_no_packages_shows_helpful_error) is unrelated to this change — it's caused by Rich-formatted output containing ANSI escape codes that the test asserts against plain text.Reproducibility