forked from HAL9000/cleveragents-core
02250473ad
Fix all failing CI quality gates (lint, unit_tests, format) without suppressing any quality enforcement. Root causes and fixes: 1. Format: features/steps/plan_namespaced_name_tdd_steps.py had trailing whitespace; fixed by running ruff format. 2. Unit tests - A2A JSON-RPC 2.0 migration (commit9c6d6915) renamed A2aRequest fields (operation→method, request_id→id, a2a_version→jsonrpc) and A2aResponse fields (status+data→result, request_id→id) but did not update all step files and feature files: - a2a_jsonrpc_wire_format_steps.py: added use_step_matcher('re') and reset to 'parse' at end to prevent parallel test interference - a2a_facade_wiring_steps.py: updated operation= to method=, .status/.data to .result - a2a_facade_steps.py: updated request_id→id, a2a_version→jsonrpc, A2aResponse(request_id=..., status=...) to new API - m6_facade_steps.py: updated all old API usage - devcontainer_cleanup_steps.py: updated A2aRequest(operation=...) - plan_prompt_command_steps.py: updated A2aRequest(operation=...) - wf03_plan_prompt_confidence_steps.py: updated A2aRequest(operation=...) - consolidated_misc.feature: updated old A2aRequest/A2aResponse scenarios 3. Unit tests - Session CLI output changed (commit0d5d9cf0and others): - 'Session Created' → 'Session created' (lowercase) - 'Session Details' → 'Session Summary' - 'Sessions (N total)' → 'Sessions' - session list JSON: top-level 'total' → nested 'summary.total' - Fixed in: session_cli.feature, session_cli_coverage_boost.feature, session_cli_uncovered_branches.feature, session_list_error.feature, tdd_session_create_persist_steps.py 4. Unit tests - Plan list output changed (commit1a07a891): - 'V3 Lifecycle Plans' → 'Plans' - 'Lifecycle Plans' → 'Plans' - Name column removed (restored in source) - Invariants column removed (restored in source) - Project truncation removed (restored in source) - Fixed in: plan_cli_cancel_revert_coverage.feature, plan_lifecycle_cli_coverage.feature, plan_cli_coverage_boost_steps.py, plan.py (source code restored) 5. Unit tests - Plan apply command now requires ULID (commit300a5d6d): - plan_cli_coverage_r3.feature: updated 'PLAN-001' to valid ULID - plan_cli_coverage_r3_steps.py: added --yes flag, added new step for no-eligible-plans path 6. Unit tests - Various source code bugs: - ThoughtBlock: converted from @dataclass to Pydantic BaseModel (architecture test requires all dataclasses to use Pydantic) - session.py: added DatabaseError handling to export, import, tell commands - database.py: fixed rollback_to() to reuse checkpoint connection for writes - database.py: added _get_checkpoint_conn() helper - check-tls-cert.py: fixed SSLCertVerificationError.reason AttributeError 7. Unit tests - Test step bugs: - error_recovery_coverage_boost_steps.py: fixed invalid ULID _PLAN_ID - session_service_coverage_steps.py: fixed 'sha256:' prefix bug in checksum - database_models_new_coverage_steps.py: added 'name' field to session mock - async_audit_recording_steps.py: fixed Settings(audit_async=False) via env var - coverage_threshold_config_steps.py: added --coverage-min pattern support - m5_acms_smoke_steps.py: updated usage hint text - actor_cli_yaml_steps.py: updated 'Removed actor' → 'Actor removed' - aimodelscredentials_steps.py: set context.imported_class in import step - domain_base_model.feature: added missing 'When I examine model_config' step - tui_first_run_steps.py: fixed module reload to restore cleveragents.tui.* modules after test (prevented patch interference in subsequent tests) - tui_first_run_steps.py: added set_search('') step for empty string - resource_handler_base_coverage_r3_steps.py: use _MinimalHandler instead of DatabaseResourceHandler for NotImplementedError tests - resource_handler_crud.feature: updated to test new DatabaseHandler behavior - resource_handler_sandbox.feature: updated to test new DatabaseHandler behavior - tdd_json_decode_crash_persistence.feature: fixed @tdd_bug → @tdd_issue tags 8. Parallel test interference: - All step files using use_step_matcher('re') now reset to 'parse' at end to prevent global matcher state leaking to subsequent step files
92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
"""Step definitions for TDD Bug #1141 — session create does not persist.
|
|
|
|
Steps exercise the create-then-list round-trip through the real DI path.
|
|
All step names use the ``tdd1141`` prefix to avoid ``AmbiguousStep``
|
|
collisions with existing session create/list steps.
|
|
|
|
The shared ``Given a CLI runner using the real session DI path`` step
|
|
(from ``tdd_session_shared_steps.py``) handles setup and cleanup:
|
|
temp database, DI reset, structlog suppression, and cleanup registration.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from behave import then, when
|
|
from behave.runner import Context
|
|
|
|
from cleveragents.cli.main import app as main_app
|
|
|
|
|
|
@when("I tdd1141 invoke init with force yes")
|
|
def step_tdd1141_invoke_init(context: Context) -> None:
|
|
"""Invoke ``init --force --yes`` via the root CLI app."""
|
|
context.tdd1141_init_result = context.runner.invoke(
|
|
main_app, ["init", "--force", "--yes"]
|
|
)
|
|
|
|
|
|
@then("the tdd1141 init should exit successfully")
|
|
def step_tdd1141_init_exits_ok(context: Context) -> None:
|
|
"""Assert init exits with code 0."""
|
|
result = context.tdd1141_init_result
|
|
assert result.exit_code == 0, (
|
|
f"Expected init exit code 0, got {result.exit_code}.\nOutput:\n{result.output}"
|
|
)
|
|
|
|
|
|
@when("I tdd1141 invoke session create")
|
|
def step_tdd1141_invoke_create(context: Context) -> None:
|
|
"""Invoke ``session create`` through the root CLI app."""
|
|
context.tdd1141_create_result = context.runner.invoke(
|
|
main_app, ["session", "create"]
|
|
)
|
|
|
|
|
|
@then("the tdd1141 session create should exit successfully")
|
|
def step_tdd1141_create_exits_ok(context: Context) -> None:
|
|
"""Assert session create exits with code 0."""
|
|
result = context.tdd1141_create_result
|
|
assert result.exit_code == 0, (
|
|
f"Expected session create exit code 0, got {result.exit_code}.\n"
|
|
f"Output:\n{result.output}"
|
|
)
|
|
|
|
|
|
@when("I tdd1141 invoke session list with format json")
|
|
def step_tdd1141_invoke_list_json(context: Context) -> None:
|
|
"""Invoke ``session list --format json`` through the root CLI app."""
|
|
context.tdd1141_list_result = context.runner.invoke(
|
|
main_app, ["session", "list", "--format", "json"]
|
|
)
|
|
|
|
|
|
@then("the tdd1141 session list should exit successfully")
|
|
def step_tdd1141_list_exits_ok(context: Context) -> None:
|
|
"""Assert session list exits with code 0."""
|
|
result = context.tdd1141_list_result
|
|
assert result.exit_code == 0, (
|
|
f"Expected session list exit code 0, got {result.exit_code}.\n"
|
|
f"Output:\n{result.output}"
|
|
)
|
|
|
|
|
|
@then("the tdd1141 session list output should report total {count:d}")
|
|
def step_tdd1141_list_contains_count(context: Context, count: int) -> None:
|
|
"""Assert the JSON output reports the expected total session count."""
|
|
output = context.tdd1141_list_result.output
|
|
try:
|
|
data = json.loads(output)
|
|
except json.JSONDecodeError as exc:
|
|
raise AssertionError(
|
|
f"Session list output is not valid JSON:\n{output}"
|
|
) from exc
|
|
|
|
# Support both top-level "total" (empty list case) and nested "summary.total"
|
|
actual = data["total"] if "total" in data else data.get("summary", {}).get("total")
|
|
assert actual == count, (
|
|
f"Expected 'total': {count} in session list output, got {actual!r}.\n"
|
|
f"Full output:\n{output}"
|
|
)
|