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