Skip to content

Commit 65b3ab0

Browse files
committed
Django 2.2 for python3 setup
1 parent 2e11553 commit 65b3ab0

File tree

3 files changed

+63
-47
lines changed

3 files changed

+63
-47
lines changed

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Integrations
134134
Django
135135
******
136136

137-
You can use DjangoOpenAPIRequest a Django request factory:
137+
For Django 2.2 you can use DjangoOpenAPIRequest a Django request factory:
138138

139139
.. code-block:: python
140140

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ exclude =
4343
tests
4444

4545
[options.extras_require]
46-
django = django
46+
django = django>=2.2; python_version>="3.0"
4747
flask = werkzeug
4848

4949
[tool:pytest]

tests/integration/contrib/test_django.py

Lines changed: 61 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
from django.http import HttpResponse, HttpResponseRedirect
2-
from django.test.client import RequestFactory
3-
from django.urls import resolve
1+
import sys
2+
43
import pytest
54
from six import b
65

@@ -13,41 +12,58 @@
1312
from 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

Comments
 (0)