async def test_shield_middleware_funcitonal(loop, method, value): flag = False client_ready = asyncio.Event() handler_ready = asyncio.Event() async def handler(request): handler_ready.set() # Cancellation point. # When not shielded, CancelledError will be raised here. await client_ready.wait() nonlocal flag flag = True return web.Response(status=200) # Run handler in a task. middleware = shield_middleware(methods=frozenset({"POST"})) task = loop.create_task( middleware(make_mocked_request(method, "/"), handler)) await handler_ready.wait() # Cancel the handler. task.cancel() client_ready.set() # Wait for completion. await asyncio.wait([task]) assert flag is value
def create_app(*, methods=None, urls=None, ignore=None): app = web.Application(middlewares=[ shield_middleware(methods=methods, urls=urls, ignore=ignore) ]) app.router.add_get("/one", handler) app.router.add_post("/one", handler) app.router.add_get("/two", handler) app.router.add_post("/two", handler) app.router.add_patch("/three", handler) return app
def test_shield_middleware_mixed_urls_and_ignore(): with pytest.raises(ValueError): shield_middleware(urls=["/one"], ignore=["/two"])
def test_shield_middleware_mixed_methods_and_urls(): with pytest.raises(ValueError): shield_middleware(methods=NON_IDEMPOTENT_METHODS, urls=["/one"])
def test_shield_middleware_no_arguments(): with pytest.raises(ValueError): shield_middleware()