1
1
from __future__ import annotations
2
+
2
3
from typing import TYPE_CHECKING
3
4
4
5
import pytest
12
13
from csp .tests .utils import response
13
14
14
15
if TYPE_CHECKING :
15
- from django .http import HttpRequest
16
+ from django .http import HttpRequest , HttpResponseBase
16
17
17
18
mw = CSPMiddleware (response ())
18
19
19
20
20
21
def test_csp_exempt () -> None :
21
22
@csp_exempt ()
22
- def view (request : HttpRequest ) -> HttpResponse :
23
+ def view (request : HttpRequest ) -> HttpResponseBase :
23
24
return HttpResponse ()
24
25
25
26
response = view (RequestFactory ().get ("/" ))
@@ -29,7 +30,7 @@ def view(request: HttpRequest) -> HttpResponse:
29
30
30
31
def test_csp_exempt_ro () -> None :
31
32
@csp_exempt (REPORT_ONLY = True )
32
- def view (request : HttpRequest ) -> HttpResponse :
33
+ def view (request : HttpRequest ) -> HttpResponseBase :
33
34
return HttpResponse ()
34
35
35
36
response = view (RequestFactory ().get ("/" ))
@@ -41,7 +42,7 @@ def view(request: HttpRequest) -> HttpResponse:
41
42
def test_csp_update () -> None :
42
43
request = RequestFactory ().get ("/" )
43
44
44
- def view_without_decorator (request : HttpRequest ) -> HttpResponse :
45
+ def view_without_decorator (request : HttpRequest ) -> HttpResponseBase :
45
46
return HttpResponse ()
46
47
47
48
response = view_without_decorator (request )
@@ -51,7 +52,7 @@ def view_without_decorator(request: HttpRequest) -> HttpResponse:
51
52
assert policy_list == ["default-src 'self'" , "img-src foo.com" ]
52
53
53
54
@csp_update ({"img-src" : ["bar.com" , NONCE ]})
54
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
55
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
55
56
return HttpResponse ()
56
57
57
58
response = view_with_decorator (request )
@@ -74,7 +75,7 @@ def view_with_decorator(request: HttpRequest) -> HttpResponse:
74
75
def test_csp_update_ro () -> None :
75
76
request = RequestFactory ().get ("/" )
76
77
77
- def view_without_decorator (request : HttpRequest ) -> HttpResponse :
78
+ def view_without_decorator (request : HttpRequest ) -> HttpResponseBase :
78
79
return HttpResponse ()
79
80
80
81
response = view_without_decorator (request )
@@ -84,7 +85,7 @@ def view_without_decorator(request: HttpRequest) -> HttpResponse:
84
85
assert policy_list == ["default-src 'self'" , "img-src foo.com" ]
85
86
86
87
@csp_update ({"img-src" : ["bar.com" , NONCE ]}, REPORT_ONLY = True )
87
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
88
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
88
89
return HttpResponse ()
89
90
90
91
response = view_with_decorator (request )
@@ -107,7 +108,7 @@ def view_with_decorator(request: HttpRequest) -> HttpResponse:
107
108
def test_csp_replace () -> None :
108
109
request = RequestFactory ().get ("/" )
109
110
110
- def view_without_decorator (request : HttpRequest ) -> HttpResponse :
111
+ def view_without_decorator (request : HttpRequest ) -> HttpResponseBase :
111
112
return HttpResponse ()
112
113
113
114
response = view_without_decorator (request )
@@ -117,7 +118,7 @@ def view_without_decorator(request: HttpRequest) -> HttpResponse:
117
118
assert policy_list == ["default-src 'self'" , "img-src foo.com" ]
118
119
119
120
@csp_replace ({"img-src" : ["bar.com" ]})
120
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
121
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
121
122
return HttpResponse ()
122
123
123
124
response = view_with_decorator (request )
@@ -134,7 +135,7 @@ def view_with_decorator(request: HttpRequest) -> HttpResponse:
134
135
assert policy_list == ["default-src 'self'" , "img-src foo.com" ]
135
136
136
137
@csp_replace ({"img-src" : None })
137
- def view_removing_directive (request : HttpRequest ) -> HttpResponse :
138
+ def view_removing_directive (request : HttpRequest ) -> HttpResponseBase :
138
139
return HttpResponse ()
139
140
140
141
response = view_removing_directive (request )
@@ -148,7 +149,7 @@ def view_removing_directive(request: HttpRequest) -> HttpResponse:
148
149
def test_csp_replace_ro () -> None :
149
150
request = RequestFactory ().get ("/" )
150
151
151
- def view_without_decorator (request : HttpRequest ) -> HttpResponse :
152
+ def view_without_decorator (request : HttpRequest ) -> HttpResponseBase :
152
153
return HttpResponse ()
153
154
154
155
response = view_without_decorator (request )
@@ -158,7 +159,7 @@ def view_without_decorator(request: HttpRequest) -> HttpResponse:
158
159
assert policy_list == ["default-src 'self'" , "img-src foo.com" ]
159
160
160
161
@csp_replace ({"img-src" : ["bar.com" ]}, REPORT_ONLY = True )
161
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
162
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
162
163
return HttpResponse ()
163
164
164
165
response = view_with_decorator (request )
@@ -175,7 +176,7 @@ def view_with_decorator(request: HttpRequest) -> HttpResponse:
175
176
assert policy_list == ["default-src 'self'" , "img-src foo.com" ]
176
177
177
178
@csp_replace ({"img-src" : None }, REPORT_ONLY = True )
178
- def view_removing_directive (request : HttpRequest ) -> HttpResponse :
179
+ def view_removing_directive (request : HttpRequest ) -> HttpResponseBase :
179
180
return HttpResponse ()
180
181
181
182
response = view_removing_directive (request )
@@ -188,7 +189,7 @@ def view_removing_directive(request: HttpRequest) -> HttpResponse:
188
189
def test_csp () -> None :
189
190
request = RequestFactory ().get ("/" )
190
191
191
- def view_without_decorator (request : HttpRequest ) -> HttpResponse :
192
+ def view_without_decorator (request : HttpRequest ) -> HttpResponseBase :
192
193
return HttpResponse ()
193
194
194
195
response = view_without_decorator (request )
@@ -198,7 +199,7 @@ def view_without_decorator(request: HttpRequest) -> HttpResponse:
198
199
assert policy_list == ["default-src 'self'" ]
199
200
200
201
@csp ({"img-src" : ["foo.com" ], "font-src" : ["bar.com" ]})
201
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
202
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
202
203
return HttpResponse ()
203
204
204
205
response = view_with_decorator (request )
@@ -218,7 +219,7 @@ def view_with_decorator(request: HttpRequest) -> HttpResponse:
218
219
def test_csp_ro () -> None :
219
220
request = RequestFactory ().get ("/" )
220
221
221
- def view_without_decorator (request : HttpRequest ) -> HttpResponse :
222
+ def view_without_decorator (request : HttpRequest ) -> HttpResponseBase :
222
223
return HttpResponse ()
223
224
224
225
response = view_without_decorator (request )
@@ -229,7 +230,7 @@ def view_without_decorator(request: HttpRequest) -> HttpResponse:
229
230
230
231
@csp ({"img-src" : ["foo.com" ], "font-src" : ["bar.com" ]}, REPORT_ONLY = True )
231
232
@csp ({}) # CSP with no directives effectively removes the header.
232
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
233
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
233
234
return HttpResponse ()
234
235
235
236
response = view_with_decorator (request )
@@ -251,7 +252,7 @@ def test_csp_string_values() -> None:
251
252
request = RequestFactory ().get ("/" )
252
253
253
254
@csp ({"img-src" : "foo.com" , "font-src" : "bar.com" })
254
- def view_with_decorator (request : HttpRequest ) -> HttpResponse :
255
+ def view_with_decorator (request : HttpRequest ) -> HttpResponseBase :
255
256
return HttpResponse ()
256
257
257
258
response = view_with_decorator (request )
@@ -268,7 +269,7 @@ def test_csp_exempt_error() -> None:
268
269
with pytest .raises (RuntimeError ) as excinfo :
269
270
# Ignore type error since we're checking for the exception raised for 3.x syntax
270
271
@csp_exempt # type: ignore
271
- def view (request : HttpRequest ) -> HttpResponse :
272
+ def view (request : HttpRequest ) -> HttpResponseBase :
272
273
return HttpResponse ()
273
274
274
275
assert "Incompatible `csp_exempt` decorator usage" in str (excinfo .value )
@@ -278,7 +279,7 @@ def test_csp_update_error() -> None:
278
279
with pytest .raises (RuntimeError ) as excinfo :
279
280
280
281
@csp_update (IMG_SRC = "bar.com" )
281
- def view (request : HttpRequest ) -> HttpResponse :
282
+ def view (request : HttpRequest ) -> HttpResponseBase :
282
283
return HttpResponse ()
283
284
284
285
assert "Incompatible `csp_update` decorator arguments" in str (excinfo .value )
@@ -288,7 +289,7 @@ def test_csp_replace_error() -> None:
288
289
with pytest .raises (RuntimeError ) as excinfo :
289
290
290
291
@csp_replace (IMG_SRC = "bar.com" )
291
- def view (request : HttpRequest ) -> HttpResponse :
292
+ def view (request : HttpRequest ) -> HttpResponseBase :
292
293
return HttpResponse ()
293
294
294
295
assert "Incompatible `csp_replace` decorator arguments" in str (excinfo .value )
@@ -298,7 +299,7 @@ def test_csp_error() -> None:
298
299
with pytest .raises (RuntimeError ) as excinfo :
299
300
300
301
@csp (IMG_SRC = ["bar.com" ])
301
- def view (request : HttpRequest ) -> HttpResponse :
302
+ def view (request : HttpRequest ) -> HttpResponseBase :
302
303
return HttpResponse ()
303
304
304
305
assert "Incompatible `csp` decorator arguments" in str (excinfo .value )
0 commit comments