📝 Add source examples for Python 3.9 and 3.10 (#715)

* 📝 Add source examples for Python 3.9 and 3.10

*  Add tests for new source examples for Python 3.9 and 3.10, still needs pytest markers

*  Add tests for fastapi examples

*  Update tests for FastAPI app testing, for Python 3.9 and 3.10, fixing multi-app testing conflicts

*  Require Python 3.9 and 3.10 for tests

*  Update tests with missing markers
This commit is contained in:
Sebastián Ramírez
2023-11-29 16:51:55 +01:00
committed by GitHub
parent cce30d7546
commit d8effcbc5c
243 changed files with 20057 additions and 80 deletions

View File

@@ -0,0 +1,163 @@
from typing import Any, Dict, List, Union
from unittest.mock import patch
from sqlmodel import create_engine
from tests.conftest import get_testing_print_function, needs_py310
def check_calls(calls: List[List[Union[str, Dict[str, Any]]]]):
assert calls[0] == ["Before interacting with the database"]
assert calls[1] == [
"Hero 1:",
{
"id": None,
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
},
]
assert calls[2] == [
"Hero 2:",
{
"id": None,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
},
]
assert calls[3] == [
"Hero 3:",
{
"id": None,
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
},
]
assert calls[4] == ["After adding to the session"]
assert calls[5] == [
"Hero 1:",
{
"id": None,
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
},
]
assert calls[6] == [
"Hero 2:",
{
"id": None,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
},
]
assert calls[7] == [
"Hero 3:",
{
"id": None,
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
},
]
assert calls[8] == ["After committing the session"]
assert calls[9] == ["Hero 1:", {}]
assert calls[10] == ["Hero 2:", {}]
assert calls[11] == ["Hero 3:", {}]
assert calls[12] == ["After committing the session, show IDs"]
assert calls[13] == ["Hero 1 ID:", 1]
assert calls[14] == ["Hero 2 ID:", 2]
assert calls[15] == ["Hero 3 ID:", 3]
assert calls[16] == ["After committing the session, show names"]
assert calls[17] == ["Hero 1 name:", "Deadpond"]
assert calls[18] == ["Hero 2 name:", "Spider-Boy"]
assert calls[19] == ["Hero 3 name:", "Rusty-Man"]
assert calls[20] == ["After refreshing the heroes"]
assert calls[21] == [
"Hero 1:",
{
"id": 1,
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
},
]
assert calls[22] == [
"Hero 2:",
{
"id": 2,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
},
]
assert calls[23] == [
"Hero 3:",
{
"id": 3,
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
},
]
assert calls[24] == ["After the session closes"]
assert calls[21] == [
"Hero 1:",
{
"id": 1,
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
},
]
assert calls[22] == [
"Hero 2:",
{
"id": 2,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
},
]
assert calls[23] == [
"Hero 3:",
{
"id": 3,
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
},
]
@needs_py310
def test_tutorial_001(clear_sqlmodel):
from docs_src.tutorial.automatic_id_none_refresh import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
check_calls(calls)
@needs_py310
def test_tutorial_002(clear_sqlmodel):
from docs_src.tutorial.automatic_id_none_refresh import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
check_calls(calls)

View File

@@ -0,0 +1,38 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"id": 1,
"name": "Deadpond",
"age": None,
"secret_name": "Dive Wilson",
"team_id": 1,
},
],
[
"Hero's team:",
{"name": "Z-Force", "headquarters": "Sister Margarets Bar", "id": 1},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.code_structure.tutorial001_py310 import app, database
database.sqlite_url = "sqlite://"
database.engine = create_engine(database.sqlite_url)
app.engine = database.engine
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
app.main()
assert calls == expected_calls

View File

@@ -0,0 +1,38 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"id": 1,
"name": "Deadpond",
"age": None,
"secret_name": "Dive Wilson",
"team_id": 1,
},
],
[
"Hero's team:",
{"name": "Z-Force", "headquarters": "Sister Margarets Bar", "id": 1},
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.code_structure.tutorial001_py39 import app, database
database.sqlite_url = "sqlite://"
database.engine = create_engine(database.sqlite_url)
app.engine = database.engine
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
app.main()
assert calls == expected_calls

View File

@@ -0,0 +1,38 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"id": 1,
"name": "Deadpond",
"age": None,
"secret_name": "Dive Wilson",
"team_id": 1,
},
],
[
"Hero's team:",
{"name": "Z-Force", "headquarters": "Sister Margarets Bar", "id": 1},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.code_structure.tutorial002_py310 import app, database
database.sqlite_url = "sqlite://"
database.engine = create_engine(database.sqlite_url)
app.engine = database.engine
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
app.main()
assert calls == expected_calls

View File

@@ -0,0 +1,38 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"id": 1,
"name": "Deadpond",
"age": None,
"secret_name": "Dive Wilson",
"team_id": 1,
},
],
[
"Hero's team:",
{"name": "Z-Force", "headquarters": "Sister Margarets Bar", "id": 1},
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.code_structure.tutorial002_py39 import app, database
database.sqlite_url = "sqlite://"
database.engine = create_engine(database.sqlite_url)
app.engine = database.engine
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
app.main()
assert calls == expected_calls

View File

@@ -0,0 +1,17 @@
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ....conftest import needs_py310
@needs_py310
def test_tutorial001(clear_sqlmodel):
from docs_src.tutorial.connect.create_tables import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.main()
insp: Inspector = inspect(mod.engine)
assert insp.has_table(str(mod.Hero.__tablename__))
assert insp.has_table(str(mod.Team.__tablename__))

View File

@@ -0,0 +1,73 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 1,
"name": "Spider-Boy",
},
],
[
"No longer Preventer:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.connect.delete import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,53 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
]
@needs_py310
def test_tutorial001(clear_sqlmodel):
from docs_src.tutorial.connect.insert import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,92 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
"Team:",
{"id": 2, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
],
[
"Hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
"Team:",
{"id": 1, "name": "Preventers", "headquarters": "Sharp Tower"},
],
]
@needs_py310
def test_tutorial001(clear_sqlmodel):
from docs_src.tutorial.connect.select import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls
@needs_py310
def test_tutorial002(clear_sqlmodel):
from docs_src.tutorial.connect.select import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,89 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
"Team:",
{"id": 2, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
],
[
"Hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
"Team:",
{"id": 1, "name": "Preventers", "headquarters": "Sharp Tower"},
],
[
"Hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
"Team:",
None,
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.connect.select import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,63 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Preventer Hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.connect.select import tutorial004_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,65 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Preventer Hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
"Team:",
{"id": 1, "name": "Preventers", "headquarters": "Sharp Tower"},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.connect.select import tutorial005_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,63 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 2,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 1,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 1,
"name": "Spider-Boy",
},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.connect.update import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,19 @@
from pathlib import Path
from ...conftest import coverage_run, needs_py310
@needs_py310
def test_create_db_and_table(cov_tmp_path: Path):
module = "docs_src.tutorial.create_db_and_table.tutorial001_py310"
result = coverage_run(module=module, cwd=cov_tmp_path)
assert "BEGIN" in result.stdout
assert 'PRAGMA main.table_info("hero")' in result.stdout
assert "CREATE TABLE hero (" in result.stdout
assert "id INTEGER NOT NULL," in result.stdout
assert "name VARCHAR NOT NULL," in result.stdout
assert "secret_name VARCHAR NOT NULL," in result.stdout
assert "age INTEGER," in result.stdout
assert "PRIMARY KEY (id)" in result.stdout
assert ")" in result.stdout
assert "COMMIT" in result.stdout

View File

