import tempfile import unittest from pathlib import Path from unittest.mock import Mock import pymupdf from copienator.commands.page_splitter import PDFPreviewer, PAGE_SPLITTER_KB class ReversePagesTests(unittest.TestCase): def test_reverse_restarts_with_fresh_settings_and_exports_reversed_pages(self): with tempfile.TemporaryDirectory() as temporary: source = Path(temporary) / "copy.pdf" with pymupdf.open() as document: for index in range(3): page = document.new_page(width=200 + 20 * index, height=300) page.insert_text((30, 30), f"Page {index + 1}") document.save(source) original = source.read_bytes() preview = PDFPreviewer.__new__(PDFPreviewer) preview.doc = pymupdf.open(source) self.addCleanup(lambda: None if preview.doc.is_closed else preview.doc.close()) preview.current_page_index = 2 preview.page_settings = [{"keep": "none"}, {"keep": "left"}] preview.current_rotation = 180 preview.file_rotation = 180 preview.global_rotation = 180 preview.processing = False preview.load_page = Mock() preview.reverse_pages() self.assertEqual([page.get_text().strip() for page in preview.doc], ["Page 3", "Page 2", "Page 1"]) self.assertEqual(preview.current_page_index, 0) self.assertEqual(preview.page_settings, []) self.assertEqual(preview.current_line_x, 120) self.assertEqual(preview.current_rotation, 0) self.assertEqual((preview.file_rotation, preview.global_rotation), (180, 180)) preview.load_page.assert_called_once_with() self.assertEqual(source.read_bytes(), original) preview.reverse_pages() self.assertEqual([page.get_text().strip() for page in preview.doc], ["Page 1", "Page 2", "Page 3"]) preview.reverse_pages() preview.base_name = "copy" preview.split_dir = Path(temporary) / "split" preview.reorder_dir = Path(temporary) / "reorder" preview.final_file = Path(temporary) / "result.pdf" preview.output_dir = None preview.page_settings = [ {"keep": "as_is", "rotation": 0, "line_x": page.rect.width / 2} for page in preview.doc ] preview.split_pdf() preview.reorder_pdfs() preview.concate_files() with pymupdf.open(preview.final_file) as result: self.assertEqual([page.get_text().strip() for page in result], ["Page 3", "Page 2", "Page 1"]) def test_single_page_can_restart_and_processing_ignores_shortcut(self): preview = PDFPreviewer.__new__(PDFPreviewer) preview.doc = pymupdf.open() self.addCleanup(preview.doc.close) preview.doc.new_page() preview.processing = True preview.load_page = Mock() preview.reverse_pages() preview.load_page.assert_not_called() preview.processing = False preview.reverse_pages() self.assertEqual(preview.current_page_index, 0) self.assertEqual(preview.page_settings, []) preview.load_page.assert_called_once_with() def test_shortcut_available_with_personal_configuration(self): self.assertEqual(PAGE_SPLITTER_KB["reverse_pages"], "i")