Files
cleveragents-core/features/database_models_new_coverage.feature
T
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

88 lines
4.5 KiB
Gherkin

@unit @database @models @new_coverage
Feature: Database models new coverage for missed lines and branches
As a developer
I want comprehensive coverage for database model conversions
So that all code paths including edge cases are tested
# -------------------------------------------------------------------
# ToolModel.from_domain: object (non-dict) access via getattr
# -------------------------------------------------------------------
@tool @from_domain @object_access
Scenario: ToolModel from_domain with object attribute access pattern
Given a domain tool object with attribute access
When I create a ToolModel from the domain object
Then the ToolModel should have the correct name
And the ToolModel should have the correct description
And the ToolModel should have the correct tool_type
And the ToolModel should have the correct source
@tool @from_domain @object_access_namespaced
Scenario: ToolModel from_domain with namespaced object splits name correctly
Given a domain tool object with a namespaced name attribute
When I create a ToolModel from the namespaced domain object
Then the ToolModel namespace should be extracted correctly
And the ToolModel short_name should be extracted correctly
@tool @from_domain @object_defaults
Scenario: ToolModel from_domain with object falling back to defaults
Given a domain tool object with minimal attributes
When I create a ToolModel from the minimal domain object
Then the ToolModel should use default values for missing attributes
# -------------------------------------------------------------------
# SessionModel.from_domain: non-empty messages list
# -------------------------------------------------------------------
@session @from_domain @messages
Scenario: SessionModel from_domain with non-empty messages list
Given a domain session object with two messages
When I create a SessionModel from the domain session
Then the SessionModel should have two message child models
And the first message model should have the correct role and content
And the second message model should have the correct sequence
@session @from_domain @single_message
Scenario: SessionModel from_domain with a single message
Given a domain session object with one message
When I create a SessionModel from the single-message domain session
Then the SessionModel should have exactly one message child model
And the message model should preserve the message_id
# -------------------------------------------------------------------
# SkillModel: instantiation exercises short_name and description columns
# -------------------------------------------------------------------
@skill @instantiation
Scenario: SkillModel instantiation covers short_name and description columns
Given a SkillModel is created with short_name and description values
Then the SkillModel short_name should match the provided value
And the SkillModel description should match the provided value
And the SkillModel namespace should be set correctly
@skill @instantiation @with_items
Scenario: SkillModel instantiation with child SkillItemModel records
Given a SkillModel is created with a child SkillItemModel
Then the SkillModel should have one item in items_rel
And the SkillItemModel should have the correct item_type and item_name
# -------------------------------------------------------------------
# LifecyclePlanModel.from_domain: arguments_order with missing key
# -------------------------------------------------------------------
@plan @from_domain @arguments_order_missing_key
@tdd_issue @tdd_issue_4247 @tdd_expected_fail
Scenario: Plan from_domain skips arguments_order entries not in arguments_dict
Given a plan domain object with arguments_order containing a missing key
When I convert the plan domain object to a database model
Then the database plan model should only have arguments for keys present in arguments_dict
And the missing key should not appear in the argument child records
@plan @from_domain @arguments_order_mixed
@tdd_issue @tdd_issue_4247 @tdd_expected_fail
Scenario: Plan from_domain handles mix of present and missing argument keys
Given a plan domain object with three ordered keys but only two in arguments_dict
When I convert the mixed-arguments plan to a database model
Then the database plan model should have exactly two argument child records
And the argument positions should reflect their order in arguments_order