tests/test_tutorial/test_sql_databases/test_tutorial001.py PYTHON 361 lines View on github.com → Search inside
1import importlib2import warnings3from typing import Any, cast45import pytest6from dirty_equals import IsInt7from fastapi.testclient import TestClient8from inline_snapshot import snapshot9from sqlalchemy import StaticPool10from sqlmodel import SQLModel, create_engine11from sqlmodel.main import default_registry1213from tests.utils import needs_py310141516def clear_sqlmodel():17    # Clear the tables in the metadata for the default base model18    SQLModel.metadata.clear()19    # Clear the Models associated with the registry, to avoid warnings20    default_registry.dispose()212223@pytest.fixture(24    name="client",25    params=[26        pytest.param("tutorial001_py310", marks=needs_py310),27        pytest.param("tutorial001_an_py310", marks=needs_py310),28    ],29    scope="module",30)31def get_client(request: pytest.FixtureRequest):32    clear_sqlmodel()33    # TODO: remove when updating SQL tutorial to use new lifespan API34    with warnings.catch_warnings(record=True):35        warnings.simplefilter("always")36        mod = importlib.import_module(f"docs_src.sql_databases.{request.param}")37        clear_sqlmodel()38        importlib.reload(mod)39    mod_any = cast(Any, mod)40    mod_any.sqlite_url = "sqlite://"41    mod_any.engine = create_engine(42        mod_any.sqlite_url,43        connect_args={"check_same_thread": False},44        poolclass=StaticPool,45    )4647    with TestClient(mod_any.app) as c:48        yield c49    # Clean up connection explicitly to avoid resource warning50    mod_any.engine.dispose()515253def test_crud_app(client: TestClient):54    # TODO: this warns that SQLModel.from_orm is deprecated in Pydantic v1, refactor55    # this if using obj.model_validate becomes independent of Pydantic v256    with warnings.catch_warnings(record=True):57        warnings.simplefilter("always")58        # No heroes before creating59        response = client.get("heroes/")60        assert response.status_code == 200, response.text61        assert response.json() == []6263        # Create a hero64        response = client.post(65            "/heroes/",66            json={67                "id": 999,68                "name": "Dead Pond",69                "age": 30,70                "secret_name": "Dive Wilson",71            },72        )73        assert response.status_code == 200, response.text74        assert response.json() == snapshot(75            {"age": 30, "secret_name": "Dive Wilson", "id": 999, "name": "Dead Pond"}76        )7778        # Read a hero79        hero_id = response.json()["id"]80        response = client.get(f"/heroes/{hero_id}")81        assert response.status_code == 200, response.text82        assert response.json() == snapshot(83            {"name": "Dead Pond", "age": 30, "id": 999, "secret_name": "Dive Wilson"}84        )8586        # Read all heroes87        # Create more heroes first88        response = client.post(89            "/heroes/",90            json={"name": "Spider-Boy", "age": 18, "secret_name": "Pedro Parqueador"},91        )92        assert response.status_code == 200, response.text93        response = client.post(94            "/heroes/", json={"name": "Rusty-Man", "secret_name": "Tommy Sharp"}95        )96        assert response.status_code == 200, response.text9798        response = client.get("/heroes/")99        assert response.status_code == 200, response.text100        assert response.json() == snapshot(101            [102                {103                    "name": "Dead Pond",104                    "age": 30,105                    "id": IsInt(),106                    "secret_name": "Dive Wilson",107                },108                {109                    "name": "Spider-Boy",110                    "age": 18,111                    "id": IsInt(),112                    "secret_name": "Pedro Parqueador",113                },114                {115                    "name": "Rusty-Man",116                    "age": None,117                    "id": IsInt(),118                    "secret_name": "Tommy Sharp",119                },120            ]121        )122123        response = client.get("/heroes/?offset=1&limit=1")124        assert response.status_code == 200, response.text125        assert response.json() == snapshot(126            [127                {128                    "name": "Spider-Boy",129                    "age": 18,130                    "id": IsInt(),131                    "secret_name": "Pedro Parqueador",132                }133            ]134        )135136        # Delete a hero137        response = client.delete(f"/heroes/{hero_id}")138        assert response.status_code == 200, response.text139        assert response.json() == snapshot({"ok": True})140141        response = client.get(f"/heroes/{hero_id}")142        assert response.status_code == 404, response.text143144        response = client.delete(f"/heroes/{hero_id}")145        assert response.status_code == 404, response.text146        assert response.json() == snapshot({"detail": "Hero not found"})147148149def test_openapi_schema(client: TestClient):150    response = client.get("/openapi.json")151    assert response.status_code == 200, response.text152    assert response.json() == snapshot(153        {154            "openapi": "3.1.0",155            "info": {"title": "FastAPI", "version": "0.1.0"},156            "paths": {157                "/heroes/": {158                    "post": {159                        "summary": "Create Hero",160                        "operationId": "create_hero_heroes__post",161                        "requestBody": {162                            "required": True,163                            "content": {164                                "application/json": {165                                    "schema": {"$ref": "#/components/schemas/Hero"}166                                }167                            },168                        },169                        "responses": {170                            "200": {171                                "description": "Successful Response",172                                "content": {173                                    "application/json": {174                                        "schema": {"$ref": "#/components/schemas/Hero"}175                                    }176                                },177                            },178                            "422": {179                                "description": "Validation Error",180                                "content": {181                                    "application/json": {182                                        "schema": {183                                            "$ref": "#/components/schemas/HTTPValidationError"184                                        }185                                    }186                                },187                            },188                        },189                    },190                    "get": {191                        "summary": "Read Heroes",192                        "operationId": "read_heroes_heroes__get",193                        "parameters": [194                            {195                                "name": "offset",196                                "in": "query",197                                "required": False,198                                "schema": {199                                    "type": "integer",200                                    "default": 0,201                                    "title": "Offset",202                                },203                            },204                            {205                                "name": "limit",206                                "in": "query",207                                "required": False,208                                "schema": {209                                    "type": "integer",210                                    "maximum": 100,211                                    "default": 100,212                                    "title": "Limit",213                                },214                            },215                        ],216                        "responses": {217                            "200": {218                                "description": "Successful Response",219                                "content": {220                                    "application/json": {221                                        "schema": {222                                            "type": "array",223                                            "items": {224                                                "$ref": "#/components/schemas/Hero"225                                            },226                                            "title": "Response Read Heroes Heroes  Get",227                                        }228                                    }229                                },230                            },231                            "422": {232                                "description": "Validation Error",233                                "content": {234                                    "application/json": {235                                        "schema": {236                                            "$ref": "#/components/schemas/HTTPValidationError"237                                        }238                                    }239                                },240                            },241                        },242                    },243                },244                "/heroes/{hero_id}": {245                    "get": {246                        "summary": "Read Hero",247                        "operationId": "read_hero_heroes__hero_id__get",248                        "parameters": [249                            {250                                "name": "hero_id",251                                "in": "path",252                                "required": True,253                                "schema": {"type": "integer", "title": "Hero Id"},254                            }255                        ],256                        "responses": {257                            "200": {258                                "description": "Successful Response",259                                "content": {260                                    "application/json": {261                                        "schema": {"$ref": "#/components/schemas/Hero"}262                                    }263                                },264                            },265                            "422": {266                                "description": "Validation Error",267                                "content": {268                                    "application/json": {269                                        "schema": {270                                            "$ref": "#/components/schemas/HTTPValidationError"271                                        }272                                    }273                                },274                            },275                        },276                    },277                    "delete": {278                        "summary": "Delete Hero",279                        "operationId": "delete_hero_heroes__hero_id__delete",280                        "parameters": [281                            {282                                "name": "hero_id",283                                "in": "path",284                                "required": True,285                                "schema": {"type": "integer", "title": "Hero Id"},286                            }287                        ],288                        "responses": {289                            "200": {290                                "description": "Successful Response",291                                "content": {"application/json": {"schema": {}}},292                            },293                            "422": {294                                "description": "Validation Error",295                                "content": {296                                    "application/json": {297                                        "schema": {298                                            "$ref": "#/components/schemas/HTTPValidationError"299                                        }300                                    }301                                },302                            },303                        },304                    },305                },306            },307            "components": {308                "schemas": {309                    "HTTPValidationError": {310                        "properties": {311                            "detail": {312                                "items": {313                                    "$ref": "#/components/schemas/ValidationError"314                                },315                                "type": "array",316                                "title": "Detail",317                            }318                        },319                        "type": "object",320                        "title": "HTTPValidationError",321                    },322                    "Hero": {323                        "properties": {324                            "id": {325                                "anyOf": [{"type": "integer"}, {"type": "null"}],326                                "title": "Id",327                            },328                            "name": {"type": "string", "title": "Name"},329                            "age": {330                                "anyOf": [{"type": "integer"}, {"type": "null"}],331                                "title": "Age",332                            },333                            "secret_name": {"type": "string", "title": "Secret Name"},334                        },335                        "type": "object",336                        "required": ["name", "secret_name"],337                        "title": "Hero",338                    },339                    "ValidationError": {340                        "properties": {341                            "ctx": {"title": "Context", "type": "object"},342                            "input": {"title": "Input"},343                            "loc": {344                                "items": {345                                    "anyOf": [{"type": "string"}, {"type": "integer"}]346                                },347                                "type": "array",348                                "title": "Location",349                            },350                            "msg": {"type": "string", "title": "Message"},351                            "type": {"type": "string", "title": "Error Type"},352                        },353                        "type": "object",354                        "required": ["loc", "msg", "type"],355                        "title": "ValidationError",356                    },357                }358            },359        }360    )

Code quality findings 2

Ensure functions have docstrings for documentation
info maintainability missing-docstring
def clear_sqlmodel():
Ensure functions have docstrings for documentation
info maintainability missing-docstring
def get_client(request: pytest.FixtureRequest):

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.

Generated by searchcode.com · powered by code_get_file + code_get_findings