1 import types

2 from abc import ABCMeta, abstractmethod

3 from collections.abc import AsyncGenerator, Iterable

4 from typing import Any, Callable, Coroutine, Dict, Optional, Type, TypeVar

5

6_T = TypeVar("_T")

7

8

9 class TestRunner(metaclass=ABCMeta):

10 """

11 Encapsulates a running event loop. Every call made through this object will use the same event

12 loop.

13 """

14

15 def __enter__(self) -> "TestRunner":

16 return self

17

18 def __exit__(

19 self,

20 exc_type: Optional[Type[BaseException]],

21 exc_val: Optional[BaseException],

22 exc_tb: Optional[types.TracebackType],

23 ) -> Optional[bool]:

24 self.close()

25 return None

26

27 @abstractmethod

28 def close(self) -> None:

29 """Close the event loop."""

30

31 @abstractmethod

32 def run_asyncgen_fixture(

33 self,

34 fixture_func: Callable[..., "AsyncGenerator[_T, Any]"],

35 kwargs: Dict[str, Any],

36 ) -> "Iterable[_T]":

37 """

38 Run an async generator fixture.

39

40 :param fixture_func: the fixture function

41 :param kwargs: keyword arguments to call the fixture function with

42 :return: an iterator yielding the value yielded from the async generator

43 """

44

45 @abstractmethod

46 def run_fixture(

47 self,

48 fixture_func: Callable[..., Coroutine[Any, Any, _T]],

49 kwargs: Dict[str, Any],

50 ) -> _T:

51 """

52 Run an async fixture.

53

54 :param fixture_func: the fixture function

55 :param kwargs: keyword arguments to call the fixture function with

56 :return: the return value of the fixture function

57 """

58

59 @abstractmethod

60 def run_test(

61 self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: Dict[str, Any]

62 ) -> None:

63 """

64 Run an async test function.

65

66 :param test_func: the test function

67 :param kwargs: keyword arguments to call the test function with

68 """