"""Tests for the inline permission dialog."""
from __future__ import annotations
import pytest
from clients.terminal.tui.screens.permission_dialog import PermissionDialogScreen
from clients.terminal.tui.events import WsEvent
from clients.terminal.tui.tui_app import NaviCodeTui
@pytest.mark.anyio
async def test_tool_started_triggers_permission_dialog() -> None:
"""A destructive tool_started event opens the permission dialog."""
async with NaviCodeTui(new_session=True).run_test() as pilot:
await pilot.pause()
chat = pilot.app.query_one("ChatPanel")
pilot.app.post_message(WsEvent({"type": "tool_started", "tool": "filesystem", "args": {"action": "delete", "path": "/tmp/x"}}))
await pilot.pause()
assert pilot.app.screen_stack[-1].__class__.__name__ == "PermissionDialogScreen"
@pytest.mark.anyio
async def test_allow_once_passes_tool_to_chat() -> None:
async with NaviCodeTui(new_session=True).run_test() as pilot:
await pilot.pause()
chat = pilot.app.query_one("ChatPanel")
pilot.app.post_message(WsEvent({"type": "tool_started", "tool": "filesystem", "args": {"action": "delete", "path": "/tmp/x"}}))
await pilot.pause()
dialog = pilot.app.screen_stack[-1]
assert isinstance(dialog, PermissionDialogScreen)
await pilot.click("#allow_once")
await pilot.pause()
assert any(item.kind == "tool_started" for item in chat._model.items)
@pytest.mark.anyio
async def test_deny_once_adds_error_and_stops() -> None:
async with NaviCodeTui(new_session=True).run_test() as pilot:
await pilot.pause()
chat = pilot.app.query_one("ChatPanel")
pilot.app.post_message(WsEvent({"type": "tool_started", "tool": "filesystem", "args": {"action": "delete", "path": "/tmp/x"}}))
await pilot.pause()
dialog = pilot.app.screen_stack[-1]
assert isinstance(dialog, PermissionDialogScreen)
await pilot.click("#deny_once")
await pilot.pause()
assert any(item.kind == "error" for item in chat._model.items)