d25a060c58
CI / lint (pull_request) Successful in 50s
CI / quality (pull_request) Successful in 1m2s
CI / push-validation (pull_request) Successful in 39s
CI / helm (pull_request) Successful in 43s
CI / typecheck (pull_request) Successful in 1m31s
CI / security (pull_request) Successful in 1m32s
CI / build (pull_request) Successful in 1m3s
CI / integration_tests (pull_request) Successful in 3m42s
CI / unit_tests (pull_request) Successful in 6m13s
CI / docker (pull_request) Successful in 2m2s
CI / coverage (pull_request) Successful in 11m15s
CI / status-check (pull_request) Successful in 3s
CI / build (push) Successful in 53s
CI / lint (push) Successful in 1m1s
CI / helm (push) Successful in 26s
CI / quality (push) Successful in 1m16s
CI / typecheck (push) Successful in 1m20s
CI / security (push) Successful in 1m37s
CI / benchmark-regression (push) Failing after 40s
CI / push-validation (push) Successful in 21s
CI / integration_tests (push) Successful in 3m17s
CI / unit_tests (push) Successful in 4m28s
CI / e2e_tests (push) Successful in 3m22s
CI / docker (push) Successful in 1m52s
CI / coverage (push) Successful in 12m50s
CI / status-check (push) Successful in 3s
CI / benchmark-publish (push) Successful in 1h20m0s
This reverts commit e8d2f76466.
170 lines
9.4 KiB
Gherkin
170 lines
9.4 KiB
Gherkin
Feature: Plan Generation Graph Uncovered Lines Coverage
|
|
As a developer
|
|
I want comprehensive test coverage for edge cases in PlanGenerationGraph
|
|
So that I can ensure all code paths are exercised
|
|
|
|
Background:
|
|
Given the langgraph plan generation module is importable
|
|
|
|
# Testing line 90: else branch when LLM is provided
|
|
Scenario: PlanGenerationGraph can be instantiated with custom LLM
|
|
Given I have a mock custom LLM instance
|
|
When I create a langgraph PlanGenerationGraph with the custom LLM
|
|
Then the langgraph graph should use the custom LLM
|
|
And the langgraph graph should not use FakeListLLM
|
|
|
|
# Testing lines 250-254: Exception handling in analyze_requirements
|
|
Scenario: Analyze requirements handles LLM exceptions gracefully
|
|
Given I have a langgraph PlanGenerationGraph instance with failing LLM
|
|
And I have a langgraph PlanGenerationState with prompt and contexts
|
|
When I execute the langgraph analyze_requirements node with the failing state
|
|
Then the uncovered analyzed_requirements should be empty
|
|
And the langgraph error should contain "Requirements analysis failed"
|
|
|
|
# Testing lines 297-305: Create operation with different prompt keywords
|
|
Scenario: Generate plan creates test file when prompt contains test
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with prompt "create test cases for validation"
|
|
When I execute the langgraph generate_plan node with test prompt
|
|
Then the langgraph generated file path should be "test_generated.py"
|
|
And the langgraph operation type should be CREATE
|
|
|
|
# Testing lines 298-301: Create operation for error handling file
|
|
Scenario: Generate plan creates error handler when prompt mentions error
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with prompt "add error handling"
|
|
When I execute the langgraph generate_plan node with error prompt
|
|
Then the langgraph generated file path should be "error_handler.py"
|
|
And the langgraph operation type should be CREATE
|
|
|
|
# Testing lines 298-301: Create operation for exception handling file
|
|
Scenario: Generate plan creates error handler when prompt mentions exception
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with prompt "implement exception handling"
|
|
When I execute the langgraph generate_plan node with exception prompt
|
|
Then the langgraph generated file path should be "error_handler.py"
|
|
And the langgraph operation type should be CREATE
|
|
|
|
# Testing line 303: Default file path for create operation
|
|
Scenario: Generate plan creates default file when prompt has no keywords
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with prompt "add new feature"
|
|
When I execute the langgraph generate_plan node with generic prompt
|
|
Then the langgraph generated file path should be "generated.py"
|
|
And the langgraph operation type should be CREATE
|
|
|
|
# Testing lines 329-333: Exception handling in generate_plan
|
|
Scenario: Generate plan handles LLM exceptions gracefully
|
|
Given I have a langgraph PlanGenerationGraph instance with failing LLM
|
|
And I have a langgraph state with valid requirements
|
|
When I execute the langgraph generate_plan node with failing LLM
|
|
Then the langgraph generated_changes should be empty
|
|
And the langgraph error should contain "Code generation failed"
|
|
|
|
# Testing lines 380-386: Exception handling in validate
|
|
Scenario: Validate node handles LLM exceptions gracefully
|
|
Given I have a langgraph PlanGenerationGraph instance with failing LLM
|
|
And I have a langgraph state with generated changes
|
|
When I execute the langgraph validate node with failing LLM
|
|
Then the langgraph validation status should be "FAIL"
|
|
And the langgraph validation message should contain "Validation failed"
|
|
|
|
# Testing lines 483-498: Async invoke method
|
|
Scenario: Workflow ainvoke method returns complete state asynchronously
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have langgraph workflow inputs with project plan and contexts
|
|
When I invoke the langgraph workflow asynchronously
|
|
Then the langgraph async workflow result should contain all expected fields
|
|
And the langgraph async result should have generated_changes
|
|
And the langgraph async result should have validation_result
|
|
|
|
# _should_retry is a read-only conditional-edge function; retry_count is
|
|
# incremented inside _validate (a node) so LangGraph persists the new value.
|
|
Scenario: Should retry does not mutate state and returns retry when retries remain
|
|
Given I have a langgraph PlanGenerationGraph instance with max_retries 3
|
|
And I have a langgraph state with retry_count 1
|
|
When I check uncovered langgraph should_retry with FAIL validation and retry_count 1
|
|
Then the uncovered langgraph state retry_count should not be mutated and remain 1
|
|
And the langgraph retry decision should be "retry"
|
|
|
|
# Testing full workflow with retry logic
|
|
Scenario: Workflow retries on validation failure up to max attempts
|
|
Given I have a langgraph PlanGenerationGraph instance with max_retries 2
|
|
And I have langgraph workflow inputs that will fail validation initially
|
|
When I invoke the langgraph workflow with retry scenario
|
|
Then the langgraph workflow should have performed at least one retry
|
|
|
|
# Testing validation with short content that fails length check
|
|
Scenario: Validate node fails when generated code is too short
|
|
Given I have a langgraph PlanGenerationGraph instance with strict validation
|
|
And I have a langgraph state with minimal generated changes
|
|
When I execute the langgraph validate node with short content
|
|
Then the langgraph validation might fail based on content and LLM response
|
|
And the langgraph validation result should have a status field
|
|
|
|
# Testing stream method with multiple events
|
|
Scenario: Workflow stream yields events from all nodes
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have langgraph workflow inputs with project plan and contexts
|
|
When I stream the langgraph workflow execution
|
|
Then the langgraph stream should yield events from load_context
|
|
And the langgraph stream should yield events from analyze_requirements
|
|
And the langgraph stream should yield events from generate_plan
|
|
And the langgraph stream should yield events from validate
|
|
|
|
# Testing format_context_summary edge cases
|
|
Scenario: Format context summary handles contexts with no content
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
When I format the langgraph context summary with empty content contexts
|
|
Then the langgraph summary should handle None content gracefully
|
|
And the langgraph summary should include file paths
|
|
|
|
# Testing modify operation path
|
|
Scenario: Generate plan modifies existing file when contexts provided
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with existing context file
|
|
When I execute the langgraph generate_plan node for modification
|
|
Then the langgraph operation type should be MODIFY
|
|
And the langgraph generated file path should match context path
|
|
And the langgraph change should have original_content from context
|
|
|
|
# Testing lines 260-262: chain passthrough when no retry support
|
|
Scenario: Chain without retry support is returned unchanged
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
When I wrap a langgraph chain without retry support
|
|
Then the langgraph chain wrapper should return the original chain
|
|
|
|
# Testing lines 413-431: explicit file path handling
|
|
Scenario: Generate plan honors explicit existing file path
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with explicit path to an existing file
|
|
When I execute the langgraph generate_plan node with explicit path
|
|
Then the langgraph generated file path should match the explicit file
|
|
And the langgraph operation type should be MODIFY
|
|
And the langgraph change should include original file content
|
|
|
|
# Testing lines 420-425: explicit directory path handling
|
|
Scenario: Generate plan writes to generated file under explicit directory
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with explicit directory path
|
|
When I execute the langgraph generate_plan node with explicit path
|
|
Then the langgraph generated file path should be under the explicit directory
|
|
And the langgraph operation type should be CREATE
|
|
|
|
# Testing lines 432-435: unsuffixed explicit path handling
|
|
Scenario: Generate plan appends generated file name to unsuffixed path
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with explicit path without a suffix
|
|
When I execute the langgraph generate_plan node with explicit path
|
|
Then the langgraph generated file path should append generated.py
|
|
And the langgraph operation type should be CREATE
|
|
|
|
# Testing lines 486-493: matching explicit path to context
|
|
Scenario: Generate plan selects matching context for explicit path hint
|
|
Given I have a langgraph PlanGenerationGraph instance
|
|
And I have a langgraph state with contexts and an explicit path hint
|
|
When I execute the langgraph generate_plan node with explicit path
|
|
Then the langgraph generated change should use the matching context path
|
|
And the langgraph operation type should be MODIFY
|
|
And the langgraph change should have original_content from context
|