186 lines
10 KiB
Gherkin
186 lines
10 KiB
Gherkin
@phase1 @domain @repository @skill_repo_coverage
|
||
Feature: Skill Repository Coverage – Uncovered Lines
|
||
As a developer maintaining the skill registry
|
||
I want all repository error handlers and conditional branches fully tested
|
||
So that database failures and edge-case data paths are exercised
|
||
|
||
# ===========================================================================
|
||
# SkillInUseError constructor (lines 4027-4031)
|
||
# ===========================================================================
|
||
|
||
@srcover_error_class
|
||
Scenario: SkillInUseError stores name and message without detail
|
||
When a SkillInUseError is created for skill "local/my-skill" without detail
|
||
Then the SkillInUseError message should contain "local/my-skill"
|
||
And the SkillInUseError skill_name should be "local/my-skill"
|
||
|
||
@srcover_error_class
|
||
Scenario: SkillInUseError stores name and detail in message
|
||
When a SkillInUseError is created for skill "local/busy" with detail "3 plans active"
|
||
Then the SkillInUseError message should contain "local/busy"
|
||
And the SkillInUseError message should contain "3 plans active"
|
||
And the SkillInUseError skill_name should be "local/busy"
|
||
|
||
# ===========================================================================
|
||
# ToolRepository.__init__ TypeError guard (line 3387)
|
||
# ===========================================================================
|
||
|
||
@srcover_tool_init
|
||
Scenario: ToolRepository without session factory raises TypeError
|
||
When a ToolRepository is created without any session factory
|
||
Then a TypeError should be raised about session_factory requirement
|
||
|
||
# ===========================================================================
|
||
# ToolRepository._extract_value enum unwrapping (line 3410)
|
||
# ===========================================================================
|
||
|
||
@srcover_extract_value
|
||
Scenario: ToolRepository extracts value from enum-like object
|
||
When _extract_value is called with an enum-like attribute having value "active"
|
||
Then the extracted value should be "active"
|
||
|
||
# ===========================================================================
|
||
# ToolRepository.remove success return path (line 3514)
|
||
# ===========================================================================
|
||
|
||
@srcover_tool_remove
|
||
Scenario: ToolRepository.remove returns True for existing tool
|
||
Given a tool repository with a real in-memory database for srcover
|
||
And a tool "test/removable" exists in the srcover tool repository
|
||
When the tool "test/removable" is removed via srcover repository
|
||
Then the srcover tool removal result should be True
|
||
|
||
# ===========================================================================
|
||
# ValidationAttachmentRepository.create with non-None args (line 3589)
|
||
# ===========================================================================
|
||
|
||
@srcover_val_args
|
||
Scenario: ValidationAttachment created with args serialises JSON
|
||
Given a validation attachment repository with real database for srcover
|
||
When a validation is attached with args {"retries": 3, "timeout": 120} for srcover
|
||
Then the srcover attachment should have args_json containing "retries"
|
||
|
||
# ===========================================================================
|
||
# ValidationAttachmentRepository.get_by_id returns None (line 3714)
|
||
# ===========================================================================
|
||
|
||
@srcover_val_get_none
|
||
Scenario: ValidationAttachmentRepository.get_by_id returns None for missing ID
|
||
Given a validation attachment repository with real database for srcover
|
||
When get_by_id is called with a non-existent attachment ID for srcover
|
||
Then the srcover get_by_id result should be None
|
||
|
||
# ===========================================================================
|
||
# ValidationAttachmentRepository.get_by_id OperationalError (lines 3725-3726)
|
||
# ===========================================================================
|
||
|
||
@srcover_val_get_error
|
||
Scenario: ValidationAttachmentRepository.get_by_id raises DatabaseError on OperationalError
|
||
Given a validation attachment repository with mock session raising OperationalError for srcover
|
||
When get_by_id is called and an OperationalError occurs for srcover
|
||
Then a srcover DatabaseError should be raised containing "Failed to get attachment"
|
||
|
||
# ===========================================================================
|
||
# ResourceRepository.auto_discover_children – empty child_type_name (line 2555)
|
||
# ===========================================================================
|
||
|
||
@srcover_auto_discover
|
||
Scenario: auto_discover_children skips rules with empty type name
|
||
Given a resource repository with in-memory database for srcover auto-discover
|
||
And a resource type with auto_discover rules containing an empty type for srcover
|
||
And a resource of that type exists for srcover auto-discover
|
||
When auto_discover_children is called for the srcover resource
|
||
Then the srcover auto-discover result should be an empty list
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.create – OperationalError handler (lines 4093-4095)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_create_error
|
||
Scenario: SkillRepository.create raises DatabaseError on OperationalError
|
||
Given a skill repository with mock session raising OperationalError on flush for srcover
|
||
When a skill is created through the srcover repository and an error is expected
|
||
Then a srcover DatabaseError should be raised containing "Failed to create skill"
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.create – non-UNIQUE IntegrityError (line 4090)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_create_error
|
||
Scenario: SkillRepository.create raises DatabaseError on non-UNIQUE IntegrityError
|
||
Given a skill repository with mock session raising non-UNIQUE IntegrityError for srcover
|
||
When a skill is created through the srcover repository and an error is expected
|
||
Then a srcover DatabaseError should be raised containing "Failed to create skill"
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.create – DuplicateSkillError re-raise (lines 4091-4092)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_create_error
|
||
Scenario: SkillRepository.create re-raises DuplicateSkillError from within try block
|
||
Given a skill repository with mock session raising DuplicateSkillError on flush for srcover
|
||
When a skill is created through the srcover repository and a duplicate error is expected
|
||
Then a srcover DuplicateSkillError should be raised
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.get_by_name – OperationalError handler (lines 4110-4111)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_get_error
|
||
Scenario: SkillRepository.get_by_name raises DatabaseError on OperationalError
|
||
Given a skill repository with mock session raising OperationalError on query for srcover
|
||
When a skill is fetched by name through the srcover repository and an error is expected
|
||
Then a srcover DatabaseError should be raised containing "Failed to get skill"
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.list_all – OperationalError handler (lines 4133-4134)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_list_error
|
||
Scenario: SkillRepository.list_all raises DatabaseError on OperationalError
|
||
Given a skill repository with mock session raising OperationalError on query for srcover
|
||
When skills are listed through the srcover repository and an error is expected
|
||
Then a srcover DatabaseError should be raised containing "Failed to list skills"
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.update – OperationalError handler (lines 4192-4194)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_update_error
|
||
Scenario: SkillRepository.update raises DatabaseError on OperationalError
|
||
Given a skill repository with mock session raising OperationalError on query for srcover
|
||
When a skill is updated through the srcover repository and an error is expected
|
||
Then a srcover DatabaseError should be raised containing "Failed to update skill"
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.update – overrides truthy + child item loop (lines 4168, 4178)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_update_overrides
|
||
Scenario: SkillRepository.update persists overrides and replaces child items
|
||
Given a clean in-memory skill repository for srcover update tests
|
||
And a skill "local/upd-test" is registered with tool refs for srcover
|
||
When the skill "local/upd-test" is updated with overrides and new items for srcover
|
||
Then the srcover updated skill should have overrides metadata
|
||
And the srcover updated skill should have the new items
|
||
|
||
# ===========================================================================
|
||
# SkillRepository.delete – OperationalError handler (lines 4219-4221)
|
||
# ===========================================================================
|
||
|
||
@srcover_skill_delete_error
|
||
Scenario: SkillRepository.delete raises DatabaseError on OperationalError
|
||
Given a skill repository with mock session raising OperationalError on query for srcover
|
||
When a skill is deleted through the srcover repository and an error is expected
|
||
Then a srcover DatabaseError should be raised containing "Failed to delete skill"
|
||
|
||
# ===========================================================================
|
||
# ResourceTypeRepository.create – DuplicateResourceTypeError (line 1711)
|
||
# ===========================================================================
|
||
|
||
@srcover_rt_duplicate
|
||
Scenario: ResourceTypeRepository.create raises DuplicateResourceTypeError on UNIQUE constraint
|
||
Given a resource type repository with mock session raising UNIQUE IntegrityError for srcover
|
||
When a resource type is created through the srcover repository and an error is expected
|
||
Then a srcover DuplicateResourceTypeError should be raised
|