17db96d56Sopenharmony_ciimport asyncio
27db96d56Sopenharmony_ciimport gc
37db96d56Sopenharmony_ciimport inspect
47db96d56Sopenharmony_ciimport re
57db96d56Sopenharmony_ciimport unittest
67db96d56Sopenharmony_cifrom contextlib import contextmanager
77db96d56Sopenharmony_cifrom test import support
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_cisupport.requires_working_socket(module=True)
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cifrom asyncio import run, iscoroutinefunction
127db96d56Sopenharmony_cifrom unittest import IsolatedAsyncioTestCase
137db96d56Sopenharmony_cifrom unittest.mock import (ANY, call, AsyncMock, patch, MagicMock, Mock,
147db96d56Sopenharmony_ci                           create_autospec, sentinel, _CallList, seal)
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_cidef tearDownModule():
187db96d56Sopenharmony_ci    asyncio.set_event_loop_policy(None)
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ciclass AsyncClass:
227db96d56Sopenharmony_ci    def __init__(self): pass
237db96d56Sopenharmony_ci    async def async_method(self): pass
247db96d56Sopenharmony_ci    def normal_method(self): pass
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    @classmethod
277db96d56Sopenharmony_ci    async def async_class_method(cls): pass
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    @staticmethod
307db96d56Sopenharmony_ci    async def async_static_method(): pass
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ciclass AwaitableClass:
347db96d56Sopenharmony_ci    def __await__(self): yield
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciasync def async_func(): pass
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciasync def async_func_args(a, b, *, c): pass
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_cidef normal_func(): pass
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ciclass NormalClass(object):
437db96d56Sopenharmony_ci    def a(self): pass
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ciasync_foo_name = f'{__name__}.AsyncClass'
477db96d56Sopenharmony_cinormal_foo_name = f'{__name__}.NormalClass'
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci@contextmanager
517db96d56Sopenharmony_cidef assertNeverAwaited(test):
527db96d56Sopenharmony_ci    with test.assertWarnsRegex(RuntimeWarning, "was never awaited$"):
537db96d56Sopenharmony_ci        yield
547db96d56Sopenharmony_ci        # In non-CPython implementations of Python, this is needed because timely
557db96d56Sopenharmony_ci        # deallocation is not guaranteed by the garbage collector.
567db96d56Sopenharmony_ci        gc.collect()
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ciclass AsyncPatchDecoratorTest(unittest.TestCase):
607db96d56Sopenharmony_ci    def test_is_coroutine_function_patch(self):
617db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_method')
627db96d56Sopenharmony_ci        def test_async(mock_method):
637db96d56Sopenharmony_ci            self.assertTrue(iscoroutinefunction(mock_method))
647db96d56Sopenharmony_ci        test_async()
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    def test_is_async_patch(self):
677db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_method')
687db96d56Sopenharmony_ci        def test_async(mock_method):
697db96d56Sopenharmony_ci            m = mock_method()
707db96d56Sopenharmony_ci            self.assertTrue(inspect.isawaitable(m))
717db96d56Sopenharmony_ci            run(m)
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci        @patch(f'{async_foo_name}.async_method')
747db96d56Sopenharmony_ci        def test_no_parent_attribute(mock_method):
757db96d56Sopenharmony_ci            m = mock_method()
767db96d56Sopenharmony_ci            self.assertTrue(inspect.isawaitable(m))
777db96d56Sopenharmony_ci            run(m)
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci        test_async()
807db96d56Sopenharmony_ci        test_no_parent_attribute()
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    def test_is_AsyncMock_patch(self):
837db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_method')
847db96d56Sopenharmony_ci        def test_async(mock_method):
857db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, AsyncMock)
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci        test_async()
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    def test_is_AsyncMock_patch_staticmethod(self):
907db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_static_method')
917db96d56Sopenharmony_ci        def test_async(mock_method):
927db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, AsyncMock)
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci        test_async()
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci    def test_is_AsyncMock_patch_classmethod(self):
977db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_class_method')
987db96d56Sopenharmony_ci        def test_async(mock_method):
997db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, AsyncMock)
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci        test_async()
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci    def test_async_def_patch(self):
1047db96d56Sopenharmony_ci        @patch(f"{__name__}.async_func", return_value=1)
1057db96d56Sopenharmony_ci        @patch(f"{__name__}.async_func_args", return_value=2)
1067db96d56Sopenharmony_ci        async def test_async(func_args_mock, func_mock):
1077db96d56Sopenharmony_ci            self.assertEqual(func_args_mock._mock_name, "async_func_args")
1087db96d56Sopenharmony_ci            self.assertEqual(func_mock._mock_name, "async_func")
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci            self.assertIsInstance(async_func, AsyncMock)
1117db96d56Sopenharmony_ci            self.assertIsInstance(async_func_args, AsyncMock)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci            self.assertEqual(await async_func(), 1)
1147db96d56Sopenharmony_ci            self.assertEqual(await async_func_args(1, 2, c=3), 2)
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci        run(test_async())
1177db96d56Sopenharmony_ci        self.assertTrue(inspect.iscoroutinefunction(async_func))
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ciclass AsyncPatchCMTest(unittest.TestCase):
1217db96d56Sopenharmony_ci    def test_is_async_function_cm(self):
1227db96d56Sopenharmony_ci        def test_async():
1237db96d56Sopenharmony_ci            with patch.object(AsyncClass, 'async_method') as mock_method:
1247db96d56Sopenharmony_ci                self.assertTrue(iscoroutinefunction(mock_method))
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci        test_async()
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci    def test_is_async_cm(self):
1297db96d56Sopenharmony_ci        def test_async():
1307db96d56Sopenharmony_ci            with patch.object(AsyncClass, 'async_method') as mock_method:
1317db96d56Sopenharmony_ci                m = mock_method()
1327db96d56Sopenharmony_ci                self.assertTrue(inspect.isawaitable(m))
1337db96d56Sopenharmony_ci                run(m)
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci        test_async()
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci    def test_is_AsyncMock_cm(self):
1387db96d56Sopenharmony_ci        def test_async():
1397db96d56Sopenharmony_ci            with patch.object(AsyncClass, 'async_method') as mock_method:
1407db96d56Sopenharmony_ci                self.assertIsInstance(mock_method, AsyncMock)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci        test_async()
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci    def test_async_def_cm(self):
1457db96d56Sopenharmony_ci        async def test_async():
1467db96d56Sopenharmony_ci            with patch(f"{__name__}.async_func", AsyncMock()):
1477db96d56Sopenharmony_ci                self.assertIsInstance(async_func, AsyncMock)
1487db96d56Sopenharmony_ci            self.assertTrue(inspect.iscoroutinefunction(async_func))
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci        run(test_async())
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci    def test_patch_dict_async_def(self):
1537db96d56Sopenharmony_ci        foo = {'a': 'a'}
1547db96d56Sopenharmony_ci        @patch.dict(foo, {'a': 'b'})
1557db96d56Sopenharmony_ci        async def test_async():
1567db96d56Sopenharmony_ci            self.assertEqual(foo['a'], 'b')
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(test_async))
1597db96d56Sopenharmony_ci        run(test_async())
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci    def test_patch_dict_async_def_context(self):
1627db96d56Sopenharmony_ci        foo = {'a': 'a'}
1637db96d56Sopenharmony_ci        async def test_async():
1647db96d56Sopenharmony_ci            with patch.dict(foo, {'a': 'b'}):
1657db96d56Sopenharmony_ci                self.assertEqual(foo['a'], 'b')
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci        run(test_async())
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ciclass AsyncMockTest(unittest.TestCase):
1717db96d56Sopenharmony_ci    def test_iscoroutinefunction_default(self):
1727db96d56Sopenharmony_ci        mock = AsyncMock()
1737db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock))
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci    def test_iscoroutinefunction_function(self):
1767db96d56Sopenharmony_ci        async def foo(): pass
1777db96d56Sopenharmony_ci        mock = AsyncMock(foo)
1787db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock))
1797db96d56Sopenharmony_ci        self.assertTrue(inspect.iscoroutinefunction(mock))
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci    def test_isawaitable(self):
1827db96d56Sopenharmony_ci        mock = AsyncMock()
1837db96d56Sopenharmony_ci        m = mock()
1847db96d56Sopenharmony_ci        self.assertTrue(inspect.isawaitable(m))
1857db96d56Sopenharmony_ci        run(m)
1867db96d56Sopenharmony_ci        self.assertIn('assert_awaited', dir(mock))
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci    def test_iscoroutinefunction_normal_function(self):
1897db96d56Sopenharmony_ci        def foo(): pass
1907db96d56Sopenharmony_ci        mock = AsyncMock(foo)
1917db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock))
1927db96d56Sopenharmony_ci        self.assertTrue(inspect.iscoroutinefunction(mock))
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci    def test_future_isfuture(self):
1957db96d56Sopenharmony_ci        loop = asyncio.new_event_loop()
1967db96d56Sopenharmony_ci        fut = loop.create_future()
1977db96d56Sopenharmony_ci        loop.stop()
1987db96d56Sopenharmony_ci        loop.close()
1997db96d56Sopenharmony_ci        mock = AsyncMock(fut)
2007db96d56Sopenharmony_ci        self.assertIsInstance(mock, asyncio.Future)
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ciclass AsyncAutospecTest(unittest.TestCase):
2047db96d56Sopenharmony_ci    def test_is_AsyncMock_patch(self):
2057db96d56Sopenharmony_ci        @patch(async_foo_name, autospec=True)
2067db96d56Sopenharmony_ci        def test_async(mock_method):
2077db96d56Sopenharmony_ci            self.assertIsInstance(mock_method.async_method, AsyncMock)
2087db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, MagicMock)
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci        @patch(async_foo_name, autospec=True)
2117db96d56Sopenharmony_ci        def test_normal_method(mock_method):
2127db96d56Sopenharmony_ci            self.assertIsInstance(mock_method.normal_method, MagicMock)
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        test_async()
2157db96d56Sopenharmony_ci        test_normal_method()
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci    def test_create_autospec_instance(self):
2187db96d56Sopenharmony_ci        with self.assertRaises(RuntimeError):
2197db96d56Sopenharmony_ci            create_autospec(async_func, instance=True)
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci    @unittest.skip('Broken test from https://bugs.python.org/issue37251')
2227db96d56Sopenharmony_ci    def test_create_autospec_awaitable_class(self):
2237db96d56Sopenharmony_ci        self.assertIsInstance(create_autospec(AwaitableClass), AsyncMock)
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci    def test_create_autospec(self):
2267db96d56Sopenharmony_ci        spec = create_autospec(async_func_args)
2277db96d56Sopenharmony_ci        awaitable = spec(1, 2, c=3)
2287db96d56Sopenharmony_ci        async def main():
2297db96d56Sopenharmony_ci            await awaitable
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci        self.assertEqual(spec.await_count, 0)
2327db96d56Sopenharmony_ci        self.assertIsNone(spec.await_args)
2337db96d56Sopenharmony_ci        self.assertEqual(spec.await_args_list, [])
2347db96d56Sopenharmony_ci        spec.assert_not_awaited()
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci        run(main())
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(spec))
2397db96d56Sopenharmony_ci        self.assertTrue(asyncio.iscoroutine(awaitable))
2407db96d56Sopenharmony_ci        self.assertEqual(spec.await_count, 1)
2417db96d56Sopenharmony_ci        self.assertEqual(spec.await_args, call(1, 2, c=3))
2427db96d56Sopenharmony_ci        self.assertEqual(spec.await_args_list, [call(1, 2, c=3)])
2437db96d56Sopenharmony_ci        spec.assert_awaited_once()
2447db96d56Sopenharmony_ci        spec.assert_awaited_once_with(1, 2, c=3)
2457db96d56Sopenharmony_ci        spec.assert_awaited_with(1, 2, c=3)
2467db96d56Sopenharmony_ci        spec.assert_awaited()
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
2497db96d56Sopenharmony_ci            spec.assert_any_await(e=1)
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci    def test_patch_with_autospec(self):
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci        async def test_async():
2557db96d56Sopenharmony_ci            with patch(f"{__name__}.async_func_args", autospec=True) as mock_method:
2567db96d56Sopenharmony_ci                awaitable = mock_method(1, 2, c=3)
2577db96d56Sopenharmony_ci                self.assertIsInstance(mock_method.mock, AsyncMock)
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci                self.assertTrue(iscoroutinefunction(mock_method))
2607db96d56Sopenharmony_ci                self.assertTrue(asyncio.iscoroutine(awaitable))
2617db96d56Sopenharmony_ci                self.assertTrue(inspect.isawaitable(awaitable))
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci                # Verify the default values during mock setup
2647db96d56Sopenharmony_ci                self.assertEqual(mock_method.await_count, 0)
2657db96d56Sopenharmony_ci                self.assertEqual(mock_method.await_args_list, [])
2667db96d56Sopenharmony_ci                self.assertIsNone(mock_method.await_args)
2677db96d56Sopenharmony_ci                mock_method.assert_not_awaited()
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci                await awaitable
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci            self.assertEqual(mock_method.await_count, 1)
2727db96d56Sopenharmony_ci            self.assertEqual(mock_method.await_args, call(1, 2, c=3))
2737db96d56Sopenharmony_ci            self.assertEqual(mock_method.await_args_list, [call(1, 2, c=3)])
2747db96d56Sopenharmony_ci            mock_method.assert_awaited_once()
2757db96d56Sopenharmony_ci            mock_method.assert_awaited_once_with(1, 2, c=3)
2767db96d56Sopenharmony_ci            mock_method.assert_awaited_with(1, 2, c=3)
2777db96d56Sopenharmony_ci            mock_method.assert_awaited()
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci            mock_method.reset_mock()
2807db96d56Sopenharmony_ci            self.assertEqual(mock_method.await_count, 0)
2817db96d56Sopenharmony_ci            self.assertIsNone(mock_method.await_args)
2827db96d56Sopenharmony_ci            self.assertEqual(mock_method.await_args_list, [])
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci        run(test_async())
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ciclass AsyncSpecTest(unittest.TestCase):
2887db96d56Sopenharmony_ci    def test_spec_normal_methods_on_class(self):
2897db96d56Sopenharmony_ci        def inner_test(mock_type):
2907db96d56Sopenharmony_ci            mock = mock_type(AsyncClass)
2917db96d56Sopenharmony_ci            self.assertIsInstance(mock.async_method, AsyncMock)
2927db96d56Sopenharmony_ci            self.assertIsInstance(mock.normal_method, MagicMock)
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock]:
2957db96d56Sopenharmony_ci            with self.subTest(f"test method types with {mock_type}"):
2967db96d56Sopenharmony_ci                inner_test(mock_type)
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci    def test_spec_normal_methods_on_class_with_mock(self):
2997db96d56Sopenharmony_ci        mock = Mock(AsyncClass)
3007db96d56Sopenharmony_ci        self.assertIsInstance(mock.async_method, AsyncMock)
3017db96d56Sopenharmony_ci        self.assertIsInstance(mock.normal_method, Mock)
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci    def test_spec_normal_methods_on_class_with_mock_seal(self):
3047db96d56Sopenharmony_ci        mock = Mock(AsyncClass)
3057db96d56Sopenharmony_ci        seal(mock)
3067db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
3077db96d56Sopenharmony_ci            mock.normal_method
3087db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
3097db96d56Sopenharmony_ci            mock.async_method
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci    def test_spec_mock_type_kw(self):
3127db96d56Sopenharmony_ci        def inner_test(mock_type):
3137db96d56Sopenharmony_ci            async_mock = mock_type(spec=async_func)
3147db96d56Sopenharmony_ci            self.assertIsInstance(async_mock, mock_type)
3157db96d56Sopenharmony_ci            with assertNeverAwaited(self):
3167db96d56Sopenharmony_ci                self.assertTrue(inspect.isawaitable(async_mock()))
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci            sync_mock = mock_type(spec=normal_func)
3197db96d56Sopenharmony_ci            self.assertIsInstance(sync_mock, mock_type)
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock, Mock]:
3227db96d56Sopenharmony_ci            with self.subTest(f"test spec kwarg with {mock_type}"):
3237db96d56Sopenharmony_ci                inner_test(mock_type)
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci    def test_spec_mock_type_positional(self):
3267db96d56Sopenharmony_ci        def inner_test(mock_type):
3277db96d56Sopenharmony_ci            async_mock = mock_type(async_func)
3287db96d56Sopenharmony_ci            self.assertIsInstance(async_mock, mock_type)
3297db96d56Sopenharmony_ci            with assertNeverAwaited(self):
3307db96d56Sopenharmony_ci                self.assertTrue(inspect.isawaitable(async_mock()))
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci            sync_mock = mock_type(normal_func)
3337db96d56Sopenharmony_ci            self.assertIsInstance(sync_mock, mock_type)
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock, Mock]:
3367db96d56Sopenharmony_ci            with self.subTest(f"test spec positional with {mock_type}"):
3377db96d56Sopenharmony_ci                inner_test(mock_type)
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci    def test_spec_as_normal_kw_AsyncMock(self):
3407db96d56Sopenharmony_ci        mock = AsyncMock(spec=normal_func)
3417db96d56Sopenharmony_ci        self.assertIsInstance(mock, AsyncMock)
3427db96d56Sopenharmony_ci        m = mock()
3437db96d56Sopenharmony_ci        self.assertTrue(inspect.isawaitable(m))
3447db96d56Sopenharmony_ci        run(m)
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci    def test_spec_as_normal_positional_AsyncMock(self):
3477db96d56Sopenharmony_ci        mock = AsyncMock(normal_func)
3487db96d56Sopenharmony_ci        self.assertIsInstance(mock, AsyncMock)
3497db96d56Sopenharmony_ci        m = mock()
3507db96d56Sopenharmony_ci        self.assertTrue(inspect.isawaitable(m))
3517db96d56Sopenharmony_ci        run(m)
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci    def test_spec_async_mock(self):
3547db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_method', spec=True)
3557db96d56Sopenharmony_ci        def test_async(mock_method):
3567db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, AsyncMock)
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci        test_async()
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci    def test_spec_parent_not_async_attribute_is(self):
3617db96d56Sopenharmony_ci        @patch(async_foo_name, spec=True)
3627db96d56Sopenharmony_ci        def test_async(mock_method):
3637db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, MagicMock)
3647db96d56Sopenharmony_ci            self.assertIsInstance(mock_method.async_method, AsyncMock)
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci        test_async()
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci    def test_target_async_spec_not(self):
3697db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_method', spec=NormalClass.a)
3707db96d56Sopenharmony_ci        def test_async_attribute(mock_method):
3717db96d56Sopenharmony_ci            self.assertIsInstance(mock_method, MagicMock)
3727db96d56Sopenharmony_ci            self.assertFalse(inspect.iscoroutine(mock_method))
3737db96d56Sopenharmony_ci            self.assertFalse(inspect.isawaitable(mock_method))
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci        test_async_attribute()
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci    def test_target_not_async_spec_is(self):
3787db96d56Sopenharmony_ci        @patch.object(NormalClass, 'a', spec=async_func)
3797db96d56Sopenharmony_ci        def test_attribute_not_async_spec_is(mock_async_func):
3807db96d56Sopenharmony_ci            self.assertIsInstance(mock_async_func, AsyncMock)
3817db96d56Sopenharmony_ci        test_attribute_not_async_spec_is()
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci    def test_spec_async_attributes(self):
3847db96d56Sopenharmony_ci        @patch(normal_foo_name, spec=AsyncClass)
3857db96d56Sopenharmony_ci        def test_async_attributes_coroutines(MockNormalClass):
3867db96d56Sopenharmony_ci            self.assertIsInstance(MockNormalClass.async_method, AsyncMock)
3877db96d56Sopenharmony_ci            self.assertIsInstance(MockNormalClass, MagicMock)
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci        test_async_attributes_coroutines()
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ciclass AsyncSpecSetTest(unittest.TestCase):
3937db96d56Sopenharmony_ci    def test_is_AsyncMock_patch(self):
3947db96d56Sopenharmony_ci        @patch.object(AsyncClass, 'async_method', spec_set=True)
3957db96d56Sopenharmony_ci        def test_async(async_method):
3967db96d56Sopenharmony_ci            self.assertIsInstance(async_method, AsyncMock)
3977db96d56Sopenharmony_ci        test_async()
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci    def test_is_async_AsyncMock(self):
4007db96d56Sopenharmony_ci        mock = AsyncMock(spec_set=AsyncClass.async_method)
4017db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock))
4027db96d56Sopenharmony_ci        self.assertIsInstance(mock, AsyncMock)
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    def test_is_child_AsyncMock(self):
4057db96d56Sopenharmony_ci        mock = MagicMock(spec_set=AsyncClass)
4067db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock.async_method))
4077db96d56Sopenharmony_ci        self.assertFalse(iscoroutinefunction(mock.normal_method))
4087db96d56Sopenharmony_ci        self.assertIsInstance(mock.async_method, AsyncMock)
4097db96d56Sopenharmony_ci        self.assertIsInstance(mock.normal_method, MagicMock)
4107db96d56Sopenharmony_ci        self.assertIsInstance(mock, MagicMock)
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci    def test_magicmock_lambda_spec(self):
4137db96d56Sopenharmony_ci        mock_obj = MagicMock()
4147db96d56Sopenharmony_ci        mock_obj.mock_func = MagicMock(spec=lambda x: x)
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci        with patch.object(mock_obj, "mock_func") as cm:
4177db96d56Sopenharmony_ci            self.assertIsInstance(cm, MagicMock)
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ciclass AsyncArguments(IsolatedAsyncioTestCase):
4217db96d56Sopenharmony_ci    async def test_add_return_value(self):
4227db96d56Sopenharmony_ci        async def addition(self, var): pass
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci        mock = AsyncMock(addition, return_value=10)
4257db96d56Sopenharmony_ci        output = await mock(5)
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci        self.assertEqual(output, 10)
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci    async def test_add_side_effect_exception(self):
4307db96d56Sopenharmony_ci        async def addition(var): pass
4317db96d56Sopenharmony_ci        mock = AsyncMock(addition, side_effect=Exception('err'))
4327db96d56Sopenharmony_ci        with self.assertRaises(Exception):
4337db96d56Sopenharmony_ci            await mock(5)
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci    async def test_add_side_effect_coroutine(self):
4367db96d56Sopenharmony_ci        async def addition(var):
4377db96d56Sopenharmony_ci            return var + 1
4387db96d56Sopenharmony_ci        mock = AsyncMock(side_effect=addition)
4397db96d56Sopenharmony_ci        result = await mock(5)
4407db96d56Sopenharmony_ci        self.assertEqual(result, 6)
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci    async def test_add_side_effect_normal_function(self):
4437db96d56Sopenharmony_ci        def addition(var):
4447db96d56Sopenharmony_ci            return var + 1
4457db96d56Sopenharmony_ci        mock = AsyncMock(side_effect=addition)
4467db96d56Sopenharmony_ci        result = await mock(5)
4477db96d56Sopenharmony_ci        self.assertEqual(result, 6)
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci    async def test_add_side_effect_iterable(self):
4507db96d56Sopenharmony_ci        vals = [1, 2, 3]
4517db96d56Sopenharmony_ci        mock = AsyncMock(side_effect=vals)
4527db96d56Sopenharmony_ci        for item in vals:
4537db96d56Sopenharmony_ci            self.assertEqual(await mock(), item)
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci        with self.assertRaises(StopAsyncIteration) as e:
4567db96d56Sopenharmony_ci            await mock()
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ci    async def test_add_side_effect_exception_iterable(self):
4597db96d56Sopenharmony_ci        class SampleException(Exception):
4607db96d56Sopenharmony_ci            pass
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci        vals = [1, SampleException("foo")]
4637db96d56Sopenharmony_ci        mock = AsyncMock(side_effect=vals)
4647db96d56Sopenharmony_ci        self.assertEqual(await mock(), 1)
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci        with self.assertRaises(SampleException) as e:
4677db96d56Sopenharmony_ci            await mock()
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci    async def test_return_value_AsyncMock(self):
4707db96d56Sopenharmony_ci        value = AsyncMock(return_value=10)
4717db96d56Sopenharmony_ci        mock = AsyncMock(return_value=value)
4727db96d56Sopenharmony_ci        result = await mock()
4737db96d56Sopenharmony_ci        self.assertIs(result, value)
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci    async def test_return_value_awaitable(self):
4767db96d56Sopenharmony_ci        fut = asyncio.Future()
4777db96d56Sopenharmony_ci        fut.set_result(None)
4787db96d56Sopenharmony_ci        mock = AsyncMock(return_value=fut)
4797db96d56Sopenharmony_ci        result = await mock()
4807db96d56Sopenharmony_ci        self.assertIsInstance(result, asyncio.Future)
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci    async def test_side_effect_awaitable_values(self):
4837db96d56Sopenharmony_ci        fut = asyncio.Future()
4847db96d56Sopenharmony_ci        fut.set_result(None)
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci        mock = AsyncMock(side_effect=[fut])
4877db96d56Sopenharmony_ci        result = await mock()
4887db96d56Sopenharmony_ci        self.assertIsInstance(result, asyncio.Future)
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci        with self.assertRaises(StopAsyncIteration):
4917db96d56Sopenharmony_ci            await mock()
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci    async def test_side_effect_is_AsyncMock(self):
4947db96d56Sopenharmony_ci        effect = AsyncMock(return_value=10)
4957db96d56Sopenharmony_ci        mock = AsyncMock(side_effect=effect)
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ci        result = await mock()
4987db96d56Sopenharmony_ci        self.assertEqual(result, 10)
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci    async def test_wraps_coroutine(self):
5017db96d56Sopenharmony_ci        value = asyncio.Future()
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci        ran = False
5047db96d56Sopenharmony_ci        async def inner():
5057db96d56Sopenharmony_ci            nonlocal ran
5067db96d56Sopenharmony_ci            ran = True
5077db96d56Sopenharmony_ci            return value
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci        mock = AsyncMock(wraps=inner)
5107db96d56Sopenharmony_ci        result = await mock()
5117db96d56Sopenharmony_ci        self.assertEqual(result, value)
5127db96d56Sopenharmony_ci        mock.assert_awaited()
5137db96d56Sopenharmony_ci        self.assertTrue(ran)
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci    async def test_wraps_normal_function(self):
5167db96d56Sopenharmony_ci        value = 1
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci        ran = False
5197db96d56Sopenharmony_ci        def inner():
5207db96d56Sopenharmony_ci            nonlocal ran
5217db96d56Sopenharmony_ci            ran = True
5227db96d56Sopenharmony_ci            return value
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci        mock = AsyncMock(wraps=inner)
5257db96d56Sopenharmony_ci        result = await mock()
5267db96d56Sopenharmony_ci        self.assertEqual(result, value)
5277db96d56Sopenharmony_ci        mock.assert_awaited()
5287db96d56Sopenharmony_ci        self.assertTrue(ran)
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci    async def test_await_args_list_order(self):
5317db96d56Sopenharmony_ci        async_mock = AsyncMock()
5327db96d56Sopenharmony_ci        mock2 = async_mock(2)
5337db96d56Sopenharmony_ci        mock1 = async_mock(1)
5347db96d56Sopenharmony_ci        await mock1
5357db96d56Sopenharmony_ci        await mock2
5367db96d56Sopenharmony_ci        async_mock.assert_has_awaits([call(1), call(2)])
5377db96d56Sopenharmony_ci        self.assertEqual(async_mock.await_args_list, [call(1), call(2)])
5387db96d56Sopenharmony_ci        self.assertEqual(async_mock.call_args_list, [call(2), call(1)])
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ciclass AsyncMagicMethods(unittest.TestCase):
5427db96d56Sopenharmony_ci    def test_async_magic_methods_return_async_mocks(self):
5437db96d56Sopenharmony_ci        m_mock = MagicMock()
5447db96d56Sopenharmony_ci        self.assertIsInstance(m_mock.__aenter__, AsyncMock)
5457db96d56Sopenharmony_ci        self.assertIsInstance(m_mock.__aexit__, AsyncMock)
5467db96d56Sopenharmony_ci        self.assertIsInstance(m_mock.__anext__, AsyncMock)
5477db96d56Sopenharmony_ci        # __aiter__ is actually a synchronous object
5487db96d56Sopenharmony_ci        # so should return a MagicMock
5497db96d56Sopenharmony_ci        self.assertIsInstance(m_mock.__aiter__, MagicMock)
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci    def test_sync_magic_methods_return_magic_mocks(self):
5527db96d56Sopenharmony_ci        a_mock = AsyncMock()
5537db96d56Sopenharmony_ci        self.assertIsInstance(a_mock.__enter__, MagicMock)
5547db96d56Sopenharmony_ci        self.assertIsInstance(a_mock.__exit__, MagicMock)
5557db96d56Sopenharmony_ci        self.assertIsInstance(a_mock.__next__, MagicMock)
5567db96d56Sopenharmony_ci        self.assertIsInstance(a_mock.__len__, MagicMock)
5577db96d56Sopenharmony_ci
5587db96d56Sopenharmony_ci    def test_magicmock_has_async_magic_methods(self):
5597db96d56Sopenharmony_ci        m_mock = MagicMock()
5607db96d56Sopenharmony_ci        self.assertTrue(hasattr(m_mock, "__aenter__"))
5617db96d56Sopenharmony_ci        self.assertTrue(hasattr(m_mock, "__aexit__"))
5627db96d56Sopenharmony_ci        self.assertTrue(hasattr(m_mock, "__anext__"))
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci    def test_asyncmock_has_sync_magic_methods(self):
5657db96d56Sopenharmony_ci        a_mock = AsyncMock()
5667db96d56Sopenharmony_ci        self.assertTrue(hasattr(a_mock, "__enter__"))
5677db96d56Sopenharmony_ci        self.assertTrue(hasattr(a_mock, "__exit__"))
5687db96d56Sopenharmony_ci        self.assertTrue(hasattr(a_mock, "__next__"))
5697db96d56Sopenharmony_ci        self.assertTrue(hasattr(a_mock, "__len__"))
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci    def test_magic_methods_are_async_functions(self):
5727db96d56Sopenharmony_ci        m_mock = MagicMock()
5737db96d56Sopenharmony_ci        self.assertIsInstance(m_mock.__aenter__, AsyncMock)
5747db96d56Sopenharmony_ci        self.assertIsInstance(m_mock.__aexit__, AsyncMock)
5757db96d56Sopenharmony_ci        # AsyncMocks are also coroutine functions
5767db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(m_mock.__aenter__))
5777db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(m_mock.__aexit__))
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ciclass AsyncContextManagerTest(unittest.TestCase):
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci    class WithAsyncContextManager:
5827db96d56Sopenharmony_ci        async def __aenter__(self, *args, **kwargs): pass
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ci        async def __aexit__(self, *args, **kwargs): pass
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci    class WithSyncContextManager:
5877db96d56Sopenharmony_ci        def __enter__(self, *args, **kwargs): pass
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci        def __exit__(self, *args, **kwargs): pass
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ci    class ProductionCode:
5927db96d56Sopenharmony_ci        # Example real-world(ish) code
5937db96d56Sopenharmony_ci        def __init__(self):
5947db96d56Sopenharmony_ci            self.session = None
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ci        async def main(self):
5977db96d56Sopenharmony_ci            async with self.session.post('https://python.org') as response:
5987db96d56Sopenharmony_ci                val = await response.json()
5997db96d56Sopenharmony_ci                return val
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ci    def test_set_return_value_of_aenter(self):
6027db96d56Sopenharmony_ci        def inner_test(mock_type):
6037db96d56Sopenharmony_ci            pc = self.ProductionCode()
6047db96d56Sopenharmony_ci            pc.session = MagicMock(name='sessionmock')
6057db96d56Sopenharmony_ci            cm = mock_type(name='magic_cm')
6067db96d56Sopenharmony_ci            response = AsyncMock(name='response')
6077db96d56Sopenharmony_ci            response.json = AsyncMock(return_value={'json': 123})
6087db96d56Sopenharmony_ci            cm.__aenter__.return_value = response
6097db96d56Sopenharmony_ci            pc.session.post.return_value = cm
6107db96d56Sopenharmony_ci            result = run(pc.main())
6117db96d56Sopenharmony_ci            self.assertEqual(result, {'json': 123})
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock]:
6147db96d56Sopenharmony_ci            with self.subTest(f"test set return value of aenter with {mock_type}"):
6157db96d56Sopenharmony_ci                inner_test(mock_type)
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci    def test_mock_supports_async_context_manager(self):
6187db96d56Sopenharmony_ci        def inner_test(mock_type):
6197db96d56Sopenharmony_ci            called = False
6207db96d56Sopenharmony_ci            cm = self.WithAsyncContextManager()
6217db96d56Sopenharmony_ci            cm_mock = mock_type(cm)
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci            async def use_context_manager():
6247db96d56Sopenharmony_ci                nonlocal called
6257db96d56Sopenharmony_ci                async with cm_mock as result:
6267db96d56Sopenharmony_ci                    called = True
6277db96d56Sopenharmony_ci                return result
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci            cm_result = run(use_context_manager())
6307db96d56Sopenharmony_ci            self.assertTrue(called)
6317db96d56Sopenharmony_ci            self.assertTrue(cm_mock.__aenter__.called)
6327db96d56Sopenharmony_ci            self.assertTrue(cm_mock.__aexit__.called)
6337db96d56Sopenharmony_ci            cm_mock.__aenter__.assert_awaited()
6347db96d56Sopenharmony_ci            cm_mock.__aexit__.assert_awaited()
6357db96d56Sopenharmony_ci            # We mock __aenter__ so it does not return self
6367db96d56Sopenharmony_ci            self.assertIsNot(cm_mock, cm_result)
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock]:
6397db96d56Sopenharmony_ci            with self.subTest(f"test context manager magics with {mock_type}"):
6407db96d56Sopenharmony_ci                inner_test(mock_type)
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci    def test_mock_customize_async_context_manager(self):
6447db96d56Sopenharmony_ci        instance = self.WithAsyncContextManager()
6457db96d56Sopenharmony_ci        mock_instance = MagicMock(instance)
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci        expected_result = object()
6487db96d56Sopenharmony_ci        mock_instance.__aenter__.return_value = expected_result
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci        async def use_context_manager():
6517db96d56Sopenharmony_ci            async with mock_instance as result:
6527db96d56Sopenharmony_ci                return result
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci        self.assertIs(run(use_context_manager()), expected_result)
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci    def test_mock_customize_async_context_manager_with_coroutine(self):
6577db96d56Sopenharmony_ci        enter_called = False
6587db96d56Sopenharmony_ci        exit_called = False
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ci        async def enter_coroutine(*args):
6617db96d56Sopenharmony_ci            nonlocal enter_called
6627db96d56Sopenharmony_ci            enter_called = True
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci        async def exit_coroutine(*args):
6657db96d56Sopenharmony_ci            nonlocal exit_called
6667db96d56Sopenharmony_ci            exit_called = True
6677db96d56Sopenharmony_ci
6687db96d56Sopenharmony_ci        instance = self.WithAsyncContextManager()
6697db96d56Sopenharmony_ci        mock_instance = MagicMock(instance)
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci        mock_instance.__aenter__ = enter_coroutine
6727db96d56Sopenharmony_ci        mock_instance.__aexit__ = exit_coroutine
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci        async def use_context_manager():
6757db96d56Sopenharmony_ci            async with mock_instance:
6767db96d56Sopenharmony_ci                pass
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci        run(use_context_manager())
6797db96d56Sopenharmony_ci        self.assertTrue(enter_called)
6807db96d56Sopenharmony_ci        self.assertTrue(exit_called)
6817db96d56Sopenharmony_ci
6827db96d56Sopenharmony_ci    def test_context_manager_raise_exception_by_default(self):
6837db96d56Sopenharmony_ci        async def raise_in(context_manager):
6847db96d56Sopenharmony_ci            async with context_manager:
6857db96d56Sopenharmony_ci                raise TypeError()
6867db96d56Sopenharmony_ci
6877db96d56Sopenharmony_ci        instance = self.WithAsyncContextManager()
6887db96d56Sopenharmony_ci        mock_instance = MagicMock(instance)
6897db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
6907db96d56Sopenharmony_ci            run(raise_in(mock_instance))
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ciclass AsyncIteratorTest(unittest.TestCase):
6947db96d56Sopenharmony_ci    class WithAsyncIterator(object):
6957db96d56Sopenharmony_ci        def __init__(self):
6967db96d56Sopenharmony_ci            self.items = ["foo", "NormalFoo", "baz"]
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci        def __aiter__(self): pass
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci        async def __anext__(self): pass
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci    def test_aiter_set_return_value(self):
7037db96d56Sopenharmony_ci        mock_iter = AsyncMock(name="tester")
7047db96d56Sopenharmony_ci        mock_iter.__aiter__.return_value = [1, 2, 3]
7057db96d56Sopenharmony_ci        async def main():
7067db96d56Sopenharmony_ci            return [i async for i in mock_iter]
7077db96d56Sopenharmony_ci        result = run(main())
7087db96d56Sopenharmony_ci        self.assertEqual(result, [1, 2, 3])
7097db96d56Sopenharmony_ci
7107db96d56Sopenharmony_ci    def test_mock_aiter_and_anext_asyncmock(self):
7117db96d56Sopenharmony_ci        def inner_test(mock_type):
7127db96d56Sopenharmony_ci            instance = self.WithAsyncIterator()
7137db96d56Sopenharmony_ci            mock_instance = mock_type(instance)
7147db96d56Sopenharmony_ci            # Check that the mock and the real thing bahave the same
7157db96d56Sopenharmony_ci            # __aiter__ is not actually async, so not a coroutinefunction
7167db96d56Sopenharmony_ci            self.assertFalse(iscoroutinefunction(instance.__aiter__))
7177db96d56Sopenharmony_ci            self.assertFalse(iscoroutinefunction(mock_instance.__aiter__))
7187db96d56Sopenharmony_ci            # __anext__ is async
7197db96d56Sopenharmony_ci            self.assertTrue(iscoroutinefunction(instance.__anext__))
7207db96d56Sopenharmony_ci            self.assertTrue(iscoroutinefunction(mock_instance.__anext__))
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock]:
7237db96d56Sopenharmony_ci            with self.subTest(f"test aiter and anext corourtine with {mock_type}"):
7247db96d56Sopenharmony_ci                inner_test(mock_type)
7257db96d56Sopenharmony_ci
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci    def test_mock_async_for(self):
7287db96d56Sopenharmony_ci        async def iterate(iterator):
7297db96d56Sopenharmony_ci            accumulator = []
7307db96d56Sopenharmony_ci            async for item in iterator:
7317db96d56Sopenharmony_ci                accumulator.append(item)
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci            return accumulator
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci        expected = ["FOO", "BAR", "BAZ"]
7367db96d56Sopenharmony_ci        def test_default(mock_type):
7377db96d56Sopenharmony_ci            mock_instance = mock_type(self.WithAsyncIterator())
7387db96d56Sopenharmony_ci            self.assertEqual(run(iterate(mock_instance)), [])
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci        def test_set_return_value(mock_type):
7427db96d56Sopenharmony_ci            mock_instance = mock_type(self.WithAsyncIterator())
7437db96d56Sopenharmony_ci            mock_instance.__aiter__.return_value = expected[:]
7447db96d56Sopenharmony_ci            self.assertEqual(run(iterate(mock_instance)), expected)
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci        def test_set_return_value_iter(mock_type):
7477db96d56Sopenharmony_ci            mock_instance = mock_type(self.WithAsyncIterator())
7487db96d56Sopenharmony_ci            mock_instance.__aiter__.return_value = iter(expected[:])
7497db96d56Sopenharmony_ci            self.assertEqual(run(iterate(mock_instance)), expected)
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_ci        for mock_type in [AsyncMock, MagicMock]:
7527db96d56Sopenharmony_ci            with self.subTest(f"default value with {mock_type}"):
7537db96d56Sopenharmony_ci                test_default(mock_type)
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci            with self.subTest(f"set return_value with {mock_type}"):
7567db96d56Sopenharmony_ci                test_set_return_value(mock_type)
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci            with self.subTest(f"set return_value iterator with {mock_type}"):
7597db96d56Sopenharmony_ci                test_set_return_value_iter(mock_type)
7607db96d56Sopenharmony_ci
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ciclass AsyncMockAssert(unittest.TestCase):
7637db96d56Sopenharmony_ci    def setUp(self):
7647db96d56Sopenharmony_ci        self.mock = AsyncMock()
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci    async def _runnable_test(self, *args, **kwargs):
7677db96d56Sopenharmony_ci        await self.mock(*args, **kwargs)
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ci    async def _await_coroutine(self, coroutine):
7707db96d56Sopenharmony_ci        return await coroutine
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci    def test_assert_called_but_not_awaited(self):
7737db96d56Sopenharmony_ci        mock = AsyncMock(AsyncClass)
7747db96d56Sopenharmony_ci        with assertNeverAwaited(self):
7757db96d56Sopenharmony_ci            mock.async_method()
7767db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock.async_method))
7777db96d56Sopenharmony_ci        mock.async_method.assert_called()
7787db96d56Sopenharmony_ci        mock.async_method.assert_called_once()
7797db96d56Sopenharmony_ci        mock.async_method.assert_called_once_with()
7807db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
7817db96d56Sopenharmony_ci            mock.assert_awaited()
7827db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
7837db96d56Sopenharmony_ci            mock.async_method.assert_awaited()
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci    def test_assert_called_then_awaited(self):
7867db96d56Sopenharmony_ci        mock = AsyncMock(AsyncClass)
7877db96d56Sopenharmony_ci        mock_coroutine = mock.async_method()
7887db96d56Sopenharmony_ci        mock.async_method.assert_called()
7897db96d56Sopenharmony_ci        mock.async_method.assert_called_once()
7907db96d56Sopenharmony_ci        mock.async_method.assert_called_once_with()
7917db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
7927db96d56Sopenharmony_ci            mock.async_method.assert_awaited()
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci        run(self._await_coroutine(mock_coroutine))
7957db96d56Sopenharmony_ci        # Assert we haven't re-called the function
7967db96d56Sopenharmony_ci        mock.async_method.assert_called_once()
7977db96d56Sopenharmony_ci        mock.async_method.assert_awaited()
7987db96d56Sopenharmony_ci        mock.async_method.assert_awaited_once()
7997db96d56Sopenharmony_ci        mock.async_method.assert_awaited_once_with()
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci    def test_assert_called_and_awaited_at_same_time(self):
8027db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8037db96d56Sopenharmony_ci            self.mock.assert_awaited()
8047db96d56Sopenharmony_ci
8057db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8067db96d56Sopenharmony_ci            self.mock.assert_called()
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ci        run(self._runnable_test())
8097db96d56Sopenharmony_ci        self.mock.assert_called_once()
8107db96d56Sopenharmony_ci        self.mock.assert_awaited_once()
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci    def test_assert_called_twice_and_awaited_once(self):
8137db96d56Sopenharmony_ci        mock = AsyncMock(AsyncClass)
8147db96d56Sopenharmony_ci        coroutine = mock.async_method()
8157db96d56Sopenharmony_ci        # The first call will be awaited so no warning there
8167db96d56Sopenharmony_ci        # But this call will never get awaited, so it will warn here
8177db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8187db96d56Sopenharmony_ci            mock.async_method()
8197db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8207db96d56Sopenharmony_ci            mock.async_method.assert_awaited()
8217db96d56Sopenharmony_ci        mock.async_method.assert_called()
8227db96d56Sopenharmony_ci        run(self._await_coroutine(coroutine))
8237db96d56Sopenharmony_ci        mock.async_method.assert_awaited()
8247db96d56Sopenharmony_ci        mock.async_method.assert_awaited_once()
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ci    def test_assert_called_once_and_awaited_twice(self):
8277db96d56Sopenharmony_ci        mock = AsyncMock(AsyncClass)
8287db96d56Sopenharmony_ci        coroutine = mock.async_method()
8297db96d56Sopenharmony_ci        mock.async_method.assert_called_once()
8307db96d56Sopenharmony_ci        run(self._await_coroutine(coroutine))
8317db96d56Sopenharmony_ci        with self.assertRaises(RuntimeError):
8327db96d56Sopenharmony_ci            # Cannot reuse already awaited coroutine
8337db96d56Sopenharmony_ci            run(self._await_coroutine(coroutine))
8347db96d56Sopenharmony_ci        mock.async_method.assert_awaited()
8357db96d56Sopenharmony_ci
8367db96d56Sopenharmony_ci    def test_assert_awaited_but_not_called(self):
8377db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8387db96d56Sopenharmony_ci            self.mock.assert_awaited()
8397db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8407db96d56Sopenharmony_ci            self.mock.assert_called()
8417db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
8427db96d56Sopenharmony_ci            # You cannot await an AsyncMock, it must be a coroutine
8437db96d56Sopenharmony_ci            run(self._await_coroutine(self.mock))
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8467db96d56Sopenharmony_ci            self.mock.assert_awaited()
8477db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8487db96d56Sopenharmony_ci            self.mock.assert_called()
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci    def test_assert_has_calls_not_awaits(self):
8517db96d56Sopenharmony_ci        kalls = [call('foo')]
8527db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8537db96d56Sopenharmony_ci            self.mock('foo')
8547db96d56Sopenharmony_ci        self.mock.assert_has_calls(kalls)
8557db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
8567db96d56Sopenharmony_ci            self.mock.assert_has_awaits(kalls)
8577db96d56Sopenharmony_ci
8587db96d56Sopenharmony_ci    def test_assert_has_mock_calls_on_async_mock_no_spec(self):
8597db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8607db96d56Sopenharmony_ci            self.mock()
8617db96d56Sopenharmony_ci        kalls_empty = [('', (), {})]
8627db96d56Sopenharmony_ci        self.assertEqual(self.mock.mock_calls, kalls_empty)
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8657db96d56Sopenharmony_ci            self.mock('foo')
8667db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8677db96d56Sopenharmony_ci            self.mock('baz')
8687db96d56Sopenharmony_ci        mock_kalls = ([call(), call('foo'), call('baz')])
8697db96d56Sopenharmony_ci        self.assertEqual(self.mock.mock_calls, mock_kalls)
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci    def test_assert_has_mock_calls_on_async_mock_with_spec(self):
8727db96d56Sopenharmony_ci        a_class_mock = AsyncMock(AsyncClass)
8737db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8747db96d56Sopenharmony_ci            a_class_mock.async_method()
8757db96d56Sopenharmony_ci        kalls_empty = [('', (), {})]
8767db96d56Sopenharmony_ci        self.assertEqual(a_class_mock.async_method.mock_calls, kalls_empty)
8777db96d56Sopenharmony_ci        self.assertEqual(a_class_mock.mock_calls, [call.async_method()])
8787db96d56Sopenharmony_ci
8797db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8807db96d56Sopenharmony_ci            a_class_mock.async_method(1, 2, 3, a=4, b=5)
8817db96d56Sopenharmony_ci        method_kalls = [call(), call(1, 2, 3, a=4, b=5)]
8827db96d56Sopenharmony_ci        mock_kalls = [call.async_method(), call.async_method(1, 2, 3, a=4, b=5)]
8837db96d56Sopenharmony_ci        self.assertEqual(a_class_mock.async_method.mock_calls, method_kalls)
8847db96d56Sopenharmony_ci        self.assertEqual(a_class_mock.mock_calls, mock_kalls)
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci    def test_async_method_calls_recorded(self):
8877db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8887db96d56Sopenharmony_ci            self.mock.something(3, fish=None)
8897db96d56Sopenharmony_ci        with assertNeverAwaited(self):
8907db96d56Sopenharmony_ci            self.mock.something_else.something(6, cake=sentinel.Cake)
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci        self.assertEqual(self.mock.method_calls, [
8937db96d56Sopenharmony_ci            ("something", (3,), {'fish': None}),
8947db96d56Sopenharmony_ci            ("something_else.something", (6,), {'cake': sentinel.Cake})
8957db96d56Sopenharmony_ci        ],
8967db96d56Sopenharmony_ci            "method calls not recorded correctly")
8977db96d56Sopenharmony_ci        self.assertEqual(self.mock.something_else.method_calls,
8987db96d56Sopenharmony_ci                         [("something", (6,), {'cake': sentinel.Cake})],
8997db96d56Sopenharmony_ci                         "method calls not recorded correctly")
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci    def test_async_arg_lists(self):
9027db96d56Sopenharmony_ci        def assert_attrs(mock):
9037db96d56Sopenharmony_ci            names = ('call_args_list', 'method_calls', 'mock_calls')
9047db96d56Sopenharmony_ci            for name in names:
9057db96d56Sopenharmony_ci                attr = getattr(mock, name)
9067db96d56Sopenharmony_ci                self.assertIsInstance(attr, _CallList)
9077db96d56Sopenharmony_ci                self.assertIsInstance(attr, list)
9087db96d56Sopenharmony_ci                self.assertEqual(attr, [])
9097db96d56Sopenharmony_ci
9107db96d56Sopenharmony_ci        assert_attrs(self.mock)
9117db96d56Sopenharmony_ci        with assertNeverAwaited(self):
9127db96d56Sopenharmony_ci            self.mock()
9137db96d56Sopenharmony_ci        with assertNeverAwaited(self):
9147db96d56Sopenharmony_ci            self.mock(1, 2)
9157db96d56Sopenharmony_ci        with assertNeverAwaited(self):
9167db96d56Sopenharmony_ci            self.mock(a=3)
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci        self.mock.reset_mock()
9197db96d56Sopenharmony_ci        assert_attrs(self.mock)
9207db96d56Sopenharmony_ci
9217db96d56Sopenharmony_ci        a_mock = AsyncMock(AsyncClass)
9227db96d56Sopenharmony_ci        with assertNeverAwaited(self):
9237db96d56Sopenharmony_ci            a_mock.async_method()
9247db96d56Sopenharmony_ci        with assertNeverAwaited(self):
9257db96d56Sopenharmony_ci            a_mock.async_method(1, a=3)
9267db96d56Sopenharmony_ci
9277db96d56Sopenharmony_ci        a_mock.reset_mock()
9287db96d56Sopenharmony_ci        assert_attrs(a_mock)
9297db96d56Sopenharmony_ci
9307db96d56Sopenharmony_ci    def test_assert_awaited(self):
9317db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9327db96d56Sopenharmony_ci            self.mock.assert_awaited()
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci        run(self._runnable_test())
9357db96d56Sopenharmony_ci        self.mock.assert_awaited()
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci    def test_assert_awaited_once(self):
9387db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9397db96d56Sopenharmony_ci            self.mock.assert_awaited_once()
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ci        run(self._runnable_test())
9427db96d56Sopenharmony_ci        self.mock.assert_awaited_once()
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci        run(self._runnable_test())
9457db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9467db96d56Sopenharmony_ci            self.mock.assert_awaited_once()
9477db96d56Sopenharmony_ci
9487db96d56Sopenharmony_ci    def test_assert_awaited_with(self):
9497db96d56Sopenharmony_ci        msg = 'Not awaited'
9507db96d56Sopenharmony_ci        with self.assertRaisesRegex(AssertionError, msg):
9517db96d56Sopenharmony_ci            self.mock.assert_awaited_with('foo')
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci        run(self._runnable_test())
9547db96d56Sopenharmony_ci        msg = 'expected await not found'
9557db96d56Sopenharmony_ci        with self.assertRaisesRegex(AssertionError, msg):
9567db96d56Sopenharmony_ci            self.mock.assert_awaited_with('foo')
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
9597db96d56Sopenharmony_ci        self.mock.assert_awaited_with('foo')
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci        run(self._runnable_test('SomethingElse'))
9627db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9637db96d56Sopenharmony_ci            self.mock.assert_awaited_with('foo')
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci    def test_assert_awaited_once_with(self):
9667db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9677db96d56Sopenharmony_ci            self.mock.assert_awaited_once_with('foo')
9687db96d56Sopenharmony_ci
9697db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
9707db96d56Sopenharmony_ci        self.mock.assert_awaited_once_with('foo')
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
9737db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9747db96d56Sopenharmony_ci            self.mock.assert_awaited_once_with('foo')
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci    def test_assert_any_wait(self):
9777db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9787db96d56Sopenharmony_ci            self.mock.assert_any_await('foo')
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci        run(self._runnable_test('baz'))
9817db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9827db96d56Sopenharmony_ci            self.mock.assert_any_await('foo')
9837db96d56Sopenharmony_ci
9847db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
9857db96d56Sopenharmony_ci        self.mock.assert_any_await('foo')
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ci        run(self._runnable_test('SomethingElse'))
9887db96d56Sopenharmony_ci        self.mock.assert_any_await('foo')
9897db96d56Sopenharmony_ci
9907db96d56Sopenharmony_ci    def test_assert_has_awaits_no_order(self):
9917db96d56Sopenharmony_ci        calls = [call('foo'), call('baz')]
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci        with self.assertRaises(AssertionError) as cm:
9947db96d56Sopenharmony_ci            self.mock.assert_has_awaits(calls)
9957db96d56Sopenharmony_ci        self.assertEqual(len(cm.exception.args), 1)
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
9987db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
9997db96d56Sopenharmony_ci            self.mock.assert_has_awaits(calls)
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
10027db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
10037db96d56Sopenharmony_ci            self.mock.assert_has_awaits(calls)
10047db96d56Sopenharmony_ci
10057db96d56Sopenharmony_ci        run(self._runnable_test('baz'))
10067db96d56Sopenharmony_ci        self.mock.assert_has_awaits(calls)
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci        run(self._runnable_test('SomethingElse'))
10097db96d56Sopenharmony_ci        self.mock.assert_has_awaits(calls)
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ci    def test_awaits_asserts_with_any(self):
10127db96d56Sopenharmony_ci        class Foo:
10137db96d56Sopenharmony_ci            def __eq__(self, other): pass
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci        run(self._runnable_test(Foo(), 1))
10167db96d56Sopenharmony_ci
10177db96d56Sopenharmony_ci        self.mock.assert_has_awaits([call(ANY, 1)])
10187db96d56Sopenharmony_ci        self.mock.assert_awaited_with(ANY, 1)
10197db96d56Sopenharmony_ci        self.mock.assert_any_await(ANY, 1)
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci    def test_awaits_asserts_with_spec_and_any(self):
10227db96d56Sopenharmony_ci        class Foo:
10237db96d56Sopenharmony_ci            def __eq__(self, other): pass
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci        mock_with_spec = AsyncMock(spec=Foo)
10267db96d56Sopenharmony_ci
10277db96d56Sopenharmony_ci        async def _custom_mock_runnable_test(*args):
10287db96d56Sopenharmony_ci            await mock_with_spec(*args)
10297db96d56Sopenharmony_ci
10307db96d56Sopenharmony_ci        run(_custom_mock_runnable_test(Foo(), 1))
10317db96d56Sopenharmony_ci        mock_with_spec.assert_has_awaits([call(ANY, 1)])
10327db96d56Sopenharmony_ci        mock_with_spec.assert_awaited_with(ANY, 1)
10337db96d56Sopenharmony_ci        mock_with_spec.assert_any_await(ANY, 1)
10347db96d56Sopenharmony_ci
10357db96d56Sopenharmony_ci    def test_assert_has_awaits_ordered(self):
10367db96d56Sopenharmony_ci        calls = [call('foo'), call('baz')]
10377db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
10387db96d56Sopenharmony_ci            self.mock.assert_has_awaits(calls, any_order=True)
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ci        run(self._runnable_test('baz'))
10417db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
10427db96d56Sopenharmony_ci            self.mock.assert_has_awaits(calls, any_order=True)
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ci        run(self._runnable_test('bamf'))
10457db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
10467db96d56Sopenharmony_ci            self.mock.assert_has_awaits(calls, any_order=True)
10477db96d56Sopenharmony_ci
10487db96d56Sopenharmony_ci        run(self._runnable_test('foo'))
10497db96d56Sopenharmony_ci        self.mock.assert_has_awaits(calls, any_order=True)
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci        run(self._runnable_test('qux'))
10527db96d56Sopenharmony_ci        self.mock.assert_has_awaits(calls, any_order=True)
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ci    def test_assert_not_awaited(self):
10557db96d56Sopenharmony_ci        self.mock.assert_not_awaited()
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci        run(self._runnable_test())
10587db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
10597db96d56Sopenharmony_ci            self.mock.assert_not_awaited()
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ci    def test_assert_has_awaits_not_matching_spec_error(self):
10627db96d56Sopenharmony_ci        async def f(x=None): pass
10637db96d56Sopenharmony_ci
10647db96d56Sopenharmony_ci        self.mock = AsyncMock(spec=f)
10657db96d56Sopenharmony_ci        run(self._runnable_test(1))
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci        with self.assertRaisesRegex(
10687db96d56Sopenharmony_ci                AssertionError,
10697db96d56Sopenharmony_ci                '^{}$'.format(
10707db96d56Sopenharmony_ci                    re.escape('Awaits not found.\n'
10717db96d56Sopenharmony_ci                              'Expected: [call()]\n'
10727db96d56Sopenharmony_ci                              'Actual: [call(1)]'))) as cm:
10737db96d56Sopenharmony_ci            self.mock.assert_has_awaits([call()])
10747db96d56Sopenharmony_ci        self.assertIsNone(cm.exception.__cause__)
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ci        with self.assertRaisesRegex(
10777db96d56Sopenharmony_ci                AssertionError,
10787db96d56Sopenharmony_ci                '^{}$'.format(
10797db96d56Sopenharmony_ci                    re.escape(
10807db96d56Sopenharmony_ci                        'Error processing expected awaits.\n'
10817db96d56Sopenharmony_ci                        "Errors: [None, TypeError('too many positional "
10827db96d56Sopenharmony_ci                        "arguments')]\n"
10837db96d56Sopenharmony_ci                        'Expected: [call(), call(1, 2)]\n'
10847db96d56Sopenharmony_ci                        'Actual: [call(1)]'))) as cm:
10857db96d56Sopenharmony_ci            self.mock.assert_has_awaits([call(), call(1, 2)])
10867db96d56Sopenharmony_ci        self.assertIsInstance(cm.exception.__cause__, TypeError)
10877db96d56Sopenharmony_ci
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ciif __name__ == '__main__':
10907db96d56Sopenharmony_ci    unittest.main()
1091