| 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) |