def __init__( self, *, logger: logging.Logger = web_logger, router: Optional[UrlDispatcher] = None, middlewares: Iterable[_Middleware] = (), handler_args: Optional[Mapping[str, Any]] = None, client_max_size: int = 1024**2, loop: Optional[asyncio.AbstractEventLoop] = None, debug: Any = ..., # mypy doesn't support ellipsis ) -> None: if router is None: router = UrlDispatcher() else: warnings.warn("router argument is deprecated", DeprecationWarning, stacklevel=2) assert isinstance(router, AbstractRouter), router if loop is not None: warnings.warn("loop argument is deprecated", DeprecationWarning, stacklevel=2) if debug is not ...: warnings.warn("debug argument is deprecated", DeprecationWarning, stacklevel=2) self._debug = debug self._router = router # type: UrlDispatcher self._loop = loop self._handler_args = handler_args self.logger = logger self._middlewares = FrozenList(middlewares) # type: _Middlewares # initialized on freezing self._middlewares_handlers = None # type: _MiddlewaresHandlers # initialized on freezing self._run_middlewares = None # type: Optional[bool] self._state = {} # type: Dict[str, Any] self._frozen = False self._pre_frozen = False self._subapps = [] # type: _Subapps self._on_response_prepare = Signal(self) # type: _RespPrepareSignal self._on_startup = Signal(self) # type: _AppSignal self._on_shutdown = Signal(self) # type: _AppSignal self._on_cleanup = Signal(self) # type: _AppSignal self._cleanup_ctx = CleanupContext() self._on_startup.append(self._cleanup_ctx._on_startup) self._on_cleanup.append(self._cleanup_ctx._on_cleanup) self._client_max_size = client_max_size
def test_delitem(owner): signal = Signal(owner) m1 = mock.Mock() signal.append(m1) assert len(signal) == 1 del signal[0] assert len(signal) == 0
async def test_add_signal_handler_not_a_callable(owner): callback = True signal = Signal(owner) signal.append(callback) signal.freeze() with pytest.raises(TypeError): await signal.send()
def test_setitem(owner): signal = Signal(owner) m1 = mock.Mock() signal.append(m1) assert signal[0] is m1 m2 = mock.Mock() signal[0] = m2 assert signal[0] is m2
def test_repr(owner): signal = Signal(owner) signal.append(mock.Mock(__repr__=lambda *a: "<callback>")) assert re.match( r"<Signal owner=<Owner 0xdeadbeef>, frozen=False, " r"\[<callback>\]>", repr(signal)) is not None
def test_cannot_delitem_in_frozen_signal(owner): signal = Signal(owner) m1 = mock.Mock() signal.append(m1) signal.freeze() with pytest.raises(RuntimeError): del signal[0] assert list(signal) == [m1]
def test_cannot_append_to_frozen_signal(owner): signal = Signal(owner) m1 = mock.Mock() m2 = mock.Mock() signal.append(m1) signal.freeze() with pytest.raises(RuntimeError): signal.append(m2) assert list(signal) == [m1]
def test_cannot_setitem_in_frozen_signal(owner: Owner) -> None: signal = Signal(owner) m1 = mock.Mock() m2 = mock.Mock() signal.append(m1) signal.freeze() with pytest.raises(RuntimeError): signal[0] = m2 assert list(signal) == [m1]
async def test_non_coroutine(owner: Owner) -> None: signal = Signal(owner) kwargs = {'foo': 1, 'bar': 2} callback = mock.Mock() signal.append(callback) signal.freeze() with pytest.raises(TypeError): await signal.send(**kwargs)
def __init__( self, *, logger: logging.Logger = web_logger, middlewares: Iterable[_Middleware] = (), handler_args: Optional[Mapping[str, Any]] = None, client_max_size: int = 1024**2, debug: Any = ..., # mypy doesn't support ellipsis ) -> None: if debug is not ...: warnings.warn( "debug argument is no-op since 4.0 " "and scheduled for removal in 5.0", DeprecationWarning, stacklevel=2, ) self._router = UrlDispatcher() self._handler_args = handler_args self.logger = logger self._middlewares = FrozenList(middlewares) # type: _Middlewares # initialized on freezing self._middlewares_handlers = tuple() # type: _MiddlewaresHandlers # initialized on freezing self._run_middlewares = None # type: Optional[bool] self._state = {} # type: Dict[str, Any] self._frozen = False self._pre_frozen = False self._subapps = [] # type: _Subapps self._on_response_prepare = Signal(self) # type: _RespPrepareSignal self._on_startup = Signal(self) # type: _AppSignal self._on_shutdown = Signal(self) # type: _AppSignal self._on_cleanup = Signal(self) # type: _AppSignal self._cleanup_ctx = CleanupContext() self._on_startup.append(self._cleanup_ctx._on_startup) self._on_cleanup.append(self._cleanup_ctx._on_cleanup) self._client_max_size = client_max_size
async def test_function_signal_dispatch_kwargs(owner): signal = Signal(owner) kwargs = {'foo': 1, 'bar': 2} callback_mock = mock.Mock() async def callback(**kwargs): callback_mock(**kwargs) signal.append(callback) signal.freeze() await signal.send(**kwargs) callback_mock.assert_called_once_with(**kwargs)
async def test_cannot_send_non_frozen_signal(owner): signal = Signal(owner) callback_mock = mock.Mock() async def callback(**kwargs): callback_mock(**kwargs) signal.append(callback) with pytest.raises(RuntimeError): await signal.send() assert not callback_mock.called
def _create_app_mock() -> mock.MagicMock: def get_dict(app: Any, key: str) -> Any: return app.__app_dict[key] def set_dict(app: Any, key: str, value: Any) -> None: app.__app_dict[key] = value app = mock.MagicMock() app.__app_dict = {} app.__getitem__ = get_dict app.__setitem__ = set_dict app.on_response_prepare = Signal(app) app.on_response_prepare.freeze() return app
async def test_function_signal_dispatch_args_kwargs(owner: Owner) -> None: signal = Signal(owner) args = {"a", "b"} kwargs = {"foo": 1, "bar": 2} callback_mock = mock.Mock() async def callback(*args, **kwargs): callback_mock(*args, **kwargs) signal.append(callback) signal.freeze() await signal.send(*args, **kwargs) callback_mock.assert_called_once_with(*args, **kwargs)
def __init__( self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace ) -> None: self._on_request_start: Signal[ _SignalCallback[TraceRequestStartParams]] = Signal(self) self._on_request_chunk_sent: Signal[ _SignalCallback[TraceRequestChunkSentParams]] = Signal(self) self._on_response_chunk_received: Signal[ _SignalCallback[TraceResponseChunkReceivedParams]] = Signal(self) self._on_request_end: Signal[ _SignalCallback[TraceRequestEndParams]] = Signal(self) self._on_request_exception: Signal[ _SignalCallback[TraceRequestExceptionParams]] = Signal(self) self._on_request_redirect: Signal[ _SignalCallback[TraceRequestRedirectParams]] = Signal(self) self._on_connection_queued_start: Signal[ _SignalCallback[TraceConnectionQueuedStartParams]] = Signal(self) self._on_connection_queued_end: Signal[ _SignalCallback[TraceConnectionQueuedEndParams]] = Signal(self) self._on_connection_create_start: Signal[ _SignalCallback[TraceConnectionCreateStartParams]] = Signal(self) self._on_connection_create_end: Signal[ _SignalCallback[TraceConnectionCreateEndParams]] = Signal(self) self._on_connection_reuseconn: Signal[ _SignalCallback[TraceConnectionReuseconnParams]] = Signal(self) self._on_dns_resolvehost_start: Signal[ _SignalCallback[TraceDnsResolveHostStartParams]] = Signal(self) self._on_dns_resolvehost_end: Signal[ _SignalCallback[TraceDnsResolveHostEndParams]] = Signal(self) self._on_dns_cache_hit: Signal[ _SignalCallback[TraceDnsCacheHitParams]] = Signal(self) self._on_dns_cache_miss: Signal[ _SignalCallback[TraceDnsCacheMissParams]] = Signal(self) self._on_request_headers_sent: Signal[ _SignalCallback[TraceRequestHeadersSentParams]] = Signal(self) self._trace_config_ctx_factory = trace_config_ctx_factory