PageRenderTime 38ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/regressiontests/templates/loaders.py

https://code.google.com/p/mango-py/
Python | 177 lines | 128 code | 34 blank | 15 comment | 2 complexity | 4e13d619c8f76186dcb49d020a2f8530 MD5 | raw file
Possible License(s): BSD-3-Clause
  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 sys
  9. import pkg_resources
  10. import imp
  11. import StringIO
  12. import os.path
  13. import warnings
  14. from django.template import TemplateDoesNotExist, Context
  15. from django.template.loaders.eggs import load_template_source as lts_egg
  16. from django.template.loaders.eggs import Loader as EggLoader
  17. from django.template import loader
  18. from django.test.utils import get_warnings_state, restore_warnings_state
  19. from django.utils import unittest
  20. # Mock classes and objects for pkg_resources functions.
  21. class MockProvider(pkg_resources.NullProvider):
  22. def __init__(self, module):
  23. pkg_resources.NullProvider.__init__(self, module)
  24. self.module = module
  25. def _has(self, path):
  26. return path in self.module._resources
  27. def _isdir(self,path):
  28. return False
  29. def get_resource_stream(self, manager, resource_name):
  30. return self.module._resources[resource_name]
  31. def _get(self, path):
  32. return self.module._resources[path].read()
  33. class MockLoader(object):
  34. pass
  35. def create_egg(name, resources):
  36. """
  37. Creates a mock egg with a list of resources.
  38. name: The name of the module.
  39. resources: A dictionary of resources. Keys are the names and values the data.
  40. """
  41. egg = imp.new_module(name)
  42. egg.__loader__ = MockLoader()
  43. egg._resources = resources
  44. sys.modules[name] = egg
  45. class DeprecatedEggLoaderTest(unittest.TestCase):
  46. "Test the deprecated load_template_source interface to the egg loader"
  47. def setUp(self):
  48. pkg_resources._provider_factories[MockLoader] = MockProvider
  49. self.empty_egg = create_egg("egg_empty", {})
  50. self.egg_1 = create_egg("egg_1", {
  51. os.path.normcase('templates/y.html') : StringIO.StringIO("y"),
  52. os.path.normcase('templates/x.txt') : StringIO.StringIO("x"),
  53. })
  54. self._old_installed_apps = settings.INSTALLED_APPS
  55. settings.INSTALLED_APPS = []
  56. self._warnings_state = get_warnings_state()
  57. warnings.filterwarnings("ignore", category=DeprecationWarning,
  58. module='django.template.loaders.eggs')
  59. def tearDown(self):
  60. settings.INSTALLED_APPS = self._old_installed_apps
  61. restore_warnings_state(self._warnings_state)
  62. def test_existing(self):
  63. "A template can be loaded from an egg"
  64. settings.INSTALLED_APPS = ['egg_1']
  65. contents, template_name = lts_egg("y.html")
  66. self.assertEqual(contents, "y")
  67. self.assertEqual(template_name, "egg:egg_1:templates/y.html")
  68. class EggLoaderTest(unittest.TestCase):
  69. def setUp(self):
  70. pkg_resources._provider_factories[MockLoader] = MockProvider
  71. self.empty_egg = create_egg("egg_empty", {})
  72. self.egg_1 = create_egg("egg_1", {
  73. os.path.normcase('templates/y.html') : StringIO.StringIO("y"),
  74. os.path.normcase('templates/x.txt') : StringIO.StringIO("x"),
  75. })
  76. self._old_installed_apps = settings.INSTALLED_APPS
  77. settings.INSTALLED_APPS = []
  78. def tearDown(self):
  79. settings.INSTALLED_APPS = self._old_installed_apps
  80. def test_empty(self):
  81. "Loading any template on an empty egg should fail"
  82. settings.INSTALLED_APPS = ['egg_empty']
  83. egg_loader = EggLoader()
  84. self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "not-existing.html")
  85. def test_non_existing(self):
  86. "Template loading fails if the template is not in the egg"
  87. settings.INSTALLED_APPS = ['egg_1']
  88. egg_loader = EggLoader()
  89. self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "not-existing.html")
  90. def test_existing(self):
  91. "A template can be loaded from an egg"
  92. settings.INSTALLED_APPS = ['egg_1']
  93. egg_loader = EggLoader()
  94. contents, template_name = egg_loader.load_template_source("y.html")
  95. self.assertEqual(contents, "y")
  96. self.assertEqual(template_name, "egg:egg_1:templates/y.html")
  97. def test_not_installed(self):
  98. "Loading an existent template from an egg not included in INSTALLED_APPS should fail"
  99. settings.INSTALLED_APPS = []
  100. egg_loader = EggLoader()
  101. self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "y.html")
  102. class CachedLoader(unittest.TestCase):
  103. def setUp(self):
  104. self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
  105. settings.TEMPLATE_LOADERS = (
  106. ('django.template.loaders.cached.Loader', (
  107. 'django.template.loaders.filesystem.Loader',
  108. )
  109. ),
  110. )
  111. def tearDown(self):
  112. settings.TEMPLATE_LOADERS = self.old_TEMPLATE_LOADERS
  113. def test_templatedir_caching(self):
  114. "Check that the template directories form part of the template cache key. Refs #13573"
  115. # Retrive a template specifying a template directory to check
  116. t1, name = loader.find_template('test.html', (os.path.join(os.path.dirname(__file__), 'templates', 'first'),))
  117. # Now retrieve the same template name, but from a different directory
  118. t2, name = loader.find_template('test.html', (os.path.join(os.path.dirname(__file__), 'templates', 'second'),))
  119. # The two templates should not have the same content
  120. self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
  121. class RenderToStringTest(unittest.TestCase):
  122. def setUp(self):
  123. self._old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
  124. settings.TEMPLATE_DIRS = (
  125. os.path.join(os.path.dirname(__file__), 'templates'),
  126. )
  127. def tearDown(self):
  128. settings.TEMPLATE_DIRS = self._old_TEMPLATE_DIRS
  129. def test_basic(self):
  130. self.assertEqual(loader.render_to_string('test_context.html'), 'obj:')
  131. def test_basic_context(self):
  132. self.assertEqual(loader.render_to_string('test_context.html',
  133. {'obj': 'test'}), 'obj:test')
  134. def test_existing_context_kept_clean(self):
  135. context = Context({'obj': 'before'})
  136. output = loader.render_to_string('test_context.html', {'obj': 'after'},
  137. context_instance=context)
  138. self.assertEqual(output, 'obj:after')
  139. self.assertEqual(context['obj'], 'before')
  140. if __name__ == "__main__":
  141. unittest.main()