test(tui): add failing behave scenario for set_active_persona preset reset bug
CI / helm (pull_request) Successful in 36s
CI / push-validation (pull_request) Successful in 22s
CI / build (pull_request) Successful in 3m57s
CI / lint (pull_request) Successful in 4m3s
CI / quality (pull_request) Successful in 4m27s
CI / typecheck (pull_request) Successful in 4m44s
CI / security (pull_request) Successful in 5m0s
CI / e2e_tests (pull_request) Successful in 7m33s
CI / integration_tests (pull_request) Successful in 7m50s
CI / unit_tests (pull_request) Successful in 9m27s
CI / docker (pull_request) Successful in 1m41s
CI / coverage (pull_request) Successful in 14m59s
CI / status-check (pull_request) Successful in 3s

Implemented TDD scaffolding for issue #10500:
- Added a new Behave feature: features/tdd_persona_state_set_active_persona_reset.feature
  - Contains two scenarios tagged @tdd_issue @tdd_issue_10500 @tdd_expected_fail
  - Verifies that PersonaState.set_active_persona() resets the preset to "default" when switching personas
  - Tests are intentionally failing to demonstrate TDD; the @tdd_expected_fail tag inverts results so CI passes
- Added step definitions: features/steps/tdd_persona_state_set_active_persona_reset_steps.py
  - Implements the steps required by the feature to exercise set_active_persona() and preset handling
- Rationale: The bug is that set_active_persona() only initializes the preset to "default" when there is no preset; if a non-default preset exists (e.g., "turbo"), switching personas leaves the preset unchanged instead of resetting to "default"

Files added provide the failing test scenarios and their wiring, guiding the eventual fix for resetting presets on persona switches.
This commit is contained in:
2026-04-19 11:48:05 +00:00
parent 435e409df9
commit 99833d872d
2 changed files with 133 additions and 0 deletions
@@ -0,0 +1,110 @@
"""Step definitions for tdd_persona_state_set_active_persona_reset.feature.
These steps capture bug #10500: PersonaState.set_active_persona() does not
reset the active preset to "default" when switching to a different persona.
The current implementation only initialises the preset when the session has
no preset entry at all. If the session already has a non-default preset
(e.g. because the user cycled through presets), switching persona leaves
that preset unchanged instead of resetting it to "default".
Expected (correct) behaviour:
state.set_active_persona(session_id, new_persona)
→ state.current_preset(session_id) == "default"
Actual (buggy) behaviour:
state.set_active_persona(session_id, new_persona)
→ state.current_preset(session_id) == <previous non-default preset>
"""
from unittest.mock import MagicMock
from behave import given, then, when
from cleveragents.tui.persona.schema import Persona
from cleveragents.tui.persona.state import PersonaState
# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------
def _make_persona(name, actor="ns/actor"):
"""Build a minimal real Persona for testing."""
return Persona(name=name, actor=actor)
def _make_mock_registry(personas):
"""Return a MagicMock that quacks like PersonaRegistry."""
registry = MagicMock()
default = next(iter(personas.values()))
registry.ensure_default.return_value = default
registry.get_last_persona.return_value = None
registry.set_last_persona = MagicMock()
def _get(name):
return personas.get(name)
registry.get.side_effect = _get
return registry
# ---------------------------------------------------------------------------
# Given steps
# ---------------------------------------------------------------------------
@given(
'a session "{session_id}" with persona "{persona_name}"'
' and a non-default preset "{preset_name}"'
)
def step_session_with_persona_and_preset(
context, session_id, persona_name, preset_name
):
"""Set up a session that already has a non-default preset."""
coder = _make_persona("coder", actor="ns/coder")
analyst = _make_persona("analyst", actor="ns/analyst")
registry = _make_mock_registry({"coder": coder, "analyst": analyst})
context.state = PersonaState(
registry=registry,
active_by_session={session_id: persona_name},
preset_by_session={session_id: preset_name},
)
@given('the preset for session "{session_id}" has been updated to "{preset_name}"')
def step_update_preset(context, session_id, preset_name):
"""Directly update the preset for a session (simulates cycling)."""
context.state.preset_by_session[session_id] = preset_name
# ---------------------------------------------------------------------------
# When steps
# ---------------------------------------------------------------------------
@when('I switch session "{session_id}" to persona "{persona_name}"')
def step_switch_persona(context, session_id, persona_name):
"""Call set_active_persona to switch the active persona."""
context.state.set_active_persona(session_id, persona_name)
# ---------------------------------------------------------------------------
# Then steps
# ---------------------------------------------------------------------------
@then('the preset for session "{session_id}" should be "{expected_preset}"')
def step_verify_preset(context, session_id, expected_preset):
"""Assert that the preset has been reset to the expected value.
This assertion will FAIL while bug #10500 is unfixed because
set_active_persona() does not reset an existing preset to "default".
The @tdd_expected_fail tag inverts this failure so CI passes.
"""
actual = context.state.current_preset(session_id)
assert actual == expected_preset, (
f"Bug #10500: expected preset '{expected_preset}' after switching persona "
f"but got '{actual}'. set_active_persona() does not reset an existing "
f"non-default preset to 'default'."
)
@@ -0,0 +1,23 @@
@tdd_issue @tdd_issue_10500
Feature: TDD Bug #10500 — PersonaState.set_active_persona() does not reset preset
As a TUI user
I want switching to a different persona to reset the active preset to "default"
So that I do not accidentally carry over a preset from a previous persona
When a session has cycled to a non-default preset and the user then switches
to a different persona, the preset should be reset to "default". The current
implementation only initialises the preset when the session has no preset at
all; it leaves an existing non-default preset unchanged.
@tdd_issue @tdd_issue_10500 @tdd_expected_fail
Scenario: Bug #10500 - switching persona resets preset to default
Given a session "sess-reset-1" with persona "coder" and a non-default preset "turbo"
When I switch session "sess-reset-1" to persona "analyst"
Then the preset for session "sess-reset-1" should be "default"
@tdd_issue @tdd_issue_10500 @tdd_expected_fail
Scenario: Bug #10500 - switching persona resets preset even after multiple cycles
Given a session "sess-reset-2" with persona "coder" and a non-default preset "fast"
And the preset for session "sess-reset-2" has been updated to "slow"
When I switch session "sess-reset-2" to persona "analyst"
Then the preset for session "sess-reset-2" should be "default"