f7d2f63ab8
CI / lint (pull_request) Successful in 15s
CI / typecheck (pull_request) Successful in 28s
CI / security (pull_request) Successful in 23s
CI / quality (pull_request) Successful in 15s
CI / integration_tests (pull_request) Successful in 5m11s
CI / build (pull_request) Successful in 16s
CI / unit_tests (pull_request) Successful in 14m31s
CI / docker (pull_request) Successful in 40s
CI / coverage (pull_request) Successful in 8m18s
CI / lint (push) Successful in 13s
CI / typecheck (push) Successful in 28s
CI / security (push) Successful in 23s
CI / quality (push) Successful in 16s
CI / integration_tests (push) Successful in 4m58s
CI / build (push) Successful in 15s
CI / unit_tests (push) Successful in 15m30s
CI / coverage (push) Has been cancelled
CI / docker (push) Has been cancelled
173 lines
7.5 KiB
Gherkin
173 lines
7.5 KiB
Gherkin
Feature: Coverage boost for domain models and services
|
|
As a developer
|
|
I want comprehensive tests for domain model default factories and validators
|
|
So that overall test coverage meets the 97% threshold
|
|
|
|
# ---- PlanSettings default factories (5 lines: 17, 21, 25, 29, 33) ----
|
|
|
|
Scenario: PlanSettings with minimal fields uses default factories
|
|
Given I import PlanSettings from domain models
|
|
When I create a PlanSettings with only modelPackName
|
|
Then the plan settings should have empty default lists
|
|
|
|
# ---- PlanFiles default factories (3 lines: 16, 20, 24) ----
|
|
|
|
Scenario: PlanFiles models use default factories
|
|
Given I import planfiles domain models
|
|
When I create CurrentPlanFiles with minimal fields
|
|
Then the plan files should have empty default lists
|
|
|
|
# ---- AiModels custom default factories (5 lines: 14, 18, 22, 26, 30) ----
|
|
|
|
Scenario: AiModels custom models use default factories
|
|
Given I import aimodels_custom domain models
|
|
When I create ClientModelsInput with minimal fields
|
|
Then the client models input should have empty default lists
|
|
|
|
# ---- Conversation default factories (3 lines: 16, 20, 24) ----
|
|
|
|
Scenario: Conversation models use default factories
|
|
Given I import conversation domain models
|
|
When I create a ConvoMessage with minimal fields
|
|
Then the convo message should have default flags
|
|
|
|
# ---- Actor name validation error paths (3 lines: 53, 59, 61) ----
|
|
|
|
Scenario: Actor name without slash raises ValueError
|
|
Given I import Actor from domain models
|
|
When I try to create an Actor with name "noslash"
|
|
Then a ValueError should be raised with message containing "/"
|
|
|
|
Scenario: Actor name with empty prefix raises ValueError
|
|
Given I import Actor from domain models
|
|
When I try to create an Actor with name "/suffix"
|
|
Then a ValueError should be raised with message containing "prefix"
|
|
|
|
Scenario: Actor name local with empty id raises ValueError
|
|
Given I import Actor from domain models
|
|
When I try to create an Actor with name "local/ "
|
|
Then a ValueError should be raised with message containing "local"
|
|
|
|
# ---- ChangeSet stats for MOVE and applied (3 lines: 91-92, 95) ----
|
|
|
|
Scenario: ChangeSet statistics count MOVE and applied changes
|
|
Given I import ChangeSet from domain models
|
|
When I create a ChangeSet with MOVE operations and applied changes
|
|
Then the stats should include moves and applied counts
|
|
|
|
# ---- Context model default factories and validator (lines 16, 20, 45, 120-124) ----
|
|
|
|
Scenario: Context model uses default factories
|
|
Given I import context domain models
|
|
When I create a Context with minimal fields
|
|
Then the context should have empty default collections
|
|
|
|
Scenario: ContextUpdateResult validator rejects negative token diffs
|
|
Given I import context domain models
|
|
When I try to create ContextUpdateResult with negative token diffs
|
|
Then a ValueError should be raised with message containing "non-negative"
|
|
|
|
Scenario: ContextFile validates path resolution
|
|
Given I import context domain models
|
|
When I create a ContextFile with a relative path
|
|
Then the path should be resolved to absolute
|
|
|
|
# ---- Resource CLI additional coverage for remaining lines ----
|
|
|
|
Scenario: type add with update flag re-raises non-already-exists ValidationError
|
|
Given a fresh in-memory resource registry
|
|
And a service whose register_type raises ValidationError with custom message
|
|
When I run type_add with update and the service error
|
|
Then the resource command should fail
|
|
|
|
Scenario: resource add with branch but no path
|
|
Given a fresh in-memory resource registry
|
|
And built-in types are bootstrapped
|
|
When I run resource add with branch only type "git-checkout" name "local/br-only" branch "develop"
|
|
Then the resource output should contain "local/br-only"
|
|
|
|
Scenario: resource show format yaml
|
|
Given a fresh in-memory resource registry
|
|
And built-in types are bootstrapped
|
|
And I run resource add "git-checkout" "local/yaml-show" with path "/tmp/ys"
|
|
When I run resource show "local/yaml-show" using format "yaml"
|
|
Then the resource output should contain "local/yaml-show"
|
|
|
|
Scenario: resource show format plain
|
|
Given a fresh in-memory resource registry
|
|
And built-in types are bootstrapped
|
|
And I run resource add "git-checkout" "local/plain-show" with path "/tmp/ps"
|
|
When I run resource show "local/plain-show" using format "plain"
|
|
Then the resource output should contain "local/plain-show"
|
|
|
|
Scenario: resource type add raises generic CleverAgentsError via update
|
|
Given a fresh in-memory resource registry
|
|
And a valid custom resource type YAML file
|
|
And a service whose register_type raises CleverAgentsError
|
|
When I run type_add with the stored config and update false
|
|
Then the resource command should fail
|
|
And the resource output should contain "Error"
|
|
|
|
# ---- Action domain model coverage (lines 260-261, 621, 628, 630, 632, 652, 654, 659) ----
|
|
|
|
Scenario: Action to_dict includes all optional fields
|
|
Given I import Action from domain models
|
|
When I create an Action with all optional fields populated
|
|
Then the to_dict result should include all optional keys
|
|
|
|
Scenario: ActionArgument coerce to float raises ValueError
|
|
Given I import ActionArgument from domain models
|
|
When I try to coerce "not_a_float" to float for an argument
|
|
Then a ValueError should be raised with message containing "float"
|
|
|
|
# ---- NamespacedProject validation (line 397) ----
|
|
|
|
Scenario: NamespacedProject rejects invalid namespace
|
|
Given I import NamespacedProject from domain models
|
|
When I try to create a NamespacedProject with invalid namespace "123bad"
|
|
Then a ValueError should be raised with message containing "invalid"
|
|
|
|
# ---- NamespacedProject linked resource lookup (lines 514, 530, 532-534) ----
|
|
|
|
Scenario: NamespacedProject linked resource lookup by id
|
|
Given I import NamespacedProject from domain models
|
|
When I create a NamespacedProject with linked resources
|
|
And I look up a linked resource by id "01HXYZ1234567890ABCDEFGHKJ"
|
|
Then the linked resource should be found
|
|
|
|
Scenario: NamespacedProject linked resource lookup by empty id
|
|
Given I import NamespacedProject from domain models
|
|
When I try to look up a linked resource by empty id
|
|
Then a ValueError should be raised with message containing "empty"
|
|
|
|
Scenario: NamespacedProject linked resource lookup by alias
|
|
Given I import NamespacedProject from domain models
|
|
When I create a NamespacedProject with linked resources
|
|
And I look up a linked resource by alias "my-alias"
|
|
Then the linked resource should be found
|
|
|
|
Scenario: NamespacedProject linked resource lookup by empty alias
|
|
Given I import NamespacedProject from domain models
|
|
When I try to look up a linked resource by empty alias
|
|
Then a ValueError should be raised with message containing "empty"
|
|
|
|
Scenario: NamespacedProject linked resource not found by alias
|
|
Given I import NamespacedProject from domain models
|
|
When I create a NamespacedProject with linked resources
|
|
And I look up a linked resource by alias "nonexistent"
|
|
Then the linked resource should not be found
|
|
|
|
# ---- Additional database model repr coverage ----
|
|
|
|
Scenario: Database model repr methods
|
|
Given I import database models
|
|
When I create database model instances
|
|
Then their repr methods should return strings
|
|
|
|
# ---- Plan lifecycle service edge cases ----
|
|
|
|
Scenario: Plan lifecycle service uncovered branches
|
|
Given I import plan lifecycle service helpers
|
|
When I test plan lifecycle service edge paths
|
|
Then no errors should occur
|