Files
2025-09-22 13:56:04 -05:00

241 lines
7.6 KiB
Python

from unittest.mock import Mock
import pytest
from ren_browser.controls.shortcuts import Shortcuts
class TestShortcuts:
"""Test cases for the Shortcuts class."""
@pytest.fixture
def mock_tab_manager(self):
"""Create a mock tab manager for testing."""
manager = Mock()
manager.manager.index = 0
manager.manager.tabs = [{"url_field": Mock()}]
manager._on_add_click = Mock()
manager._on_close_click = Mock()
manager.select_tab = Mock()
return manager
@pytest.fixture
def shortcuts(self, mock_page, mock_tab_manager):
"""Create a Shortcuts instance for testing."""
return Shortcuts(mock_page, mock_tab_manager)
def test_shortcuts_init(self, mock_page, mock_tab_manager):
"""Test Shortcuts initialization."""
shortcuts = Shortcuts(mock_page, mock_tab_manager)
assert shortcuts.page == mock_page
assert shortcuts.tab_manager == mock_tab_manager
assert mock_page.on_keyboard_event == shortcuts.on_keyboard
def test_new_tab_shortcut_ctrl_t(self, shortcuts, mock_tab_manager):
"""Test Ctrl+T shortcut for new tab."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "t"
event.shift = False
shortcuts.on_keyboard(event)
mock_tab_manager._on_add_click.assert_called_once_with(None)
shortcuts.page.update.assert_called_once()
def test_new_tab_shortcut_meta_t(self, shortcuts, mock_tab_manager):
"""Test Meta+T shortcut for new tab (macOS)."""
event = Mock()
event.ctrl = False
event.meta = True
event.key = "T"
event.shift = False
shortcuts.on_keyboard(event)
mock_tab_manager._on_add_click.assert_called_once_with(None)
def test_close_tab_shortcut_ctrl_w(self, shortcuts, mock_tab_manager):
"""Test Ctrl+W shortcut for close tab."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "w"
event.shift = False
shortcuts.on_keyboard(event)
mock_tab_manager._on_close_click.assert_called_once_with(None)
shortcuts.page.update.assert_called_once()
def test_focus_url_bar_shortcut_ctrl_l(self, shortcuts, mock_tab_manager):
"""Test Ctrl+L shortcut for focusing URL bar."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "l"
event.shift = False
url_field = Mock()
mock_tab_manager.manager.tabs = [{"url_field": url_field}]
mock_tab_manager.manager.index = 0
shortcuts.on_keyboard(event)
url_field.focus.assert_called_once()
shortcuts.page.update.assert_called_once()
def test_show_announces_drawer_ctrl_a(self, shortcuts):
"""Test Ctrl+A shortcut for showing announces drawer."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "a"
event.shift = False
shortcuts.page.drawer = Mock()
shortcuts.page.drawer.open = False
shortcuts.on_keyboard(event)
assert shortcuts.page.drawer.open is True
shortcuts.page.update.assert_called_once()
def test_cycle_tabs_forward_ctrl_tab(self, shortcuts, mock_tab_manager):
"""Test Ctrl+Tab for cycling tabs forward."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "Tab"
event.shift = False
mock_tab_manager.manager.index = 0
mock_tab_manager.manager.tabs = [Mock(), Mock(), Mock()] # 3 tabs
shortcuts.on_keyboard(event)
mock_tab_manager.select_tab.assert_called_once_with(1)
shortcuts.page.update.assert_called_once()
def test_cycle_tabs_backward_ctrl_shift_tab(self, shortcuts, mock_tab_manager):
"""Test Ctrl+Shift+Tab for cycling tabs backward."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "Tab"
event.shift = True
mock_tab_manager.manager.index = 1
mock_tab_manager.manager.tabs = [Mock(), Mock(), Mock()] # 3 tabs
shortcuts.on_keyboard(event)
mock_tab_manager.select_tab.assert_called_once_with(0)
shortcuts.page.update.assert_called_once()
def test_cycle_tabs_wrap_around_forward(self, shortcuts, mock_tab_manager):
"""Test tab cycling wraps around when going forward from last tab."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "Tab"
event.shift = False
mock_tab_manager.manager.index = 2 # Last tab
mock_tab_manager.manager.tabs = [Mock(), Mock(), Mock()] # 3 tabs
shortcuts.on_keyboard(event)
mock_tab_manager.select_tab.assert_called_once_with(0) # Wrap to first
def test_cycle_tabs_wrap_around_backward(self, shortcuts, mock_tab_manager):
"""Test tab cycling wraps around when going backward from first tab."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "Tab"
event.shift = True
mock_tab_manager.manager.index = 0 # First tab
mock_tab_manager.manager.tabs = [Mock(), Mock(), Mock()] # 3 tabs
shortcuts.on_keyboard(event)
mock_tab_manager.select_tab.assert_called_once_with(2) # Wrap to last
def test_no_ctrl_or_meta_key_returns_early(self, shortcuts, mock_tab_manager):
"""Test that shortcuts without Ctrl or Meta key don't trigger actions."""
event = Mock()
event.ctrl = False
event.meta = False
event.key = "t"
event.shift = False
shortcuts.on_keyboard(event)
mock_tab_manager._on_add_click.assert_not_called()
shortcuts.page.update.assert_not_called()
def test_unknown_key_returns_early(self, shortcuts, mock_tab_manager):
"""Test that unknown key combinations don't trigger actions."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "z" # Unknown shortcut
event.shift = False
shortcuts.on_keyboard(event)
mock_tab_manager._on_add_click.assert_not_called()
shortcuts.page.update.assert_not_called()
def test_case_insensitive_keys(self, shortcuts, mock_tab_manager):
"""Test that shortcuts work with uppercase keys."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "T" # Uppercase
event.shift = False
shortcuts.on_keyboard(event)
mock_tab_manager._on_add_click.assert_called_once_with(None)
def test_multiple_tabs_url_field_access(self, shortcuts, mock_tab_manager):
"""Test URL field access with multiple tabs."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "l"
event.shift = False
url_field1 = Mock()
url_field2 = Mock()
mock_tab_manager.manager.tabs = [
{"url_field": url_field1},
{"url_field": url_field2},
]
mock_tab_manager.manager.index = 1 # Second tab
shortcuts.on_keyboard(event)
url_field1.focus.assert_not_called()
url_field2.focus.assert_called_once()
def test_single_tab_cycling(self, shortcuts, mock_tab_manager):
"""Test tab cycling with only one tab."""
event = Mock()
event.ctrl = True
event.meta = False
event.key = "Tab"
event.shift = False
mock_tab_manager.manager.index = 0
mock_tab_manager.manager.tabs = [Mock()] # Only 1 tab
shortcuts.on_keyboard(event)
mock_tab_manager.select_tab.assert_called_once_with(0) # Stay on same tab