import types from abc import ABCMeta, abstractmethod from typing import Any, Awaitable, Callable, Dict, Optional, Type, TypeVar _T = TypeVar("_T") class TestRunner(metaclass=ABCMeta): """ Encapsulates a running event loop. Every call made through this object will use the same event loop. """ def __enter__(self) -> 'TestRunner': return self def __exit__(self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[types.TracebackType]) -> Optional[bool]: self.close() return None @abstractmethod def close(self) -> None: """Close the event loop.""" @abstractmethod def call(self, func: Callable[..., Awaitable[_T]], *args: object, **kwargs: Dict[str, Any]) -> _T: """ Call the given function within the backend's event loop. :param func: a callable returning an awaitable :param args: positional arguments to call ``func`` with :param kwargs: keyword arguments to call ``func`` with :return: the return value of ``func`` """