Compare commits

...

6 Commits

Author SHA1 Message Date
Sebastián Ramírez
d4f3ca1c1b 🔖 Release 0.54.1 2020-04-08 07:51:26 +02:00
Sebastián Ramírez
471d703611 📝 Update release notes 2020-04-08 07:50:30 +02:00
Sebastián Ramírez
a46bbc54cd Update database setup for tests (#1226)
* 🗃️ Update database setup for tests

*  Add pragmas and update db handling for tests
2020-04-08 07:41:53 +02:00
Sebastián Ramírez
a4405bbed2 📝 Update release notes 2020-04-08 06:39:40 +02:00
Samuel Colvin
e9b189e9f2 Improve test debugging (#1222) 2020-04-08 06:37:38 +02:00
Sebastián Ramírez
483bce3ae1 ⬆️ Upgrade to MkDocs Material 5 and update docs scripts (#1225)
* ⬆️ Upgrade mkdocs.yml configs for MkDocs Material 5

*  Update docs.py to always update mkdocs.yml

* 🌐 Update mkdocs.yml for translations

* 🔧 Update MkDocs config

*  Add tabs for alternative options

* ⬆️ Update termynal setup with new CSS classes

* 🔧 Sync / Update mkdocs.yml for languages
2020-04-08 06:25:01 +02:00
156 changed files with 660 additions and 599 deletions

View File

@@ -15,35 +15,37 @@ An <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-
You can create and use environment variables in the shell, without needing Python:
<div class="termy">
=== "Linux, macOS, Windows Bash"
```console
// You could create an env var MY_NAME with
$ export MY_NAME="Wade Wilson"
<div class="termy">
// Then you could use it with other programs, like
$ echo "Hello $MY_NAME"
```console
// You could create an env var MY_NAME with
$ export MY_NAME="Wade Wilson"
Hello Wade Wilson
```
// Then you could use it with other programs, like
$ echo "Hello $MY_NAME"
</div>
Hello Wade Wilson
```
Or in PowerShell in Windows:
</div>
<div class="termy">
=== "Windows PowerShell"
```console
// Create an env var MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
<div class="termy">
// Use it with other programs, like
$ echo "Hello $Env:MY_NAME"
```console
// Create an env var MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
Hello Wade Wilson
```
// Use it with other programs, like
$ echo "Hello $Env:MY_NAME"
</div>
Hello Wade Wilson
```
</div>
### Read env vars in Python

View File

@@ -24,59 +24,67 @@ That will create a directory `./env/` with the Python binaries and then you will
Activate the new environment with:
<div class="termy">
=== "Linux, macOS"
```console
$ source ./env/bin/activate
```
<div class="termy">
</div>
```console
$ source ./env/bin/activate
```
Or in Windows' PowerShell:
</div>
<div class="termy">
=== "Windows PowerShell"
```console
$ .\env\Scripts\Activate.ps1
```
<div class="termy">
</div>
```console
$ .\env\Scripts\Activate.ps1
```
Or if you use Bash for Windows (e.g. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>):
</div>
<div class="termy">
=== "Windows Bash"
```console
$ source ./env/Scripts/activate
```
Or if you use Bash for Windows (e.g. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>):
</div>
<div class="termy">
```console
$ source ./env/Scripts/activate
```
</div>
To check it worked, use:
<div class="termy">
=== "Linux, macOS, Windows Bash"
```console
$ which pip
<div class="termy">
some/directory/fastapi/env/bin/pip
```
```console
$ which pip
</div>
some/directory/fastapi/env/bin/pip
```
</div>
=== "Windows PowerShell"
<div class="termy">
```console
$ Get-Command pip
some/directory/fastapi/env/bin/pip
```
</div>
If it shows the `pip` binary at `env/bin/pip` then it worked. 🎉
Or in Windows PowerShell:
<div class="termy">
```console
$ Get-Command pip
some/directory/fastapi/env/bin/pip
```
</div>
!!! tip
Every time you install a new package with `pip` under that environment, activate the environment again.
@@ -103,27 +111,31 @@ Now re-activate the environment to make sure you are using the `flit` you just i
And now use `flit` to install the development dependencies:
<div class="termy">
=== "Linux, macOS"
```console
$ flit install --deps develop --symlink
<div class="termy">
---> 100%
```
```console
$ flit install --deps develop --symlink
</div>
---> 100%
```
If you are on Windows, use `--pth-file` instead of `--symlink`:
</div>
<div class="termy">
=== "Windows"
```console
$ flit install --deps develop --pth-file
If you are on Windows, use `--pth-file` instead of `--symlink`:
---> 100%
```
<div class="termy">
</div>
```console
$ flit install --deps develop --pth-file
---> 100%
```
</div>
It will install all the dependencies and your local FastAPI in your local environment.

View File

@@ -329,55 +329,61 @@ You can deploy **FastAPI** directly without Docker too.
You just need to install an ASGI compatible server like:
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, a lightning-fast ASGI server, built on uvloop and httptools.
=== "Uvicorn"
<div class="termy">
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, a lightning-fast ASGI server, built on uvloop and httptools.
```console
$ pip install uvicorn
<div class="termy">
---> 100%
```
```console
$ pip install uvicorn
</div>
---> 100%
```
* <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, an ASGI server also compatible with HTTP/2.
</div>
<div class="termy">
=== "Hypercorn"
```console
$ pip install hypercorn
* <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, an ASGI server also compatible with HTTP/2.
---> 100%
```
<div class="termy">
</div>
```console
$ pip install hypercorn
...or any other ASGI server.
---> 100%
```
</div>
...or any other ASGI server.
And run your application the same way you have done in the tutorials, but without the `--reload` option, e.g.:
<div class="termy">
=== "Uvicorn"
```console
$ uvicorn main:app --host 0.0.0.0 --port 80
<div class="termy">
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
```console
$ uvicorn main:app --host 0.0.0.0 --port 80
</div>
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
or with Hypercorn:
</div>
<div class="termy">
=== "Hypercorn"
```console
$ hypercorn main:app --bind 0.0.0.0:80
<div class="termy">
Running on 0.0.0.0:8080 over http (CTRL + C to quit)
```
```console
$ hypercorn main:app --bind 0.0.0.0:80
</div>
Running on 0.0.0.0:8080 over http (CTRL + C to quit)
```
</div>
You might want to set up some tooling to make sure it is restarted automatically if it stops.

View File

@@ -35,7 +35,7 @@ function setupTermynal() {
function createTermynals() {
document
.querySelectorAll(`.${termynalActivateClass} .codehilite`)
.querySelectorAll(`.${termynalActivateClass} .highlight`)
.forEach(node => {
const text = node.textContent;
const lines = text.split("\n");

View File

@@ -2,6 +2,11 @@
## Latest changes
## 0.54.1
* Update database test setup. PR [#1226](https://github.com/tiangolo/fastapi/pull/1226).
* Improve test debugging by showing response text in failing tests. PR [#1222](https://github.com/tiangolo/fastapi/pull/1222) by [@samuelcolvin](https://github.com/samuelcolvin).
## 0.54.0
* Fix grammatical mistakes in async docs. PR [#1188](https://github.com/tiangolo/fastapi/pull/1188) by [@mickeypash](https://github.com/mickeypash).

View File

@@ -6,6 +6,8 @@ theme:
palette:
primary: teal
accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: img/icon-white.svg
favicon: img/favicon.png
language: en
@@ -129,19 +131,20 @@ markdown_extensions:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra:
social:
- type: github
- icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer
- type: twitter
- icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo
- type: linkedin
- icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo
- type: rss
- icon: fontawesome/brands/dev
link: https://dev.to/tiangolo
- type: medium
- icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo
- type: globe
- icon: fontawesome/solid/globe
link: https://tiangolo.com
extra_css:
- css/termynal.css

View File

@@ -6,6 +6,8 @@ theme:
palette:
primary: teal
accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: https://fastapi.tiangolo.com/img/icon-white.svg
favicon: https://fastapi.tiangolo.com/img/favicon.png
language: es
@@ -37,19 +39,20 @@ markdown_extensions:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra:
social:
- type: github
- icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer
- type: twitter
- icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo
- type: linkedin
- icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo
- type: rss
- icon: fontawesome/brands/dev
link: https://dev.to/tiangolo
- type: medium
- icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo
- type: globe
- icon: fontawesome/solid/globe
link: https://tiangolo.com
extra_css:
- https://fastapi.tiangolo.com/css/termynal.css
@@ -58,3 +61,5 @@ extra_javascript:
- https://unpkg.com/mermaid@8.4.6/dist/mermaid.min.js
- https://fastapi.tiangolo.com/js/termynal.js
- https://fastapi.tiangolo.com/js/custom.js
- https://fastapi.tiangolo.com/js/chat.js
- https://sidecar.gitter.im/dist/sidecar.v1.js

View File

@@ -6,6 +6,8 @@ theme:
palette:
primary: teal
accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: https://fastapi.tiangolo.com/img/icon-white.svg
favicon: https://fastapi.tiangolo.com/img/favicon.png
language: pt
@@ -37,19 +39,20 @@ markdown_extensions:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra:
social:
- type: github
- icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer
- type: twitter
- icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo
- type: linkedin
- icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo
- type: rss
- icon: fontawesome/brands/dev
link: https://dev.to/tiangolo
- type: medium
- icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo
- type: globe
- icon: fontawesome/solid/globe
link: https://tiangolo.com
extra_css:
- https://fastapi.tiangolo.com/css/termynal.css

View File

@@ -6,6 +6,8 @@ theme:
palette:
primary: teal
accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: https://fastapi.tiangolo.com/img/icon-white.svg
favicon: https://fastapi.tiangolo.com/img/favicon.png
language: zh
@@ -37,19 +39,20 @@ markdown_extensions:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra:
social:
- type: github
- icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer
- type: twitter
- icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo
- type: linkedin
- icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo
- type: rss
- icon: fontawesome/brands/dev
link: https://dev.to/tiangolo
- type: medium
- icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo
- type: globe
- icon: fontawesome/solid/globe
link: https://tiangolo.com
extra_css:
- https://fastapi.tiangolo.com/css/termynal.css

View File

@@ -34,14 +34,14 @@ def test_create_user():
"/users/",
json={"email": "deadpool@example.com", "password": "chimichangas4life"},
)
assert response.status_code == 200
assert response.status_code == 200, response.text
data = response.json()
assert data["email"] == "deadpool@example.com"
assert "id" in data
user_id = data["id"]
response = client.get(f"/users/{user_id}")
assert response.status_code == 200
assert response.status_code == 200, response.text
data = response.json()
assert data["email"] == "deadpool@example.com"
assert data["id"] == user_id

View File

@@ -1,6 +1,6 @@
"""FastAPI framework, high performance, easy to learn, fast to code, ready for production"""
__version__ = "0.54.0"
__version__ = "0.54.1"
from starlette import status

View File

@@ -20,6 +20,12 @@ missing_translation_snippet = """
"""
docs_path = Path("docs")
en_docs_path = Path("docs/en")
en_config_path: Path = en_docs_path / mkdocs_name
def get_en_config() -> dict:
return mkdocs.utils.yaml_load(en_config_path.read_text(encoding="utf-8"))
def get_lang_paths():
@@ -43,39 +49,15 @@ def complete_existing_lang(incomplete: str):
yield lang_path.name
@app.command()
def new_lang(lang: str = typer.Argument(..., callback=lang_callback)):
"""
Generate a new docs translation directory for the language LANG.
LANG should be a 2-letter language code, like: en, es, de, pt, etc.
"""
new_path: Path = Path("docs") / lang
if new_path.exists():
typer.echo(f"The language was already created: {lang}")
raise typer.Abort()
new_path.mkdir()
en_docs_path = Path("docs/en")
en_config_path: Path = en_docs_path / mkdocs_name
en_config: dict = mkdocs.utils.yaml_load(en_config_path.read_text(encoding="utf-8"))
def get_base_lang_config(lang: str):
en_config = get_en_config()
fastapi_url_base = "https://fastapi.tiangolo.com/"
new_config = {}
new_config["site_name"] = en_config["site_name"]
new_config["site_description"] = en_config["site_description"]
new_config = en_config.copy()
new_config["site_url"] = en_config["site_url"] + f"{lang}/"
new_config["theme"] = en_config["theme"]
new_config["theme"]["logo"] = fastapi_url_base + en_config["theme"]["logo"]
new_config["theme"]["favicon"] = fastapi_url_base + en_config["theme"]["favicon"]
new_config["theme"]["language"] = lang
new_config["repo_name"] = en_config["repo_name"]
new_config["repo_url"] = en_config["repo_url"]
new_config["edit_uri"] = en_config["edit_uri"]
new_config["google_analytics"] = en_config["google_analytics"]
new_config["nav"] = en_config["nav"][:2]
new_config["markdown_extensions"] = en_config["markdown_extensions"]
new_config["extra"] = en_config["extra"]
extra_css = []
css: str
for css in en_config["extra_css"]:
@@ -93,6 +75,22 @@ def new_lang(lang: str = typer.Argument(..., callback=lang_callback)):
else:
extra_js.append(fastapi_url_base + js)
new_config["extra_javascript"] = extra_js
return new_config
@app.command()
def new_lang(lang: str = typer.Argument(..., callback=lang_callback)):
"""
Generate a new docs translation directory for the language LANG.
LANG should be a 2-letter language code, like: en, es, de, pt, etc.
"""
new_path: Path = Path("docs") / lang
if new_path.exists():
typer.echo(f"The language was already created: {lang}")
raise typer.Abort()
new_path.mkdir()
new_config = get_base_lang_config(lang)
new_config_path: Path = Path(new_path) / mkdocs_name
new_config_path.write_text(
yaml.dump(new_config, sort_keys=False, width=200), encoding="utf-8"
@@ -280,7 +278,15 @@ def live(
def update_config(lang: str):
lang_path: Path = docs_path / lang
config_path = lang_path / mkdocs_name
config: dict = mkdocs.utils.yaml_load(config_path.read_text(encoding="utf-8"))
current_config: dict = mkdocs.utils.yaml_load(
config_path.read_text(encoding="utf-8")
)
if lang == "en":
config = get_en_config()
else:
config = get_base_lang_config(lang)
config["nav"] = current_config["nav"]
config["theme"]["language"] = current_config["theme"]["language"]
languages = [{"en": "/"}]
for lang in get_lang_paths():
if lang.name == "en" or not lang.is_dir():

View File

@@ -100,11 +100,11 @@ openapi_schema = {
def test_additional_properties_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_additional_properties_post():
response = client.post("/foo", json={"items": {"foo": 1, "bar": 2}})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"foo": 1, "bar": 2}

View File

@@ -42,11 +42,11 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_path_operation():
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"id": "foo"}

View File

@@ -96,5 +96,5 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -81,5 +81,5 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -113,5 +113,5 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -89,23 +89,23 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_a():
response = client.get("/a")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == "a"
def test_b():
response = client.get("/b")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == "b"
def test_c():
response = client.get("/c")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == "c"

View File

@@ -1128,7 +1128,7 @@ def test_get_path(path, expected_status, expected_response):
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
assert "swagger-ui-dist" in response.text
assert (
@@ -1139,13 +1139,13 @@ def test_swagger_ui():
def test_swagger_ui_oauth2_redirect():
response = client.get("/docs/oauth2-redirect")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
assert "window.opener.swaggerUIRedirectOauth2" in response.text
def test_redoc():
response = client.get("/redoc")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
assert "redoc@next" in response.text

View File

@@ -16,7 +16,7 @@ client = TestClient(app)
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
assert "swagger-ui-dist" in response.text
print(client.base_url)
@@ -28,7 +28,7 @@ def test_swagger_ui():
def test_swagger_ui_oauth2_redirect():
response = client.get(swagger_ui_oauth2_redirect_url)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
assert "window.opener.swaggerUIRedirectOauth2" in response.text

View File

@@ -41,28 +41,28 @@ client = TestClient(app)
def test_normal_counter():
counter_holder["counter"] = 0
response = client.get("/counter/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"counter": 1}
response = client.get("/counter/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"counter": 2}
def test_sub_counter():
counter_holder["counter"] = 0
response = client.get("/sub-counter/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"counter": 1, "subcounter": 1}
response = client.get("/sub-counter/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"counter": 2, "subcounter": 2}
def test_sub_counter_no_cache():
counter_holder["counter"] = 0
response = client.get("/sub-counter-no-cache/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"counter": 2, "subcounter": 1}
response = client.get("/sub-counter-no-cache/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"counter": 4, "subcounter": 3}

View File

@@ -66,5 +66,5 @@ client = TestClient(app)
)
def test_class_dependency(route, value):
response = client.get(route, params={"value": value})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == value

View File

@@ -206,7 +206,7 @@ client = TestClient(app)
def test_async_state():
assert state["/async"] == f"asyncgen not started"
response = client.get("/async")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == f"asyncgen started"
assert state["/async"] == f"asyncgen completed"
@@ -214,7 +214,7 @@ def test_async_state():
def test_sync_state():
assert state["/sync"] == f"generator not started"
response = client.get("/sync")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == f"generator started"
assert state["/sync"] == f"generator completed"
@@ -237,7 +237,7 @@ def test_sync_raise_other():
def test_async_raise():
response = client.get("/async_raise")
assert response.status_code == 500
assert response.status_code == 500, response.text
assert state["/async_raise"] == "asyncgen raise finalized"
assert "/async_raise" in errors
errors.clear()
@@ -272,7 +272,7 @@ def test_background_tasks():
def test_sync_raise():
response = client.get("/sync_raise")
assert response.status_code == 500
assert response.status_code == 500, response.text
assert state["/sync_raise"] == "generator raise finalized"
assert "/sync_raise" in errors
errors.clear()
@@ -280,14 +280,14 @@ def test_sync_raise():
def test_sync_async_state():
response = client.get("/sync_async")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == f"asyncgen started"
assert state["/async"] == f"asyncgen completed"
def test_sync_sync_state():
response = client.get("/sync_sync")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == f"generator started"
assert state["/sync"] == f"generator completed"
@@ -308,7 +308,7 @@ def test_sync_sync_raise_other():
def test_sync_async_raise():
response = client.get("/sync_async_raise")
assert response.status_code == 500
assert response.status_code == 500, response.text
assert state["/async_raise"] == "asyncgen raise finalized"
assert "/async_raise" in errors
errors.clear()
@@ -316,7 +316,7 @@ def test_sync_async_raise():
def test_sync_sync_raise():
response = client.get("/sync_sync_raise")
assert response.status_code == 500
assert response.status_code == 500, response.text
assert state["/sync_raise"] == "generator raise finalized"
assert "/sync_raise" in errors
errors.clear()

View File

@@ -190,13 +190,13 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_no_duplicates_invalid():
response = client.post("/no-duplicates", json={"item": {"data": "myitem"}})
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == {
"detail": [
{
@@ -213,19 +213,19 @@ def test_no_duplicates():
"/no-duplicates",
json={"item": {"data": "myitem"}, "item2": {"data": "myitem2"}},
)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [{"data": "myitem"}, {"data": "myitem2"}]
def test_duplicates():
response = client.post("/with-duplicates", json={"data": "myitem"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [{"data": "myitem"}, {"data": "myitem"}]
def test_sub_duplicates():
response = client.post("/with-duplicates-sub", json={"data": "myitem"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [
{"data": "myitem"},
[{"data": "myitem"}, {"data": "myitem"}],

View File

@@ -21,11 +21,11 @@ client = TestClient(app)
def test_use_empty():
with client:
response = client.get("/prefix")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == ["OK"]
response = client.get("/prefix/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == ["OK"]

View File

@@ -314,47 +314,47 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get_api_route():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo"}
def test_get_api_route_not_decorated():
response = client.get("/items-not-decorated/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo"}
def test_delete():
response = client.delete("/items/foo", json={"name": "Foo"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo", "item": {"name": "Foo", "price": None}}
def test_head():
response = client.head("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["x-fastapi-item-id"] == "foo"
def test_options():
response = client.options("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["x-fastapi-item-id"] == "foo"
def test_patch():
response = client.patch("/items/foo", json={"name": "Foo"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo", "item": {"name": "Foo", "price": None}}
def test_trace():
response = client.request("trace", "/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "message/http"

View File

@@ -127,13 +127,13 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_filter_sub_model():
response = client.get("/model/modelA")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {
"name": "modelA",
"description": "model-a-desc",

View File

@@ -26,7 +26,7 @@ def test_python_list_param_as_form():
response = client.post(
"/form/python-list", data={"items": ["first", "second", "third"]}
)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == ["first", "second", "third"]
@@ -34,7 +34,7 @@ def test_python_set_param_as_form():
response = client.post(
"/form/python-set", data={"items": ["first", "second", "third"]}
)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert set(response.json()) == {"first", "second", "third"}
@@ -42,5 +42,5 @@ def test_python_tuple_param_as_form():
response = client.post(
"/form/python-tuple", data={"items": ["first", "second", "third"]}
)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == ["first", "second", "third"]

View File

@@ -18,5 +18,5 @@ client = TestClient(app)
def test_sub_router():
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"hello": "world"}

View File

@@ -46,21 +46,21 @@ client = TestClient(app)
def test_get_users():
"""Check that /users returns expected data"""
response = client.get("/users")
assert response.status_code == 200
assert response.status_code == 200, response.text
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.status_code == 200, response.text
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.status_code == 200, response.text
assert response.json() == [
{"item_id": "i1", "user_id": "u1"},
{"item_id": "i2", "user_id": "u2"},
@@ -70,42 +70,42 @@ def test_get_items_1():
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.status_code == 200, response.text
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.status_code == 200, response.text
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.status_code == 200, response.text
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.status_code == 200, response.text
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.status_code == 200, response.text
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
assert response.status_code == 200, response.text
r = response.json()
d = {
@@ -122,7 +122,7 @@ def test_schema_1():
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
assert response.status_code == 200, response.text
r = response.json()
d = {

View File

@@ -125,31 +125,31 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_post_a():
data = {"a": 2, "b": "foo"}
response = client.post("/a/compute", json=data)
assert response.status_code == 200
assert response.status_code == 200, response.text
data = response.json()
def test_post_a_invalid():
data = {"a": "bar", "b": "foo"}
response = client.post("/a/compute", json=data)
assert response.status_code == 422
assert response.status_code == 422, response.text
def test_post_b():
data = {"a": 2, "b": "foo"}
response = client.post("/b/compute/", json=data)
assert response.status_code == 200
assert response.status_code == 200, response.text
data = response.json()
def test_post_b_invalid():
data = {"a": "bar", "b": "foo"}
response = client.post("/b/compute/", json=data)
assert response.status_code == 422
assert response.status_code == 422, response.text

View File

@@ -139,23 +139,23 @@ multiple_errors = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_put_correct_body():
response = client.post("/items/", json=[{"name": "Foo", "age": 5}])
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item": [{"name": "Foo", "age": 5}]}
def test_jsonable_encoder_requiring_error():
response = client.post("/items/", json=[{"name": "Foo", "age": -1.0}])
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == single_error
def test_put_incorrect_body_multiple():
response = client.post("/items/", json=[{"age": "five"}, {"age": "six"}])
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == multiple_errors

View File

@@ -102,17 +102,17 @@ multiple_errors = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_multi_query():
response = client.get("/items/?q=5&q=6")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"q": [5, 6]}
def test_multi_query_incorrect():
response = client.get("/items/?q=five&q=six")
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == multiple_errors

View File

@@ -14,7 +14,7 @@ client = TestClient(app)
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["content-type"] == "text/html; charset=utf-8"
assert "swagger-ui-dist" in response.text
print(client.base_url)
@@ -23,7 +23,7 @@ def test_swagger_ui():
def test_swagger_ui_no_oauth2_redirect():
response = client.get("/docs/oauth2-redirect")
assert response.status_code == 404
assert response.status_code == 404, response.text
def test_response():

View File

@@ -15,11 +15,11 @@ client = TestClient(app)
def test_default_param_query_none():
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"q": None}
def test_default_param_query():
response = client.get("/items/?q=foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"q": "foo"}

View File

@@ -90,4 +90,4 @@ def test_reused_param():
def test_read_users():
response = client.get("/users/42")
assert response.status_code == 200
assert response.status_code == 200, response.text

View File

@@ -8,13 +8,13 @@ client = TestClient(app)
def test_text_get():
response = client.get("/text")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == "Hello World"
def test_nonexistent():
response = client.get("/nonexistent")
assert response.status_code == 404
assert response.status_code == 404, response.text
assert response.json() == {"detail": "Not Found"}

View File

@@ -81,17 +81,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_put_no_body():
response = client.put("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo"}
def test_put_no_body_with_body():
response = client.put("/items/foo", json={"name": "Foo"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo"}

View File

@@ -55,7 +55,7 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
openapi_schema = response.json()
assert (
openapi_schema["paths"]["/products"]["post"]["requestBody"]

View File

@@ -22,5 +22,5 @@ client = TestClient(app)
def test_dependency_set_status_code():
response = client.get("/")
assert response.status_code == 201
assert response.status_code == 201, response.text
assert response.json() == {"msg": "Hello World"}

View File

@@ -110,5 +110,5 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -104,5 +104,5 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -145,16 +145,16 @@ client = TestClient(app)
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_path_operations():
response = client.get("/valid1")
assert response.status_code == 200
assert response.status_code == 200, response.text
response = client.get("/valid2")
assert response.status_code == 200
assert response.status_code == 200, response.text
response = client.get("/valid3")
assert response.status_code == 200
assert response.status_code == 200, response.text
response = client.get("/valid4")
assert response.status_code == 200
assert response.status_code == 200, response.text

View File

@@ -77,7 +77,7 @@ def test_router_events():
assert state.router_shutdown is False
assert state.sub_router_shutdown is False
response = client.get("/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"message": "Hello World"}
assert state.app_startup is True
assert state.router_startup is True

View File

@@ -19,5 +19,5 @@ client = TestClient(app)
def test_get():
response = client.get("/seg/users/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"segment": "seg", "id": "foo"}

View File

@@ -52,17 +52,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_api_key():
response = client.get("/users/me", cookies={"key": "secret"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "secret"}
def test_security_api_key_no_key():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}

View File

@@ -59,17 +59,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_api_key():
response = client.get("/users/me", cookies={"key": "secret"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "secret"}
def test_security_api_key_no_key():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -52,17 +52,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_api_key():
response = client.get("/users/me", headers={"key": "secret"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "secret"}
def test_security_api_key_no_key():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}

View File

@@ -58,17 +58,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_api_key():
response = client.get("/users/me", headers={"key": "secret"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "secret"}
def test_security_api_key_no_key():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -52,17 +52,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_api_key():
response = client.get("/users/me?key=secret")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "secret"}
def test_security_api_key_no_key():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}

View File

@@ -58,17 +58,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_api_key():
response = client.get("/users/me?key=secret")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "secret"}
def test_security_api_key_no_key():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -40,17 +40,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_base():
response = client.get("/users/me", headers={"Authorization": "Other foobar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"scheme": "Other", "credentials": "foobar"}
def test_security_http_base_no_credentials():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}

View File

@@ -46,17 +46,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_base():
response = client.get("/users/me", headers={"Authorization": "Other foobar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"scheme": "Other", "credentials": "foobar"}
def test_security_http_base_no_credentials():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -46,20 +46,20 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_basic():
auth = HTTPBasicAuth(username="john", password="secret")
response = client.get("/users/me", auth=auth)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "john", "password": "secret"}
def test_security_http_basic_no_credentials():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}
@@ -67,7 +67,7 @@ def test_security_http_basic_invalid_credentials():
response = client.get(
"/users/me", headers={"Authorization": "Basic notabase64token"}
)
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.headers["WWW-Authenticate"] == "Basic"
assert response.json() == {"detail": "Invalid authentication credentials"}
@@ -76,6 +76,6 @@ def test_security_http_basic_non_basic_credentials():
payload = b64encode(b"johnsecret").decode("ascii")
auth_header = f"Basic {payload}"
response = client.get("/users/me", headers={"Authorization": auth_header})
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.headers["WWW-Authenticate"] == "Basic"
assert response.json() == {"detail": "Invalid authentication credentials"}

View File

@@ -43,21 +43,21 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_basic():
auth = HTTPBasicAuth(username="john", password="secret")
response = client.get("/users/me", auth=auth)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "john", "password": "secret"}
def test_security_http_basic_no_credentials():
response = client.get("/users/me")
assert response.json() == {"detail": "Not authenticated"}
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.headers["WWW-Authenticate"] == 'Basic realm="simple"'
@@ -65,7 +65,7 @@ def test_security_http_basic_invalid_credentials():
response = client.get(
"/users/me", headers={"Authorization": "Basic notabase64token"}
)
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.headers["WWW-Authenticate"] == 'Basic realm="simple"'
assert response.json() == {"detail": "Invalid authentication credentials"}
@@ -74,6 +74,6 @@ def test_security_http_basic_non_basic_credentials():
payload = b64encode(b"johnsecret").decode("ascii")
auth_header = f"Basic {payload}"
response = client.get("/users/me", headers={"Authorization": auth_header})
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.headers["WWW-Authenticate"] == 'Basic realm="simple"'
assert response.json() == {"detail": "Invalid authentication credentials"}

View File

@@ -40,23 +40,23 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_bearer():
response = client.get("/users/me", headers={"Authorization": "Bearer foobar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"scheme": "Bearer", "credentials": "foobar"}
def test_security_http_bearer_no_credentials():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}
def test_security_http_bearer_incorrect_scheme_credentials():
response = client.get("/users/me", headers={"Authorization": "Basic notreally"})
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Invalid authentication credentials"}

View File

@@ -46,23 +46,23 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_bearer():
response = client.get("/users/me", headers={"Authorization": "Bearer foobar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"scheme": "Bearer", "credentials": "foobar"}
def test_security_http_bearer_no_credentials():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}
def test_security_http_bearer_incorrect_scheme_credentials():
response = client.get("/users/me", headers={"Authorization": "Basic notreally"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -40,19 +40,19 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_digest():
response = client.get("/users/me", headers={"Authorization": "Digest foobar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"scheme": "Digest", "credentials": "foobar"}
def test_security_http_digest_no_credentials():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}
@@ -60,5 +60,5 @@ def test_security_http_digest_incorrect_scheme_credentials():
response = client.get(
"/users/me", headers={"Authorization": "Other invalidauthorization"}
)
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Invalid authentication credentials"}

View File

@@ -46,19 +46,19 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_http_digest():
response = client.get("/users/me", headers={"Authorization": "Digest foobar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"scheme": "Digest", "credentials": "foobar"}
def test_security_http_digest_no_credentials():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}
@@ -66,5 +66,5 @@ def test_security_http_digest_incorrect_scheme_credentials():
response = client.get(
"/users/me", headers={"Authorization": "Other invalidauthorization"}
)
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Invalid authentication credentials"}

View File

@@ -156,25 +156,25 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_oauth2():
response = client.get("/users/me", headers={"Authorization": "Bearer footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Bearer footokenbar"}
def test_security_oauth2_password_other_header():
response = client.get("/users/me", headers={"Authorization": "Other footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Other footokenbar"}
def test_security_oauth2_password_bearer_no_header():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}

View File

@@ -55,23 +55,23 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_no_token():
response = client.get("/items")
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.json() == {"detail": "Not authenticated"}
def test_incorrect_token():
response = client.get("/items", headers={"Authorization": "Non-existent testtoken"})
assert response.status_code == 401
assert response.status_code == 401, response.text
assert response.json() == {"detail": "Not authenticated"}
def test_token():
response = client.get("/items", headers={"Authorization": "Bearer testtoken"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"token": "testtoken"}

View File

@@ -160,25 +160,25 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_oauth2():
response = client.get("/users/me", headers={"Authorization": "Bearer footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Bearer footokenbar"}
def test_security_oauth2_password_other_header():
response = client.get("/users/me", headers={"Authorization": "Other footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Other footokenbar"}
def test_security_oauth2_password_bearer_no_header():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -49,23 +49,23 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_no_token():
response = client.get("/items")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}
def test_token():
response = client.get("/items", headers={"Authorization": "Bearer testtoken"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"token": "testtoken"}
def test_incorrect_token():
response = client.get("/items", headers={"Authorization": "Notexistent testtoken"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -52,23 +52,23 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_oauth2():
response = client.get("/users/me", headers={"Authorization": "Bearer footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Bearer footokenbar"}
def test_security_oauth2_password_other_header():
response = client.get("/users/me", headers={"Authorization": "Other footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Other footokenbar"}
def test_security_oauth2_password_bearer_no_header():
response = client.get("/users/me")
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "Not authenticated"}

View File

@@ -58,23 +58,23 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_security_oauth2():
response = client.get("/users/me", headers={"Authorization": "Bearer footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Bearer footokenbar"}
def test_security_oauth2_password_other_header():
response = client.get("/users/me", headers={"Authorization": "Other footokenbar"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"username": "Other footokenbar"}
def test_security_oauth2_password_bearer_no_header():
response = client.get("/users/me")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Create an account first"}

View File

@@ -126,31 +126,31 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get_item():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item": "The Foo Wrestlers"}
def test_get_item_not_found():
response = client.get("/items/bar")
assert response.status_code == 404
assert response.status_code == 404, response.text
assert response.headers.get("x-error") == "Some custom header"
assert response.json() == {"detail": "Item not found"}
def test_get_starlette_item():
response = client.get("/starlette-items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item": "The Foo Wrestlers"}
def test_get_starlette_item_not_found():
response = client.get("/starlette-items/bar")
assert response.status_code == 404
assert response.status_code == 404, response.text
assert response.headers.get("x-error") is None
assert response.json() == {"detail": "Item not found"}

View File

@@ -25,7 +25,7 @@ client = TestClient(app)
def test_route_converters_int():
# Test integer conversion
response = client.get("/int/5")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"int": 5}
assert app.url_path_for("int_convertor", param=5) == "/int/5"
@@ -33,7 +33,7 @@ def test_route_converters_int():
def test_route_converters_float():
# Test float conversion
response = client.get("/float/25.5")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"float": 25.5}
assert app.url_path_for("float_convertor", param=25.5) == "/float/25.5"
@@ -41,7 +41,7 @@ def test_route_converters_float():
def test_route_converters_path():
# Test path conversion
response = client.get("/path/some/example")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"path": "some/example"}

View File

@@ -221,7 +221,7 @@ def test_get():
response = client.post(
"/invoices/", json={"id": "fooinvoice", "customer": "John", "total": 5.3}
)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"msg": "Invoice received"}

View File

@@ -16,7 +16,7 @@ client = TestClient(app)
def test_swagger_ui():
response = client.get("/docs")
assert response.status_code == 200
assert response.status_code == 200, response.text
print(response.text)
assert f"ui.initOAuth" in response.text
assert f'"appName": "The Predendapp"' in response.text

View File

@@ -100,17 +100,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_path_operation():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"id": "foo", "value": "there goes my hero"}
def test_path_operation_not_found():
response = client.get("/items/bar")
assert response.status_code == 404
assert response.status_code == 404, response.text
assert response.json() == {"message": "Item not found"}

View File

@@ -96,20 +96,20 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_path_operation():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"id": "foo", "value": "there goes my hero"}
def test_path_operation_img():
shutil.copy("./docs/en/docs/img/favicon.png", "./image.png")
response = client.get("/items/foo?img=1")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["Content-Type"] == "image/png"
assert len(response.content)
os.remove("./image.png")

View File

@@ -101,17 +101,17 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_path_operation():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"id": "foo", "value": "there goes my hero"}
def test_path_operation_not_found():
response = client.get("/items/bar")
assert response.status_code == 404
assert response.status_code == 404, response.text
assert response.json() == {"message": "Item not found"}

View File

@@ -99,20 +99,20 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_path_operation():
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"id": "foo", "value": "there goes my hero"}
def test_path_operation_img():
shutil.copy("./docs/en/docs/img/favicon.png", "./image.png")
response = client.get("/items/foo?img=1")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.headers["Content-Type"] == "image/png"
assert len(response.content)
os.remove("./image.png")

View File

@@ -7,11 +7,11 @@ client = TestClient(app)
def test_update():
response = client.put("/items/foo", json={"name": "Wrestlers"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"name": "Wrestlers", "size": None}
def test_create():
response = client.put("/items/red", json={"name": "Chillies"})
assert response.status_code == 201
assert response.status_code == 201, response.text
assert response.json() == {"name": "Chillies", "size": None}

View File

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

View File

@@ -6,10 +6,10 @@ 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
assert response.status_code == 200, response.text
client = TestClient(app, base_url="http://subdomain.example.com")
response = client.get("/")
assert response.status_code == 200
assert response.status_code == 200, response.text
client = TestClient(app, base_url="http://invalidhost")
response = client.get("/")
assert response.status_code == 400
assert response.status_code == 400, response.text

View File

@@ -14,9 +14,9 @@ client = TestClient(app)
def test_middleware():
response = client.get("/large", headers={"accept-encoding": "gzip"})
assert response.status_code == 200
assert response.status_code == 200, response.text
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
assert response.status_code == 200, response.text

View File

@@ -113,7 +113,7 @@ openapi_schema = {
def test_openapi_schema():
with TestClient(app) as client:
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
@@ -121,11 +121,11 @@ def test_create_read():
with TestClient(app) as client:
note = {"text": "Foo bar", "completed": False}
response = client.post("/notes/", json=note)
assert response.status_code == 200
assert response.status_code == 200, response.text
data = response.json()
assert data["text"] == note["text"]
assert data["completed"] == note["completed"]
assert "id" in data
response = client.get(f"/notes/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert data in response.json()

View File

@@ -13,7 +13,7 @@ def test():
if log.is_file():
os.remove(log) # pragma: no cover
response = client.post("/send-notification/foo@example.com")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"message": "Notification sent in the background"}
with open("./log.txt") as f:
assert "notification for foo@example.com: some notification" in f.read()

View File

@@ -13,7 +13,7 @@ def test():
if log.is_file():
os.remove(log) # pragma: no cover
response = client.post("/send-notification/foo@example.com?q=some-query")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"message": "Message sent"}
with open("./log.txt") as f:
assert "found query: some-query\nmessage to foo@example.com" in f.read()

View File

@@ -270,7 +270,7 @@ def test_get_path(path, expected_status, expected_response, headers):
def test_put_no_header():
response = client.put("/items/foo")
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == {
"detail": [
{
@@ -284,17 +284,17 @@ def test_put_no_header():
def test_put_invalid_header():
response = client.put("/items/foo", headers={"X-Token": "invalid"})
assert response.status_code == 400
assert response.status_code == 400, response.text
assert response.json() == {"detail": "X-Token header invalid"}
def test_put():
response = client.put("/items/foo", headers={"X-Token": "fake-super-secret-token"})
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"item_id": "foo", "name": "The Fighters"}
def test_put_forbidden():
response = client.put("/items/bar", headers={"X-Token": "fake-super-secret-token"})
assert response.status_code == 403
assert response.status_code == 403, response.text
assert response.json() == {"detail": "You can only update the item: foo"}

View File

@@ -85,7 +85,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
@@ -176,5 +176,5 @@ def test_post_body(path, body, expected_status, expected_response):
def test_post_broken_body():
response = client.post("/items/", data={"name": "Foo", "price": 50.5})
assert response.status_code == 400
assert response.status_code == 400, response.text
assert response.json() == {"detail": "There was an error parsing the body"}

View File

@@ -120,7 +120,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -103,7 +103,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -114,7 +114,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -77,21 +77,21 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_post_body():
data = {"2": 2.2, "3": 3.3}
response = client.post("/index-weights/", json=data)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == data
def test_post_invalid_body():
data = {"foo": 2.2, "3": 3.3}
response = client.post("/index-weights/", json=data)
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == {
"detail": [
{

View File

@@ -133,13 +133,13 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get():
response = client.get("/items/baz")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {
"name": "Baz",
"description": None,

View File

@@ -12,7 +12,7 @@ def test_cors():
"Access-Control-Request-Headers": "X-Example",
}
response = client.options("/", headers=headers)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.text == "OK"
assert (
response.headers["access-control-allow-origin"]
@@ -23,7 +23,7 @@ def test_cors():
# Test standard response
headers = {"Origin": "https://localhost.tiangolo.com"}
response = client.get("/", headers=headers)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"message": "Hello World"}
assert (
response.headers["access-control-allow-origin"]
@@ -32,6 +32,6 @@ def test_cors():
# Test non-CORS response
response = client.get("/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"message": "Hello World"}
assert "access-control-allow-origin" not in response.headers

View File

@@ -26,11 +26,11 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get_custom_response():
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [{"item_id": "Foo"}]

View File

@@ -37,11 +37,11 @@ html_contents = """
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get_custom_response():
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.text == html_contents

View File

@@ -26,11 +26,11 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get():
response = client.get("/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.text == "Hello World"

View File

@@ -7,5 +7,5 @@ client = TestClient(app)
def test_get():
response = client.get("/typer", allow_redirects=False)
assert response.status_code == 307
assert response.status_code == 307, response.text
assert response.headers["location"] == "https://typer.tiangolo.com"

View File

@@ -128,7 +128,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -86,7 +86,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema

View File

@@ -79,13 +79,13 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test_get_no_headers():
response = client.get("/items/")
assert response.status_code == 422
assert response.status_code == 422, response.text
assert response.json() == {
"detail": [
{
@@ -104,7 +104,7 @@ def test_get_no_headers():
def test_get_invalid_one_header():
response = client.get("/items/", headers={"X-Token": "invalid"})
assert response.status_code == 400
assert response.status_code == 400, response.text
assert response.json() == {"detail": "X-Token header invalid"}
@@ -112,7 +112,7 @@ def test_get_invalid_second_header():
response = client.get(
"/items/", headers={"X-Token": "fake-super-secret-token", "X-Key": "invalid"}
)
assert response.status_code == 400
assert response.status_code == 400, response.text
assert response.json() == {"detail": "X-Key header invalid"}
@@ -124,5 +124,5 @@ def test_get_valid_headers():
"X-Key": "fake-super-secret-key",
},
)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [{"item": "Foo"}, {"item": "Bar"}]

View File

@@ -72,8 +72,8 @@ openapi_schema = {
def test_events():
with TestClient(app) as client:
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
response = client.get("/items/foo")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == {"name": "Fighters"}

View File

@@ -25,10 +25,10 @@ openapi_schema = {
def test_events():
with TestClient(app) as client:
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [{"name": "Foo"}]
with open("log.txt") as log:
assert "Application shutdown" in log.read()

View File

@@ -31,14 +31,14 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
def test():
response = client.get("/items/")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == [{"name": "Foo"}]

View File

@@ -19,24 +19,24 @@ def client():
def test_swagger_ui_html(client: TestClient):
response = client.get("/docs")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert "/static/swagger-ui-bundle.js" in response.text
assert "/static/swagger-ui.css" in response.text
def test_swagger_ui_oauth2_redirect_html(client: TestClient):
response = client.get("/docs/oauth2-redirect")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert "window.opener.swaggerUIRedirectOauth2" in response.text
def test_redoc_html(client: TestClient):
response = client.get("/redoc")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert "/static/redoc.standalone.js" in response.text
def test_api(client: TestClient):
response = client.get("/users/john")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json()["message"] == "Hello john"

View File

@@ -113,7 +113,7 @@ openapi_schema = {
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == openapi_schema
@@ -134,5 +134,5 @@ def test_extra_types():
}
)
response = client.put(f"/items/{item_id}", json=data)
assert response.status_code == 200
assert response.status_code == 200, response.text
assert response.json() == expected_response

Some files were not shown because too many files have changed in this diff Show More