Re-export utils from Starlette (#1064)

*  Re-export main features used from Starlette to simplify developer's code

* ♻️ Refactor Starlette exports

* ♻️ Refactor tutorial examples to use re-exported utils from Starlette

* 📝 Add examples for all middlewares

* 📝 Add new docs for middlewares

* 📝 Add examples for custom responses

* 📝 Extend docs for custom responses

* 📝 Update docs and add notes explaining re-exports from Starlette everywhere

* 🍱 Update screenshot for HTTP status

* 🔧 Update MkDocs config with new content

* ♻️ Refactor tests to use re-exported utils from Starlette

*  Re-export WebSocketDisconnect from Starlette for tests

*  Add extra tests for extra re-exported middleware

*  Add tests for re-exported responses from Starlette

*  Add docs about mounting WSGI apps

*  Add Flask as a dependency to test WSGIMiddleware

*  Test WSGIMiddleware example
This commit is contained in:
Sebastián Ramírez
2020-03-01 21:49:20 +01:00
committed by GitHub
parent f2bd2c44e2
commit 0ac9b3ee5c
267 changed files with 1000 additions and 403 deletions

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from additional_responses.tutorial001 import app

View File

@@ -1,7 +1,7 @@
import os
import shutil
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from additional_responses.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from additional_responses.tutorial003 import app

View File

@@ -1,7 +1,7 @@
import os
import shutil
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from additional_responses.tutorial004 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from additional_status_codes.tutorial001 import app

View File

View File

@@ -0,0 +1,14 @@
from fastapi.testclient import TestClient
from advanced_middleware.tutorial001 import app
def test_middleware():
client = TestClient(app, base_url="https://testserver")
response = client.get("/")
assert response.status_code == 200
client = TestClient(app)
response = client.get("/", allow_redirects=False)
assert response.status_code == 307
assert response.headers["location"] == "https://testserver/"

View File

@@ -0,0 +1,15 @@
from fastapi.testclient import TestClient
from advanced_middleware.tutorial002 import app
def test_middleware():
client = TestClient(app, base_url="http://example.com")
response = client.get("/")
assert response.status_code == 200
client = TestClient(app, base_url="http://subdomain.example.com")
response = client.get("/")
assert response.status_code == 200
client = TestClient(app, base_url="http://invalidhost")
response = client.get("/")
assert response.status_code == 400

View File

@@ -0,0 +1,22 @@
from fastapi.responses import PlainTextResponse
from fastapi.testclient import TestClient
from advanced_middleware.tutorial003 import app
@app.get("/large")
async def large():
return PlainTextResponse("x" * 4000, status_code=200)
client = TestClient(app)
def test_middleware():
response = client.get("/large", headers={"accept-encoding": "gzip"})
assert response.status_code == 200
assert response.text == "x" * 4000
assert response.headers["Content-Encoding"] == "gzip"
assert int(response.headers["Content-Length"]) < 4000
response = client.get("/")
assert response.status_code == 200

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from application_configuration.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from async_sql_databases.tutorial001 import app

View File

@@ -1,7 +1,7 @@
import os
from pathlib import Path
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from background_tasks.tutorial001 import app

View File

@@ -1,7 +1,7 @@
import os
from pathlib import Path
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from background_tasks.tutorial002 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from bigger_applications.app.main import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from body.tutorial001 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from body_fields.tutorial001 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from body_multiple_params.tutorial001 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from body_multiple_params.tutorial003 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from body_nested_models.tutorial009 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from body_updates.tutorial001 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from cookie_params.tutorial001 import app

View File

View File

@@ -0,0 +1,37 @@
from fastapi.testclient import TestClient
from cors.tutorial001 import app
def test_cors():
client = TestClient(app)
# Test pre-flight response
headers = {
"Origin": "https://localhost.tiangolo.com",
"Access-Control-Request-Method": "GET",
"Access-Control-Request-Headers": "X-Example",
}
response = client.options("/", headers=headers)
assert response.status_code == 200
assert response.text == "OK"
assert (
response.headers["access-control-allow-origin"]
== "https://localhost.tiangolo.com"
)
assert response.headers["access-control-allow-headers"] == "X-Example"
# Test standard response
headers = {"Origin": "https://localhost.tiangolo.com"}
response = client.get("/", headers=headers)
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
assert (
response.headers["access-control-allow-origin"]
== "https://localhost.tiangolo.com"
)
# Test non-CORS response
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
assert "access-control-allow-origin" not in response.headers

View File

@@ -2,8 +2,8 @@ import gzip
import json
import pytest
from starlette.requests import Request
from starlette.testclient import TestClient
from fastapi import Request
from fastapi.testclient import TestClient
from custom_request_and_route.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from custom_request_and_route.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from custom_request_and_route.tutorial003 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from custom_response.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from custom_response.tutorial004 import app

View File

@@ -0,0 +1,36 @@
from fastapi.testclient import TestClient
from custom_response.tutorial005 import app
client = TestClient(app)
openapi_schema = {
"openapi": "3.0.2",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/": {
"get": {
"summary": "Main",
"operationId": "main__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {"text/plain": {"schema": {"type": "string"}}},
}
},
}
}
},
}
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.json() == openapi_schema
def test_get():
response = client.get("/")
assert response.status_code == 200
assert response.text == "Hello World"

