Skip to content

Commit 2cbbbf0

Browse files
HiPhishjoshuadavidthomas
authored andcommitted
Add tests for Jinja template function
The tests mirror the Django template tag tests
1 parent d48999c commit 2cbbbf0

File tree

5 files changed

+147
-21
lines changed

5 files changed

+147
-21
lines changed

src/django_simple_nav/jinja2/django_simple_nav.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ def django_simple_nav(
2323
try:
2424
nav = import_string(nav)()
2525
except ImportError as err:
26-
msg = f"Variable does not exist: {err}"
27-
raise TemplateRuntimeError(msg) from err
28-
29-
if template_name is None:
30-
template_name = cast(Nav, nav).template_name
31-
if template_name is None:
32-
raise TemplateRuntimeError("Navigation object has no template")
33-
34-
template: Template = loader.load(context.environment, template_name)
35-
return template.render(items=cast(Nav, nav).items)
26+
raise TemplateRuntimeError(str(err)) from err
27+
28+
try:
29+
if template_name is None:
30+
template_name = cast(Nav, nav).template_name
31+
if template_name is None:
32+
raise TemplateRuntimeError("Navigation object has no template")
33+
items = cast(Nav, nav).get_items(context['request'])
34+
except Exception as err:
35+
raise TemplateRuntimeError(str(err)) from err
36+
37+
return loader.load(context.environment, template_name).render(items=items)

tests/jinja2/environment.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,8 @@
77

88
from django_simple_nav.jinja2.django_simple_nav import django_simple_nav
99

10-
environment = Environment(loader=FileSystemLoader("tests/templates/tests/jinja2/"))
10+
# Ensure the same template paths are valid for both Jinja2 and Django templates
11+
loader = FileSystemLoader("tests/jinja2/")
12+
13+
environment = Environment(loader=loader, trim_blocks=True)
1114
environment.globals.update({"django_simple_nav": django_simple_nav})
File renamed without changes.
File renamed without changes.

tests/test_jinja.py

Lines changed: 131 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,137 @@
11
from __future__ import annotations
22

3-
from .jinja2.environment import environment
3+
import pytest
4+
from jinja2 import UndefinedError, TemplateRuntimeError
5+
from django.contrib.auth.models import AnonymousUser
6+
from django.contrib.auth import get_user_model
47

8+
from django_simple_nav.nav import NavItem
9+
from model_bakery import baker
510

6-
def test_render():
7-
"""Render the template"""
11+
from tests.utils import count_anchors
12+
from tests.navs import DummyNav
13+
from tests.jinja2.environment import environment
14+
15+
pytestmark = pytest.mark.django_db
16+
17+
18+
def test_django_simple_nav_templatetag(req):
19+
template = environment.from_string(
20+
'{{ django_simple_nav("tests.navs.DummyNav") }}'
21+
)
22+
req.user = AnonymousUser()
23+
rendered_template = template.render(request=req)
24+
assert count_anchors(rendered_template) == 7
25+
26+
27+
def test_templatetag_with_template_name(req):
28+
template = environment.from_string(
29+
"{{ django_simple_nav('tests.navs.DummyNav', 'tests/alternate.html') }}"
30+
)
31+
req.user = AnonymousUser()
32+
rendered_template = template.render({"request": req})
33+
assert "This is an alternate template." in rendered_template
34+
35+
36+
def test_templatetag_with_nav_instance(req):
37+
class PlainviewNav(DummyNav):
38+
items = [
39+
NavItem(title="I drink your milkshake!", url="/milkshake/"),
40+
]
41+
42+
template = environment.from_string("{{ django_simple_nav(new_nav) }}")
43+
req.user = baker.make(get_user_model(), first_name="Daniel", last_name="Plainview")
44+
rendered_template = template.render({"request": req, "new_nav": PlainviewNav()})
45+
assert "I drink your milkshake!" in rendered_template
46+
47+
48+
def test_templatetag_with_nav_instance_and_template_name(req):
49+
class DeadParrotNav(DummyNav):
50+
items = [
51+
NavItem(title="He's pinin' for the fjords!", url="/notlob/"),
52+
]
53+
54+
template = environment.from_string(
55+
"{{ django_simple_nav(new_nav, 'tests/alternate.html') }}"
56+
)
57+
req.user = baker.make(get_user_model(), first_name="Norwegian", last_name="Blue")
58+
rendered_template = template.render({"request": req, "new_nav": DeadParrotNav()})
59+
assert "He's pinin' for the fjords!" in rendered_template
60+
assert "This is an alternate template." in rendered_template
61+
62+
63+
def test_templatetag_with_template_name_on_nav_instance(req):
64+
class PinkmanNav(DummyNav):
65+
template_name = "tests/alternate.html"
66+
items = [
67+
NavItem(title="Yeah Mr. White! Yeah science!", url="/science/"),
68+
]
69+
70+
template = environment.from_string("{{ django_simple_nav(new_nav) }}")
71+
req.user = baker.make(get_user_model(), first_name="Jesse", last_name="Pinkman")
72+
rendered_template = template.render({"request": req, "new_nav": PinkmanNav()})
73+
assert "Yeah Mr. White! Yeah science!" in rendered_template
74+
assert "This is an alternate template." in rendered_template
75+
76+
77+
def test_templatetag_with_no_arguments(req):
78+
req.user = AnonymousUser()
79+
with pytest.raises(TypeError):
80+
template = environment.from_string("{{ django_simple_nav() }}")
81+
template.render({'request': req})
82+
83+
84+
def test_templatetag_with_missing_variable(req):
85+
req.user = AnonymousUser()
86+
template = environment.from_string("{{ django_simple_nav(missing_nav) }}")
87+
with pytest.raises(TemplateRuntimeError):
88+
template.render({'request': req})
89+
90+
91+
def test_nested_templatetag(req):
92+
# called twice to simulate a nested call
93+
template = environment.from_string(
94+
"{{ django_simple_nav('tests.navs.DummyNav') }}"
95+
"{{ django_simple_nav('tests.navs.DummyNav') }}"
96+
)
97+
req.user = AnonymousUser()
98+
rendered_template = template.render({"request": req})
99+
assert count_anchors(rendered_template) == 14
100+
101+
102+
def test_invalid_dotted_string(req):
8103
template = environment.from_string(
9-
'''
10-
<p>
11-
{{ django_simple_nav("tests.navs.DummyNav", "dummy_nav.html") }}
12-
</p>'
13-
'''
104+
"{{ django_simple_nav('path.to.DoesNotExist') }}"
14105
)
15-
print(template.render(some_var=[1, 2, 3]))
16-
assert True
106+
107+
with pytest.raises(TemplateRuntimeError):
108+
template.render({"request": req})
109+
110+
111+
class InvalidNav:
112+
...
113+
114+
115+
def test_invalid_nav_instance(req):
116+
template = environment.from_string(
117+
"{{ django_simple_nav('tests.test_templatetags.InvalidNav') }}"
118+
)
119+
with pytest.raises(TemplateRuntimeError):
120+
template.render({"request": req})
121+
122+
123+
def test_template_name_variable_does_not_exist(req):
124+
template = environment.from_string(
125+
"{{ django_simple_nav('tests.navs.DummyNav', nonexistent_template_name_variable) }}"
126+
)
127+
with pytest.raises(TemplateRuntimeError):
128+
template.render({"request": req})
129+
130+
131+
def test_request_not_in_context():
132+
template = environment.from_string(
133+
" {{ django_simple_nav('tests.navs.DummyNav') }}"
134+
)
135+
136+
with pytest.raises(TemplateRuntimeError):
137+
template.render()

0 commit comments

Comments
 (0)