1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
from typing import TYPE_CHECKING, Any
import pytest
from litestar import Controller, Litestar, Router, get
from litestar.openapi.config import OpenAPIConfig
from litestar.openapi.spec import Components
from litestar.openapi.spec.security_scheme import SecurityScheme
if TYPE_CHECKING:
from litestar.handlers.http_handlers import HTTPRouteHandler
@pytest.fixture()
def public_route() -> "HTTPRouteHandler":
@get("/handler")
def _handler() -> Any: ...
return _handler
@pytest.fixture()
def protected_route() -> "HTTPRouteHandler":
@get("/protected", security=[{"BearerToken": []}])
def _handler() -> Any: ...
return _handler
def test_schema_without_security_property(public_route: "HTTPRouteHandler") -> None:
app = Litestar(route_handlers=[public_route])
schema = app.openapi_schema
assert schema
assert schema.components
assert not schema.components.security_schemes
def test_schema_with_security_scheme_defined(public_route: "HTTPRouteHandler") -> None:
app = Litestar(
route_handlers=[public_route],
openapi_config=OpenAPIConfig(
title="test app",
version="0.0.1",
components=Components(
security_schemes={
"BearerToken": SecurityScheme(
type="http",
scheme="bearer",
)
},
),
security=[{"BearerToken": []}],
),
)
schema = app.openapi_schema
assert schema
schema_dict = schema.to_schema()
schema_components = schema_dict.get("components", {})
assert "securitySchemes" in schema_components
assert schema_components.get("securitySchemes", {}) == {
"BearerToken": {
"type": "http",
"scheme": "bearer",
}
}
assert schema_dict.get("security", []) == [{"BearerToken": []}]
def test_schema_with_route_security_overridden(protected_route: "HTTPRouteHandler") -> None:
app = Litestar(
route_handlers=[protected_route],
openapi_config=OpenAPIConfig(
title="test app",
version="0.0.1",
components=Components(
security_schemes={
"BearerToken": SecurityScheme(
type="http",
scheme="bearer",
)
},
),
),
)
schema = app.openapi_schema
assert schema
schema_dict = schema.to_schema()
route = schema_dict["paths"]["/protected"]["get"]
assert route.get("security", None) == [{"BearerToken": []}]
def test_layered_security_declaration() -> None:
class MyController(Controller):
path = "/controller"
security = [{"controllerToken": []}] # pyright: ignore
@get("", security=[{"handlerToken": []}])
def my_handler(self) -> None: ...
router = Router("/router", route_handlers=[MyController], security=[{"routerToken": []}])
app = Litestar(
route_handlers=[router],
security=[{"appToken": []}],
openapi_config=OpenAPIConfig(
title="test app",
version="0.0.1",
components=Components(
security_schemes={
"handlerToken": SecurityScheme(
type="http",
scheme="bearer",
),
"controllerToken": SecurityScheme(
type="http",
scheme="bearer",
),
"routerToken": SecurityScheme(
type="http",
scheme="bearer",
),
"appToken": SecurityScheme(
type="http",
scheme="bearer",
),
},
),
),
)
assert app.openapi_schema
assert app.openapi_schema.components
security_schemes = app.openapi_schema.components.security_schemes
assert security_schemes
assert list(security_schemes.keys()) == [
"handlerToken",
"controllerToken",
"routerToken",
"appToken",
]
assert app.openapi_schema
paths = app.openapi_schema.paths
assert paths
assert paths["/router/controller"].get
assert paths["/router/controller"].get.security == [
{"appToken": []},
{"routerToken": []},
{"controllerToken": []},
{"handlerToken": []},
]
|