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
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:
@@ -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"
|
||||
Reference in New Issue
Block a user