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>
This commit is contained in:
Quentin 2026-02-27 17:31:58 +01:00 committed by GitHub
parent a560a47ce8
commit 5d2e01a6d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
139 changed files with 7152 additions and 1457 deletions

View file

@ -0,0 +1,109 @@
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