Skip to content

Commit

Permalink
Refs #31224 -- Added autoconversion of test async methods.
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewgodwin authored and felixxm committed Mar 5, 2020
1 parent 2f53d32 commit 17009e9
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 11 deletions.
7 changes: 7 additions & 0 deletions django/test/testcases.py
@@ -1,3 +1,4 @@
import asyncio
import difflib
import json
import posixpath
Expand All @@ -16,6 +17,8 @@
)
from urllib.request import url2pathname

from asgiref.sync import async_to_sync

from django.apps import apps
from django.conf import settings
from django.core import mail
Expand Down Expand Up @@ -257,6 +260,10 @@ def _setup_and_call(self, result, debug=False):
getattr(testMethod, "__unittest_skip__", False)
)

# Convert async test methods.
if asyncio.iscoroutinefunction(testMethod):
setattr(self, self._testMethodName, async_to_sync(testMethod))

if not skipped:
try:
self._pre_setup()
Expand Down
8 changes: 0 additions & 8 deletions tests/asgi/tests.py
Expand Up @@ -2,7 +2,6 @@
import sys
from unittest import skipIf

from asgiref.sync import async_to_sync
from asgiref.testing import ApplicationCommunicator

from django.core.asgi import get_asgi_application
Expand Down Expand Up @@ -34,7 +33,6 @@ def _get_scope(self, **kwargs):
def tearDown(self):
request_started.connect(close_old_connections)

@async_to_sync
async def test_get_asgi_application(self):
"""
get_asgi_application() returns a functioning ASGI callable.
Expand All @@ -58,7 +56,6 @@ async def test_get_asgi_application(self):
self.assertEqual(response_body['type'], 'http.response.body')
self.assertEqual(response_body['body'], b'Hello World!')

@async_to_sync
async def test_file_response(self):
"""
Makes sure that FileResponse works over ASGI.
Expand Down Expand Up @@ -86,7 +83,6 @@ async def test_file_response(self):
self.assertEqual(response_body['type'], 'http.response.body')
self.assertEqual(response_body['body'], test_file_contents)

@async_to_sync
async def test_headers(self):
application = get_asgi_application()
communicator = ApplicationCommunicator(
Expand Down Expand Up @@ -116,7 +112,6 @@ async def test_headers(self):
self.assertEqual(response_body['type'], 'http.response.body')
self.assertEqual(response_body['body'], b'From Scotland,Wales')

@async_to_sync
async def test_get_query_string(self):
application = get_asgi_application()
for query_string in (b'name=Andrew', 'name=Andrew'):
Expand All @@ -133,15 +128,13 @@ async def test_get_query_string(self):
self.assertEqual(response_body['type'], 'http.response.body')
self.assertEqual(response_body['body'], b'Hello Andrew!')

@async_to_sync
async def test_disconnect(self):
application = get_asgi_application()
communicator = ApplicationCommunicator(application, self._get_scope(path='/'))
await communicator.send_input({'type': 'http.disconnect'})
with self.assertRaises(asyncio.TimeoutError):
await communicator.receive_output()

@async_to_sync
async def test_wrong_connection_type(self):
application = get_asgi_application()
communicator = ApplicationCommunicator(
Expand All @@ -153,7 +146,6 @@ async def test_wrong_connection_type(self):
with self.assertRaisesMessage(ValueError, msg):
await communicator.receive_output()

@async_to_sync
async def test_non_unicode_query_string(self):
application = get_asgi_application()
communicator = ApplicationCommunicator(
Expand Down
4 changes: 1 addition & 3 deletions tests/async/tests.py
Expand Up @@ -27,7 +27,6 @@ async def async_cache():
@skipIf(sys.platform == 'win32' and (3, 8, 0) < sys.version_info < (3, 8, 1), 'https://bugs.python.org/issue38563')
class DatabaseConnectionTest(SimpleTestCase):
"""A database connection cannot be used in an async context."""
@async_to_sync
async def test_get_async_connection(self):
with self.assertRaises(SynchronousOnlyOperation):
list(SimpleModel.objects.all())
Expand All @@ -43,7 +42,6 @@ class AsyncUnsafeTest(SimpleTestCase):
def dangerous_method(self):
return True

@async_to_sync
async def test_async_unsafe(self):
# async_unsafe decorator catches bad access and returns the right
# message.
Expand All @@ -55,7 +53,7 @@ async def test_async_unsafe(self):
self.dangerous_method()

@mock.patch.dict(os.environ, {'DJANGO_ALLOW_ASYNC_UNSAFE': 'true'})
@async_to_sync
@async_to_sync # mock.patch() is not async-aware.
async def test_async_unsafe_suppressed(self):
# Decorator doesn't trigger check when the environment variable to
# suppress it is set.
Expand Down

0 comments on commit 17009e9

Please sign in to comment.