improved library screen, fixed issues with image rendering and navigation
This commit is contained in:
@@ -7,6 +7,7 @@ and verify that tap detection works correctly.
|
||||
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import MagicMock
|
||||
from dreader import LibraryManager
|
||||
|
||||
|
||||
@@ -46,9 +47,12 @@ class TestLibraryInteraction(unittest.TestCase):
|
||||
# Table should exist
|
||||
self.assertIsNotNone(table)
|
||||
|
||||
# Table should have body rows matching book count
|
||||
# Table should have body rows for 2-column grid layout
|
||||
# Each pair of books gets 2 rows (cover row + detail row)
|
||||
# So N books = ceil(N/2) * 2 rows
|
||||
body_rows = list(table.body_rows())
|
||||
self.assertEqual(len(body_rows), len(books))
|
||||
expected_rows = ((len(books) + 1) // 2) * 2 # Round up to nearest even number, then double
|
||||
self.assertEqual(len(body_rows), expected_rows)
|
||||
|
||||
def test_library_rendering(self):
|
||||
"""Test that library can be rendered to image"""
|
||||
@@ -136,7 +140,7 @@ class TestLibraryInteraction(unittest.TestCase):
|
||||
self.assertIsNone(selected_path, "Tap below last book should not select anything")
|
||||
|
||||
def test_multiple_taps(self):
|
||||
"""Test that multiple taps work correctly"""
|
||||
"""Test that multiple taps work correctly with 2-column grid layout"""
|
||||
books = self.library.scan_library()
|
||||
|
||||
if len(books) < 3:
|
||||
@@ -145,16 +149,20 @@ class TestLibraryInteraction(unittest.TestCase):
|
||||
self.library.create_library_table()
|
||||
self.library.render_library()
|
||||
|
||||
# Tap first book (row 0: y=60-180)
|
||||
# In 2-column layout:
|
||||
# Books 0 and 1 are in the first pair (rows 0-1: cover and detail)
|
||||
# Books 2 and 3 are in the second pair (rows 2-3: cover and detail)
|
||||
|
||||
# Tap first book (left column, first pair cover row)
|
||||
path1 = self.library.handle_library_tap(x=100, y=100)
|
||||
self.assertEqual(path1, books[0]['path'])
|
||||
|
||||
# Tap second book (row 1: y=181-301)
|
||||
path2 = self.library.handle_library_tap(x=400, y=250)
|
||||
# Tap second book (right column, first pair cover row)
|
||||
path2 = self.library.handle_library_tap(x=500, y=100)
|
||||
self.assertEqual(path2, books[1]['path'])
|
||||
|
||||
# Tap third book (row 2: y=302-422)
|
||||
path3 = self.library.handle_library_tap(x=400, y=360)
|
||||
# Tap third book (left column, second pair cover row)
|
||||
path3 = self.library.handle_library_tap(x=100, y=360)
|
||||
self.assertEqual(path3, books[2]['path'])
|
||||
|
||||
# All should be different
|
||||
@@ -162,6 +170,79 @@ class TestLibraryInteraction(unittest.TestCase):
|
||||
self.assertNotEqual(path2, path3)
|
||||
self.assertNotEqual(path1, path3)
|
||||
|
||||
def test_pagination(self):
|
||||
"""Test library pagination with fake book data"""
|
||||
# Create fake books (20 books to ensure multiple pages)
|
||||
fake_books = []
|
||||
for i in range(20):
|
||||
fake_books.append({
|
||||
'path': f'/fake/path/book_{i}.epub',
|
||||
'title': f'Book Title {i}',
|
||||
'author': f'Author {i}',
|
||||
'filename': f'book_{i}.epub',
|
||||
'cover_data': None,
|
||||
'cover_path': None
|
||||
})
|
||||
|
||||
# Create library with 6 books per page
|
||||
library = LibraryManager(
|
||||
library_path=str(self.library_path),
|
||||
page_size=(800, 1200),
|
||||
books_per_page=6
|
||||
)
|
||||
library.books = fake_books
|
||||
|
||||
# Test initial state
|
||||
self.assertEqual(library.current_page, 0)
|
||||
self.assertEqual(library.get_total_pages(), 4) # 20 books / 6 per page = 4 pages
|
||||
|
||||
# Test creating table for first page
|
||||
table = library.create_library_table()
|
||||
self.assertIsNotNone(table)
|
||||
# 6 books = 3 pairs = 6 rows (3 cover rows + 3 detail rows)
|
||||
body_rows = list(table.body_rows())
|
||||
self.assertEqual(len(body_rows), 6)
|
||||
|
||||
# Test navigation to next page
|
||||
self.assertTrue(library.next_page())
|
||||
self.assertEqual(library.current_page, 1)
|
||||
|
||||
# Create table for second page
|
||||
table = library.create_library_table()
|
||||
body_rows = list(table.body_rows())
|
||||
self.assertEqual(len(body_rows), 6) # Still 6 books on page 2
|
||||
|
||||
# Test navigation to last page
|
||||
library.set_page(3)
|
||||
self.assertEqual(library.current_page, 3)
|
||||
table = library.create_library_table()
|
||||
body_rows = list(table.body_rows())
|
||||
# Page 4 has 2 books (20 - 18 = 2) = 1 pair = 2 rows
|
||||
self.assertEqual(len(body_rows), 2)
|
||||
|
||||
# Test can't go beyond last page
|
||||
self.assertFalse(library.next_page())
|
||||
self.assertEqual(library.current_page, 3)
|
||||
|
||||
# Test navigation to previous page
|
||||
self.assertTrue(library.previous_page())
|
||||
self.assertEqual(library.current_page, 2)
|
||||
|
||||
# Test navigation to first page
|
||||
library.set_page(0)
|
||||
self.assertEqual(library.current_page, 0)
|
||||
|
||||
# Test can't go before first page
|
||||
self.assertFalse(library.previous_page())
|
||||
self.assertEqual(library.current_page, 0)
|
||||
|
||||
# Test invalid page number
|
||||
self.assertFalse(library.set_page(-1))
|
||||
self.assertFalse(library.set_page(100))
|
||||
self.assertEqual(library.current_page, 0) # Should stay on current page
|
||||
|
||||
library.cleanup()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user