From a415ce70bef6d91036b00dd2c8544aed7aeeaaed Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Fri, 12 Apr 2019 06:15:18 -0700 Subject: Fixed #30451 -- Added ASGI handler and coroutine-safety. This adds an ASGI handler, asgi.py file for the default project layout, a few async utilities and adds async-safety to many parts of Django. --- tests/async/__init__.py | 0 tests/async/models.py | 5 +++++ tests/async/tests.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 tests/async/__init__.py create mode 100644 tests/async/models.py create mode 100644 tests/async/tests.py (limited to 'tests/async') diff --git a/tests/async/__init__.py b/tests/async/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/async/models.py b/tests/async/models.py new file mode 100644 index 0000000000..0fd606b07e --- /dev/null +++ b/tests/async/models.py @@ -0,0 +1,5 @@ +from django.db import models + + +class SimpleModel(models.Model): + field = models.IntegerField() diff --git a/tests/async/tests.py b/tests/async/tests.py new file mode 100644 index 0000000000..1e1cabc1c6 --- /dev/null +++ b/tests/async/tests.py @@ -0,0 +1,36 @@ +from asgiref.sync import async_to_sync + +from django.core.exceptions import SynchronousOnlyOperation +from django.test import SimpleTestCase +from django.utils.asyncio import async_unsafe + +from .models import SimpleModel + + +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()) + + +class AsyncUnsafeTest(SimpleTestCase): + """ + async_unsafe decorator should work correctly and returns the correct + message. + """ + @async_unsafe + 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. + msg = ( + 'You cannot call this from an async context - use a thread or ' + 'sync_to_async.' + ) + with self.assertRaisesMessage(SynchronousOnlyOperation, msg): + self.dangerous_method() -- cgit v1.3