1- from django .http import HttpResponse , HttpResponseRedirect
2- from django .test .client import RequestFactory
3- from django .urls import resolve
1+ import sys
2+
43import pytest
54from six import b
65
1312from openapi_core .validation .response .validators import ResponseValidator
1413
1514
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+ )
4649
4750 @pytest .fixture
4851 def request_factory (self ):
52+ from django .test .client import RequestFactory
4953 return RequestFactory ()
5054
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+
5167 def test_no_resolver (self , request_factory ):
5268 request = request_factory .get ('/admin/' )
5369
@@ -73,6 +89,7 @@ def test_no_resolver(self, request_factory):
7389 assert openapi_request .mimetype == request .content_type
7490
7591 def test_simple (self , request_factory ):
92+ from django .urls import resolve
7693 request = request_factory .get ('/admin/' )
7794 request .resolver_match = resolve ('/admin/' )
7895
@@ -98,6 +115,7 @@ def test_simple(self, request_factory):
98115 assert openapi_request .mimetype == request .content_type
99116
100117 def test_url_rule (self , request_factory ):
118+ from django .urls import resolve
101119 request = request_factory .get ('/admin/auth/group/1/' )
102120 request .resolver_match = resolve ('/admin/auth/group/1/' )
103121
@@ -126,10 +144,10 @@ def test_url_rule(self, request_factory):
126144 assert openapi_request .mimetype == request .content_type
127145
128146
129- class TestDjangoOpenAPIResponse :
147+ class TestDjangoOpenAPIResponse ( BaseTestDjango ) :
130148
131- def test_stream_response (self ):
132- response = HttpResponse ()
149+ def test_stream_response (self , response_factory ):
150+ response = response_factory ()
133151 response .writelines (['foo\n ' , 'bar\n ' , 'baz\n ' ])
134152
135153 openapi_response = DjangoOpenAPIResponse (response )
@@ -138,8 +156,8 @@ def test_stream_response(self):
138156 assert openapi_response .status_code == response .status_code
139157 assert openapi_response .mimetype == response ["Content-Type" ]
140158
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 )
143161
144162 openapi_response = DjangoOpenAPIResponse (response )
145163
@@ -148,30 +166,28 @@ def test_redirect_response(self):
148166 assert openapi_response .mimetype == response ["Content-Type" ]
149167
150168
151- class TestDjangoOpenAPIValidation (object ):
152-
153- @pytest .fixture
154- def request_factory (self ):
155- return RequestFactory ()
169+ class TestDjangoOpenAPIValidation (BaseTestDjango ):
156170
157171 @pytest .fixture
158172 def django_spec (self , factory ):
159173 specfile = 'data/v3.0/django_factory.yaml'
160174 return create_spec (factory .spec_from_file (specfile ))
161175
162176 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
164179 validator = ResponseValidator (django_spec )
165180 request = request_factory .get ('/admin/auth/group/1/' )
166181 request .resolver_match = resolve ('/admin/auth/group/1/' )
167182 openapi_request = DjangoOpenAPIRequest (request )
168- response = HttpResponse (b ('Some item' ))
183+ response = response_factory (b ('Some item' ))
169184 openapi_response = DjangoOpenAPIResponse (response )
170185 result = validator .validate (openapi_request , openapi_response )
171186 assert not result .errors
172187
173188 def test_request_validator_path_pattern (
174189 self , django_spec , request_factory ):
190+ from django .urls import resolve
175191 validator = RequestValidator (django_spec )
176192 request = request_factory .get ('/admin/auth/group/1/' )
177193 request .resolver_match = resolve ('/admin/auth/group/1/' )
0 commit comments