@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