@@ -0,0 +1,16 @@
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ...conftest import needs_py310
@needs_py310
def test_create_db_and_table(clear_sqlmodel):
from docs_src.tutorial.create_db_and_table import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.create_db_and_tables()
insp: Inspector = inspect(mod.engine)
assert insp.has_table(str(mod.Hero.__tablename__))

View File

@@ -0,0 +1,16 @@
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ...conftest import needs_py310
@needs_py310
def test_create_db_and_table(clear_sqlmodel):
from docs_src.tutorial.create_db_and_table import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.create_db_and_tables()
insp: Inspector = inspect(mod.engine)
assert insp.has_table(str(mod.Hero.__tablename__))

View File

@@ -0,0 +1,88 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Hero 1:",
{"id": 2, "name": "Spider-Boy", "secret_name": "Pedro Parqueador", "age": None},
],
[
"Hero 2:",
{
"id": 7,
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
},
],
[
"Updated hero 1:",
{
"id": 2,
"name": "Spider-Youngster",
"secret_name": "Pedro Parqueador",
"age": 16,
},
],
[
"Updated hero 2:",
{
"id": 7,
"name": "Captain North America Except Canada",
"secret_name": "Esteban Rogelios",
"age": 110,
},
],
[
"Hero: ",
{
"id": 2,
"name": "Spider-Youngster",
"secret_name": "Pedro Parqueador",
"age": 16,
},
],
[
"Deleted hero:",
{
"id": 2,
"name": "Spider-Youngster",
"secret_name": "Pedro Parqueador",
"age": 16,
},
],
["There's no hero named Spider-Youngster"],
]
@needs_py310
def test_tutorial001(clear_sqlmodel):
from docs_src.tutorial.delete import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls
@needs_py310
def test_tutorial002(clear_sqlmodel):
from docs_src.tutorial.delete import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,25 @@
import subprocess
from pathlib import Path
from ....conftest import needs_py310
@needs_py310
def test_run_tests(clear_sqlmodel):
from docs_src.tutorial.fastapi.app_testing.tutorial001_py310 import test_main as mod
test_path = Path(mod.__file__).resolve().parent
top_level_path = Path(__file__).resolve().parent.parent.parent.parent.parent
result = subprocess.run(
[
"coverage",
"run",
"--parallel-mode",
"-m",
"pytest",
test_path,
],
cwd=top_level_path,
capture_output=True,
)
assert result.returncode == 0, result.stdout.decode("utf-8")

View File

@@ -0,0 +1,25 @@
import subprocess
from pathlib import Path
from ....conftest import needs_py39
@needs_py39
def test_run_tests(clear_sqlmodel):
from docs_src.tutorial.fastapi.app_testing.tutorial001_py39 import test_main as mod
test_path = Path(mod.__file__).resolve().parent
top_level_path = Path(__file__).resolve().parent.parent.parent.parent.parent
result = subprocess.run(
[
"coverage",
"run",
"--parallel-mode",
"-m",
"pytest",
test_path,
],
cwd=top_level_path,
capture_output=True,
)
assert result.returncode == 0, result.stdout.decode("utf-8")

View File

@@ -1,83 +1,22 @@
import importlib
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import Session, create_engine
from docs_src.tutorial.fastapi.app_testing.tutorial001 import main as app_mod
from docs_src.tutorial.fastapi.app_testing.tutorial001 import test_main as test_mod
from docs_src.tutorial.fastapi.app_testing.tutorial001.test_main import (
client_fixture,
session_fixture,
)
assert session_fixture, "This keeps the session fixture used below"
assert client_fixture, "This keeps the client fixture used below"
import subprocess
from pathlib import Path
@pytest.fixture(name="prepare", autouse=True)
def prepare_fixture(clear_sqlmodel):
# Trigger side effects of registering table models in SQLModel
# This has to be called after clear_sqlmodel, but before the session_fixture
# That's why the extra custom fixture here
importlib.reload(app_mod)
importlib.reload(test_mod)
def test_run_tests(clear_sqlmodel):
from docs_src.tutorial.fastapi.app_testing.tutorial001 import test_main as mod
def test_create_hero(session: Session, client: TestClient):
test_mod.test_create_hero(client)
def test_create_hero_incomplete(session: Session, client: TestClient):
test_mod.test_create_hero_incomplete(client)
def test_create_hero_invalid(session: Session, client: TestClient):
test_mod.test_create_hero_invalid(client)
def test_read_heroes(session: Session, client: TestClient):
test_mod.test_read_heroes(session=session, client=client)
def test_read_hero(session: Session, client: TestClient):
test_mod.test_read_hero(session=session, client=client)
def test_update_hero(session: Session, client: TestClient):
test_mod.test_update_hero(session=session, client=client)
def test_delete_hero(session: Session, client: TestClient):
test_mod.test_delete_hero(session=session, client=client)
def test_startup():
app_mod.engine = create_engine("sqlite://")
app_mod.on_startup()
insp: Inspector = inspect(app_mod.engine)
assert insp.has_table(str(app_mod.Hero.__tablename__))
def test_get_session():
app_mod.engine = create_engine("sqlite://")
for session in app_mod.get_session():
assert isinstance(session, Session)
assert session.bind == app_mod.engine
def test_read_hero_not_found(client: TestClient):
response = client.get("/heroes/9000")
assert response.status_code == 404
def test_update_hero_not_found(client: TestClient):
response = client.patch("/heroes/9000", json={"name": "Very-Rusty-Man"})
assert response.status_code == 404
def test_delete_hero_not_found(client: TestClient):
response = client.delete("/heroes/9000")
assert response.status_code == 404
test_path = Path(mod.__file__).resolve().parent
top_level_path = Path(__file__).resolve().parent.parent.parent.parent.parent
result = subprocess.run(
[
"coverage",
"run",
"--parallel-mode",
"-m",
"pytest",
test_path,
],
cwd=top_level_path,
capture_output=True,
)
assert result.returncode == 0, result.stdout.decode("utf-8")

View File

