Skip to content

Commit 40c89d4

Browse files
committed
Expand tests for nonce usage in templates
1 parent 4763b50 commit 40c89d4

File tree

1 file changed

+61
-7
lines changed

1 file changed

+61
-7
lines changed

csp/tests/test_middleware.py

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
HttpResponseNotFound,
44
HttpResponseServerError,
55
)
6-
from django.template import Context, Template
6+
from django.template import Context, Template, engines
77
from django.test import RequestFactory
88
from django.test.utils import override_settings
99

@@ -169,16 +169,16 @@ def test_nonce_is_false_before_access_and_true_after() -> None:
169169
assert getattr(request, "csp_nonce") == nonce
170170

171171

172-
def test_nonce_in_template() -> None:
172+
def test_nonce_conditional_in_django_template() -> None:
173173
"""An unset nonce is Falsy in a template context"""
174174

175175
template = Template(
176176
"""
177-
{% if request.csp_nonce %}
178-
The CSP nonce is {{ request.csp_nonce }}.
179-
{% else %}
180-
The CSP nonce is not set.
181-
{% endif %}
177+
{% if request.csp_nonce %}
178+
The CSP nonce is {{ request.csp_nonce }}.
179+
{% else %}
180+
The CSP nonce is not set.
181+
{% endif %}
182182
"""
183183
)
184184
request = rf.get("/")
@@ -193,6 +193,60 @@ def test_nonce_in_template() -> None:
193193
assert rendered_set == f"The CSP nonce is {nonce}."
194194

195195

196+
def test_nonce_usage_in_django_template() -> None:
197+
"""Reading a nonce in a template context generates the nonce"""
198+
199+
template = Template("The CSP nonce is {{ request.csp_nonce }}.")
200+
request = rf.get("/")
201+
context = Context({"request": request})
202+
203+
mw.process_request(request)
204+
nonce = getattr(request, "csp_nonce", None)
205+
assert bool(nonce) is False
206+
rendered = template.render(context)
207+
assert bool(nonce) is True
208+
assert rendered == f"The CSP nonce is {nonce}."
209+
210+
211+
def test_nonce_conditional_in_jinja2_template() -> None:
212+
"""An unset nonce is Falsy in a template context"""
213+
214+
template = engines["jinja2"].from_string(
215+
"""
216+
{% if request.csp_nonce %}
217+
The CSP nonce is {{ request.csp_nonce }}.
218+
{% else %}
219+
The CSP nonce is not set.
220+
{% endif %}
221+
"""
222+
)
223+
request = rf.get("/")
224+
context = {"request": request}
225+
226+
mw.process_request(request)
227+
rendered_unset = template.render(context).strip()
228+
assert rendered_unset == "The CSP nonce is not set."
229+
230+
nonce = str(getattr(request, "csp_nonce"))
231+
rendered_set = template.render(context).strip()
232+
assert rendered_set == f"The CSP nonce is {nonce}."
233+
234+
235+
def test_nonce_usage_in_jinja2_template() -> None:
236+
"""Reading a nonce in a template context generates the nonce"""
237+
238+
template = engines["jinja2"].from_string("The CSP nonce is {{ request.csp_nonce }}.")
239+
request = rf.get("/")
240+
context = {"request": request}
241+
242+
mw.process_request(request)
243+
nonce = getattr(request, "csp_nonce", None)
244+
assert bool(nonce) is False
245+
rendered = template.render(context)
246+
assert bool(nonce) is True
247+
assert rendered == f"The CSP nonce is {nonce}."
248+
249+
196250
def test_no_nonce_when_not_accessed() -> None:
197251
request = rf.get("/")
198252
mw.process_request(request)

0 commit comments

Comments
 (0)