vibe/tests/cli/test_switching_mode.py
Quentin 5d2e01a6d7
v2.3.0 (#429)
Co-authored-by: Carlo <carloantonio.patti@mistral.ai>
Co-authored-by: Mathias Gesbert <mathias.gesbert@mistral.ai>
Co-authored-by: Clement Sirieix <clem.sirieix@gmail.com>
Co-authored-by: Michel Thomazo <michel.thomazo@mistral.ai>
Co-authored-by: Clément Drouin <clement.drouin@mistral.ai>
Co-authored-by: Vincent Guilloux <vincent.guilloux@mistral.ai>
Co-authored-by: Thomas Kenbeek <thomas.kenbeek@mistral.ai>
Co-authored-by: Mistral Vibe <vibe@mistral.ai>
2026-02-27 17:31:58 +01:00

109 lines
3.5 KiB
Python

from __future__ import annotations
import pytest
from tests.conftest import build_test_vibe_app
from vibe.cli.textual_ui.widgets.chat_input import ChatInputContainer
from vibe.cli.textual_ui.widgets.chat_input.body import ChatInputBody, _PromptSpinner
from vibe.cli.textual_ui.widgets.messages import UserMessage
@pytest.mark.asyncio
async def test_submit_ignored_while_switching_mode() -> None:
"""Enter press during mode switch must not clear input or send a message."""
app = build_test_vibe_app()
async with app.run_test() as pilot:
await pilot.pause(0.1)
body = app.query_one(ChatInputBody)
body.switching_mode = True
await pilot.pause(0.1)
# Type some text and press enter
app.query_one(ChatInputContainer).value = "hello world"
await pilot.press("enter")
await pilot.pause(0.1)
# Text must remain in the input
assert app.query_one(ChatInputContainer).value == "hello world"
# No user message should have been posted
assert len(app.query(UserMessage)) == 0
@pytest.mark.asyncio
async def test_submit_works_after_switching_mode_ends() -> None:
"""After switching_mode is set back to False, Enter should work normally."""
app = build_test_vibe_app()
async with app.run_test() as pilot:
await pilot.pause(0.1)
body = app.query_one(ChatInputBody)
# Enable then disable switching mode
body.switching_mode = True
await pilot.pause(0.1)
body.switching_mode = False
await pilot.pause(0.1)
# Now submit should work
app.query_one(ChatInputContainer).value = "hello"
await pilot.press("enter")
await pilot.pause(0.1)
assert app.query_one(ChatInputContainer).value == ""
@pytest.mark.asyncio
async def test_spinner_shown_while_switching_mode() -> None:
"""Prompt widget is hidden and spinner is mounted when switching_mode is True."""
app = build_test_vibe_app()
async with app.run_test() as pilot:
await pilot.pause(0.1)
body = app.query_one(ChatInputBody)
prompt = body.prompt_widget
assert prompt is not None
assert prompt.display is True
assert len(body.query(_PromptSpinner)) == 0
body.switching_mode = True
await pilot.pause(0.1)
assert prompt.display is False
assert len(body.query(_PromptSpinner)) == 1
@pytest.mark.asyncio
async def test_spinner_removed_after_switching_mode_ends() -> None:
"""Prompt is restored and spinner removed when switching_mode becomes False."""
app = build_test_vibe_app()
async with app.run_test() as pilot:
await pilot.pause(0.1)
body = app.query_one(ChatInputBody)
body.switching_mode = True
await pilot.pause(0.1)
body.switching_mode = False
await pilot.pause(0.1)
assert body.prompt_widget is not None
assert body.prompt_widget.display is True
assert len(body.query(_PromptSpinner)) == 0
@pytest.mark.asyncio
async def test_rapid_switching_mode_no_duplicate_spinners() -> None:
"""Rapidly toggling switching_mode must never produce duplicate spinners."""
app = build_test_vibe_app()
async with app.run_test() as pilot:
await pilot.pause(0.1)
body = app.query_one(ChatInputBody)
# Rapidly toggle several times
for _ in range(5):
body.switching_mode = True
body.switching_mode = True # double set
await pilot.pause(0.1)
assert len(body.query(_PromptSpinner)) == 1