@@ -0,0 +1,331 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.delete import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,331 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.delete import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,255 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.limit_and_offset import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.get("/heroes/", params={"limit": 2})
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[1]["name"] == hero2_data["name"]
response = client.get("/heroes/", params={"offset": 1})
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
assert data[0]["name"] == hero2_data["name"]
assert data[1]["name"] == hero3_data["name"]
response = client.get("/heroes/", params={"offset": 1, "limit": 1})
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 1
assert data[0]["name"] == hero2_data["name"]
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
}
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,255 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.limit_and_offset import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.get("/heroes/", params={"limit": 2})
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[1]["name"] == hero2_data["name"]
response = client.get("/heroes/", params={"offset": 1})
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
assert data[0]["name"] == hero2_data["name"]
assert data[1]["name"] == hero3_data["name"]
response = client.get("/heroes/", params={"offset": 1, "limit": 1})
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 1
assert data[0]["name"] == hero2_data["name"]
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
}
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,203 @@
from fastapi.testclient import TestClient
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.multiple_models import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero1_data["name"]
assert data["secret_name"] == hero1_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.post("/heroes/", json=hero2_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"]
assert data["secret_name"] == hero2_data["secret_name"]
assert data["id"] != hero2_data["id"], (
"Now it's not possible to predefine the ID from the request, "
"it's now set by the database"
)
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[0]["secret_name"] == hero1_data["secret_name"]
assert data[1]["name"] == hero2_data["name"]
assert data[1]["secret_name"] == hero2_data["secret_name"]
assert data[1]["id"] != hero2_data["id"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["id", "name", "secret_name"],
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}
# Test inherited indexes
insp: Inspector = inspect(mod.engine)
indexes = insp.get_indexes(str(mod.Hero.__tablename__))
expected_indexes = [
{
"name": "ix_hero_name",
"dialect_options": {},
"column_names": ["name"],
"unique": 0,
},
{
"name": "ix_hero_age",
"dialect_options": {},
"column_names": ["age"],
"unique": 0,
},
]
for index in expected_indexes:
assert index in indexes, "This expected index should be in the indexes in DB"
# Now that this index was checked, remove it from the list of indexes
indexes.pop(indexes.index(index))
assert len(indexes) == 0, "The database should only have the expected indexes"

View File

@@ -0,0 +1,203 @@
from fastapi.testclient import TestClient
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.multiple_models import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero1_data["name"]
assert data["secret_name"] == hero1_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.post("/heroes/", json=hero2_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"]
assert data["secret_name"] == hero2_data["secret_name"]
assert data["id"] != hero2_data["id"], (
"Now it's not possible to predefine the ID from the request, "
"it's now set by the database"
)
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[0]["secret_name"] == hero1_data["secret_name"]
assert data[1]["name"] == hero2_data["name"]
assert data[1]["secret_name"] == hero2_data["secret_name"]
assert data[1]["id"] != hero2_data["id"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["id", "name", "secret_name"],
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}
# Test inherited indexes
insp: Inspector = inspect(mod.engine)
indexes = insp.get_indexes(str(mod.Hero.__tablename__))
expected_indexes = [
{
"name": "ix_hero_name",
"dialect_options": {},
"column_names": ["name"],
"unique": 0,
},
{
"name": "ix_hero_age",
"dialect_options": {},
"column_names": ["age"],
"unique": 0,
},
]
for index in expected_indexes:
assert index in indexes, "This expected index should be in the indexes in DB"
# Now that this index was checked, remove it from the list of indexes
indexes.pop(indexes.index(index))
assert len(indexes) == 0, "The database should only have the expected indexes"

View File

@@ -0,0 +1,203 @@
from fastapi.testclient import TestClient
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.multiple_models import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero1_data["name"]
assert data["secret_name"] == hero1_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.post("/heroes/", json=hero2_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"]
assert data["secret_name"] == hero2_data["secret_name"]
assert data["id"] != hero2_data["id"], (
"Now it's not possible to predefine the ID from the request, "
"it's now set by the database"
)
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[0]["secret_name"] == hero1_data["secret_name"]
assert data[1]["name"] == hero2_data["name"]
assert data[1]["secret_name"] == hero2_data["secret_name"]
assert data[1]["id"] != hero2_data["id"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}
# Test inherited indexes
insp: Inspector = inspect(mod.engine)
indexes = insp.get_indexes(str(mod.Hero.__tablename__))
expected_indexes = [
{
"name": "ix_hero_age",
"dialect_options": {},
"column_names": ["age"],
"unique": 0,
},
{
"name": "ix_hero_name",
"dialect_options": {},
"column_names": ["name"],
"unique": 0,
},
]
for index in expected_indexes:
assert index in indexes, "This expected index should be in the indexes in DB"
# Now that this index was checked, remove it from the list of indexes
indexes.pop(indexes.index(index))
assert len(indexes) == 0, "The database should only have the expected indexes"

View File

@@ -0,0 +1,203 @@
from fastapi.testclient import TestClient
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.multiple_models import tutorial002_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero1_data["name"]
assert data["secret_name"] == hero1_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.post("/heroes/", json=hero2_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"]
assert data["secret_name"] == hero2_data["secret_name"]
assert data["id"] != hero2_data["id"], (
"Now it's not possible to predefine the ID from the request, "
"it's now set by the database"
)
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[0]["secret_name"] == hero1_data["secret_name"]
assert data[1]["name"] == hero2_data["name"]
assert data[1]["secret_name"] == hero2_data["secret_name"]
assert data[1]["id"] != hero2_data["id"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}
# Test inherited indexes
insp: Inspector = inspect(mod.engine)
indexes = insp.get_indexes(str(mod.Hero.__tablename__))
expected_indexes = [
{
"name": "ix_hero_age",
"dialect_options": {},
"column_names": ["age"],
"unique": 0,
},
{
"name": "ix_hero_name",
"dialect_options": {},
"column_names": ["name"],
"unique": 0,
},
]
for index in expected_indexes:
assert index in indexes, "This expected index should be in the indexes in DB"
# Now that this index was checked, remove it from the list of indexes
indexes.pop(indexes.index(index))
assert len(indexes) == 0, "The database should only have the expected indexes"

View File

@@ -0,0 +1,201 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.read_one import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
hero_id = hero2["id"]
response = client.get(f"/heroes/{hero_id}")
assert response.status_code == 200, response.text
data = response.json()
assert data == hero2
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
}
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,201 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.read_one import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
hero_id = hero2["id"]
response = client.get(f"/heroes/{hero_id}")
assert response.status_code == 200, response.text
data = response.json()
assert data == hero2
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
}
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,638 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.relationships import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
team_preventers = {"name": "Preventers", "headquarters": "Sharp Tower"}
team_z_force = {"name": "Z-Force", "headquarters": "Sister Margarets Bar"}
response = client.post("/teams/", json=team_preventers)
assert response.status_code == 200, response.text
team_preventers_data = response.json()
team_preventers_id = team_preventers_data["id"]
response = client.post("/teams/", json=team_z_force)
assert response.status_code == 200, response.text
team_z_force_data = response.json()
team_z_force_id = team_z_force_data["id"]
response = client.get("/teams/")
data = response.json()
assert len(data) == 2
response = client.get("/teams/9000")
assert response.status_code == 404, response.text
response = client.patch(
f"/teams/{team_preventers_id}", json={"headquarters": "Preventers Tower"}
)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == team_preventers["name"]
assert data["headquarters"] == "Preventers Tower"
response = client.patch("/teams/9000", json={"name": "Freedom League"})
assert response.status_code == 404, response.text
hero1_data = {
"name": "Deadpond",
"secret_name": "Dive Wilson",
"team_id": team_z_force_id,
}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
"team_id": team_preventers_id,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
hero1 = response.json()
hero1_id = hero1["id"]
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.get(f"/heroes/{hero1_id}")
assert response.status_code == 200, response.text
data = response.json()
assert data["name"] == hero1_data["name"]
assert data["team"]["name"] == team_z_force["name"]
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get(f"/teams/{team_preventers_id}")
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == team_preventers_data["name"]
assert data["heroes"][0]["name"] == hero3_data["name"]
response = client.delete(f"/teams/{team_preventers_id}")
assert response.status_code == 200, response.text
response = client.delete("/teams/9000")
assert response.status_code == 404, response.text
response = client.get("/teams/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 1
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroReadWithTeam"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/": {
"get": {
"summary": "Read Teams",
"operationId": "read_teams_teams__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Teams Teams Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Team",
"operationId": "create_team_teams__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/{team_id}": {
"get": {
"summary": "Read Team",
"operationId": "read_team_teams__team_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamReadWithHeroes"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Team",
"operationId": "delete_team_teams__team_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Team",
"operationId": "update_team_teams__team_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroReadWithTeam": {
"title": "HeroReadWithTeam",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
"team": {"$ref": "#/components/schemas/TeamRead"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"TeamCreate": {
"title": "TeamCreate",
"required": ["name", "headquarters"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"TeamRead": {
"title": "TeamRead",
"required": ["name", "headquarters", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
"id": {"title": "Id", "type": "integer"},
},
},
"TeamReadWithHeroes": {
"title": "TeamReadWithHeroes",
"required": ["name", "headquarters", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
"id": {"title": "Id", "type": "integer"},
"heroes": {
"title": "Heroes",
"type": "array",
"items": {"$ref": "#/components/schemas/HeroRead"},
"default": [],
},
},
},
"TeamUpdate": {
"title": "TeamUpdate",
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,638 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.relationships import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
team_preventers = {"name": "Preventers", "headquarters": "Sharp Tower"}
team_z_force = {"name": "Z-Force", "headquarters": "Sister Margarets Bar"}
response = client.post("/teams/", json=team_preventers)
assert response.status_code == 200, response.text
team_preventers_data = response.json()
team_preventers_id = team_preventers_data["id"]
response = client.post("/teams/", json=team_z_force)
assert response.status_code == 200, response.text
team_z_force_data = response.json()
team_z_force_id = team_z_force_data["id"]
response = client.get("/teams/")
data = response.json()
assert len(data) == 2
response = client.get("/teams/9000")
assert response.status_code == 404, response.text
response = client.patch(
f"/teams/{team_preventers_id}", json={"headquarters": "Preventers Tower"}
)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == team_preventers["name"]
assert data["headquarters"] == "Preventers Tower"
response = client.patch("/teams/9000", json={"name": "Freedom League"})
assert response.status_code == 404, response.text
hero1_data = {
"name": "Deadpond",
"secret_name": "Dive Wilson",
"team_id": team_z_force_id,
}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
"team_id": team_preventers_id,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
hero1 = response.json()
hero1_id = hero1["id"]
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.get(f"/heroes/{hero1_id}")
assert response.status_code == 200, response.text
data = response.json()
assert data["name"] == hero1_data["name"]
assert data["team"]["name"] == team_z_force["name"]
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get(f"/teams/{team_preventers_id}")
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == team_preventers_data["name"]
assert data["heroes"][0]["name"] == hero3_data["name"]
response = client.delete(f"/teams/{team_preventers_id}")
assert response.status_code == 200, response.text
response = client.delete("/teams/9000")
assert response.status_code == 404, response.text
response = client.get("/teams/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 1
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroReadWithTeam"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/": {
"get": {
"summary": "Read Teams",
"operationId": "read_teams_teams__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Teams Teams Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Team",
"operationId": "create_team_teams__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/{team_id}": {
"get": {
"summary": "Read Team",
"operationId": "read_team_teams__team_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamReadWithHeroes"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Team",
"operationId": "delete_team_teams__team_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Team",
"operationId": "update_team_teams__team_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroReadWithTeam": {
"title": "HeroReadWithTeam",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
"team": {"$ref": "#/components/schemas/TeamRead"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"TeamCreate": {
"title": "TeamCreate",
"required": ["name", "headquarters"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"TeamRead": {
"title": "TeamRead",
"required": ["name", "headquarters", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
"id": {"title": "Id", "type": "integer"},
},
},
"TeamReadWithHeroes": {
"title": "TeamReadWithHeroes",
"required": ["name", "headquarters", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
"id": {"title": "Id", "type": "integer"},
"heroes": {
"title": "Heroes",
"type": "array",
"items": {"$ref": "#/components/schemas/HeroRead"},
"default": [],
},
},
},
"TeamUpdate": {
"title": "TeamUpdate",
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,144 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.response_model import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
response = client.post("/heroes/", json=hero_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero_data["name"]
assert data["secret_name"] == hero_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 1
assert data[0]["name"] == hero_data["name"]
assert data[0]["secret_name"] == hero_data["secret_name"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/Hero"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/Hero"}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/Hero"}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"Hero": {
"title": "Hero",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,144 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.response_model import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
response = client.post("/heroes/", json=hero_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero_data["name"]
assert data["secret_name"] == hero_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 1
assert data[0]["name"] == hero_data["name"]
assert data[0]["secret_name"] == hero_data["secret_name"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/Hero"
},
}
}
},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/Hero"}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/Hero"}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"Hero": {
"title": "Hero",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,333 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.session_with_dependency import (
tutorial001_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,333 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.session_with_dependency import (
tutorial001_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,150 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.simple_hero_api import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
response = client.post("/heroes/", json=hero1_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero1_data["name"]
assert data["secret_name"] == hero1_data["secret_name"]
assert data["id"] is not None
assert data["age"] is None
response = client.post("/heroes/", json=hero2_data)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"]
assert data["secret_name"] == hero2_data["secret_name"]
assert data["id"] == hero2_data["id"], (
"Up to this point it's still possible to "
"set the ID of the hero in the request"
)
assert data["age"] is None
response = client.get("/heroes/")
data = response.json()
assert response.status_code == 200, response.text
assert len(data) == 2
assert data[0]["name"] == hero1_data["name"]
assert data[0]["secret_name"] == hero1_data["secret_name"]
assert data[1]["name"] == hero2_data["name"]
assert data[1]["secret_name"] == hero2_data["secret_name"]
assert data[1]["id"] == hero2_data["id"]
response = client.get("/openapi.json")
data = response.json()
assert response.status_code == 200, response.text
assert data == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
}
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/Hero"}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"Hero": {
"title": "Hero",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"id": {"title": "Id", "type": "integer"},
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,595 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.teams import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
team_preventers = {"name": "Preventers", "headquarters": "Sharp Tower"}
team_z_force = {"name": "Z-Force", "headquarters": "Sister Margarets Bar"}
response = client.post("/teams/", json=team_preventers)
assert response.status_code == 200, response.text
team_preventers_data = response.json()
team_preventers_id = team_preventers_data["id"]
response = client.post("/teams/", json=team_z_force)
assert response.status_code == 200, response.text
team_z_force_data = response.json()
team_z_force_data["id"]
response = client.get("/teams/")
data = response.json()
assert len(data) == 2
response = client.get(f"/teams/{team_preventers_id}")
data = response.json()
assert response.status_code == 200, response.text
assert data == team_preventers_data
response = client.get("/teams/9000")
assert response.status_code == 404, response.text
response = client.patch(
f"/teams/{team_preventers_id}", json={"headquarters": "Preventers Tower"}
)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == team_preventers["name"]
assert data["headquarters"] == "Preventers Tower"
response = client.patch("/teams/9000", json={"name": "Freedom League"})
assert response.status_code == 404, response.text
response = client.delete(f"/teams/{team_preventers_id}")
assert response.status_code == 200, response.text
response = client.delete("/teams/9000")
assert response.status_code == 404, response.text
response = client.get("/teams/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 1
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/": {
"get": {
"summary": "Read Teams",
"operationId": "read_teams_teams__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Teams Teams Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Team",
"operationId": "create_team_teams__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/{team_id}": {
"get": {
"summary": "Read Team",
"operationId": "read_team_teams__team_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Team",
"operationId": "delete_team_teams__team_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Team",
"operationId": "update_team_teams__team_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"TeamCreate": {
"title": "TeamCreate",
"required": ["name", "headquarters"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"TeamRead": {
"title": "TeamRead",
"required": ["name", "headquarters", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
"id": {"title": "Id", "type": "integer"},
},
},
"TeamUpdate": {
"title": "TeamUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,595 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.teams import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
assert response.status_code == 200, response.text
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.delete(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 2
response = client.delete("/heroes/9000")
assert response.status_code == 404, response.text
team_preventers = {"name": "Preventers", "headquarters": "Sharp Tower"}
team_z_force = {"name": "Z-Force", "headquarters": "Sister Margarets Bar"}
response = client.post("/teams/", json=team_preventers)
assert response.status_code == 200, response.text
team_preventers_data = response.json()
team_preventers_id = team_preventers_data["id"]
response = client.post("/teams/", json=team_z_force)
assert response.status_code == 200, response.text
team_z_force_data = response.json()
team_z_force_data["id"]
response = client.get("/teams/")
data = response.json()
assert len(data) == 2
response = client.get(f"/teams/{team_preventers_id}")
data = response.json()
assert response.status_code == 200, response.text
assert data == team_preventers_data
response = client.get("/teams/9000")
assert response.status_code == 404, response.text
response = client.patch(
f"/teams/{team_preventers_id}", json={"headquarters": "Preventers Tower"}
)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == team_preventers["name"]
assert data["headquarters"] == "Preventers Tower"
response = client.patch("/teams/9000", json={"name": "Freedom League"})
assert response.status_code == 404, response.text
response = client.delete(f"/teams/{team_preventers_id}")
assert response.status_code == 200, response.text
response = client.delete("/teams/9000")
assert response.status_code == 404, response.text
response = client.get("/teams/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 1
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Hero",
"operationId": "delete_hero_heroes__hero_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/": {
"get": {
"summary": "Read Teams",
"operationId": "read_teams_teams__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Teams Teams Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Team",
"operationId": "create_team_teams__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/teams/{team_id}": {
"get": {
"summary": "Read Team",
"operationId": "read_team_teams__team_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"delete": {
"summary": "Delete Team",
"operationId": "delete_team_teams__team_id__delete",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Team",
"operationId": "update_team_teams__team_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Team Id", "type": "integer"},
"name": "team_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"team_id": {"title": "Team Id", "type": "integer"},
},
},
"TeamCreate": {
"title": "TeamCreate",
"required": ["name", "headquarters"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"TeamRead": {
"title": "TeamRead",
"required": ["name", "headquarters", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
"id": {"title": "Id", "type": "integer"},
},
},
"TeamUpdate": {
"title": "TeamUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"headquarters": {"title": "Headquarters", "type": "string"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,310 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.update import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
hero3 = response.json()
hero3_id = hero3["id"]
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"], "The name should not be set to none"
assert (
data["secret_name"] == "Spider-Youngster"
), "The secret name should be updated"
response = client.patch(f"/heroes/{hero3_id}", json={"age": None})
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero3_data["name"]
assert data["age"] is None, (
"A field should be updatable to None, even if " "that's the default"
)
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,310 @@
from fastapi.testclient import TestClient
from sqlmodel import create_engine
from sqlmodel.pool import StaticPool
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.fastapi.update import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(
mod.sqlite_url, connect_args=mod.connect_args, poolclass=StaticPool
)
with TestClient(mod.app) as client:
hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"}
hero2_data = {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"id": 9000,
}
hero3_data = {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
}
response = client.post("/heroes/", json=hero1_data)
assert response.status_code == 200, response.text
response = client.post("/heroes/", json=hero2_data)
assert response.status_code == 200, response.text
hero2 = response.json()
hero2_id = hero2["id"]
response = client.post("/heroes/", json=hero3_data)
assert response.status_code == 200, response.text
hero3 = response.json()
hero3_id = hero3["id"]
response = client.get(f"/heroes/{hero2_id}")
assert response.status_code == 200, response.text
response = client.get("/heroes/9000")
assert response.status_code == 404, response.text
response = client.get("/heroes/")
assert response.status_code == 200, response.text
data = response.json()
assert len(data) == 3
response = client.patch(
f"/heroes/{hero2_id}", json={"secret_name": "Spider-Youngster"}
)
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero2_data["name"], "The name should not be set to none"
assert (
data["secret_name"] == "Spider-Youngster"
), "The secret name should be updated"
response = client.patch(f"/heroes/{hero3_id}", json={"age": None})
data = response.json()
assert response.status_code == 200, response.text
assert data["name"] == hero3_data["name"]
assert data["age"] is None, (
"A field should be updatable to None, even if " "that's the default"
)
response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"})
assert response.status_code == 404, response.text
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/heroes/": {
"get": {
"summary": "Read Heroes",
"operationId": "read_heroes_heroes__get",
"parameters": [
{
"required": False,
"schema": {
"title": "Offset",
"type": "integer",
"default": 0,
},
"name": "offset",
"in": "query",
},
{
"required": False,
"schema": {
"title": "Limit",
"maximum": 100.0,
"type": "integer",
"default": 100,
},
"name": "limit",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"title": "Response Read Heroes Heroes Get",
"type": "array",
"items": {
"$ref": "#/components/schemas/HeroRead"
},
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"post": {
"summary": "Create Hero",
"operationId": "create_hero_heroes__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroCreate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
"/heroes/{hero_id}": {
"get": {
"summary": "Read Hero",
"operationId": "read_hero_heroes__hero_id__get",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
"patch": {
"summary": "Update Hero",
"operationId": "update_hero_heroes__hero_id__patch",
"parameters": [
{
"required": True,
"schema": {"title": "Hero Id", "type": "integer"},
"name": "hero_id",
"in": "path",
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroUpdate"
}
}
},
"required": True,
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HeroRead"
}
}
},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
},
},
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationError"
},
}
},
},
"HeroCreate": {
"title": "HeroCreate",
"required": ["name", "secret_name"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"HeroRead": {
"title": "HeroRead",
"required": ["name", "secret_name", "id"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
"id": {"title": "Id", "type": "integer"},
},
},
"HeroUpdate": {
"title": "HeroUpdate",
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"secret_name": {"title": "Secret Name", "type": "string"},
"age": {"title": "Age", "type": "integer"},
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type": "integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}

View File

@@ -0,0 +1,46 @@
from unittest.mock import patch
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.indexes import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"secret_name": "Dive Wilson", "age": None, "id": 1, "name": "Deadpond"}]
]
insp: Inspector = inspect(mod.engine)
indexes = insp.get_indexes(str(mod.Hero.__tablename__))
expected_indexes = [
{
"name": "ix_hero_name",
"dialect_options": {},
"column_names": ["name"],
"unique": 0,
},
{
"name": "ix_hero_age",
"dialect_options": {},
"column_names": ["age"],
"unique": 0,
},
]
for index in expected_indexes:
assert index in indexes, "This expected index should be in the indexes in DB"
# Now that this index was checked, remove it from the list of indexes
indexes.pop(indexes.index(index))
assert len(indexes) == 0, "The database should only have the expected indexes"

View File

@@ -0,0 +1,47 @@
from unittest.mock import patch
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.indexes import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"name": "Tarantula", "secret_name": "Natalia Roman-on", "age": 32, "id": 4}],
[{"name": "Black Lion", "secret_name": "Trevor Challa", "age": 35, "id": 5}],
]
insp: Inspector = inspect(mod.engine)
indexes = insp.get_indexes(str(mod.Hero.__tablename__))
expected_indexes = [
{
"name": "ix_hero_name",
"dialect_options": {},
"column_names": ["name"],
"unique": 0,
},
{
"name": "ix_hero_age",
"dialect_options": {},
"column_names": ["age"],
"unique": 0,
},
]
for index in expected_indexes:
assert index in indexes, "This expected index should be in the indexes in DB"
# Now that this index was checked, remove it from the list of indexes
indexes.pop(indexes.index(index))
assert len(indexes) == 0, "The database should only have the expected indexes"

View File

@@ -0,0 +1,30 @@
from sqlmodel import Session, create_engine, select
from ...conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.insert import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.main()
with Session(mod.engine) as session:
heroes = session.exec(select(mod.Hero)).all()
heroes_by_name = {hero.name: hero for hero in heroes}
deadpond = heroes_by_name["Deadpond"]
spider_boy = heroes_by_name["Spider-Boy"]
rusty_man = heroes_by_name["Rusty-Man"]
assert deadpond.name == "Deadpond"
assert deadpond.age is None
assert deadpond.id is not None
assert deadpond.secret_name == "Dive Wilson"
assert spider_boy.name == "Spider-Boy"
assert spider_boy.age is None
assert spider_boy.id is not None
assert spider_boy.secret_name == "Pedro Parqueador"
assert rusty_man.name == "Rusty-Man"
assert rusty_man.age == 48
assert rusty_man.id is not None
assert rusty_man.secret_name == "Tommy Sharp"

View File

@@ -0,0 +1,30 @@
from sqlmodel import Session, create_engine, select
from ...conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.insert import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.main()
with Session(mod.engine) as session:
heroes = session.exec(select(mod.Hero)).all()
heroes_by_name = {hero.name: hero for hero in heroes}
deadpond = heroes_by_name["Deadpond"]
spider_boy = heroes_by_name["Spider-Boy"]
rusty_man = heroes_by_name["Rusty-Man"]
assert deadpond.name == "Deadpond"
assert deadpond.age is None
assert deadpond.id is not None
assert deadpond.secret_name == "Dive Wilson"
assert spider_boy.name == "Spider-Boy"
assert spider_boy.age is None
assert spider_boy.id is not None
assert spider_boy.secret_name == "Pedro Parqueador"
assert rusty_man.name == "Rusty-Man"
assert rusty_man.age == 48
assert rusty_man.id is not None
assert rusty_man.secret_name == "Tommy Sharp"

View File

@@ -0,0 +1,30 @@
from sqlmodel import Session, create_engine, select
from ...conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.insert import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.main()
with Session(mod.engine) as session:
heroes = session.exec(select(mod.Hero)).all()
heroes_by_name = {hero.name: hero for hero in heroes}
deadpond = heroes_by_name["Deadpond"]
spider_boy = heroes_by_name["Spider-Boy"]
rusty_man = heroes_by_name["Rusty-Man"]
assert deadpond.name == "Deadpond"
assert deadpond.age is None
assert deadpond.id is not None
assert deadpond.secret_name == "Dive Wilson"
assert spider_boy.name == "Spider-Boy"
assert spider_boy.age is None
assert spider_boy.id is not None
assert spider_boy.secret_name == "Pedro Parqueador"
assert rusty_man.name == "Rusty-Man"
assert rusty_man.age == 48
assert rusty_man.id is not None
assert rusty_man.secret_name == "Tommy Sharp"

View File

@@ -0,0 +1,35 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
[
{"id": 1, "name": "Deadpond", "secret_name": "Dive Wilson", "age": None},
{
"id": 2,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
},
{"id": 3, "name": "Rusty-Man", "secret_name": "Tommy Sharp", "age": 48},
]
]
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.offset_and_limit import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,35 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
[
{
"id": 4,
"name": "Tarantula",
"secret_name": "Natalia Roman-on",
"age": 32,
},
{"id": 5, "name": "Black Lion", "secret_name": "Trevor Challa", "age": 35},
{"id": 6, "name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36},
]
]
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.offset_and_limit import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,33 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
[
{
"id": 7,
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
}
]
]
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.offset_and_limit import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,27 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.offset_and_limit import tutorial004_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
[
{"name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36, "id": 6},
{"name": "Rusty-Man", "secret_name": "Tommy Sharp", "age": 48, "id": 3},
]
]
]

View File

@@ -0,0 +1,50 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Deadpond:",
{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"},
],
[
"Deadpond teams:",
[
{"id": 1, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
],
],
[
"Rusty-Man:",
{"id": 2, "secret_name": "Tommy Sharp", "age": 48, "name": "Rusty-Man"},
],
[
"Rusty-Man Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
[
"Spider-Boy:",
{"id": 3, "secret_name": "Pedro Parqueador", "age": None, "name": "Spider-Boy"},
],
[
"Spider-Boy Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.many_to_many import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,50 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Deadpond:",
{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"},
],
[
"Deadpond teams:",
[
{"id": 1, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
],
],
[
"Rusty-Man:",
{"id": 2, "secret_name": "Tommy Sharp", "age": 48, "name": "Rusty-Man"},
],
[
"Rusty-Man Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
[
"Spider-Boy:",
{"id": 3, "secret_name": "Pedro Parqueador", "age": None, "name": "Spider-Boy"},
],
[
"Spider-Boy Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.many_to_many import tutorial001_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,77 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Deadpond:",
{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"},
],
[
"Deadpond teams:",
[
{"id": 1, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
],
],
[
"Rusty-Man:",
{"id": 2, "secret_name": "Tommy Sharp", "age": 48, "name": "Rusty-Man"},
],
[
"Rusty-Man Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
[
"Spider-Boy:",
{"id": 3, "secret_name": "Pedro Parqueador", "age": None, "name": "Spider-Boy"},
],
[
"Spider-Boy Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
[
"Updated Spider-Boy's Teams:",
[
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
{"id": 1, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
],
],
[
"Z-Force heroes:",
[
{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"},
{
"id": 3,
"secret_name": "Pedro Parqueador",
"age": None,
"name": "Spider-Boy",
},
],
],
[
"Reverted Z-Force's heroes:",
[{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"}],
],
[
"Reverted Spider-Boy's teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.many_to_many import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,77 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Deadpond:",
{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"},
],
[
"Deadpond teams:",
[
{"id": 1, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
],
],
[
"Rusty-Man:",
{"id": 2, "secret_name": "Tommy Sharp", "age": 48, "name": "Rusty-Man"},
],
[
"Rusty-Man Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
[
"Spider-Boy:",
{"id": 3, "secret_name": "Pedro Parqueador", "age": None, "name": "Spider-Boy"},
],
[
"Spider-Boy Teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
[
"Updated Spider-Boy's Teams:",
[
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
{"id": 1, "name": "Z-Force", "headquarters": "Sister Margarets Bar"},
],
],
[
"Z-Force heroes:",
[
{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"},
{
"id": 3,
"secret_name": "Pedro Parqueador",
"age": None,
"name": "Spider-Boy",
},
],
],
[
"Reverted Z-Force's heroes:",
[{"id": 1, "secret_name": "Dive Wilson", "age": None, "name": "Deadpond"}],
],
[
"Reverted Spider-Boy's teams:",
[{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"}],
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.many_to_many import tutorial002_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,73 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Z-Force hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "id": 1, "age": None},
"is training:",
False,
],
[
"Preventers hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "id": 1, "age": None},
"is training:",
True,
],
[
"Preventers hero:",
{"name": "Spider-Boy", "secret_name": "Pedro Parqueador", "id": 2, "age": None},
"is training:",
True,
],
[
"Preventers hero:",
{"name": "Rusty-Man", "secret_name": "Tommy Sharp", "id": 3, "age": 48},
"is training:",
False,
],
[
"Updated Spider-Boy's Teams:",
[
{"team_id": 2, "is_training": True, "hero_id": 2},
{"team_id": 1, "is_training": True, "hero_id": 2},
],
],
[
"Z-Force heroes:",
[
{"team_id": 1, "is_training": False, "hero_id": 1},
{"team_id": 1, "is_training": True, "hero_id": 2},
],
],
[
"Spider-Boy team:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
"is training:",
False,
],
[
"Spider-Boy team:",
{"headquarters": "Sister Margarets Bar", "id": 1, "name": "Z-Force"},
"is training:",
True,
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.many_to_many import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,73 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Z-Force hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "id": 1, "age": None},
"is training:",
False,
],
[
"Preventers hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "id": 1, "age": None},
"is training:",
True,
],
[
"Preventers hero:",
{"name": "Spider-Boy", "secret_name": "Pedro Parqueador", "id": 2, "age": None},
"is training:",
True,
],
[
"Preventers hero:",
{"name": "Rusty-Man", "secret_name": "Tommy Sharp", "id": 3, "age": 48},
"is training:",
False,
],
[
"Updated Spider-Boy's Teams:",
[
{"team_id": 2, "is_training": True, "hero_id": 2},
{"team_id": 1, "is_training": True, "hero_id": 2},
],
],
[
"Z-Force heroes:",
[
{"team_id": 1, "is_training": False, "hero_id": 1},
{"team_id": 1, "is_training": True, "hero_id": 2},
],
],
[
"Spider-Boy team:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
"is training:",
False,
],
[
"Spider-Boy team:",
{"headquarters": "Sister Margarets Bar", "id": 1, "name": "Z-Force"},
"is training:",
True,
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.many_to_many import tutorial003_py39 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,30 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
"Hero:",
{
"name": "Tarantula",
"secret_name": "Natalia Roman-on",
"age": 32,
"id": 4,
},
]
]

View File

@@ -0,0 +1,20 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [["Hero:", None]]

View File

@@ -0,0 +1,25 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
"Hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "age": None, "id": 1},
]
]

View File

@@ -0,0 +1,41 @@
from unittest.mock import patch
import pytest
from sqlalchemy.exc import MultipleResultsFound
from sqlmodel import Session, create_engine, delete
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial004_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
with pytest.raises(MultipleResultsFound):
mod.main()
with Session(mod.engine) as session:
# TODO: create delete() function
# TODO: add overloads for .exec() with delete object
session.exec(delete(mod.Hero))
session.add(mod.Hero(name="Test Hero", secret_name="Secret Test Hero", age=24))
session.commit()
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.select_heroes()
assert calls == [
[
"Hero:",
{
"id": 1,
"name": "Test Hero",
"secret_name": "Secret Test Hero",
"age": 24,
},
]
]

View File

@@ -0,0 +1,41 @@
from unittest.mock import patch
import pytest
from sqlalchemy.exc import NoResultFound
from sqlmodel import Session, create_engine, delete
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial005_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
with pytest.raises(NoResultFound):
mod.main()
with Session(mod.engine) as session:
# TODO: create delete() function
# TODO: add overloads for .exec() with delete object
session.exec(delete(mod.Hero))
session.add(mod.Hero(name="Test Hero", secret_name="Secret Test Hero", age=24))
session.commit()
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.select_heroes()
assert calls == [
[
"Hero:",
{
"id": 1,
"name": "Test Hero",
"secret_name": "Secret Test Hero",
"age": 24,
},
]
]

View File

@@ -0,0 +1,25 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial006_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
"Hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "age": None, "id": 1},
]
]

View File

@@ -0,0 +1,25 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial007_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
"Hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "age": None, "id": 1},
]
]

View File

@@ -0,0 +1,25 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial008_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
"Hero:",
{"name": "Deadpond", "secret_name": "Dive Wilson", "age": None, "id": 1},
]
]

View File

@@ -0,0 +1,20 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.one import tutorial009_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [["Hero:", None]]

View File

@@ -0,0 +1,290 @@
from unittest.mock import patch
import pytest
from sqlalchemy.exc import SAWarning
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"headquarters": "Wakaland Capital City", "id": 3, "name": "Wakaland"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Preventers heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Hero Spider-Boy:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
],
[
"Preventers Team Heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Spider-Boy without team:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes again:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
["After committing"],
[
"Spider-Boy after commit:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes after commit:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.back_populates import (
tutorial001_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
with pytest.warns(SAWarning):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,290 @@
from unittest.mock import patch
import pytest
from sqlalchemy.exc import SAWarning
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"headquarters": "Wakaland Capital City", "id": 3, "name": "Wakaland"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Preventers heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Hero Spider-Boy:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
],
[
"Preventers Team Heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Spider-Boy without team:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes again:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
["After committing"],
[
"Spider-Boy after commit:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes after commit:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.back_populates import (
tutorial001_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
with pytest.warns(SAWarning):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,280 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"id": 3, "name": "Wakaland", "headquarters": "Wakaland Capital City"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Preventers heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Hero Spider-Boy:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team:",
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
],
[
"Preventers Team Heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Spider-Boy without team:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes again:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
["After committing"],
[
"Spider-Boy after commit:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes after commit:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.back_populates import (
tutorial002_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,280 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"id": 3, "name": "Wakaland", "headquarters": "Wakaland Capital City"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Preventers heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Hero Spider-Boy:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team:",
{"id": 2, "name": "Preventers", "headquarters": "Sharp Tower"},
],
[
"Preventers Team Heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Spider-Boy without team:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes again:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
["After committing"],
[
"Spider-Boy after commit:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Preventers Team Heroes after commit:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.back_populates import (
tutorial002_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,21 @@
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ....conftest import needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.back_populates import (
tutorial003_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.main()
insp: Inspector = inspect(mod.engine)
assert insp.has_table(str(mod.Hero.__tablename__))
assert insp.has_table(str(mod.Weapon.__tablename__))
assert insp.has_table(str(mod.Power.__tablename__))
assert insp.has_table(str(mod.Team.__tablename__))

View File

@@ -0,0 +1,21 @@
from sqlalchemy import inspect
from sqlalchemy.engine.reflection import Inspector
from sqlmodel import create_engine
from ....conftest import needs_py39
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.back_populates import (
tutorial003_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
mod.main()
insp: Inspector = inspect(mod.engine)
assert insp.has_table(str(mod.Hero.__tablename__))
assert insp.has_table(str(mod.Weapon.__tablename__))
assert insp.has_table(str(mod.Power.__tablename__))
assert insp.has_table(str(mod.Team.__tablename__))

View File

@@ -0,0 +1,99 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"id": 3, "headquarters": "Wakaland Capital City", "name": "Wakaland"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.create_and_update_relationships import (
tutorial001_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,99 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"id": 3, "headquarters": "Wakaland Capital City", "name": "Wakaland"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.create_and_update_relationships import (
tutorial001_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,55 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"name": "Deadpond",
"age": None,
"team_id": 1,
"id": 1,
"secret_name": "Dive Wilson",
},
],
[
"Created hero:",
{
"name": "Rusty-Man",
"age": 48,
"team_id": 2,
"id": 2,
"secret_name": "Tommy Sharp",
},
],
[
"Created hero:",
{
"name": "Spider-Boy",
"age": None,
"team_id": None,
"id": 3,
"secret_name": "Pedro Parqueador",
},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.define_relationship_attributes import (
tutorial001_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,55 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"name": "Deadpond",
"age": None,
"team_id": 1,
"id": 1,
"secret_name": "Dive Wilson",
},
],
[
"Created hero:",
{
"name": "Rusty-Man",
"age": 48,
"team_id": 2,
"id": 2,
"secret_name": "Tommy Sharp",
},
],
[
"Created hero:",
{
"name": "Spider-Boy",
"age": None,
"team_id": None,
"id": 3,
"secret_name": "Pedro Parqueador",
},
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.define_relationship_attributes import (
tutorial001_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,107 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"headquarters": "Wakaland Capital City", "id": 3, "name": "Wakaland"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Spider-Boy's team:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
],
[
"Spider-Boy's team again:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.read_relationships import (
tutorial001_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,107 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"headquarters": "Wakaland Capital City", "id": 3, "name": "Wakaland"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Spider-Boy's team:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
],
[
"Spider-Boy's team again:",
{"headquarters": "Sharp Tower", "id": 2, "name": "Preventers"},
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.read_relationships import (
tutorial001_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,149 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"id": 3, "name": "Wakaland", "headquarters": "Wakaland Capital City"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Preventers heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Spider-Boy without team:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
]
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.read_relationships import (
tutorial002_py310 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,149 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ....conftest import get_testing_print_function, needs_py39
expected_calls = [
[
"Created hero:",
{
"age": None,
"id": 1,
"secret_name": "Dive Wilson",
"team_id": 1,
"name": "Deadpond",
},
],
[
"Created hero:",
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
],
[
"Created hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
[
"Updated hero:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
],
[
"Team Wakaland:",
{"id": 3, "name": "Wakaland", "headquarters": "Wakaland Capital City"},
],
[
"Preventers new hero:",
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
],
[
"Preventers new hero:",
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
],
[
"Preventers new hero:",
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
[
"Preventers heroes:",
[
{
"age": 48,
"id": 2,
"secret_name": "Tommy Sharp",
"team_id": 2,
"name": "Rusty-Man",
},
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": 2,
"name": "Spider-Boy",
},
{
"age": 32,
"id": 6,
"secret_name": "Natalia Roman-on",
"team_id": 2,
"name": "Tarantula",
},
{
"age": 36,
"id": 7,
"secret_name": "Steve Weird",
"team_id": 2,
"name": "Dr. Weird",
},
{
"age": 93,
"id": 8,
"secret_name": "Esteban Rogelios",
"team_id": 2,
"name": "Captain North America",
},
],
],
[
"Spider-Boy without team:",
{
"age": None,
"id": 3,
"secret_name": "Pedro Parqueador",
"team_id": None,
"name": "Spider-Boy",
},
],
]
@needs_py39
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.relationship_attributes.read_relationships import (
tutorial002_py39 as mod,
)
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,57 @@
from typing import Any, Dict, List, Union
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
def check_calls(calls: List[List[Union[str, Dict[str, Any]]]]):
assert calls[0][0] == {
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
"id": 1,
}
assert calls[1][0] == {
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
"id": 2,
}
assert calls[2][0] == {
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
"id": 3,
}
@needs_py310
def test_tutorial_001(clear_sqlmodel):
from docs_src.tutorial.select import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
check_calls(calls)
@needs_py310
def test_tutorial_002(clear_sqlmodel):
from docs_src.tutorial.select import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
check_calls(calls)

View File

@@ -0,0 +1,59 @@
from typing import Any, Dict, List, Union
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
def check_calls(calls: List[List[Union[str, Dict[str, Any]]]]):
assert calls[0][0] == [
{
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
"id": 1,
},
{
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
"id": 2,
},
{
"name": "Rusty-Man",
"secret_name": "Tommy Sharp",
"age": 48,
"id": 3,
},
]
@needs_py310
def test_tutorial_003(clear_sqlmodel):
from docs_src.tutorial.select import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
check_calls(calls)
@needs_py310
def test_tutorial_002(clear_sqlmodel):
from docs_src.tutorial.select import tutorial004_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
check_calls(calls)

View File

@@ -0,0 +1,56 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Hero:",
{
"id": 2,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
},
],
[
"Updated hero:",
{
"id": 2,
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": 16,
},
],
]
@needs_py310
def test_tutorial001(clear_sqlmodel):
from docs_src.tutorial.update import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls
@needs_py310
def test_tutorial002(clear_sqlmodel):
from docs_src.tutorial.update import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,69 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
expected_calls = [
[
"Hero 1:",
{"id": 2, "name": "Spider-Boy", "secret_name": "Pedro Parqueador", "age": None},
],
[
"Hero 2:",
{
"id": 7,
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
},
],
[
"Updated hero 1:",
{
"id": 2,
"name": "Spider-Youngster",
"secret_name": "Pedro Parqueador",
"age": 16,
},
],
[
"Updated hero 2:",
{
"id": 7,
"name": "Captain North America Except Canada",
"secret_name": "Esteban Rogelios",
"age": 110,
},
],
]
@needs_py310
def test_tutorial003(clear_sqlmodel):
from docs_src.tutorial.update import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls
@needs_py310
def test_tutorial004(clear_sqlmodel):
from docs_src.tutorial.update import tutorial004_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == expected_calls

View File

@@ -0,0 +1,29 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial001_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
{
"name": "Deadpond",
"secret_name": "Dive Wilson",
"age": None,
"id": 1,
}
]
]

View File

@@ -0,0 +1,30 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial002_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[
{
"name": "Spider-Boy",
"secret_name": "Pedro Parqueador",
"age": None,
"id": 2,
}
],
[{"name": "Rusty-Man", "secret_name": "Tommy Sharp", "age": 48, "id": 3}],
]

View File

@@ -0,0 +1,37 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial003_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
expected_calls = [
[{"id": 6, "name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36}],
[{"id": 3, "name": "Rusty-Man", "secret_name": "Tommy Sharp", "age": 48}],
[
{
"id": 7,
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
}
],
]
for call in expected_calls:
assert call in calls, "This expected item should be in the list"
# Now that this item was checked, remove it from the list
calls.pop(calls.index(call))
assert len(calls) == 0, "The list should only have the expected items"

View File

@@ -0,0 +1,37 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial004_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
expected_calls = [
[{"id": 5, "name": "Black Lion", "secret_name": "Trevor Challa", "age": 35}],
[{"id": 6, "name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36}],
[{"id": 3, "name": "Rusty-Man", "secret_name": "Tommy Sharp", "age": 48}],
[
{
"id": 7,
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
}
],
]
for call in expected_calls:
assert call in calls, "This expected item should be in the list"
# Now that this item was checked, remove it from the list
calls.pop(calls.index(call))
assert len(calls) == 0, "The list should only have the expected items"

View File

@@ -0,0 +1,22 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial005_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"name": "Tarantula", "secret_name": "Natalia Roman-on", "age": 32, "id": 4}]
]

View File

@@ -0,0 +1,23 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial006_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"name": "Tarantula", "secret_name": "Natalia Roman-on", "age": 32, "id": 4}],
[{"name": "Black Lion", "secret_name": "Trevor Challa", "age": 35, "id": 5}],
]

View File

@@ -0,0 +1,23 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial007_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"id": 5, "name": "Black Lion", "secret_name": "Trevor Challa", "age": 35}],
[{"id": 6, "name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36}],
]

View File

@@ -0,0 +1,23 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial008_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"id": 5, "name": "Black Lion", "secret_name": "Trevor Challa", "age": 35}],
[{"id": 6, "name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36}],
]

View File

@@ -0,0 +1,31 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial009_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"name": "Tarantula", "secret_name": "Natalia Roman-on", "age": 32, "id": 4}],
[{"name": "Black Lion", "secret_name": "Trevor Challa", "age": 35, "id": 5}],
[
{
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
"id": 7,
}
],
]

View File

@@ -0,0 +1,31 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial010_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
assert calls == [
[{"name": "Tarantula", "secret_name": "Natalia Roman-on", "age": 32, "id": 4}],
[{"name": "Black Lion", "secret_name": "Trevor Challa", "age": 35, "id": 5}],
[
{
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
"id": 7,
}
],
]

View File

@@ -0,0 +1,37 @@
from unittest.mock import patch
from sqlmodel import create_engine
from ...conftest import get_testing_print_function, needs_py310
@needs_py310
def test_tutorial(clear_sqlmodel):
from docs_src.tutorial.where import tutorial011_py310 as mod
mod.sqlite_url = "sqlite://"
mod.engine = create_engine(mod.sqlite_url)
calls = []
new_print = get_testing_print_function(calls)
with patch("builtins.print", new=new_print):
mod.main()
expected_calls = [
[{"id": 5, "name": "Black Lion", "secret_name": "Trevor Challa", "age": 35}],
[{"id": 6, "name": "Dr. Weird", "secret_name": "Steve Weird", "age": 36}],
[{"id": 3, "name": "Rusty-Man", "secret_name": "Tommy Sharp", "age": 48}],
[
{
"id": 7,
"name": "Captain North America",
"secret_name": "Esteban Rogelios",
"age": 93,
}
],
]
for call in expected_calls:
assert call in calls, "This expected item should be in the list"
# Now that this item was checked, remove it from the list
calls.pop(calls.index(call))
assert len(calls) == 0, "The list should only have the expected items"