Files
cleveragents-core/features/apply_pipeline.feature
2026-02-25 10:01:57 +00:00

103 lines
4.5 KiB
Gherkin

Feature: Validation-gated apply pipeline
As a plan executor
I want apply to be gated by validation results
So that changes are only committed when all required validations pass
Background:
Given an apply pipeline test environment
# -- Successful apply --------------------------------------------------
Scenario: Apply succeeds when all required validations pass
Given a plan with changeset containing 3 files
And the plan has validation summary with 2 required passed and 0 failed
When I apply the plan with validation gate
Then the apply outcome should be "applied"
And the apply result files changed should be 3
And the apply result validations total should be 2
And the apply result message should contain "applied successfully"
Scenario: Apply succeeds with no validations
Given a plan with changeset containing 1 files
And the plan has no validation summary
When I apply the plan with validation gate
Then the apply outcome should be "applied"
And the apply result validations total should be 0
# -- Blocked by validation failure ------------------------------------
Scenario: Apply blocked when required validations fail
Given a plan with changeset containing 5 files
And the plan has validation summary with 1 required passed and 2 failed
When I apply the plan with validation gate
Then the apply outcome should be "constrained"
And the apply result validations failed should be 2
And the apply result message should contain "Apply refused"
And the apply result message should contain "2 required"
# -- Idempotent re-apply blocking -------------------------------------
Scenario: Re-apply on already applied plan returns already_applied
Given a plan that is already applied
When I apply the plan with validation gate
Then the apply outcome should be "already_applied"
And the apply result message should contain "already been applied"
Scenario: Apply on errored plan returns constrained
Given a plan that is in errored state
When I apply the plan with validation gate
Then the apply outcome should be "constrained"
And the apply result message should contain "terminal state"
Scenario: Apply on cancelled plan returns constrained
Given a plan that is in cancelled state
When I apply the plan with validation gate
Then the apply outcome should be "constrained"
And the apply result message should contain "terminal state"
# -- Empty changeset guard --------------------------------------------
Scenario: Apply blocked on empty changeset without allow_empty
Given a plan with empty changeset
When I apply the plan with validation gate
Then the apply outcome should be "blocked_empty"
And the apply result message should contain "empty ChangeSet"
Scenario: Apply blocked when plan has no changeset
Given an apply plan with no changeset assigned
When I apply the plan with validation gate
Then the apply outcome should be "blocked_empty"
And the apply result message should contain "empty ChangeSet"
Scenario: Apply succeeds on empty changeset with allow_empty
Given a plan with empty changeset
And the plan has no validation summary
When I apply the plan with validation gate and allow_empty
Then the apply outcome should be "applied"
# -- External validation summary override -----------------------------
Scenario: External validation summary overrides plan stored summary
Given a plan with changeset containing 2 files
And the plan has validation summary with 0 required passed and 0 failed
When I apply the plan with external validation summary having 1 passed and 1 failed
Then the apply outcome should be "constrained"
And the apply result validations failed should be 1
# -- Validation count extraction --------------------------------------
Scenario: Validation counts extracted correctly from summary
Given a plan with changeset containing 1 files
And the plan has validation summary with 3 required passed and 0 failed and 2 informational
When I apply the plan with validation gate
Then the apply outcome should be "applied"
And the apply result validations total should be 5
# -- ApplyResult model checks -----------------------------------------
Scenario: ApplyResult model has correct fields
Given a plan with changeset containing 1 files
And the plan has no validation summary
When I apply the plan with validation gate
Then the apply result plan_id should match the plan ID