diff --git a/mglib/pdftk.py b/mglib/pdftk.py index 4840d85..1463b68 100644 --- a/mglib/pdftk.py +++ b/mglib/pdftk.py @@ -31,6 +31,8 @@ def cat_ranges_for_reorder(page_count, new_order): [4, 2, 3, 1] """ + if len(new_order) != page_count: + raise ValueError("Not enough pages specified") results = [] # key = page_num # value = page_order @@ -53,7 +55,7 @@ def cat_ranges_for_delete(page_count, page_numbers): """ Returns a list of integers. Each number in the list is the number of page which will 'stay' in document. - In other words, it returns a list with deleted pages. + In other words, it returns a list with not deleted pages. Examples: @@ -83,7 +85,7 @@ def cat_ranges_for_delete(page_count, page_numbers): for check in page_numbers: if not isinstance(check, int): - err_msg = "page_numbers must be a list of strings" + err_msg = "page_numbers must be a list of ints" raise ValueError(err_msg) for number in range(1, page_count + 1): @@ -112,7 +114,7 @@ def split_ranges(total, after=False, before=False): (it means, by default, all pages are inserted at the end of the doc) """ if after and not before: - if not isinstance(after, int): + if not type(after) == int: raise ValueError( "argument 'after' is supposed to be an int" ) @@ -121,7 +123,7 @@ def split_ranges(total, after=False, before=False): return list1, list2 if not after and before: - if not isinstance(before, int): + if not type(before) == int: raise ValueError( "argument 'before' is supposed to be an int" ) diff --git a/test/test_pdftk.py b/test/test_pdftk.py new file mode 100644 index 0000000..cfb5462 --- /dev/null +++ b/test/test_pdftk.py @@ -0,0 +1,145 @@ +import os +import unittest +from unittest import mock +from mglib import pdftk +from mglib.conf import settings +from mglib.runcmd import run + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + +DATA_DIR = os.path.join(BASE_DIR, "data") + + +class TestPdfLib(unittest.TestCase): + def test_ranges_for_reorder(self): + actual = pdftk.cat_ranges_for_reorder(4, [ + {"page_order": 1, "page_num": 4}, + {"page_order": 2, "page_num": 3}, + {"page_order": 3, "page_num": 2}, + {"page_order": 4, "page_num": 1} + ]) + expected = [4,3,2,1] + assert expected == actual + + self.assertRaises(ValueError, pdftk.cat_ranges_for_reorder, 2, []) + self.assertRaises(KeyError, pdftk.cat_ranges_for_reorder, 2, [ + {"page_order": 3, "page_num": 4}, + {"page_order": 5, "page_num": 6} + ]) + + def test_delete_pages(self): + input_file = os.path.join(DATA_DIR, "berlin.pdf") + output_file = os.path.join(DATA_DIR, "berlin2.pdf") + + with mock.patch("mglib.pdftk.run") as run_func: + pdftk.delete_pages(input_file, output_file, [1]) + run_func.assert_called() + run_func.assert_called_with( + [settings.BINARY_PDFTK, input_file, "cat", "2", "output", output_file] + ) + + def test_cat_ranges_for_delete(self): + page_count = 22 + page_numbers = range(1, 23) + + actual = pdftk.cat_ranges_for_delete(page_count, [21]) + expected = list(page_numbers) + expected.remove(21) + assert actual == expected + + actual = pdftk.cat_ranges_for_delete(page_count, [1]) + expected = list(page_numbers) + expected.remove(1) + assert actual == expected + + actual = pdftk.cat_ranges_for_delete(page_count, [1, 7, 10]) + expected = list(page_numbers) + expected.remove(1) + expected.remove(7) + expected.remove(10) + assert actual == expected + + self.assertRaises(ValueError, pdftk.cat_ranges_for_delete, page_count, ["1"]) + + def test_split_ranges(self): + page_count = 9 + page_numbers = list(range(1, 10)) + + self.assertRaises(ValueError, pdftk.split_ranges, 9, after="a", before=False) + self.assertRaises(ValueError, pdftk.split_ranges, 9, after=False, before=True) + + actual1, actual2 = pdftk.split_ranges(page_count, 1, False) + expected1 = [1] + expected2 = [2, 3, 4, 5, 6, 7, 8, 9] + assert actual1 == expected1 + assert actual2 == expected2 + + actual1, actual2 = pdftk.split_ranges(page_count, False, 2) + expected1 = [1] + expected2 = [2, 3, 4, 5, 6, 7, 8, 9] + assert actual1 == expected1 + assert actual2 == expected2 + + actual1, actual2 = pdftk.split_ranges(page_count) + expected1 = list(range(1, page_count + 1)) + expected2 = [] + assert actual1 == expected1 + assert actual2 == expected2 + + def test_reorder_pages(self): + input_file = os.path.join(DATA_DIR, "berlin.pdf") + output_file = os.path.join(DATA_DIR, "berlin2.pdf") + new_order = [ + {'page_num': 2, 'page_order': 1}, + {'page_num': 1, 'page_order': 2}, + ] + + with mock.patch("mglib.pdftk.run") as run_func: + pdftk.reorder_pages(input_file, output_file, new_order) + run_func.assert_called() + run_func.assert_called_with( + [settings.BINARY_PDFTK, input_file, "cat", "2", "1", "output", output_file] + ) + + def test_paste_pages_into_existing_doc(self): + input_file = os.path.join(DATA_DIR, "berlin.pdf") + output_file = os.path.join(DATA_DIR, "berlin2.pdf") + datalist = [] + + with mock.patch("mglib.pdftk.run") as run_func: + pdftk.paste_pages_into_existing_doc(input_file, output_file, datalist) + run_func.assert_called() + run_func.assert_called_with( + [settings.BINARY_PDFTK, "A=" + input_file, "cat", "A1", "A2", "output", output_file] + ) + + datalist = [{"src": input_file, "page_nums": "34"}] + + with mock.patch("mglib.pdftk.run") as run_func: + pdftk.paste_pages_into_existing_doc(input_file, output_file, datalist, 1) + run_func.assert_called() + run_func.assert_called_with( + [settings.BINARY_PDFTK, "A=" + input_file, "B=" + input_file, "cat", "A1", "B3", + "B4", "A2", "output", output_file] + ) + def test_paste_pages(self): + input_file = os.path.join(DATA_DIR, "berlin.pdf") + output_file = os.path.join(DATA_DIR, "berlin2.pdf") + datalist = [] + + with mock.patch("mglib.pdftk.run") as run_func: + pdftk.paste_pages(input_file, output_file, datalist, False) + run_func.assert_called() + run_func.assert_called_with( + [settings.BINARY_PDFTK, "A=" + input_file, "cat", "A1", "A2", "output", output_file] + ) + + datalist = [{"src": input_file, "page_nums": "34"}] + + with mock.patch("mglib.pdftk.run") as run_func: + pdftk.paste_pages(input_file, output_file, datalist) + run_func.assert_called() + run_func.assert_called_with( + [settings.BINARY_PDFTK, "A=" + input_file, "cat", "A3", "A4", + "output", output_file] + )