test_toc.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from io import open
  2. import unittest
  3. import re
  4. import toc
  5. from pelican.readers import MarkdownReader
  6. from pelican.contents import Article
  7. from pelican.tests.support import get_settings
  8. class TestToCGeneration(unittest.TestCase):
  9. @classmethod
  10. def setUpClass(cls):
  11. toc.init_default_config(None)
  12. cls.settings = get_settings()
  13. cls.md_reader = MarkdownReader(cls.settings)
  14. def setUp(self):
  15. # have to reset the default, because shallow copies
  16. self.settings['TOC']['TOC_HEADERS'] = '^h[1-6]'
  17. self.settings['TOC']['TOC_RUN'] = 'true'
  18. def _handle_article_generation(self, path):
  19. content, metadata = self.md_reader.read(path)
  20. return Article(content=content, metadata=metadata)
  21. def _generate_toc(self, article_path, expected_path):
  22. result = self._handle_article_generation(article_path)
  23. toc.generate_toc(result)
  24. expected = ""
  25. with open(expected_path, 'r') as f:
  26. expected = f.read()
  27. return result, expected
  28. def test_toc_generation(self):
  29. result, expected = self._generate_toc(
  30. "test_data/article_with_headers.md",
  31. "test_data/article_with_headers_toc.html"
  32. )
  33. self.assertEqual(result.toc, expected)
  34. def test_toc_generation_nonascii(self):
  35. result, expected = self._generate_toc(
  36. "test_data/article_with_headers_nonascii.md",
  37. "test_data/article_with_headers_toc_nonascii.html"
  38. )
  39. self.assertEqual(result.toc, expected)
  40. def test_toc_generation_exclude_small_headers(self):
  41. self.settings['TOC']['TOC_HEADERS'] = '^h[1-3]'
  42. result, expected = self._generate_toc(
  43. "test_data/article_with_headers_exclude_small_headers.md",
  44. "test_data/article_with_headers_toc_exclude_small_headers.html"
  45. )
  46. self.assertEqual(result.toc, expected)
  47. def test_toc_generation_exclude_small_headers_metadata(self):
  48. result, expected = self._generate_toc(
  49. "test_data/article_with_headers_exclude_small_headers_metadata.md",
  50. "test_data/article_with_headers_toc_exclude_small_headers.html"
  51. )
  52. self.assertEqual(result.toc, expected)
  53. def test_bad_TOC_HEADERS(self):
  54. self.settings['TOC']['TOC_HEADERS'] = '^[1-'
  55. with self.assertRaises(re.error):
  56. self._generate_toc(
  57. "test_data/article_with_headers_exclude_small_headers.md",
  58. "test_data/article_with_headers_toc_exclude_small_headers.html"
  59. )
  60. def test_no_toc_generation(self):
  61. article_without_headers_path = "test_data/article_without_headers.md"
  62. article_without_headers = self._handle_article_generation(
  63. article_without_headers_path)
  64. toc.generate_toc(article_without_headers)
  65. with self.assertRaises(AttributeError):
  66. self.assertIsNone(article_without_headers.toc)
  67. def test_no_toc_generation_metadata(self):
  68. article_without_headers_path = "test_data/article_with_headers_metadata.md"
  69. article_without_headers = self._handle_article_generation(
  70. article_without_headers_path)
  71. toc.generate_toc(article_without_headers)
  72. with self.assertRaises(AttributeError):
  73. self.assertIsNone(article_without_headers.toc)
  74. if __name__ == "__main__":
  75. unittest.main()