175 lines
8.4 KiB
Gherkin
175 lines
8.4 KiB
Gherkin
Feature: Coverage boost for files with 1-5 missing lines
|
|
As a developer
|
|
I want to cover the remaining 1-5 missing lines in small files
|
|
So that overall code coverage meets the 97% threshold
|
|
|
|
# =============================================================================
|
|
# bootstrap.py - Line 26: double-check inside lock when already bootstrapped
|
|
# =============================================================================
|
|
|
|
Scenario: ensure_cli_database_bootstrapped skips inside lock when already bootstrapped
|
|
Given the CLI database is already bootstrapped
|
|
When I call ensure_cli_database_bootstrapped without force
|
|
Then no migration runner should be created
|
|
|
|
# =============================================================================
|
|
# tool/builtins/adapter.py - Lines 106, 111: register method with None registry
|
|
# =============================================================================
|
|
|
|
Scenario: BuiltinAdapter register raises ValueError for None registry
|
|
When I call BuiltinAdapter register with None registry
|
|
Then a ValueError should be raised for adapter register
|
|
|
|
# =============================================================================
|
|
# tui/search/fuzzy.py - Lines 21, 28: score_match edge cases
|
|
# =============================================================================
|
|
|
|
Scenario: score_match returns empty candidate for empty query
|
|
When I score a match with empty query against "hello"
|
|
Then the fuzzy candidate score should be 0.0
|
|
And the fuzzy candidate reason should be "empty"
|
|
|
|
Scenario: score_match returns path-component match
|
|
When I score a match with "src/utils" against "src/main/utils.py"
|
|
Then the fuzzy candidate score should be 0.8
|
|
And the fuzzy candidate reason should be "path-component"
|
|
|
|
# =============================================================================
|
|
# phase_gating.py - Lines 29, 76: TYPE_CHECKING import and PlanPhase enum passthrough
|
|
# =============================================================================
|
|
|
|
Scenario: resolve_plan_phase returns PlanPhase enum directly
|
|
Given a PlanPhase EXECUTE enum value
|
|
When I call resolve_plan_phase with the enum
|
|
Then the resolved phase should be EXECUTE
|
|
|
|
# =============================================================================
|
|
# lsp/registry.py - Lines 61, 83, 151: get, remove, list_servers edge cases
|
|
# =============================================================================
|
|
|
|
Scenario: LspRegistry get returns None for unknown server
|
|
Given a fresh empty LspRegistry for coverage
|
|
When I coverage get LSP server "nonexistent"
|
|
Then the coverage LSP server result should be None
|
|
|
|
Scenario: LspRegistry remove returns False for unknown server
|
|
Given a fresh empty LspRegistry for coverage
|
|
When I coverage remove LSP server "nonexistent"
|
|
Then the coverage LSP remove result should be False
|
|
|
|
Scenario: LspRegistry list_servers returns empty list when empty
|
|
Given a fresh empty LspRegistry for coverage
|
|
When I coverage list all LSP servers
|
|
Then the coverage LSP servers list should be empty
|
|
|
|
# =============================================================================
|
|
# application/services/skill_registry_service.py - Lines 144, 192, 202
|
|
# =============================================================================
|
|
|
|
Scenario: SkillRegistryService get_skill returns None for unknown skill
|
|
Given a fresh SkillRegistryService with no skills
|
|
When I coverage get skill "nonexistent"
|
|
Then the coverage skill result should be None
|
|
|
|
# =============================================================================
|
|
# a2a/errors.py - Lines 144, 155, 157, 159: map_domain_error edge cases
|
|
# =============================================================================
|
|
|
|
Scenario: map_domain_error raises TypeError for non-Exception
|
|
When I call map_domain_error with a non-Exception
|
|
Then a TypeError should be raised for map_domain_error
|
|
|
|
Scenario: map_domain_error maps AuthenticationError
|
|
When I call map_domain_error with AuthenticationError
|
|
Then the map_domain error code should be -32002
|
|
|
|
Scenario: map_domain_error maps AuthorizationError
|
|
When I call map_domain_error with AuthorizationError
|
|
Then the map_domain error code should be -32003
|
|
|
|
Scenario: map_domain_error maps ConfigurationError
|
|
When I call map_domain_error with ConfigurationError
|
|
Then the map_domain error code should be -32009
|
|
|
|
# =============================================================================
|
|
# application/services/uko_inference.py - Lines 131, 132, 133, 135
|
|
# =============================================================================
|
|
|
|
Scenario: uko inference with empty context returns empty result
|
|
When I infer UKO with empty context
|
|
Then the inference result should be empty
|
|
|
|
# =============================================================================
|
|
# core/async_cleanup.py - Lines 122, 123, 124, 125
|
|
# =============================================================================
|
|
|
|
Scenario: async cleanup handles exception during close
|
|
When I close async resources with a failing resource
|
|
Then the close should complete without raising
|
|
|
|
# =============================================================================
|
|
# application/services/strategy_resolution.py - Lines 17, 30, 34, 43
|
|
# =============================================================================
|
|
|
|
Scenario: resolve_strategy returns None when no strategies available
|
|
When I resolve strategy with no arguments
|
|
Then the strategy result should be None
|
|
|
|
# =============================================================================
|
|
# infrastructure/sandbox/_fs_utils.py - Lines 69, 70, 94, 95, 96
|
|
# =============================================================================
|
|
|
|
Scenario: safe_restore raises for invalid path outside sandbox
|
|
When I check if "/etc/passwd" is safe in "/tmp/sandbox"
|
|
Then the safe path result should be an error
|
|
|
|
# =============================================================================
|
|
# resource/handlers/discovery.py - Lines 76, 77, 80, 81, 159
|
|
# =============================================================================
|
|
|
|
Scenario: discover_resources in empty directory returns empty list
|
|
When I discover resources in an empty directory
|
|
Then the discovery result should be empty
|
|
|
|
# =============================================================================
|
|
# infrastructure/sandbox/strategy_adapter.py - Lines 165, 166, 174, 175, 252
|
|
# =============================================================================
|
|
|
|
Scenario: BuiltInSandboxStrategyAdapter cleanup unknown ref is a no-op
|
|
Given a BuiltInSandboxStrategyAdapter with no strategies
|
|
When I cleanup an unknown sandbox ref
|
|
Then no exception should be raised for coverage
|
|
|
|
# =============================================================================
|
|
# infrastructure/sandbox/merge.py - Lines 73, 131, 132, 134, 136
|
|
# =============================================================================
|
|
|
|
Scenario: merge_changes with no changes returns empty
|
|
When I merge changes with empty list
|
|
Then the merge result should indicate success with empty content
|
|
|
|
# =============================================================================
|
|
# application/services/fusion_engine.py - Lines 147, 152, 157, 162, 167
|
|
# =============================================================================
|
|
|
|
Scenario: FusionEngine fuse with no inputs returns empty
|
|
When I fuse with no inputs
|
|
Then the fusion result should be empty
|
|
|
|
# =============================================================================
|
|
# application/services/subplan_merge_service.py - Lines 197, 198, 199, 200, 201
|
|
# =============================================================================
|
|
|
|
Scenario: SubplanMergeService merge with no subplans raises ValueError
|
|
When I merge subplans with empty list
|
|
Then a ValueError should be raised for empty subplans
|
|
|
|
# =============================================================================
|
|
# infrastructure/database/unit_of_work.py - Lines 31, 304, 305, 306, 308
|
|
# =============================================================================
|
|
|
|
Scenario: UnitOfWork transaction with no changes succeeds
|
|
Given a UnitOfWork with no pending changes
|
|
When I run a transaction on the UnitOfWork
|
|
Then the transaction should succeed without error
|