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