Files
textual/tests/test_tooltips.py
2024-08-09 20:59:43 +02:00

119 lines
4.9 KiB
Python

"""Tests for the tooltips."""
from typing_extensions import Final
from textual.app import App, ComposeResult
from textual.widgets import Static
class TooltipApp(App[None]):
TOOLTIP_DELAY = 0.4
CSS = """
Static {
width: 1fr;
height: 1fr;
}
"""
@staticmethod
def tip(static: Static) -> Static:
static.tooltip = "This is a test tooltip"
return static
def compose(self) -> ComposeResult:
yield Static(id="mr-pink")
yield self.tip(Static(id="mr-blue"))
TOOLTIP_TIMEOUT: Final[float] = 0.4 + 0.1
"""How long to wait for a tooltip to appear.
The 0.4 is the value defined with TOOLTIP_DELAY, and the 0.1 is a bit of
wiggle room.
"""
async def test_no_tip_gets_no_tooltip() -> None:
"""If there is no tooltip, none should show."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-pink")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is False
async def test_tip_gets_a_tooltip() -> None:
"""If there is a tooltip, it should show."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-blue")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is True
async def test_mouse_move_removes_a_tooltip() -> None:
"""If there is a mouse move when there is a tooltip, it should disappear."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-blue")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is True
await pilot.hover("#mr-pink")
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is False
async def test_removing_tipper_should_remove_tooltip() -> None:
"""If the tipping widget is removed, it should remove the tooltip."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-blue")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is True
await pilot.app.query_one("#mr-blue").remove()
await pilot.pause()
assert pilot.app.query_one("#textual-tooltip").display is False
async def test_making_tipper_invisible_should_remove_tooltip() -> None:
"""If the tipping widget is made invisible, it should remove the tooltip."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-blue")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is True
pilot.app.query_one("#mr-blue").visible = False
await pilot.pause()
assert pilot.app.query_one("#textual-tooltip").display is False
async def test_making_tipper_not_displayed_should_remove_tooltip() -> None:
"""If the tipping widget is made display none, it should remove the tooltip."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-blue")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is True
pilot.app.query_one("#mr-blue").display = False
await pilot.pause()
assert pilot.app.query_one("#textual-tooltip").display is False
async def test_making_tipper_shuffle_away_should_remove_tooltip() -> None:
"""If the tipping widget moves from under the cursor, it should remove the tooltip."""
async with TooltipApp().run_test(tooltips=True) as pilot:
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.hover("#mr-blue")
assert pilot.app.query_one("#textual-tooltip").display is False
await pilot.pause(TOOLTIP_TIMEOUT)
assert pilot.app.query_one("#textual-tooltip").display is True
await pilot.app.mount(Static(id="mr-brown"), before="#mr-blue")
await pilot.pause()
assert pilot.app.query_one("#textual-tooltip").display is False