1
1
from corsheaders .middleware import (
2
2
ACCESS_CONTROL_ALLOW_CREDENTIALS ,
3
3
ACCESS_CONTROL_ALLOW_ORIGIN ,
4
- CorsMiddleware ,
5
4
)
6
5
from django .conf import settings
7
6
from django .http import HttpResponse
25
24
class TestCORSMiddleware (TestCase ):
26
25
27
26
def setUp (self ):
28
- self .factory = RequestFactory ()
29
- self .middleware = CorsMiddleware ()
30
27
self .url = '/api/v2/search'
31
28
self .owner = create_user (username = 'owner' , password = 'test' )
32
29
self .project = get (
@@ -69,66 +66,60 @@ def setUp(self):
69
66
)
70
67
71
68
def test_allow_linked_domain_from_public_version (self ):
72
- request = self .factory .get (
69
+ resp = self .client .get (
73
70
self .url ,
74
71
{'project' : self .project .slug , 'version' : self .version .slug },
75
72
HTTP_ORIGIN = 'http://my.valid.domain' ,
76
73
)
77
- resp = self .middleware .process_response (request , {})
78
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
79
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
74
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
75
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
80
76
81
77
def test_linked_domain_from_private_version (self ):
82
78
self .version .privacy_level = PRIVATE
83
79
self .version .save ()
84
- request = self .factory .get (
80
+ resp = self .client .get (
85
81
self .url ,
86
82
{'project' : self .project .slug , 'version' : self .version .slug },
87
83
HTTP_ORIGIN = 'http://my.valid.domain' ,
88
84
)
89
- resp = self .middleware .process_response (request , {})
90
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
91
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
85
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
86
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
92
87
93
88
def test_allowed_api_public_version_from_another_domain (self ):
94
- request = self .factory .get (
89
+ resp = self .client .get (
95
90
self .url ,
96
91
{'project' : self .project .slug , 'version' : self .version .slug },
97
92
HTTP_ORIGIN = 'http://docs.another.domain' ,
98
93
)
99
- resp = self .middleware .process_response (request , {})
100
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
101
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
94
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
95
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
102
96
103
- request = self .factory .get (
97
+ resp = self .client .get (
104
98
self .url ,
105
99
{'project' : self .project .slug , 'version' : self .version .slug },
106
100
HTTP_ORIGIN = 'http://another.valid.domain' ,
107
101
)
108
- resp = self .middleware .process_response (request , {})
109
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
110
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
102
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
103
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
111
104
112
105
def test_api_private_version_from_another_domain (self ):
113
106
self .version .privacy_level = PRIVATE
114
107
self .version .save ()
115
- request = self .factory .get (
108
+ resp = self .client .get (
116
109
self .url ,
117
110
{'project' : self .project .slug , 'version' : self .version .slug },
118
111
HTTP_ORIGIN = 'http://docs.another.domain' ,
119
112
)
120
- resp = self .middleware .process_response (request , {})
121
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
122
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
113
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
114
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
123
115
124
- request = self .factory .get (
116
+ resp = self .client .get (
125
117
self .url ,
126
118
{'project' : self .project .slug , 'version' : self .version .slug },
127
119
HTTP_ORIGIN = 'http://another.valid.domain' ,
128
120
)
129
- resp = self .middleware .process_response (request , {})
130
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
131
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
121
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
122
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
132
123
133
124
def test_valid_subproject (self ):
134
125
self .assertTrue (
@@ -137,102 +128,92 @@ def test_valid_subproject(self):
137
128
subprojects__child = self .subproject ,
138
129
).exists (),
139
130
)
140
- request = self .factory .get (
131
+ resp = self .client .get (
141
132
self .url ,
142
133
{'project' : self .project .slug , 'version' : self .version .slug },
143
134
HTTP_ORIGIN = 'http://my.valid.domain' ,
144
135
)
145
- resp = self .middleware .process_response (request , {})
146
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
147
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
136
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
137
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
148
138
149
139
def test_embed_api_private_version_linked_domain (self ):
150
140
self .version .privacy_level = PRIVATE
151
141
self .version .save ()
152
- request = self .factory .get (
142
+ resp = self .client .get (
153
143
'/api/v2/embed/' ,
154
144
{'project' : self .project .slug , 'version' : self .version .slug },
155
145
HTTP_ORIGIN = 'http://my.valid.domain' ,
156
146
)
157
- resp = self .middleware .process_response (request , {})
158
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
159
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
147
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
148
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
160
149
161
150
def test_embed_api_external_url (self ):
162
- request = self .factory .get (
151
+ resp = self .client .get (
163
152
"/api/v2/embed/" ,
164
153
{"url" : "https://pip.readthedocs.io/en/latest/index.hml" },
165
154
HTTP_ORIGIN = "http://my.valid.domain" ,
166
155
)
167
- resp = self .middleware .process_response (request , {})
168
- self .assertIn ("Access-Control-Allow-Origin" , resp )
156
+ self .assertIn ("Access-Control-Allow-Origin" , resp .headers )
169
157
170
- request = self .factory .get (
158
+ resp = self .client .get (
171
159
"/api/v2/embed/" ,
172
160
{"url" : "https://docs.example.com/en/latest/index.hml" },
173
161
HTTP_ORIGIN = "http://my.valid.domain" ,
174
162
)
175
- resp = self .middleware .process_response (request , {})
176
- self .assertIn ("Access-Control-Allow-Origin" , resp )
163
+ self .assertIn ("Access-Control-Allow-Origin" , resp .headers )
177
164
178
165
def test_sustainability_endpoint_allways_allowed (self ):
179
- request = self .factory .get (
166
+ resp = self .client .get (
180
167
'/api/v2/sustainability/' ,
181
168
{'project' : self .project .slug , 'active' : True , 'version' : self .version .slug },
182
169
HTTP_ORIGIN = 'http://invalid.domain' ,
183
170
)
184
- resp = self .middleware .process_response (request , {})
185
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
186
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
171
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
172
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
187
173
188
- request = self .factory .get (
174
+ resp = self .client .get (
189
175
'/api/v2/sustainability/' ,
190
176
{'project' : self .project .slug , 'active' : True , 'version' : self .version .slug },
191
177
HTTP_ORIGIN = 'http://my.valid.domain' ,
192
178
)
193
- resp = self .middleware .process_response (request , {})
194
- self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
195
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
179
+ self .assertIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
180
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
196
181
197
182
def test_apiv2_endpoint_not_allowed (self ):
198
- request = self .factory .get (
183
+ resp = self .client .get (
199
184
'/api/v2/version/' ,
200
185
{'project' : self .project .slug , 'active' : True , 'version' : self .version .slug },
201
186
HTTP_ORIGIN = 'http://invalid.domain' ,
202
187
)
203
- resp = self .middleware .process_response (request , {})
204
- self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
205
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
188
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
189
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
206
190
207
191
# This also doesn't work on registered domains.
208
- request = self .factory .get (
192
+ resp = self .client .get (
209
193
'/api/v2/version/' ,
210
194
{'project' : self .project .slug , 'active' : True , 'version' : self .version .slug },
211
195
HTTP_ORIGIN = 'http://my.valid.domain' ,
212
196
)
213
- resp = self .middleware .process_response (request , {})
214
- self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
215
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
197
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
198
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
216
199
217
200
# Or from our public domain.
218
- request = self .factory .get (
201
+ resp = self .client .get (
219
202
'/api/v2/version/' ,
220
203
{'project' : self .project .slug , 'active' : True , 'version' : self .version .slug },
221
204
HTTP_ORIGIN = 'http://docs.readthedocs.io/' ,
222
205
)
223
- resp = self .middleware .process_response (request , {})
224
- self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
225
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
206
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
207
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
226
208
227
209
# POST is not allowed
228
- request = self .factory .post (
210
+ resp = self .client .post (
229
211
'/api/v2/version/' ,
230
212
{'project' : self .project .slug , 'active' : True , 'version' : self .version .slug },
231
213
HTTP_ORIGIN = 'http://my.valid.domain' ,
232
214
)
233
- resp = self .middleware .process_response (request , {})
234
- self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp )
235
- self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp )
215
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_ORIGIN , resp .headers )
216
+ self .assertNotIn (ACCESS_CONTROL_ALLOW_CREDENTIALS , resp .headers )
236
217
237
218
238
219
class TestSessionMiddleware (TestCase ):
0 commit comments