# -*- coding: utf-8 -*- """ jinja2.testsuite.bytecode_cache ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Test bytecode caching :copyright: (c) 2017 by the Jinja Team. :license: BSD, see LICENSE for more details. """ import pytest from jinja2 import Environment from jinja2.bccache import Bucket, FileSystemBytecodeCache, \ MemcachedBytecodeCache from jinja2.exceptions import TemplateNotFound @pytest.fixture def env(package_loader): bytecode_cache = FileSystemBytecodeCache() return Environment( loader=package_loader, bytecode_cache=bytecode_cache, ) @pytest.mark.byte_code_cache class TestByteCodeCache(object): 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(object): 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(object): 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)