Files
cleveragents-core/features/plan_diff_artifacts.feature
hurui200320 2005b8ef82
CI / push-validation (push) Successful in 18s
CI / build (push) Successful in 19s
CI / helm (push) Successful in 24s
CI / lint (push) Successful in 29s
CI / security (push) Successful in 1m11s
CI / e2e_tests (push) Successful in 2m56s
CI / quality (push) Successful in 3m40s
CI / typecheck (push) Successful in 3m59s
CI / integration_tests (push) Successful in 4m3s
CI / unit_tests (push) Successful in 4m55s
CI / docker (push) Successful in 10s
CI / coverage (push) Successful in 10m44s
CI / status-check (push) Successful in 1s
CI / benchmark-regression (push) Has been skipped
CI / benchmark-publish (push) Successful in 1h13m28s
feat(tests): replace all @skip tags with proper @tdd_expected_fail tags or remove them across the entire codebase (#7221)
## Summary

Replaces all 234 bare `@skip` occurrences across 82 Behave feature files with the correct TDD issue-capture tagging system described in CONTRIBUTING.md § Bug Fix Workflow.

Previously, the noxfile ran Behave with `--tags=not @skip`, silently excluding all `@skip`-tagged scenarios from every CI run. These tests never ran, never inverted results via the `@tdd_expected_fail` mechanism, and never contributed to coverage — defeating the purpose of TDD issue-capture testing. Every `@skip` occurrence had a commented-out hint line immediately above it showing the intended proper tags (e.g., `# @tdd_issue @tdd_issue_4272 @tdd_expected_fail @skip`), confirming they were all intended for conversion.

## Changes

### Mechanical conversion (234 replacements across 82 files)
- Extracted the proper TDD tags from the comment hint above each `@skip` line, removed `@skip` from the tag set, and replaced the `@skip` line with those tags.
- Removed the now-redundant comment hint lines alongside each replacement.

### Bug-fixed scenarios — `@tdd_expected_fail` removed (84 scenarios)
- After conversion, ran `nox -s unit_tests` to identify which newly-enabled `@tdd_expected_fail` scenarios now **pass** (their referenced bugs have already been fixed). Removed `@tdd_expected_fail` from those 84 scenarios and their corresponding feature-level tags, leaving only the permanent `@tdd_issue @tdd_issue_<N>` regression-guard tags.
- Affected features include: `tdd_tool_runner_env_precedence`, `tdd_automation_profile_session_leak`, `tls_certificate_check`, `project_create_persist`, `resource_type_bootstrap_*`, and 18 others.

### Noxfile cleanup
- Removed all four `--tags=not @skip` arguments from `noxfile.py` (unit_tests and coverage sessions). With zero `@skip` tags remaining in the codebase, this filter was dead code and its presence would mislead future maintainers into thinking `@skip` is still a supported escape mechanism.

### Regression guard files
- Split the regression guards into two focused files:
  - `tdd_regression_guards_exec_env.feature` for bug #4281 (exec-env precedence)
  - `tdd_regression_guards_session_list.feature` for bug #4271 (session list summary)
- Each file carries only its own `@tdd_issue` tags at the feature level, avoiding cross-contamination via Behave tag inheritance. The `Background` step (`session-list-summary mock`) only appears in the session-list file where it is actually needed.

### Duplicate tag cleanup
- Removed duplicate `@tdd_issue @tdd_issue_4287` tag lines in `tdd_skill_add_regression.feature` (lines 20 and 29).

### Inline comment for retained `@tdd_expected_fail`
- Added inline comment in `ci_workflow_validation.feature:134` explaining why this specific #4227 scenario retains `@tdd_expected_fail` despite #4227 being closed (CI YAML does not encode threshold as a machine-readable value).

### Known edge cases — `@tdd_expected_fail` retained (closed issues, fix on master, scenarios still fail)
The following issues are **closed** and their fixes **are on master**, but the specific test assertions still fail because the fixes address other aspects of the bugs. The `@tdd_expected_fail` tags are functionally correct and must remain until the specific scenario assertions pass:
- `tdd_exec_env_resolution_precedence.feature` — bug #1080 (closed 2026-03-31). The precedence-level-2-vs-4 scenario still fails.
- `session_list_summary_dedup.feature` — bug #3046 (closed 2026-04-05). The dedup-consistency scenarios still fail.
- `actor_add_update_enforcement.feature` — bug #2609 (closed 2026-04-05). The enforcement scenarios still fail.
- `ci_workflow_validation.feature:134` — #4227 (closed 2026-04-08). The CI YAML threshold assertion still fails.

## Verification

- `grep -r "@skip" features/ --include="*.feature"` → **zero results** ✓
- `grep -n "tags=not @skip" noxfile.py` → **zero results** ✓
- `nox -s unit_tests` → **629 features passed, 0 failed** ✓ (up from ~545 before this PR)
- CI all green (coverage ≥ 97%) ✓
- Integration tests (Robot Framework) do not use `@skip` — confirmed no action needed ✓
- E2E tests (Robot Framework) do not use `@skip` — confirmed no action needed ✓
- `CHANGELOG.md` updated with entry for this change ✓
- `CONTRIBUTORS.md` — Rui Hu already listed ✓

## Issues Addressed

Closes #7025

Co-authored-by: CleverThis <hal9000@cleverthis.com>
Reviewed-on: #7221
Reviewed-by: HAL 9000 <HAL9000@cleverthis.com>
Reviewed-by: HAL9001 <hal9001@cleverthis.com>
Co-authored-by: Rui Hu <rui.hu@cleverthis.com>
Co-committed-by: Rui Hu <rui.hu@cleverthis.com>
2026-04-13 04:56:01 +00:00

143 lines
5.6 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 @tdd_expected_fail
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 @tdd_expected_fail
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