""" Unit tests for library interaction and tap detection. These tests demonstrate the issue with interactive images in the library and verify that tap detection works correctly. """ import unittest from pathlib import Path from dreader import LibraryManager class TestLibraryInteraction(unittest.TestCase): """Test library browsing and tap interaction""" def setUp(self): """Set up test library""" self.library_path = Path(__file__).parent / 'data' / 'library-epub' self.library = LibraryManager( library_path=str(self.library_path), page_size=(800, 1200) ) def tearDown(self): """Clean up""" self.library.cleanup() def test_library_scan(self): """Test that library scanning finds books""" books = self.library.scan_library() # Should find at least one book self.assertGreater(len(books), 0, "Library should contain at least one book") # Each book should have required fields for book in books: self.assertIn('path', book) self.assertIn('title', book) self.assertIn('filename', book) def test_library_table_creation(self): """Test that library table can be created""" books = self.library.scan_library() table = self.library.create_library_table() # Table should exist self.assertIsNotNone(table) # Table should have body rows matching book count body_rows = list(table.body_rows()) self.assertEqual(len(body_rows), len(books)) def test_library_rendering(self): """Test that library can be rendered to image""" self.library.scan_library() self.library.create_library_table() # Render library image = self.library.render_library() # Image should be created with correct size self.assertIsNotNone(image) self.assertEqual(image.size, self.library.page_size) def test_tap_detection_first_book(self): """Test that tapping on first book row selects it The entire row is interactive, so tapping anywhere in the row (not just on the cover image) will select the book. """ books = self.library.scan_library() self.library.create_library_table() self.library.render_library() # Tap anywhere in the first book's row # Based on layout: padding 30px, caption ~40px, first row starts at ~70px selected_path = self.library.handle_library_tap(x=100, y=100) # Should select the first book self.assertIsNotNone(selected_path, "Tap should select a book") self.assertEqual(selected_path, books[0]['path'], "Should select first book") def test_tap_detection_second_book(self): """Test that tapping on second book selects it""" books = self.library.scan_library() if len(books) < 2: self.skipTest("Need at least 2 books for this test") self.library.create_library_table() self.library.render_library() # Tap in the region of the second book # Row height is ~180px, so second book is at ~70 + 180 = 250px selected_path = self.library.handle_library_tap(x=400, y=250) # Should select the second book self.assertIsNotNone(selected_path, "Tap should select a book") self.assertEqual(selected_path, books[1]['path'], "Should select second book") def test_tap_outside_table(self): """Test that tapping outside table returns None""" self.library.scan_library() self.library.create_library_table() self.library.render_library() # Tap outside the table area (far right) selected_path = self.library.handle_library_tap(x=1000, y=100) # Should not select anything self.assertIsNone(selected_path, "Tap outside table should not select anything") def test_tap_above_table(self): """Test that tapping in caption area returns None""" self.library.scan_library() self.library.create_library_table() self.library.render_library() # Tap in caption area (above first row) selected_path = self.library.handle_library_tap(x=400, y=40) # Should not select anything self.assertIsNone(selected_path, "Tap in caption should not select anything") def test_tap_below_last_book(self): """Test that tapping below all books returns None""" books = self.library.scan_library() self.library.create_library_table() self.library.render_library() # Tap way below the last book # With 5 books and row height 180px: ~70 + (5 * 180) = 970px selected_path = self.library.handle_library_tap(x=400, y=1100) # Should not select anything self.assertIsNone(selected_path, "Tap below last book should not select anything") def test_multiple_taps(self): """Test that multiple taps work correctly""" books = self.library.scan_library() if len(books) < 3: self.skipTest("Need at least 3 books for this test") self.library.create_library_table() self.library.render_library() # Tap first book (row 0: y=60-180) 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) self.assertEqual(path2, books[1]['path']) # Tap third book (row 2: y=302-422) path3 = self.library.handle_library_tap(x=400, y=360) self.assertEqual(path3, books[2]['path']) # All should be different self.assertNotEqual(path1, path2) self.assertNotEqual(path2, path3) self.assertNotEqual(path1, path3) if __name__ == '__main__': unittest.main()