1
- from django .http import HttpResponse , HttpResponseRedirect
2
- from django .test .client import RequestFactory
3
- from django .urls import resolve
1
+ import sys
2
+
4
3
import pytest
5
4
from six import b
6
5
13
12
from openapi_core .validation .response .validators import ResponseValidator
14
13
15
14
16
- @pytest .fixture (autouse = True , scope = 'module' )
17
- def django_settings ():
18
- import django
19
- from django .conf import settings
20
- from django .contrib import admin
21
- from django .urls import path
22
- settings .configure (
23
- ALLOWED_HOSTS = [
24
- 'testserver' ,
25
- ],
26
- INSTALLED_APPS = [
27
- 'django.contrib.admin' ,
28
- 'django.contrib.auth' ,
29
- 'django.contrib.contenttypes' ,
30
- 'django.contrib.messages' ,
31
- 'django.contrib.sessions' ,
32
- ],
33
- MIDDLEWARE = [
34
- 'django.contrib.sessions.middleware.SessionMiddleware' ,
35
- 'django.contrib.auth.middleware.AuthenticationMiddleware' ,
36
- 'django.contrib.messages.middleware.MessageMiddleware' ,
37
- ]
38
- )
39
- django .setup ()
40
- settings .ROOT_URLCONF = (
41
- path ('admin/' , admin .site .urls ),
42
- )
43
-
44
-
45
- class TestDjangoOpenAPIRequest (object ):
15
+ @pytest .mark .skipif (sys .version_info < (3 , 0 ), reason = "requires python3" )
16
+ class BaseTestDjango (object ):
17
+
18
+ @pytest .fixture (autouse = True , scope = 'module' )
19
+ def django_settings (self ):
20
+ import django
21
+ from django .conf import settings
22
+ from django .contrib import admin
23
+ from django .urls import path
24
+
25
+ if settings .configured :
26
+ return
27
+
28
+ settings .configure (
29
+ ALLOWED_HOSTS = [
30
+ 'testserver' ,
31
+ ],
32
+ INSTALLED_APPS = [
33
+ 'django.contrib.admin' ,
34
+ 'django.contrib.auth' ,
35
+ 'django.contrib.contenttypes' ,
36
+ 'django.contrib.messages' ,
37
+ 'django.contrib.sessions' ,
38
+ ],
39
+ MIDDLEWARE = [
40
+ 'django.contrib.sessions.middleware.SessionMiddleware' ,
41
+ 'django.contrib.auth.middleware.AuthenticationMiddleware' ,
42
+ 'django.contrib.messages.middleware.MessageMiddleware' ,
43
+ ]
44
+ )
45
+ django .setup ()
46
+ settings .ROOT_URLCONF = (
47
+ path ('admin/' , admin .site .urls ),
48
+ )
46
49
47
50
@pytest .fixture
48
51
def request_factory (self ):
52
+ from django .test .client import RequestFactory
49
53
return RequestFactory ()
50
54
55
+ @pytest .fixture
56
+ def response_factory (self ):
57
+ from django .http import HttpResponse
58
+
59
+ def create (content = b ('' ), status_code = None ):
60
+ return HttpResponse (content , status = status_code )
61
+
62
+ return create
63
+
64
+
65
+ class TestDjangoOpenAPIRequest (BaseTestDjango ):
66
+
51
67
def test_no_resolver (self , request_factory ):
52
68
request = request_factory .get ('/admin/' )
53
69
@@ -73,6 +89,7 @@ def test_no_resolver(self, request_factory):
73
89
assert openapi_request .mimetype == request .content_type
74
90
75
91
def test_simple (self , request_factory ):
92
+ from django .urls import resolve
76
93
request = request_factory .get ('/admin/' )
77
94
request .resolver_match = resolve ('/admin/' )
78
95
@@ -98,6 +115,7 @@ def test_simple(self, request_factory):
98
115
assert openapi_request .mimetype == request .content_type
99
116
100
117
def test_url_rule (self , request_factory ):
118
+ from django .urls import resolve
101
119
request = request_factory .get ('/admin/auth/group/1/' )
102
120
request .resolver_match = resolve ('/admin/auth/group/1/' )
103
121
@@ -126,10 +144,10 @@ def test_url_rule(self, request_factory):
126
144
assert openapi_request .mimetype == request .content_type
127
145
128
146
129
- class TestDjangoOpenAPIResponse :
147
+ class TestDjangoOpenAPIResponse ( BaseTestDjango ) :
130
148
131
- def test_stream_response (self ):
132
- response = HttpResponse ()
149
+ def test_stream_response (self , response_factory ):
150
+ response = response_factory ()
133
151
response .writelines (['foo\n ' , 'bar\n ' , 'baz\n ' ])
134
152
135
153
openapi_response = DjangoOpenAPIResponse (response )
@@ -138,8 +156,8 @@ def test_stream_response(self):
138
156
assert openapi_response .status_code == response .status_code
139
157
assert openapi_response .mimetype == response ["Content-Type" ]
140
158
141
- def test_redirect_response (self ):
142
- response = HttpResponseRedirect ('/redirected/' )
159
+ def test_redirect_response (self , response_factory ):
160
+ response = response_factory ('/redirected/' , status_code = 302 )
143
161
144
162
openapi_response = DjangoOpenAPIResponse (response )
145
163
@@ -148,30 +166,28 @@ def test_redirect_response(self):
148
166
assert openapi_response .mimetype == response ["Content-Type" ]
149
167
150
168
151
- class TestDjangoOpenAPIValidation (object ):
152
-
153
- @pytest .fixture
154
- def request_factory (self ):
155
- return RequestFactory ()
169
+ class TestDjangoOpenAPIValidation (BaseTestDjango ):
156
170
157
171
@pytest .fixture
158
172
def django_spec (self , factory ):
159
173
specfile = 'data/v3.0/django_factory.yaml'
160
174
return create_spec (factory .spec_from_file (specfile ))
161
175
162
176
def test_response_validator_path_pattern (
163
- self , django_spec , request_factory ):
177
+ self , django_spec , request_factory , response_factory ):
178
+ from django .urls import resolve
164
179
validator = ResponseValidator (django_spec )
165
180
request = request_factory .get ('/admin/auth/group/1/' )
166
181
request .resolver_match = resolve ('/admin/auth/group/1/' )
167
182
openapi_request = DjangoOpenAPIRequest (request )
168
- response = HttpResponse (b ('Some item' ))
183
+ response = response_factory (b ('Some item' ))
169
184
openapi_response = DjangoOpenAPIResponse (response )
170
185
result = validator .validate (openapi_request , openapi_response )
171
186
assert not result .errors
172
187
173
188
def test_request_validator_path_pattern (
174
189
self , django_spec , request_factory ):
190
+ from django .urls import resolve
175
191
validator = RequestValidator (django_spec )
176
192
request = request_factory .get ('/admin/auth/group/1/' )
177
193
request .resolver_match = resolve ('/admin/auth/group/1/' )
0 commit comments