mirror of https://github.com/tiangolo/fastapi.git
209 lines
6.7 KiB
Python
209 lines
6.7 KiB
Python
import importlib
|
|
from types import ModuleType
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from ...utils import needs_py310
|
|
|
|
|
|
@pytest.fixture(
|
|
name="mod",
|
|
params=[
|
|
pytest.param("tutorial001_py39"),
|
|
pytest.param("tutorial001_py310", marks=needs_py310),
|
|
],
|
|
)
|
|
def get_module(request: pytest.FixtureRequest):
|
|
module = importlib.import_module(f"docs_src.encoder.{request.param}")
|
|
return module
|
|
|
|
|
|
@pytest.fixture(name="client")
|
|
def get_client(mod: ModuleType):
|
|
client = TestClient(mod.app)
|
|
return client
|
|
|
|
|
|
def test_put(client: TestClient, mod: ModuleType):
|
|
fake_db = mod.fake_db
|
|
|
|
response = client.put(
|
|
"/items/123",
|
|
json={
|
|
"title": "Foo",
|
|
"timestamp": "2023-01-01T12:00:00",
|
|
"description": "An optional description",
|
|
},
|
|
)
|
|
assert response.status_code == 200
|
|
assert "123" in fake_db
|
|
assert fake_db["123"] == {
|
|
"title": "Foo",
|
|
"timestamp": "2023-01-01T12:00:00",
|
|
"description": "An optional description",
|
|
}
|
|
|
|
|
|
def test_put_invalid_data(client: TestClient, mod: ModuleType):
|
|
fake_db = mod.fake_db
|
|
|
|
response = client.put(
|
|
"/items/345",
|
|
json={
|
|
"title": "Foo",
|
|
"timestamp": "not a date",
|
|
},
|
|
)
|
|
assert response.status_code == 422
|
|
assert response.json() == {
|
|
"detail": [
|
|
{
|
|
"loc": ["body", "timestamp"],
|
|
"msg": "Input should be a valid datetime or date, invalid character in year",
|
|
"type": "datetime_from_date_parsing",
|
|
"input": "not a date",
|
|
"ctx": {"error": "invalid character in year"},
|
|
}
|
|
]
|
|
}
|
|
assert "345" not in fake_db
|
|
|
|
|
|
def test_openapi_schema(client: TestClient):
|
|
response = client.get("/openapi.json")
|
|
assert response.status_code == 200
|
|
assert response.json() == {
|
|
"openapi": "3.1.0",
|
|
"info": {"title": "FastAPI", "version": "0.1.0"},
|
|
"paths": {
|
|
"/items/{id}": {
|
|
"put": {
|
|
"operationId": "update_item_items__id__put",
|
|
"parameters": [
|
|
{
|
|
"in": "path",
|
|
"name": "id",
|
|
"required": True,
|
|
"schema": {
|
|
"title": "Id",
|
|
"type": "string",
|
|
},
|
|
},
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Item",
|
|
},
|
|
},
|
|
},
|
|
"required": True,
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {},
|
|
},
|
|
},
|
|
"description": "Successful Response",
|
|
},
|
|
"422": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError",
|
|
},
|
|
},
|
|
},
|
|
"description": "Validation Error",
|
|
},
|
|
},
|
|
"summary": "Update Item",
|
|
},
|
|
},
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"HTTPValidationError": {
|
|
"properties": {
|
|
"detail": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/ValidationError",
|
|
},
|
|
"title": "Detail",
|
|
"type": "array",
|
|
},
|
|
},
|
|
"title": "HTTPValidationError",
|
|
"type": "object",
|
|
},
|
|
"Item": {
|
|
"properties": {
|
|
"description": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string",
|
|
},
|
|
{
|
|
"type": "null",
|
|
},
|
|
],
|
|
"title": "Description",
|
|
},
|
|
"timestamp": {
|
|
"format": "date-time",
|
|
"title": "Timestamp",
|
|
"type": "string",
|
|
},
|
|
"title": {
|
|
"title": "Title",
|
|
"type": "string",
|
|
},
|
|
},
|
|
"required": [
|
|
"title",
|
|
"timestamp",
|
|
],
|
|
"title": "Item",
|
|
"type": "object",
|
|
},
|
|
"ValidationError": {
|
|
"properties": {
|
|
"loc": {
|
|
"items": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string",
|
|
},
|
|
{
|
|
"type": "integer",
|
|
},
|
|
],
|
|
},
|
|
"title": "Location",
|
|
"type": "array",
|
|
},
|
|
"msg": {
|
|
"title": "Message",
|
|
"type": "string",
|
|
},
|
|
"type": {
|
|
"title": "Error Type",
|
|
"type": "string",
|
|
},
|
|
},
|
|
"required": [
|
|
"loc",
|
|
"msg",
|
|
"type",
|
|
],
|
|
"title": "ValidationError",
|
|
"type": "object",
|
|
},
|
|
},
|
|
},
|
|
}
|