pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.5 KiB
57 lines
1.5 KiB
import pytest
|
|
from fastapi import Depends, FastAPI, Security, WebSocket
|
|
from fastapi.security import APIKeyCookie
|
|
from fastapi.testclient import TestClient
|
|
from pydantic import BaseModel
|
|
from starlette.testclient import WebSocketDenialResponse
|
|
|
|
app = FastAPI()
|
|
|
|
api_key = APIKeyCookie(name="key")
|
|
|
|
|
|
class User(BaseModel):
|
|
username: str
|
|
|
|
|
|
def get_current_user(oauth_header: str = Security(api_key)):
|
|
return User(username=oauth_header)
|
|
|
|
|
|
@app.websocket("/ws")
|
|
async def websocket_endpoint(
|
|
websocket: WebSocket,
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
await websocket.accept()
|
|
data = await websocket.receive_text()
|
|
await websocket.send_text(f"{data}:{current_user.username}")
|
|
|
|
|
|
def test_security_api_key():
|
|
client = TestClient(app, cookies={"key": "secret"})
|
|
with client.websocket_connect("/ws") as websocket:
|
|
message = "test"
|
|
websocket.send_text(message)
|
|
data = websocket.receive_text()
|
|
assert data == f"{message}:{client.cookies['key']}"
|
|
|
|
|
|
def test_security_api_key_no_key():
|
|
client = TestClient(app)
|
|
|
|
with pytest.raises(WebSocketDenialResponse) as exc:
|
|
with client.websocket_connect("/ws"):
|
|
pass
|
|
assert exc.value.status_code == 403, exc.value.text
|
|
|
|
|
|
def test_openapi_schema():
|
|
client = TestClient(app)
|
|
response = client.get("/openapi.json")
|
|
assert response.status_code == 200, response.text
|
|
assert response.json() == {
|
|
"openapi": "3.1.0",
|
|
"info": {"title": "FastAPI", "version": "0.1.0"},
|
|
"paths": {},
|
|
}
|
|
|