/tests/regressiontests/templates/loaders.py

https://github.com/eric-brechemier/django · Python · 148 lines · 106 code · 27 blank · 15 comment · 2 complexity · 78a28236ccde140e4e375bccad0a2289 MD5 · raw file

  1. """
  2. Test cases for the template loaders
  3. Note: This test requires setuptools!
  4. """
  5. from django.conf import settings
  6. if __name__ == '__main__':
  7. settings.configure()
  8. import unittest
  9. import sys
  10. import pkg_resources
  11. import imp
  12. import StringIO
  13. import os.path
  14. import warnings
  15. from django.template import TemplateDoesNotExist, Context
  16. from django.template.loaders.eggs import load_template_source as lts_egg
  17. from django.template.loaders.eggs import Loader as EggLoader
  18. from django.template import loader
  19. # Mock classes and objects for pkg_resources functions.
  20. class MockProvider(pkg_resources.NullProvider):
  21. def __init__(self, module):
  22. pkg_resources.NullProvider.__init__(self, module)
  23. self.module = module
  24. def _has(self, path):
  25. return path in self.module._resources
  26. def _isdir(self,path):
  27. return False
  28. def get_resource_stream(self, manager, resource_name):
  29. return self.module._resources[resource_name]
  30. def _get(self, path):
  31. return self.module._resources[path].read()
  32. class MockLoader(object):
  33. pass
  34. def create_egg(name, resources):
  35. """
  36. Creates a mock egg with a list of resources.
  37. name: The name of the module.
  38. resources: A dictionary of resources. Keys are the names and values the data.
  39. """
  40. egg = imp.new_module(name)
  41. egg.__loader__ = MockLoader()
  42. egg._resources = resources
  43. sys.modules[name] = egg
  44. class DeprecatedEggLoaderTest(unittest.TestCase):
  45. "Test the deprecated load_template_source interface to the egg loader"
  46. def setUp(self):
  47. pkg_resources._provider_factories[MockLoader] = MockProvider
  48. self.empty_egg = create_egg("egg_empty", {})
  49. self.egg_1 = create_egg("egg_1", {
  50. os.path.normcase('templates/y.html') : StringIO.StringIO("y"),
  51. os.path.normcase('templates/x.txt') : StringIO.StringIO("x"),
  52. })
  53. self._old_installed_apps = settings.INSTALLED_APPS
  54. settings.INSTALLED_APPS = []
  55. warnings.simplefilter("ignore", PendingDeprecationWarning)
  56. def tearDown(self):
  57. settings.INSTALLED_APPS = self._old_installed_apps
  58. warnings.resetwarnings()
  59. def test_existing(self):
  60. "A template can be loaded from an egg"
  61. settings.INSTALLED_APPS = ['egg_1']
  62. contents, template_name = lts_egg("y.html")
  63. self.assertEqual(contents, "y")
  64. self.assertEqual(template_name, "egg:egg_1:templates/y.html")
  65. class EggLoaderTest(unittest.TestCase):
  66. def setUp(self):
  67. pkg_resources._provider_factories[MockLoader] = MockProvider
  68. self.empty_egg = create_egg("egg_empty", {})
  69. self.egg_1 = create_egg("egg_1", {
  70. os.path.normcase('templates/y.html') : StringIO.StringIO("y"),
  71. os.path.normcase('templates/x.txt') : StringIO.StringIO("x"),
  72. })
  73. self._old_installed_apps = settings.INSTALLED_APPS
  74. settings.INSTALLED_APPS = []
  75. def tearDown(self):
  76. settings.INSTALLED_APPS = self._old_installed_apps
  77. def test_empty(self):
  78. "Loading any template on an empty egg should fail"
  79. settings.INSTALLED_APPS = ['egg_empty']
  80. egg_loader = EggLoader()
  81. self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "not-existing.html")
  82. def test_non_existing(self):
  83. "Template loading fails if the template is not in the egg"
  84. settings.INSTALLED_APPS = ['egg_1']
  85. egg_loader = EggLoader()
  86. self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "not-existing.html")
  87. def test_existing(self):
  88. "A template can be loaded from an egg"
  89. settings.INSTALLED_APPS = ['egg_1']
  90. egg_loader = EggLoader()
  91. contents, template_name = egg_loader.load_template_source("y.html")
  92. self.assertEqual(contents, "y")
  93. self.assertEqual(template_name, "egg:egg_1:templates/y.html")
  94. def test_not_installed(self):
  95. "Loading an existent template from an egg not included in INSTALLED_APPS should fail"
  96. settings.INSTALLED_APPS = []
  97. egg_loader = EggLoader()
  98. self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "y.html")
  99. class CachedLoader(unittest.TestCase):
  100. def setUp(self):
  101. self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
  102. settings.TEMPLATE_LOADERS = (
  103. ('django.template.loaders.cached.Loader', (
  104. 'django.template.loaders.filesystem.Loader',
  105. )
  106. ),
  107. )
  108. def tearDown(self):
  109. settings.TEMPLATE_LOADERS = self.old_TEMPLATE_LOADERS
  110. def test_templatedir_caching(self):
  111. "Check that the template directories form part of the template cache key. Refs #13573"
  112. # Retrive a template specifying a template directory to check
  113. t1, name = loader.find_template('test.html', (os.path.join(os.path.dirname(__file__), 'templates', 'first'),))
  114. # Now retrieve the same template name, but from a different directory
  115. t2, name = loader.find_template('test.html', (os.path.join(os.path.dirname(__file__), 'templates', 'second'),))
  116. # The two templates should not have the same content
  117. self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
  118. if __name__ == "__main__":
  119. unittest.main()