| import pytest |
| |
| from jinja2 import Environment |
| from jinja2.bccache import Bucket |
| from jinja2.bccache import FileSystemBytecodeCache |
| from jinja2.bccache import MemcachedBytecodeCache |
| from jinja2.exceptions import TemplateNotFound |
| |
| |
| @pytest.fixture |
| def env(package_loader, tmp_path): |
| bytecode_cache = FileSystemBytecodeCache(str(tmp_path)) |
| return Environment(loader=package_loader, bytecode_cache=bytecode_cache) |
| |
| |
| class TestByteCodeCache: |
| def test_simple(self, env): |
| tmpl = env.get_template("test.html") |
| assert tmpl.render().strip() == "BAR" |
| pytest.raises(TemplateNotFound, env.get_template, "missing.html") |
| |
| |
| class MockMemcached: |
| class Error(Exception): |
| pass |
| |
| key = None |
| value = None |
| timeout = None |
| |
| def get(self, key): |
| return self.value |
| |
| def set(self, key, value, timeout=None): |
| self.key = key |
| self.value = value |
| self.timeout = timeout |
| |
| def get_side_effect(self, key): |
| raise self.Error() |
| |
| def set_side_effect(self, *args): |
| raise self.Error() |
| |
| |
| class TestMemcachedBytecodeCache: |
| def test_dump_load(self): |
| memcached = MockMemcached() |
| m = MemcachedBytecodeCache(memcached) |
| |
| b = Bucket(None, "key", "") |
| b.code = "code" |
| m.dump_bytecode(b) |
| assert memcached.key == "jinja2/bytecode/key" |
| |
| b = Bucket(None, "key", "") |
| m.load_bytecode(b) |
| assert b.code == "code" |
| |
| def test_exception(self): |
| memcached = MockMemcached() |
| memcached.get = memcached.get_side_effect |
| memcached.set = memcached.set_side_effect |
| m = MemcachedBytecodeCache(memcached) |
| b = Bucket(None, "key", "") |
| b.code = "code" |
| |
| m.dump_bytecode(b) |
| m.load_bytecode(b) |
| |
| m.ignore_memcache_errors = False |
| |
| with pytest.raises(MockMemcached.Error): |
| m.dump_bytecode(b) |
| |
| with pytest.raises(MockMemcached.Error): |
| m.load_bytecode(b) |