test_bytecode_cache.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. from jinja2 import Environment
  4. from jinja2.bccache import Bucket
  5. from jinja2.bccache import FileSystemBytecodeCache
  6. from jinja2.bccache import MemcachedBytecodeCache
  7. from jinja2.exceptions import TemplateNotFound
  8. @pytest.fixture
  9. def env(package_loader, tmp_path):
  10. bytecode_cache = FileSystemBytecodeCache(str(tmp_path))
  11. return Environment(loader=package_loader, bytecode_cache=bytecode_cache)
  12. class TestByteCodeCache(object):
  13. def test_simple(self, env):
  14. tmpl = env.get_template("test.html")
  15. assert tmpl.render().strip() == "BAR"
  16. pytest.raises(TemplateNotFound, env.get_template, "missing.html")
  17. class MockMemcached(object):
  18. class Error(Exception):
  19. pass
  20. key = None
  21. value = None
  22. timeout = None
  23. def get(self, key):
  24. return self.value
  25. def set(self, key, value, timeout=None):
  26. self.key = key
  27. self.value = value
  28. self.timeout = timeout
  29. def get_side_effect(self, key):
  30. raise self.Error()
  31. def set_side_effect(self, *args):
  32. raise self.Error()
  33. class TestMemcachedBytecodeCache(object):
  34. def test_dump_load(self):
  35. memcached = MockMemcached()
  36. m = MemcachedBytecodeCache(memcached)
  37. b = Bucket(None, "key", "")
  38. b.code = "code"
  39. m.dump_bytecode(b)
  40. assert memcached.key == "jinja2/bytecode/key"
  41. b = Bucket(None, "key", "")
  42. m.load_bytecode(b)
  43. assert b.code == "code"
  44. def test_exception(self):
  45. memcached = MockMemcached()
  46. memcached.get = memcached.get_side_effect
  47. memcached.set = memcached.set_side_effect
  48. m = MemcachedBytecodeCache(memcached)
  49. b = Bucket(None, "key", "")
  50. b.code = "code"
  51. m.dump_bytecode(b)
  52. m.load_bytecode(b)
  53. m.ignore_memcache_errors = False
  54. with pytest.raises(MockMemcached.Error):
  55. m.dump_bytecode(b)
  56. with pytest.raises(MockMemcached.Error):
  57. m.load_bytecode(b)