diff --git a/starlette/routing.py b/starlette/routing.py index 1c4915ffd..8043f1eb2 100644 --- a/starlette/routing.py +++ b/starlette/routing.py @@ -820,6 +820,7 @@ def mount( self, path: str, app: ASGIApp, name: typing.Optional[str] = None ) -> None: # pragma: nocover route = Mount(path, app=app, name=name) + self._merge_router_events(app.router) self.routes.append(route) def host( diff --git a/tests/test_applications.py b/tests/test_applications.py index e30ec9295..e7c7f70cf 100644 --- a/tests/test_applications.py +++ b/tests/test_applications.py @@ -15,6 +15,7 @@ from starlette.responses import JSONResponse, PlainTextResponse from starlette.routing import Host, Mount, Route, Router, WebSocketRoute from starlette.staticfiles import StaticFiles +from starlette.testclient import TestClient from starlette.types import ASGIApp from starlette.websockets import WebSocket @@ -281,6 +282,41 @@ def test_app_mount(tmpdir, test_client_factory): assert response.text == "Method Not Allowed" +def test_app_mount_events(): + app = Starlette() + nested_app = Starlette() + + with pytest.warns(DeprecationWarning): + + @nested_app.on_event("startup") + async def startup(): + app.state.nested_started = True + + app.mount(path="/", app=nested_app) + + with TestClient(app): + assert app.state.nested_started is True + + +def test_app_mount_lifespan(): + app = Starlette() + + @asynccontextmanager + async def lifespan(app: Starlette): + app.state.nested_started = True + yield {"router": True} + app.state.nested_shutdown = True + + nested_app = Starlette(lifespan=lifespan) + app.mount(path="/", app=nested_app) + + with TestClient(app): + assert app.state.nested_started is True + + assert app.state.nested_started is True + assert app.state.nested_shutdown is True + + def test_app_debug(test_client_factory): async def homepage(request): raise RuntimeError()