Files
cleveragents-core/features/edge_case_plan_scenarios.feature
Dev User a3ba3c3eaf fix(tests): resolve pre-existing AmbiguousStep collisions in step definitions
Rename step texts to avoid case-sensitive conflicts between different step modules:

- edge_case_plan_steps.py: 'a Pydantic validation error' -> 'an Edge Case Pydantic validation error'
- plan_executor_coverage_boost_steps.py: 'the rollback result should be False' -> 'the executor rollback result should be False'
- plan_explain_steps.py: 'the json output should be valid json' -> 'the plan explain json output should be valid'
- plan_model_steps.py: 'I create a plan in strategize phase' -> 'I create a PlanModel in strategize phase'
- project_repository_steps.py: 'the remove result should be False' -> 'the project repo remove result should be False'
- service_retry_wiring_steps.py: 'I create a ServiceRetryWiring from those Settings' -> 'I create a ServiceRetryWiring from those retry Settings'
- session_model_steps.py: 'I get the session CLI dict' -> 'I get the session model CLI dict'

These pre-existing bugs prevented all behave tests from loading.
2026-05-07 20:05:33 +00:00

254 lines
13 KiB
Gherkin

Feature: Plan edge case scenarios
As a QA engineer
I want to verify that plan operations handle edge cases correctly
So that concurrent execution, resource conflicts, validation chains, and rollbacks are robust
#
# Section 1: Concurrent plan execution edge cases
#
Scenario: Concurrent strategize start attempts on same plan
Given I have a plan lifecycle service
And I have a plan in strategize phase with queued state
When I start strategize on the plan
And I try to start strategize on the same plan again
Then the second strategize start should raise a plan not ready error
Scenario: Concurrent execute start attempts on same plan
Given I have a plan lifecycle service
And I have a plan in execute phase with queued state
When I start execute on the plan
And I try to start execute on the same plan again
Then the second execute start should raise a plan not ready error
Scenario: Concurrent apply start attempts on same plan
Given I have a plan lifecycle service
And I have a plan in apply phase with queued state
When I start apply on the plan
And I try to start apply on the same plan again
Then the second apply start should raise a plan not ready error
Scenario: Concurrent complete and fail on same strategize phase
Given I have a plan lifecycle service
And I have a plan in strategize phase with processing state
When I complete strategize on the plan
And I try to fail strategize with error "Late failure"
Then the plan should be in complete state
And the plan error message should still be "Late failure"
Scenario: Two plans created from same action simultaneously
Given I have a plan lifecycle service
And I have an available action "local/concurrent-action"
When I use the action to create plan for project "proj-a"
And I use the action to create plan for project "proj-b"
Then two distinct plans should exist
And each plan should have a unique plan id
Scenario: Concurrent phase transitions on different plans
Given I have a plan lifecycle service
And I have two plans at different lifecycle stages
When I transition plan A from strategize to execute
And I transition plan B from execute to apply
Then plan A should be in execute phase
And plan B should be in apply phase
# ──────────────────────────────────────────────────
# Section 2: Resource conflict scenarios
# ──────────────────────────────────────────────────
Scenario: Apply changes when target file is read-only
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a pending MODIFY change for a read-only file
When I try to apply the edge case changes
Then a PlanError should be raised mentioning file apply failure
Scenario: Apply changes with overlapping file paths in a single plan
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a CREATE change and a MODIFY change for the same file
When I apply the edge case changes
Then the file should contain the final modified content
And 2 changes should be marked as applied
Scenario: Apply CREATE change with None content
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a CREATE change with None content
When I apply the edge case changes
Then the created file should be empty
And 1 changes should be marked as applied
Scenario: Apply MOVE change with missing source file
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a MOVE change where source does not exist
When I apply the edge case changes
Then the destination file should not exist
And 1 changes should be marked as applied
Scenario: Apply DELETE change for already-deleted file
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a DELETE change for an already-deleted file
When I apply the edge case changes
Then 1 changes should be marked as applied
Scenario: Apply changes with file path containing spaces
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a CREATE change with a file path containing spaces
When I apply the edge case changes
Then the file with spaces in path should exist with correct content
Scenario: Apply changes with deeply nested directory creation
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a CREATE change in a deeply nested directory
When I apply the edge case changes
Then the deeply nested file should exist
# ──────────────────────────────────────────────────
# Section 2b: Path traversal rejection (H4)
# ──────────────────────────────────────────────────
Scenario: Apply CREATE change with relative path traversal is rejected
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a CREATE change with a path traversal in file_path
When I try to apply the edge case changes
Then a PlanError should be raised mentioning path traversal
Scenario: Apply MODIFY change with absolute path outside project is rejected
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a MODIFY change with an absolute path outside the project
When I try to apply the edge case changes
Then a PlanError should be raised mentioning path traversal
Scenario: Apply DELETE change with path traversal is rejected
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a DELETE change with a path traversal in file_path
When I try to apply the edge case changes
Then a PlanError should be raised mentioning path traversal
Scenario: Apply MOVE change with path traversal in new_path is rejected
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a MOVE change with a path traversal in new_path
When I try to apply the edge case changes
Then a PlanError should be raised mentioning path traversal
# ──────────────────────────────────────────────────
# Section 3: Validation failure chains
# ──────────────────────────────────────────────────
Scenario: Action use with multiple simultaneous argument validation failures
Given I have a plan lifecycle service
And I have an available action with multiple typed arguments
When I try to use the action with wrong types and missing required args
Then a validation error should list multiple argument errors
Scenario: Action use with unknown arguments alongside missing required
Given I have a plan lifecycle service
And I have an available action with one required argument "count" of type "int"
When I try to use the action with unknown argument "bogus" and no required args
Then a validation error should mention both missing and unknown arguments
Scenario: Plan model rejects empty description
When I try to create an edge case plan with empty description
Then an Edge Case Pydantic validation error should be raised
Scenario: Plan model rejects invalid phase value
When I try to create an edge case plan with invalid phase value
Then an Edge Case Pydantic validation error should be raised
Scenario: NamespacedName rejects invalid characters in namespace
When I try to parse a namespaced name with special characters "inv@lid/action"
Then an Edge Case Pydantic validation error should be raised
Scenario: NamespacedName rejects invalid characters in name
When I try to parse a namespaced name with special chars in name "local/my action!"
Then an Edge Case Pydantic validation error should be raised
# ──────────────────────────────────────────────────
# Section 4: Rollback edge cases
# ──────────────────────────────────────────────────
Scenario: Partial apply failure leaves earlier changes applied on disk
Given I have a temporary test directory for edge case plan service
And I have a Unit of Work instance for edge case plan testing
And I have an edge case PlanService instance
And I have a saved project with current plan for edge cases
And the plan has a valid CREATE change followed by a failing MODIFY change
When I try to apply the edge case changes
Then a PlanError should be raised mentioning file apply failure
And the first file should exist on disk despite the error
And the second file should remain unchanged on disk
Scenario: Fail strategize after start does not reset to queued
Given I have a plan lifecycle service
And I have a plan in strategize phase with processing state
When strategize fails with error "Provider timeout"
Then the lifecycle plan processing state should be "errored"
And the plan cannot be restarted from errored state
Scenario: Fail execute preserves the error message
Given I have a plan lifecycle service
And I have a plan in execute phase with processing state
When execute fails with error "Code generation failed"
Then the lifecycle plan processing state should be "errored"
And the lifecycle plan error message should be "Code generation failed"
Scenario: Fail apply after partial processing
Given I have a plan lifecycle service
And I have a plan in apply phase with processing state
When apply fails with error "Disk full during write"
Then the lifecycle plan processing state should be "errored"
And the lifecycle plan error message should be "Disk full during write"
And the plan should be terminal
Scenario: Cancel plan clears processing but does not revert to previous phase
Given I have a plan lifecycle service
And I have a plan in execute phase with processing state
When I cancel the plan with reason "User abort"
Then the lifecycle plan processing state should be "cancelled"
And the plan phase should remain "execute"
Scenario: Re-execute after errored strategize is rejected
Given I have a plan lifecycle service
And I have a plan in strategize phase with processing state
When strategize fails with error "Timed out"
And I try to execute the errored plan
Then a plan not ready error should be raised for the errored plan
Scenario: Cannot complete strategize after it has been failed
Given I have a plan lifecycle service
And I have a plan in strategize phase with processing state
When strategize fails with error "Network error"
And I try to complete strategize after failure
Then a plan error should be raised because plan is not processing