197 lines
5.9 KiB
Python
197 lines
5.9 KiB
Python
"""
|
|
Tests for the unified navigation overlay (TOC + Bookmarks tabs)
|
|
"""
|
|
import pytest
|
|
from pathlib import Path
|
|
from PIL import Image
|
|
|
|
from dreader.application import EbookReader
|
|
from dreader.state import OverlayState
|
|
from dreader.gesture import TouchEvent, GestureType, ActionType
|
|
|
|
|
|
@pytest.fixture
|
|
def reader_with_book():
|
|
"""Create a reader with a test book loaded"""
|
|
reader = EbookReader(page_size=(400, 600), margin=10)
|
|
|
|
# Load a simple test book
|
|
test_book = Path(__file__).parent.parent / "examples" / "books" / "hamlet.epub"
|
|
if test_book.exists():
|
|
reader.load_epub(str(test_book))
|
|
else:
|
|
# Fallback: create simple HTML for testing
|
|
html = """
|
|
<html>
|
|
<body>
|
|
<h1>Chapter 1</h1>
|
|
<p>This is chapter 1 content</p>
|
|
<h1>Chapter 2</h1>
|
|
<p>This is chapter 2 content</p>
|
|
</body>
|
|
</html>
|
|
"""
|
|
reader.load_html(html, title="Test Book", author="Test Author", document_id="test")
|
|
|
|
yield reader
|
|
reader.close()
|
|
|
|
|
|
def test_open_navigation_overlay_contents_tab(reader_with_book):
|
|
"""Test opening navigation overlay with Contents tab active"""
|
|
reader = reader_with_book
|
|
|
|
# Open navigation overlay with contents tab
|
|
image = reader.open_navigation_overlay(active_tab="contents")
|
|
|
|
assert image is not None
|
|
assert isinstance(image, Image.Image)
|
|
assert reader.get_overlay_state() == OverlayState.NAVIGATION
|
|
assert reader.is_overlay_open()
|
|
|
|
|
|
def test_open_navigation_overlay_bookmarks_tab(reader_with_book):
|
|
"""Test opening navigation overlay with Bookmarks tab active"""
|
|
reader = reader_with_book
|
|
|
|
# Save a bookmark first
|
|
reader.save_position("Test Bookmark")
|
|
|
|
# Open navigation overlay with bookmarks tab
|
|
image = reader.open_navigation_overlay(active_tab="bookmarks")
|
|
|
|
assert image is not None
|
|
assert isinstance(image, Image.Image)
|
|
assert reader.get_overlay_state() == OverlayState.NAVIGATION
|
|
|
|
|
|
def test_switch_navigation_tabs(reader_with_book):
|
|
"""Test switching between Contents and Bookmarks tabs"""
|
|
reader = reader_with_book
|
|
|
|
# Open with contents tab
|
|
reader.open_navigation_overlay(active_tab="contents")
|
|
|
|
# Switch to bookmarks
|
|
image = reader.switch_navigation_tab("bookmarks")
|
|
assert image is not None
|
|
assert reader.get_overlay_state() == OverlayState.NAVIGATION
|
|
|
|
# Switch back to contents
|
|
image = reader.switch_navigation_tab("contents")
|
|
assert image is not None
|
|
assert reader.get_overlay_state() == OverlayState.NAVIGATION
|
|
|
|
|
|
def test_close_navigation_overlay(reader_with_book):
|
|
"""Test closing navigation overlay"""
|
|
reader = reader_with_book
|
|
|
|
# Open overlay
|
|
reader.open_navigation_overlay()
|
|
assert reader.is_overlay_open()
|
|
|
|
# Close overlay
|
|
image = reader.close_overlay()
|
|
assert image is not None
|
|
assert not reader.is_overlay_open()
|
|
assert reader.get_overlay_state() == OverlayState.NONE
|
|
|
|
|
|
def test_navigation_overlay_tab_switching_gesture(reader_with_book):
|
|
"""Test tab switching via gesture/touch handling"""
|
|
reader = reader_with_book
|
|
|
|
# Open navigation overlay
|
|
reader.open_navigation_overlay(active_tab="contents")
|
|
|
|
# Query the overlay to find the bookmarks tab button
|
|
# This would normally be done by finding the coordinates of the "Bookmarks" tab
|
|
# For now, we test that the switch method works
|
|
result = reader.switch_navigation_tab("bookmarks")
|
|
|
|
assert result is not None
|
|
assert reader.get_overlay_state() == OverlayState.NAVIGATION
|
|
|
|
|
|
def test_navigation_overlay_with_no_bookmarks(reader_with_book):
|
|
"""Test navigation overlay when there are no bookmarks"""
|
|
reader = reader_with_book
|
|
|
|
# Open bookmarks tab (should show "No bookmarks yet")
|
|
image = reader.open_navigation_overlay(active_tab="bookmarks")
|
|
|
|
assert image is not None
|
|
# The overlay should still open successfully
|
|
assert reader.get_overlay_state() == OverlayState.NAVIGATION
|
|
|
|
|
|
def test_navigation_overlay_preserves_page_position(reader_with_book):
|
|
"""Test that opening/closing navigation overlay preserves reading position"""
|
|
reader = reader_with_book
|
|
|
|
# Go to page 2
|
|
reader.next_page()
|
|
initial_position = reader.get_position_info()
|
|
|
|
# Open and close navigation overlay
|
|
reader.open_navigation_overlay()
|
|
reader.close_overlay()
|
|
|
|
# Verify position hasn't changed
|
|
final_position = reader.get_position_info()
|
|
assert initial_position == final_position
|
|
|
|
|
|
def test_navigation_overlay_chapter_selection(reader_with_book):
|
|
"""Test selecting a chapter from the navigation overlay"""
|
|
reader = reader_with_book
|
|
|
|
# Get chapters
|
|
chapters = reader.get_chapters()
|
|
if len(chapters) < 2:
|
|
pytest.skip("Test book doesn't have enough chapters")
|
|
|
|
# Open navigation overlay
|
|
reader.open_navigation_overlay(active_tab="contents")
|
|
|
|
# Get initial position
|
|
initial_position = reader.get_position_info()
|
|
|
|
# Jump to chapter via the reader method (simulating a tap on chapter)
|
|
reader.jump_to_chapter(chapters[1][1]) # chapters[1] = (title, index)
|
|
reader.close_overlay()
|
|
|
|
# Verify position changed
|
|
new_position = reader.get_position_info()
|
|
assert new_position != initial_position
|
|
|
|
|
|
def test_navigation_overlay_bookmark_selection(reader_with_book):
|
|
"""Test selecting a bookmark from the navigation overlay"""
|
|
reader = reader_with_book
|
|
|
|
# Save a bookmark at page 1
|
|
reader.save_position("Bookmark 1")
|
|
|
|
# Move to a different page
|
|
reader.next_page()
|
|
position_before = reader.get_position_info()
|
|
|
|
# Open navigation overlay with bookmarks tab
|
|
reader.open_navigation_overlay(active_tab="bookmarks")
|
|
|
|
# Load the bookmark (simulating a tap on bookmark)
|
|
page = reader.load_position("Bookmark 1")
|
|
assert page is not None
|
|
|
|
reader.close_overlay()
|
|
|
|
# Verify position changed back to bookmark
|
|
position_after = reader.get_position_info()
|
|
assert position_after != position_before
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__, "-v"])
|