3
3
HttpResponseNotFound ,
4
4
HttpResponseServerError ,
5
5
)
6
- from django .template import Context , Template
6
+ from django .template import Context , Template , engines
7
7
from django .test import RequestFactory
8
8
from django .test .utils import override_settings
9
9
@@ -169,16 +169,16 @@ def test_nonce_is_false_before_access_and_true_after() -> None:
169
169
assert getattr (request , "csp_nonce" ) == nonce
170
170
171
171
172
- def test_nonce_in_template () -> None :
172
+ def test_nonce_conditional_in_django_template () -> None :
173
173
"""An unset nonce is Falsy in a template context"""
174
174
175
175
template = Template (
176
176
"""
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 %}
182
182
"""
183
183
)
184
184
request = rf .get ("/" )
@@ -193,6 +193,60 @@ def test_nonce_in_template() -> None:
193
193
assert rendered_set == f"The CSP nonce is { nonce } ."
194
194
195
195
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
+
196
250
def test_no_nonce_when_not_accessed () -> None :
197
251
request = rf .get ("/" )
198
252
mw .process_request (request )
0 commit comments