Source code for tests.djvu_tests

#!/usr/bin/env python3
"""Unit tests for tools.djvu.py."""

#
# (C) Pywikibot team, 2015-2024
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations

import os
import subprocess
import unittest
from contextlib import suppress

from pywikibot.tools.djvu import DjVuFile
from tests import create_path_func, join_data_path
from tests.aspects import TestCase
from tests.utils import skipping


join_djvu_data_path = create_path_func(join_data_path, 'djvu')
file_djvu = join_djvu_data_path('myfilé.djvu')  # test non-ASCII name


[docs] class TestDjVuFile(TestCase): """Test DjVuFile class.""" net = False file_djvu_wo_text = join_djvu_data_path('myfile_wo_text.djvu') test_txt = 'A file with non-ASCII characters, \nlike é or ç'
[docs] @classmethod def setUpClass(cls): """Skip if djvulibre library not installed.""" super().setUpClass() with skipping(OSError, msg='djvulibre library not installed.'): dp = subprocess.Popen(['djvudump'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) dp.communicate()
[docs] def test_number_of_images(self): """Test page number generator.""" djvu = DjVuFile(file_djvu) self.assertEqual(djvu.number_of_images(), 4)
[docs] def test_page_info(self): """Test page info retrieval.""" djvu = DjVuFile(file_djvu) self.assertEqual(djvu.page_info(1), ('{myfile.djvu}', ('1092x221', 600)))
[docs] def test_get_most_common_info(self): """Test that most common (size, dpi) are returned.""" djvu = DjVuFile(file_djvu) self.assertEqual(djvu.get_most_common_info(), ('1092x221', 600))
[docs] def test_has_text(self): """Test if djvu file contains text.""" djvu = DjVuFile(file_djvu) self.assertTrue(djvu.has_text()) djvu = DjVuFile(self.file_djvu_wo_text) self.assertFalse(djvu.has_text())
[docs] def test_get_existing_page_number(self): """Test text is returned for existing page number.""" djvu = DjVuFile(file_djvu) self.assertTrue(djvu.has_text()) txt = djvu.get_page(1) self.assertEqual(txt, self.test_txt)
[docs] def test_get_not_existing_page_number(self): """Test error is raised if djvu page number is out of range.""" djvu = DjVuFile(file_djvu) self.assertTrue(djvu.has_text()) with self.assertRaises(ValueError): djvu.get_page(100)
[docs] def test_get_not_existing_page(self): """Test error is raised if djvu file has no text.""" djvu = DjVuFile(self.file_djvu_wo_text) self.assertFalse(djvu.has_text()) with self.assertRaises(ValueError): djvu.get_page(1)
[docs] def test_whiten_not_existing_page_number(self): """Test djvu page cannot be whitend if page number is out of range.""" djvu = DjVuFile(file_djvu) with self.assertRaises(ValueError): djvu.whiten_page(100)
[docs] def test_delete_not_existing_page_number(self): """Test djvu page cannot be deleted if page number is out of range.""" djvu = DjVuFile(file_djvu) with self.assertRaises(ValueError): djvu.delete_page(100)
[docs] def test_clear_cache(self): """Test if djvu file contains text.""" djvu = DjVuFile(file_djvu) self.assertTrue(djvu.has_text()) djvu._has_text = False self.assertFalse(djvu.has_text()) self.assertTrue(djvu.has_text(force=True))
[docs] class TestDjVuFileWithoutLib(TestCase): """Test DjVuFile class without library installed.""" net = False file_djvu_not_existing = join_djvu_data_path('not_existing.djvu')
[docs] def test_file_existence(self): """Test file existence checks.""" djvu = DjVuFile(file_djvu) self.assertEqual(os.path.abspath(file_djvu), djvu.file) with self.assertRaises(IOError): DjVuFile(self.file_djvu_not_existing)
[docs] def test_str_method(self): """Test __str__() method.""" djvu = DjVuFile(file_djvu) expected = f"DjVuFile('{file_djvu}')" self.assertEqual(str(djvu), expected)
[docs] def test_repr_method(self): """Test __repr__() method.""" djvu = DjVuFile(file_djvu) expected = f"pywikibot.tools.djvu.DjVuFile('{file_djvu}')" self.assertEqual(repr(djvu), expected)
if __name__ == '__main__': with suppress(SystemExit): unittest.main()