View File

@@ -0,0 +1,11 @@
from fastapi.testclient import TestClient
from custom_response.tutorial006 import app
client = TestClient(app)
def test_get():
response = client.get("/typer", allow_redirects=False)
assert response.status_code == 307
assert response.headers["location"] == "https://typer.tiangolo.com"

View File

@@ -0,0 +1,11 @@
from fastapi.testclient import TestClient
from custom_response.tutorial007 import app
client = TestClient(app)
def test_get():
fake_content = b"some fake video bytes"
response = client.get("/")
assert response.content == fake_content * 10

View File

@@ -0,0 +1,17 @@
from pathlib import Path
from fastapi.testclient import TestClient
from custom_response import tutorial008
from custom_response.tutorial008 import app
client = TestClient(app)
def test_get(tmp_path: Path):
file_path: Path = tmp_path / "large-video-file.mp4"
tutorial008.some_file_path = str(file_path)
test_content = b"Fake video bytes"
file_path.write_bytes(test_content)
response = client.get("/")
assert response.content == test_content

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from dependencies.tutorial001 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from dependencies.tutorial004 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from dependencies.tutorial006 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from events.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from events.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from extending_openapi.tutorial001 import app

View File

@@ -2,7 +2,7 @@ import os
from pathlib import Path
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
@pytest.fixture(scope="module")

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from extra_data_types.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from extra_models.tutorial003 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from extra_models.tutorial004 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from extra_models.tutorial005 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from first_steps.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from handling_errors.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from handling_errors.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from handling_errors.tutorial003 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from handling_errors.tutorial004 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from handling_errors.tutorial005 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from handling_errors.tutorial006 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from header_params.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from openapi_callbacks.tutorial001 import app, invoice_notification

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_operation_advanced_configuration.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_operation_advanced_configuration.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_operation_advanced_configuration.tutorial003 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_operation_advanced_configuration.tutorial004 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_operation_configuration.tutorial005 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_operation_configuration.tutorial006 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_params.tutorial004 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from path_params.tutorial005 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params.tutorial005 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params.tutorial006 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params.tutorial007 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params_str_validations.tutorial010 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params_str_validations.tutorial011 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params_str_validations.tutorial012 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from query_params_str_validations.tutorial013 import app

View File

@@ -1,6 +1,6 @@
import os
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from request_files.tutorial001 import app

View File

@@ -1,6 +1,6 @@
import os
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from request_files.tutorial002 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from request_forms.tutorial001 import app

View File

@@ -1,7 +1,7 @@
import os
from pathlib import Path
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from request_forms_and_files.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_change_status_code.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_cookies.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_cookies.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_headers.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_headers.tutorial002 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_model.tutorial003 import app

View File

@@ -1,5 +1,5 @@
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_model.tutorial004 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_model.tutorial005 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from response_model.tutorial006 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from security.tutorial001 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from security.tutorial003 import app

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from security.tutorial005 import (
app,

View File

@@ -1,7 +1,7 @@
from base64 import b64encode
from fastapi.testclient import TestClient
from requests.auth import HTTPBasicAuth
from starlette.testclient import TestClient
from security.tutorial006 import app

View File

@@ -1,7 +1,7 @@
from pathlib import Path
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
openapi_schema = {
"openapi": "3.0.2",

View File

@@ -1,7 +1,7 @@
from pathlib import Path
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
openapi_schema = {
"openapi": "3.0.2",

View File

@@ -3,7 +3,7 @@ from pathlib import Path
from unittest.mock import MagicMock
import pytest
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from ...utils import skip_py36

View File

@@ -1,4 +1,4 @@
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
from sub_applications.tutorial001 import app

View File

@@ -1,6 +1,6 @@
import shutil
from starlette.testclient import TestClient
from fastapi.testclient import TestClient
def test_main():

View File

@@ -1,6 +1,6 @@
import pytest
from starlette.testclient import TestClient
from starlette.websockets import WebSocketDisconnect
from fastapi.testclient import TestClient
from fastapi.websockets import WebSocketDisconnect
from websockets.tutorial001 import app
client = TestClient(app)

View File

@@ -1,6 +1,6 @@
import pytest
from starlette.testclient import TestClient
from starlette.websockets import WebSocketDisconnect
from fastapi.testclient import TestClient
from fastapi.websockets import WebSocketDisconnect
from websockets.tutorial002 import app
client = TestClient(app)

View File

View File

@@ -0,0 +1,17 @@
from fastapi.testclient import TestClient
from wsgi.tutorial001 import app
client = TestClient(app)
def test_flask():
response = client.get("/v1/")
assert response.status_code == 200
assert response.text == "Hello, World from Flask!"
def test_app():
response = client.get("/v2")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}