Browse Source
This allows using parameters that can have defaults (e.g. `None`) that can be used as query parameters. But can also be used in routers with that include those parameters as part of the path.pull/568/head
committed by
Sebastián Ramírez
2 changed files with 143 additions and 4 deletions
@ -0,0 +1,136 @@ |
|||
from fastapi import APIRouter, FastAPI |
|||
from starlette.testclient import TestClient |
|||
|
|||
app = FastAPI() |
|||
|
|||
|
|||
user_router = APIRouter() |
|||
item_router = APIRouter() |
|||
|
|||
|
|||
@user_router.get("/") |
|||
def get_users(): |
|||
return [{"user_id": "u1"}, {"user_id": "u2"}] |
|||
|
|||
|
|||
@user_router.get("/{user_id}") |
|||
def get_user(user_id: str): |
|||
return {"user_id": user_id} |
|||
|
|||
|
|||
@item_router.get("/") |
|||
def get_items(user_id: str = None): |
|||
if user_id is None: |
|||
return [{"item_id": "i1", "user_id": "u1"}, {"item_id": "i2", "user_id": "u2"}] |
|||
else: |
|||
return [{"item_id": "i2", "user_id": user_id}] |
|||
|
|||
|
|||
@item_router.get("/{item_id}") |
|||
def get_item(item_id: str, user_id: str = None): |
|||
if user_id is None: |
|||
return {"item_id": item_id} |
|||
else: |
|||
return {"item_id": item_id, "user_id": user_id} |
|||
|
|||
|
|||
app.include_router(user_router, prefix="/users") |
|||
app.include_router(item_router, prefix="/items") |
|||
|
|||
app.include_router(item_router, prefix="/users/{user_id}/items") |
|||
|
|||
|
|||
client = TestClient(app) |
|||
|
|||
|
|||
def test_get_users(): |
|||
"""Check that /users returns expected data""" |
|||
response = client.get("/users") |
|||
assert response.status_code == 200 |
|||
assert response.json() == [{"user_id": "u1"}, {"user_id": "u2"}] |
|||
|
|||
|
|||
def test_get_user(): |
|||
"""Check that /users/{user_id} returns expected data""" |
|||
response = client.get("/users/abc123") |
|||
assert response.status_code == 200 |
|||
assert response.json() == {"user_id": "abc123"} |
|||
|
|||
|
|||
def test_get_items_1(): |
|||
"""Check that /items returns expected data""" |
|||
response = client.get("/items") |
|||
assert response.status_code == 200 |
|||
assert response.json() == [ |
|||
{"item_id": "i1", "user_id": "u1"}, |
|||
{"item_id": "i2", "user_id": "u2"}, |
|||
] |
|||
|
|||
|
|||
def test_get_items_2(): |
|||
"""Check that /items returns expected data with user_id specified""" |
|||
response = client.get("/items?user_id=abc123") |
|||
assert response.status_code == 200 |
|||
assert response.json() == [{"item_id": "i2", "user_id": "abc123"}] |
|||
|
|||
|
|||
def test_get_item_1(): |
|||
"""Check that /items/{item_id} returns expected data""" |
|||
response = client.get("/items/item01") |
|||
assert response.status_code == 200 |
|||
assert response.json() == {"item_id": "item01"} |
|||
|
|||
|
|||
def test_get_item_2(): |
|||
"""Check that /items/{item_id} returns expected data with user_id specified""" |
|||
response = client.get("/items/item01?user_id=abc123") |
|||
assert response.status_code == 200 |
|||
assert response.json() == {"item_id": "item01", "user_id": "abc123"} |
|||
|
|||
|
|||
def test_get_users_items(): |
|||
"""Check that /users/{user_id}/items returns expected data""" |
|||
response = client.get("/users/abc123/items") |
|||
assert response.status_code == 200 |
|||
assert response.json() == [{"item_id": "i2", "user_id": "abc123"}] |
|||
|
|||
|
|||
def test_get_users_item(): |
|||
"""Check that /users/{user_id}/items returns expected data""" |
|||
response = client.get("/users/abc123/items/item01") |
|||
assert response.status_code == 200 |
|||
assert response.json() == {"item_id": "item01", "user_id": "abc123"} |
|||
|
|||
|
|||
def test_schema_1(): |
|||
"""Check that the user_id is a required path parameter under /users""" |
|||
response = client.get("/openapi.json") |
|||
assert response.status_code == 200 |
|||
r = response.json() |
|||
|
|||
d = { |
|||
"required": True, |
|||
"schema": {"title": "User_Id", "type": "string"}, |
|||
"name": "user_id", |
|||
"in": "path", |
|||
} |
|||
|
|||
assert d in r["paths"]["/users/{user_id}"]["get"]["parameters"] |
|||
assert d in r["paths"]["/users/{user_id}/items/"]["get"]["parameters"] |
|||
|
|||
|
|||
def test_schema_2(): |
|||
"""Check that the user_id is an optional query parameter under /items""" |
|||
response = client.get("/openapi.json") |
|||
assert response.status_code == 200 |
|||
r = response.json() |
|||
|
|||
d = { |
|||
"required": False, |
|||
"schema": {"title": "User_Id", "type": "string"}, |
|||
"name": "user_id", |
|||
"in": "query", |
|||
} |
|||
|
|||
assert d in r["paths"]["/items/{item_id}"]["get"]["parameters"] |
|||
assert d in r["paths"]["/items/"]["get"]["parameters"] |
Loading…
Reference in new issue