70a302a368
The _build_artifacts_dict function in plan_apply_service.py already includes validation_summary and apply_summary in the artifacts output. These two test scenarios were marked as @tdd_expected_fail but now pass with the current implementation. Removing the tags to reflect the actual passing status. Also added the missing unit-tests.yaml validation config file that the tests require. ISSUES CLOSED: #9084
143 lines
5.5 KiB
Gherkin
143 lines
5.5 KiB
Gherkin
Feature: Plan Diff and Artifacts Output
|
|
As a developer using the plan lifecycle
|
|
I want to review diffs and artifacts before applying changes
|
|
So that I can verify what will be applied and catch issues early
|
|
|
|
Background:
|
|
Given I have a plan apply service with an in-memory changeset store
|
|
|
|
# Diff output tests
|
|
|
|
Scenario: Plan diff shows file changes in rich format
|
|
Given a plan with a changeset containing file changes
|
|
When I request the diff in rich format
|
|
Then the diff output should contain the changeset ID
|
|
And the diff output should contain file paths
|
|
And the diff output should contain operation labels
|
|
|
|
Scenario: Plan diff shows file changes in plain format
|
|
Given a plan with a changeset containing file changes
|
|
When I request the diff in plain format
|
|
Then the diff output should contain unified diff markers
|
|
And the diff output should contain the plan ID
|
|
|
|
Scenario: Plan diff shows file changes in JSON format
|
|
Given a plan with a changeset containing file changes
|
|
When I request the diff in JSON format
|
|
Then the diff output should be valid JSON
|
|
And the JSON diff should contain entries list
|
|
And the JSON diff should contain summary counts
|
|
|
|
Scenario: Plan diff shows file changes in YAML format
|
|
Given a plan with a changeset containing file changes
|
|
When I request the diff in YAML format
|
|
Then the diff output should contain YAML keys
|
|
And the diff output should contain the changeset ID
|
|
|
|
Scenario: Plan diff raises error when no changeset exists
|
|
Given a plan with no changeset
|
|
When I try to get the diff
|
|
Then a plan error about missing changeset should be raised
|
|
|
|
Scenario: Plan diff with empty changeset shows no changes
|
|
Given a plan with an empty changeset
|
|
When I request the diff in rich format
|
|
Then the diff output should indicate no changes
|
|
|
|
# Artifacts output tests
|
|
|
|
Scenario: Plan artifacts shows changeset summary
|
|
Given a plan with a changeset containing file changes
|
|
When I request the artifacts
|
|
Then the artifacts should contain the plan ID
|
|
And the artifacts should contain the changeset ID
|
|
And the artifacts should contain sandbox refs
|
|
And the artifacts should contain files changed list
|
|
|
|
@tdd_issue @tdd_issue_4253
|
|
Scenario: Plan artifacts shows validation results when available
|
|
Given a plan with a changeset and validation summary
|
|
When I request the artifacts in JSON format
|
|
Then the artifacts JSON should contain validation summary
|
|
|
|
Scenario: Plan artifacts for plan without changeset
|
|
Given a plan with no changeset
|
|
When I request the artifacts
|
|
Then the artifacts should show null changeset
|
|
|
|
# Empty ChangeSet guard tests
|
|
|
|
Scenario: Apply with empty changeset is blocked
|
|
Given a plan with an empty changeset
|
|
When I check the empty changeset guard
|
|
Then a plan error about empty changeset should be raised
|
|
|
|
Scenario: Apply with empty changeset allowed via flag
|
|
Given a plan with an empty changeset
|
|
When I check the empty changeset guard with allow_empty
|
|
Then the guard should return True
|
|
|
|
Scenario: Apply with non-empty changeset passes guard
|
|
Given a plan with a changeset containing file changes
|
|
When I check the empty changeset guard
|
|
Then the guard should return True
|
|
|
|
# Apply summary persistence tests
|
|
|
|
Scenario: Apply persists summary metadata
|
|
Given a plan in apply processing state
|
|
When I persist the apply summary with 5 files and 3 validations
|
|
Then the plan metadata should contain apply_files_changed of 5
|
|
And the plan metadata should contain apply_validations_run of 3
|
|
And the plan metadata should contain apply_completed_at timestamp
|
|
|
|
# Merge failure handling tests
|
|
|
|
Scenario: Merge failure triggers error state
|
|
Given a plan in apply processing state
|
|
When a merge failure occurs with conflict details
|
|
Then the plan should be in an errored processing state
|
|
And the plan error message should contain merge conflict info
|
|
And the plan metadata should contain merge_conflict details
|
|
And the plan metadata should contain sandbox_rollback pending
|
|
|
|
# Service initialization tests
|
|
|
|
Scenario: PlanApplyService requires lifecycle service
|
|
When I try to create PlanApplyService with None lifecycle
|
|
Then a validation error should be raised for lifecycle service
|
|
|
|
# Multiple format outputs
|
|
|
|
Scenario: Artifacts output in plain format
|
|
Given a plan with a changeset containing file changes
|
|
When I request the artifacts in plain format
|
|
Then the artifacts output should contain key-value pairs
|
|
|
|
Scenario: Artifacts output in YAML format
|
|
Given a plan with a changeset containing file changes
|
|
When I request the artifacts in YAML format
|
|
Then the artifacts output should contain YAML structure
|
|
|
|
# Coverage: _render_diff_plain with empty changeset (line 70)
|
|
|
|
Scenario: Plan diff in plain format with empty changeset
|
|
Given a plan with an empty changeset
|
|
When I request the diff in plain format
|
|
Then the diff output should indicate no changes
|
|
|
|
# Coverage: artifacts with apply summary metadata (line 181)
|
|
|
|
@tdd_issue @tdd_issue_4253
|
|
Scenario: Artifacts include apply summary from metadata
|
|
Given a plan with a changeset and apply summary metadata
|
|
When I request the artifacts in JSON format
|
|
Then the artifacts JSON should contain apply summary
|
|
|
|
# Coverage: changeset store miss fallback (line 432)
|
|
|
|
Scenario: Diff falls back to stub changeset when store misses
|
|
Given a plan with a changeset ID but store has no entry
|
|
When I request the diff in rich format
|
|
Then the diff output should indicate no changes
|