160 lines
7.7 KiB
Gherkin
160 lines
7.7 KiB
Gherkin
Feature: Plan Service Coverage
|
|
As a developer maintaining the CleverAgents system
|
|
I want comprehensive tests for the plan service
|
|
So that plan management functionality works reliably
|
|
|
|
Background:
|
|
Given I have a temporary test directory for plan service
|
|
And I have a Unit of Work instance for plan testing
|
|
And I have a PlanService instance
|
|
|
|
Scenario: Create plan with unsaved project raises error
|
|
Given I have an unsaved project without ID
|
|
When I try to create a plan for the unsaved project
|
|
Then a ValidationError should be raised with message "Cannot create plan: this directory is not linked to a saved CleverAgents project."
|
|
|
|
Scenario: Build plan when no current plan exists
|
|
Given I have a saved project with no current plan
|
|
When I try to build the plan for the project
|
|
Then a PlanError should be raised with message "No current plan to build"
|
|
|
|
Scenario: Build plan when plan has no valid ID
|
|
Given I have a saved project with current plan missing ID
|
|
When I try to build the plan with invalid ID
|
|
Then a PlanError should be raised with message "No current plan to build"
|
|
|
|
Scenario: Build plan without AI provider configured
|
|
Given I have a saved project with valid current plan
|
|
And I have a plan service without AI provider
|
|
When I try to build the plan without AI provider
|
|
Then a PlanError should be raised with message "No AI provider configured"
|
|
|
|
Scenario: Get pending changes for project with no current plan
|
|
Given I have a saved project with no current plan
|
|
When I get pending changes for the project
|
|
Then the pending changes list should be empty
|
|
|
|
Scenario: Get pending changes for project with current plan
|
|
Given I have a saved project with current plan
|
|
And the current plan has applied and unapplied changes
|
|
When I get pending changes for the project
|
|
Then I should get only the unapplied changes
|
|
|
|
Scenario: Apply changes when no current plan exists
|
|
Given I have a saved project with no current plan
|
|
When I try to apply changes without current plan
|
|
Then a PlanError should be raised with message "No current plan to apply"
|
|
|
|
Scenario: Apply changes with CREATE operation
|
|
Given I have a saved project with current plan
|
|
And the plan has a pending CREATE change
|
|
When I apply the plan changes
|
|
Then the file should be created with correct content
|
|
And the change should be marked as applied in plan service
|
|
|
|
Scenario: Apply changes with MODIFY operation
|
|
Given I have a saved project with current plan
|
|
And the plan has a pending MODIFY change for existing file
|
|
When I apply the plan changes
|
|
Then the file should be modified with new content
|
|
And the change should be marked as applied in plan service
|
|
|
|
Scenario: Apply changes with DELETE operation
|
|
Given I have a saved project with current plan
|
|
And the plan has a pending DELETE change for existing file
|
|
When I apply the plan changes
|
|
Then the file should be deleted
|
|
And the change should be marked as applied in plan service
|
|
|
|
Scenario: Apply changes with MOVE operation
|
|
Given I have a saved project with current plan
|
|
And the plan has a pending MOVE change for existing file
|
|
When I apply the plan changes
|
|
Then the file should be moved to new location
|
|
And the change should be marked as applied in plan service
|
|
|
|
Scenario: Apply changes with absolute file paths
|
|
Given I have a saved project with current plan
|
|
And the plan has changes with absolute file paths
|
|
When I apply the plan changes
|
|
Then the files should be created at absolute paths
|
|
And the changes should be marked as applied
|
|
|
|
Scenario: Apply changes handles file operation errors
|
|
Given I have a saved project with current plan
|
|
And the plan has a change that will fail on apply
|
|
When I try to apply the changes
|
|
Then a PlanError should be raised with file operation details
|
|
|
|
Scenario: Create plan with minimal prompt generates name
|
|
Given I have a saved project
|
|
When I create a plan with minimal prompt
|
|
Then the plan name should be generated from prompt
|
|
|
|
Scenario: Create plan with long prompt truncates name
|
|
Given I have a saved project
|
|
When I create a plan with very long prompt
|
|
Then the plan name should be truncated to first three words
|
|
|
|
Scenario: Apply MOVE operation when source file does not exist
|
|
Given I have a saved project with current plan
|
|
And the plan has a MOVE change for non-existent file
|
|
When I apply the plan changes
|
|
Then the MOVE operation should handle missing source gracefully
|
|
|
|
Scenario: Apply DELETE operation when file does not exist
|
|
Given I have a saved project with current plan
|
|
And the plan has a DELETE change for non-existent file
|
|
When I apply the plan changes
|
|
Then the DELETE operation should handle missing file gracefully
|
|
|
|
Scenario: Build plan with progress callback
|
|
Given I have a saved project with valid current plan
|
|
And I have a plan service with mock AI provider
|
|
When I build the plan with progress callback
|
|
Then the progress callback should be called with values from 0 to 100
|
|
|
|
Scenario: Building plan fails when plan ID disappears after status update
|
|
Given I configure a stub plan service whose current plan loses its ID after the transaction
|
|
When I try to build the plan with the stubbed service
|
|
Then a PlanError should be raised with message "Plan does not have a valid ID"
|
|
|
|
Scenario: Plan without repository ID remains non-current
|
|
Given I replace the plan service repository with a stub that never assigns plan IDs
|
|
When I create a plan with stub prompt "Missing ID branch"
|
|
Then the stub-created plan should remain non-current
|
|
And the stub repository should not record a current plan
|
|
|
|
Scenario: Reusing persistent memory with unchanged limit skips reset
|
|
When I request a persistent memory service for session "reuse-session" with max messages 4
|
|
And I monitor max message updates for session "reuse-session"
|
|
And I request the same persistent memory service for session "reuse-session" with max messages 4
|
|
Then the session "reuse-session" memory should reuse the existing service without changing limits
|
|
|
|
Scenario: Get pending changes with mixed applied status
|
|
Given I have a saved project with current plan
|
|
And the plan has 3 applied and 2 unapplied changes
|
|
When I get pending changes for the project
|
|
Then I should get exactly 2 pending changes
|
|
And the pending changes should not include applied ones
|
|
|
|
Scenario: Toggle plan memory persistence and limits
|
|
When I request an in-memory memory service for session "memory-session" with max messages 2
|
|
Then the session "memory-session" memory should be in-memory with max messages 2
|
|
When I request a persistent memory service for session "memory-session" with max messages 3
|
|
Then the session "memory-session" memory should be persistent with max messages 3
|
|
When I request a persistent memory service for session "memory-session" with max messages 5
|
|
Then the session "memory-session" memory should be persistent with max messages 5
|
|
When I request an in-memory memory service for session "memory-session" without changing message limit
|
|
Then the session "memory-session" memory should be in-memory without a connection string
|
|
|
|
Scenario: Provide conversation memory adapter for session context
|
|
When I request conversation memory for session "memory-session" with custom keys
|
|
Then the conversation adapter should expose the custom keys
|
|
And the conversation adapter should share the existing memory service
|
|
|
|
Scenario: Clear session memory and forget history
|
|
Given I stored a chat message in session "memory-session"
|
|
When I clear the session "memory-session" memory with forget history
|
|
Then the session "memory-session" memory should be removed and emptied
|