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