summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_contextlib_async.py
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2017-12-14 01:19:17 (GMT)
committerYury Selivanov <yury@magic.io>2017-12-14 01:19:17 (GMT)
commit176baa326be4ec2dc70ca0c054b7e2ab7ca6a9cf (patch)
tree308b48c9671eb33abe108d59b87eaaccad40d9eb /Lib/test/test_contextlib_async.py
parentbfbf04ef18c93ca8cab0453f76aeea1d8fc23fb1 (diff)
downloadcpython-176baa326be4ec2dc70ca0c054b7e2ab7ca6a9cf.zip
cpython-176baa326be4ec2dc70ca0c054b7e2ab7ca6a9cf.tar.gz
cpython-176baa326be4ec2dc70ca0c054b7e2ab7ca6a9cf.tar.bz2
bpo-30241: implement contextlib.AbstractAsyncContextManager (#1412)
Diffstat (limited to 'Lib/test/test_contextlib_async.py')
-rw-r--r--Lib/test/test_contextlib_async.py49
1 files changed, 48 insertions, 1 deletions
diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py
index 42cc331..447ca96 100644
--- a/Lib/test/test_contextlib_async.py
+++ b/Lib/test/test_contextlib_async.py
@@ -1,5 +1,5 @@
import asyncio
-from contextlib import asynccontextmanager
+from contextlib import asynccontextmanager, AbstractAsyncContextManager
import functools
from test import support
import unittest
@@ -20,6 +20,53 @@ def _async_test(func):
return wrapper
+class TestAbstractAsyncContextManager(unittest.TestCase):
+
+ @_async_test
+ async def test_enter(self):
+ class DefaultEnter(AbstractAsyncContextManager):
+ async def __aexit__(self, *args):
+ await super().__aexit__(*args)
+
+ manager = DefaultEnter()
+ self.assertIs(await manager.__aenter__(), manager)
+
+ async with manager as context:
+ self.assertIs(manager, context)
+
+ def test_exit_is_abstract(self):
+ class MissingAexit(AbstractAsyncContextManager):
+ pass
+
+ with self.assertRaises(TypeError):
+ MissingAexit()
+
+ def test_structural_subclassing(self):
+ class ManagerFromScratch:
+ async def __aenter__(self):
+ return self
+ async def __aexit__(self, exc_type, exc_value, traceback):
+ return None
+
+ self.assertTrue(issubclass(ManagerFromScratch, AbstractAsyncContextManager))
+
+ class DefaultEnter(AbstractAsyncContextManager):
+ async def __aexit__(self, *args):
+ await super().__aexit__(*args)
+
+ self.assertTrue(issubclass(DefaultEnter, AbstractAsyncContextManager))
+
+ class NoneAenter(ManagerFromScratch):
+ __aenter__ = None
+
+ self.assertFalse(issubclass(NoneAenter, AbstractAsyncContextManager))
+
+ class NoneAexit(ManagerFromScratch):
+ __aexit__ = None
+
+ self.assertFalse(issubclass(NoneAexit, AbstractAsyncContextManager))
+
+
class AsyncContextManagerTestCase(unittest.TestCase):
@_async_test