From f295410ffedb5432633d3155bb6ece1a8a2233fc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:21:30 +0000 Subject: [PATCH] =?utf8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20format?= =?utf8?q?=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../test_decimal/test_tutorial001.py | 11 ++-- .../test_delete/test_tutorial001.py | 4 +- .../test_insert/test_tutorial001.py | 4 +- .../test_select/test_tutorial003.py | 4 +- .../test_select/test_tutorial004.py | 4 +- .../test_select/test_tutorial005.py | 4 +- .../test_update/test_tutorial001.py | 10 +-- .../test_tutorial002.py | 2 +- .../test_tutorial003.py | 2 +- .../test_tutorial001_tests_main.py | 36 ++++++----- .../test_delete/test_tutorial001.py | 36 ++++++----- .../test_limit_and_offset/test_tutorial001.py | 20 +++--- .../test_multiple_models/test_tutorial001.py | 36 ++++++----- .../test_multiple_models/test_tutorial002.py | 34 +++++----- .../test_read_one/test_tutorial001.py | 18 +++--- .../test_relationships/test_tutorial001.py | 63 +++++++++++++------ .../test_response_model/test_tutorial001.py | 4 +- .../test_tutorial001.py | 30 +++++---- .../test_simple_hero_api/test_tutorial001.py | 16 ++--- .../test_teams/test_tutorial001.py | 60 +++++++++++------- 20 files changed, 234 insertions(+), 164 deletions(-) diff --git a/tests/test_advanced/test_decimal/test_tutorial001.py b/tests/test_advanced/test_decimal/test_tutorial001.py index 4166e22b..2be19e6c 100644 --- a/tests/test_advanced/test_decimal/test_tutorial001.py +++ b/tests/test_advanced/test_decimal/test_tutorial001.py @@ -1,12 +1,11 @@ import importlib -import types # Add import for types +import types # Add import for types from decimal import Decimal -from unittest.mock import MagicMock # Keep MagicMock for type hint, though not strictly necessary for runtime import pytest from sqlmodel import create_engine -from ...conftest import needs_py310, PrintMock # Import PrintMock for type hint +from ...conftest import PrintMock, needs_py310 # Import PrintMock for type hint expected_calls = [ [ @@ -45,8 +44,10 @@ def get_module(request: pytest.FixtureRequest): return importlib.import_module(f"docs_src.advanced.decimal.{module_name}") -def test_tutorial(print_mock: PrintMock, module: types.ModuleType): # Use PrintMock for type hint and types.ModuleType +def test_tutorial( + print_mock: PrintMock, module: types.ModuleType +): # Use PrintMock for type hint and types.ModuleType module.sqlite_url = "sqlite://" module.engine = create_engine(module.sqlite_url) module.main() - assert print_mock.calls == expected_calls # Use .calls instead of .mock_calls + assert print_mock.calls == expected_calls # Use .calls instead of .mock_calls diff --git a/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py b/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py index 04b68397..7e1a1687 100644 --- a/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py +++ b/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py @@ -69,9 +69,7 @@ expected_calls = [ ) def get_module(request: pytest.FixtureRequest) -> ModuleType: module_name = request.param - mod = importlib.import_module( - f"docs_src.tutorial.connect.delete.{module_name}" - ) + mod = importlib.import_module(f"docs_src.tutorial.connect.delete.{module_name}") mod.sqlite_url = "sqlite://" mod.engine = create_engine(mod.sqlite_url) return mod diff --git a/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py b/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py index 5a29f5d8..2884de3e 100644 --- a/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py +++ b/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py @@ -49,9 +49,7 @@ expected_calls = [ ) def get_module(request: pytest.FixtureRequest) -> ModuleType: module_name = request.param - mod = importlib.import_module( - f"docs_src.tutorial.connect.insert.{module_name}" - ) + mod = importlib.import_module(f"docs_src.tutorial.connect.insert.{module_name}") mod.sqlite_url = "sqlite://" mod.engine = create_engine(mod.sqlite_url) return mod diff --git a/tests/test_tutorial/test_connect/test_select/test_tutorial003.py b/tests/test_tutorial/test_connect/test_select/test_tutorial003.py index 2b6d4235..bc5a9c38 100644 --- a/tests/test_tutorial/test_connect/test_select/test_tutorial003.py +++ b/tests/test_tutorial/test_connect/test_select/test_tutorial003.py @@ -85,9 +85,7 @@ expected_calls = [ ) def get_module(request: pytest.FixtureRequest) -> ModuleType: module_name = request.param - mod = importlib.import_module( - f"docs_src.tutorial.connect.select.{module_name}" - ) + mod = importlib.import_module(f"docs_src.tutorial.connect.select.{module_name}") mod.sqlite_url = "sqlite://" mod.engine = create_engine(mod.sqlite_url) return mod diff --git a/tests/test_tutorial/test_connect/test_select/test_tutorial004.py b/tests/test_tutorial/test_connect/test_select/test_tutorial004.py index ecf00c96..10b1e864 100644 --- a/tests/test_tutorial/test_connect/test_select/test_tutorial004.py +++ b/tests/test_tutorial/test_connect/test_select/test_tutorial004.py @@ -59,9 +59,7 @@ expected_calls = [ ) def get_module(request: pytest.FixtureRequest) -> ModuleType: module_name = request.param - mod = importlib.import_module( - f"docs_src.tutorial.connect.select.{module_name}" - ) + mod = importlib.import_module(f"docs_src.tutorial.connect.select.{module_name}") mod.sqlite_url = "sqlite://" mod.engine = create_engine(mod.sqlite_url) return mod diff --git a/tests/test_tutorial/test_connect/test_select/test_tutorial005.py b/tests/test_tutorial/test_connect/test_select/test_tutorial005.py index 0c64821a..fec4122e 100644 --- a/tests/test_tutorial/test_connect/test_select/test_tutorial005.py +++ b/tests/test_tutorial/test_connect/test_select/test_tutorial005.py @@ -61,9 +61,7 @@ expected_calls = [ ) def get_module(request: pytest.FixtureRequest) -> ModuleType: module_name = request.param - mod = importlib.import_module( - f"docs_src.tutorial.connect.select.{module_name}" - ) + mod = importlib.import_module(f"docs_src.tutorial.connect.select.{module_name}") mod.sqlite_url = "sqlite://" mod.engine = create_engine(mod.sqlite_url) return mod diff --git a/tests/test_tutorial/test_connect/test_update/test_tutorial001.py b/tests/test_tutorial/test_connect/test_update/test_tutorial001.py index e14e30e9..57032565 100644 --- a/tests/test_tutorial/test_connect/test_update/test_tutorial001.py +++ b/tests/test_tutorial/test_connect/test_update/test_tutorial001.py @@ -1,6 +1,6 @@ import importlib from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from sqlmodel import create_engine @@ -60,14 +60,14 @@ expected_calls = [ ) def get_module(request: pytest.FixtureRequest) -> ModuleType: module_name = request.param - mod = importlib.import_module( - f"docs_src.tutorial.connect.update.{module_name}" - ) + mod = importlib.import_module(f"docs_src.tutorial.connect.update.{module_name}") mod.sqlite_url = "sqlite://" mod.engine = create_engine(mod.sqlite_url) return mod -def test_tutorial(clear_sqlmodel: Any, print_mock: PrintMock, module: ModuleType) -> None: +def test_tutorial( + clear_sqlmodel: Any, print_mock: PrintMock, module: ModuleType +) -> None: module.main() assert print_mock.calls == expected_calls diff --git a/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py b/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py index c5e21c25..c3330488 100644 --- a/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py +++ b/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py @@ -1,6 +1,6 @@ import importlib from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from sqlalchemy import inspect diff --git a/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py b/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py index e67673bd..5aa3b8ac 100644 --- a/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py +++ b/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py @@ -1,6 +1,6 @@ import importlib from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from sqlalchemy import inspect diff --git a/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py b/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py index 7313ef95..535b3301 100644 --- a/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py +++ b/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py @@ -1,15 +1,16 @@ import importlib -import sys # Add sys import +import sys # Add sys import from types import ModuleType from typing import Any, Generator import pytest from fastapi.testclient import TestClient -from sqlmodel import Session, SQLModel, create_engine # Keep this for session_fixture -from sqlmodel.pool import StaticPool # Keep this for session_fixture +from sqlmodel import Session, SQLModel, create_engine # Keep this for session_fixture +from sqlmodel.pool import StaticPool # Keep this for session_fixture from ....conftest import needs_py39, needs_py310 + # This will be our parametrized fixture providing the versioned 'main' module @pytest.fixture( name="module", @@ -20,7 +21,9 @@ from ....conftest import needs_py39, needs_py310 pytest.param("tutorial001_py310", marks=needs_py310), ], ) -def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleType: # clear_sqlmodel is autouse +def get_module( + request: pytest.FixtureRequest, clear_sqlmodel: Any +) -> ModuleType: # clear_sqlmodel is autouse module_name = f"docs_src.tutorial.fastapi.app_testing.{request.param}.main" # Forcing reload to try to get a fresh state for models @@ -30,6 +33,7 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleTyp module = importlib.import_module(module_name) return module + @pytest.fixture(name="session", scope="function") def session_fixture(module: ModuleType) -> Generator[Session, None, None]: # Store original engine-related attributes from the module @@ -39,13 +43,13 @@ def session_fixture(module: ModuleType) -> Generator[Session, None, None]: # Force module to use a fresh in-memory SQLite DB for this test run module.sqlite_url = "sqlite://" - module.connect_args = {"check_same_thread": False} # Crucial for FastAPI + SQLite + module.connect_args = {"check_same_thread": False} # Crucial for FastAPI + SQLite # Re-create the engine in the module to use these new settings test_engine = create_engine( module.sqlite_url, connect_args=module.connect_args, - poolclass=StaticPool # Recommended for tests + poolclass=StaticPool, # Recommended for tests ) module.engine = test_engine @@ -55,7 +59,9 @@ def session_fixture(module: ModuleType) -> Generator[Session, None, None]: # Fallback if the function isn't named create_db_and_tables SQLModel.metadata.create_all(module.engine) - with Session(module.engine) as session: # Use the module's (now test-configured) engine + with Session( + module.engine + ) as session: # Use the module's (now test-configured) engine yield session # Teardown: drop tables from the module's engine @@ -68,14 +74,16 @@ def session_fixture(module: ModuleType) -> Generator[Session, None, None]: module.connect_args = original_connect_args if original_engine is not None: module.engine = original_engine - else: # If engine didn't exist, remove the one we created + else: # If engine didn't exist, remove the one we created if hasattr(module, "engine"): del module.engine @pytest.fixture(name="client", scope="function") -def client_fixture(session: Session, module: ModuleType) -> Generator[TestClient, None, None]: - def get_session_override() -> Generator[Session, None, None]: # Must be a generator +def client_fixture( + session: Session, module: ModuleType +) -> Generator[TestClient, None, None]: + def get_session_override() -> Generator[Session, None, None]: # Must be a generator yield session module.app.dependency_overrides[module.get_session] = get_session_override @@ -140,7 +148,7 @@ def test_read_heroes(session: Session, client: TestClient, module: ModuleType): def test_read_hero(session: Session, client: TestClient, module: ModuleType): - hero_1 = module.Hero(name="Deadpond", secret_name="Dive Wilson") # Use module.Hero + hero_1 = module.Hero(name="Deadpond", secret_name="Dive Wilson") # Use module.Hero session.add(hero_1) session.commit() @@ -155,7 +163,7 @@ def test_read_hero(session: Session, client: TestClient, module: ModuleType): def test_update_hero(session: Session, client: TestClient, module: ModuleType): - hero_1 = module.Hero(name="Deadpond", secret_name="Dive Wilson") # Use module.Hero + hero_1 = module.Hero(name="Deadpond", secret_name="Dive Wilson") # Use module.Hero session.add(hero_1) session.commit() @@ -170,13 +178,13 @@ def test_update_hero(session: Session, client: TestClient, module: ModuleType): def test_delete_hero(session: Session, client: TestClient, module: ModuleType): - hero_1 = module.Hero(name="Deadpond", secret_name="Dive Wilson") # Use module.Hero + hero_1 = module.Hero(name="Deadpond", secret_name="Dive Wilson") # Use module.Hero session.add(hero_1) session.commit() response = client.delete(f"/heroes/{hero_1.id}") - hero_in_db = session.get(module.Hero, hero_1.id) # Use module.Hero + hero_in_db = session.get(module.Hero, hero_1.id) # Use module.Hero assert response.status_code == 200 assert hero_in_db is None diff --git a/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py index 2d37d405..08016f86 100644 --- a/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py @@ -1,12 +1,12 @@ import importlib import sys from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import SQLModel, create_engine # Import SQLModel for metadata operations +from sqlmodel import SQLModel, create_engine # Import SQLModel for metadata operations from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -22,7 +22,7 @@ from ....conftest import needs_py39, needs_py310 ], ) def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleType: - module_name = f"docs_src.tutorial.fastapi.delete.{request.param}" # No .main here + module_name = f"docs_src.tutorial.fastapi.delete.{request.param}" # No .main here if module_name in sys.modules: module = importlib.reload(sys.modules[module_name]) else: @@ -34,19 +34,23 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleTyp module.sqlite_url = "sqlite://" module.engine = create_engine( module.sqlite_url, - connect_args={"check_same_thread": False}, # connect_args from original main.py - poolclass=StaticPool + connect_args={"check_same_thread": False}, # connect_args from original main.py + poolclass=StaticPool, ) # Assuming the module has a create_db_and_tables or similar, or uses SQLModel.metadata directly if hasattr(module, "create_db_and_tables"): module.create_db_and_tables() else: - SQLModel.metadata.create_all(module.engine) # Fallback, ensure tables are created + SQLModel.metadata.create_all( + module.engine + ) # Fallback, ensure tables are created return module -def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # clear_sqlmodel is autouse but explicit for safety +def test_tutorial( + clear_sqlmodel: Any, module: ModuleType +): # clear_sqlmodel is autouse but explicit for safety # The engine and tables are now set up by the 'module' fixture # The app's dependency overrides for get_session will use module.engine @@ -56,7 +60,7 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # clear_sqlmodel is hero2_data = { "name": "Spider-Boy", "secret_name": "Pedro Parqueador", - "id": 9000, # Note: ID is part of creation data here + "id": 9000, # Note: ID is part of creation data here } hero3_data = { "name": "Rusty-Man", @@ -65,13 +69,15 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # clear_sqlmodel is } response = client.post("/heroes/", json=hero1_data) assert response.status_code == 200, response.text - hero1 = response.json() # Get actual ID of hero1 + hero1 = response.json() # Get actual ID of hero1 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"] # This will be the ID assigned by DB, not 9000 if 9000 is not allowed on POST + hero2_id = hero2[ + "id" + ] # This will be the ID assigned by DB, not 9000 if 9000 is not allowed on POST response = client.post("/heroes/", json=hero3_data) assert response.status_code == 200, response.text @@ -86,8 +92,8 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # clear_sqlmodel is # For robustness, let's check for a non-existent ID based on actual data. # If hero2_id is 1, check for 9000. If it's 9000, check for 1 (assuming hero1_id is 1). non_existent_id_check = 9000 - if hero2_id == non_existent_id_check: # if DB somehow used 9000 - non_existent_id_check = hero1_id + hero2_id + 100 # just some other ID + if hero2_id == non_existent_id_check: # if DB somehow used 9000 + non_existent_id_check = hero1_id + hero2_id + 100 # just some other ID response = client.get(f"/heroes/{non_existent_id_check}") assert response.status_code == 404, response.text @@ -102,7 +108,9 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # clear_sqlmodel is ) assert response.status_code == 200, response.text - response = client.patch(f"/heroes/{non_existent_id_check}", json={"name": "Dragon Cube X"}) + response = client.patch( + f"/heroes/{non_existent_id_check}", json={"name": "Dragon Cube X"} + ) assert response.status_code == 404, response.text response = client.delete(f"/heroes/{hero2_id}") @@ -111,7 +119,7 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # clear_sqlmodel is response = client.get("/heroes/") assert response.status_code == 200, response.text data = response.json() - assert len(data) == 2 # After deleting one hero + assert len(data) == 2 # After deleting one hero response = client.delete(f"/heroes/{non_existent_id_check}") assert response.status_code == 404, response.text diff --git a/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py index 2ce49c1e..8909e98f 100644 --- a/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py @@ -1,12 +1,12 @@ import importlib import sys from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import SQLModel, create_engine # Import SQLModel for metadata operations +from sqlmodel import SQLModel, create_engine # Import SQLModel for metadata operations from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -22,7 +22,9 @@ from ....conftest import needs_py39, needs_py310 ], ) def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleType: - module_name = f"docs_src.tutorial.fastapi.limit_and_offset.{request.param}" # No .main + module_name = ( + f"docs_src.tutorial.fastapi.limit_and_offset.{request.param}" # No .main + ) if module_name in sys.modules: module = importlib.reload(sys.modules[module_name]) else: @@ -31,8 +33,10 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleTyp module.sqlite_url = "sqlite://" module.engine = create_engine( module.sqlite_url, - connect_args={"check_same_thread": False}, # Assuming connect_args was in original mod or default - poolclass=StaticPool + connect_args={ + "check_same_thread": False + }, # Assuming connect_args was in original mod or default + poolclass=StaticPool, ) if hasattr(module, "create_db_and_tables"): module.create_db_and_tables() @@ -66,7 +70,7 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): response = client.post("/heroes/", json=hero2_data) assert response.status_code == 200, response.text hero2 = response.json() - hero2_id = hero2["id"] # Use the actual ID from response + hero2_id = hero2["id"] # Use the actual ID from response # Create hero 3 response = client.post("/heroes/", json=hero3_data) @@ -92,7 +96,9 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): assert response.status_code == 200, response.text data_limit2 = response.json() assert len(data_limit2) == 2 - assert data_limit2[0]["name"] == hero1["name"] # Compare with actual created hero data + assert ( + data_limit2[0]["name"] == hero1["name"] + ) # Compare with actual created hero data assert data_limit2[1]["name"] == hero2["name"] response = client.get("/heroes/", params={"offset": 1}) diff --git a/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py index b0c0c6ce..cd36fbe9 100644 --- a/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py @@ -1,14 +1,14 @@ import importlib import sys from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient from sqlalchemy import inspect from sqlalchemy.engine.reflection import Inspector -from sqlmodel import SQLModel, create_engine # Import SQLModel +from sqlmodel import SQLModel, create_engine # Import SQLModel from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -24,7 +24,9 @@ from ....conftest import needs_py39, needs_py310 ], ) def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleType: - module_name = f"docs_src.tutorial.fastapi.multiple_models.{request.param}" # No .main + module_name = ( + f"docs_src.tutorial.fastapi.multiple_models.{request.param}" # No .main + ) if module_name in sys.modules: module = importlib.reload(sys.modules[module_name]) else: @@ -34,13 +36,11 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleTyp # Ensure connect_args is available in module, default if not. # Some tutorial files might not define it if they don't use on_event("startup") for engine creation. connect_args = getattr(module, "connect_args", {"check_same_thread": False}) - if "check_same_thread" not in connect_args: # Ensure this specific arg for SQLite + if "check_same_thread" not in connect_args: # Ensure this specific arg for SQLite connect_args["check_same_thread"] = False module.engine = create_engine( - module.sqlite_url, - connect_args=connect_args, - poolclass=StaticPool + module.sqlite_url, connect_args=connect_args, poolclass=StaticPool ) if hasattr(module, "create_db_and_tables"): module.create_db_and_tables() @@ -66,7 +66,7 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): assert data["secret_name"] == hero1_data["secret_name"] assert data["id"] is not None assert data["age"] is None - hero1_id = data["id"] # Store actual ID + hero1_id = data["id"] # Store actual ID response = client.post("/heroes/", json=hero2_data) data = response.json() @@ -78,8 +78,7 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): # This is true if ID is auto-generated and not 9000. assert data["id"] is not None assert data["age"] is None - hero2_id = data["id"] # Store actual ID - + hero2_id = data["id"] # Store actual ID response = client.get("/heroes/") data = response.json() @@ -95,7 +94,6 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): assert data[1]["name"] == hero2_data["name"] assert data[1]["secret_name"] == hero2_data["secret_name"] - response = client.get("/openapi.json") assert response.status_code == 200, response.text # OpenAPI schema check - kept as is from original test @@ -237,8 +235,8 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): } # Test inherited indexes - insp: Inspector = inspect(module.engine) # Use module.engine - indexes = insp.get_indexes(str(module.Hero.__tablename__)) # Use module.Hero + insp: Inspector = inspect(module.engine) # Use module.engine + indexes = insp.get_indexes(str(module.Hero.__tablename__)) # Use module.Hero expected_indexes = [ { "name": "ix_hero_name", @@ -255,10 +253,16 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): ] # Convert list of dicts to list of tuples of sorted items for order-agnostic comparison indexes_for_comparison = [tuple(sorted(d.items())) for d in indexes] - expected_indexes_for_comparison = [tuple(sorted(d.items())) for d in expected_indexes] + expected_indexes_for_comparison = [ + tuple(sorted(d.items())) for d in expected_indexes + ] for index_data_tuple in expected_indexes_for_comparison: - assert index_data_tuple in indexes_for_comparison, f"Expected index {index_data_tuple} not found in DB indexes {indexes_for_comparison}" + assert index_data_tuple in indexes_for_comparison, ( + f"Expected index {index_data_tuple} not found in DB indexes {indexes_for_comparison}" + ) indexes_for_comparison.remove(index_data_tuple) - assert len(indexes_for_comparison) == 0, f"Unexpected extra indexes found in DB: {indexes_for_comparison}" + assert len(indexes_for_comparison) == 0, ( + f"Unexpected extra indexes found in DB: {indexes_for_comparison}" + ) diff --git a/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py b/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py index bff39927..92cf5cbf 100644 --- a/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py +++ b/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py @@ -1,14 +1,14 @@ import importlib import sys from types import ModuleType -from typing import Any # For clear_sqlmodel type hint +from typing import Any # For clear_sqlmodel type hint import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient from sqlalchemy import inspect from sqlalchemy.engine.reflection import Inspector -from sqlmodel import SQLModel, create_engine # Import SQLModel +from sqlmodel import SQLModel, create_engine # Import SQLModel from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -18,9 +18,13 @@ from ....conftest import needs_py39, needs_py310 name="module", scope="function", params=[ - "tutorial002", # Changed to tutorial002 - pytest.param("tutorial002_py39", marks=needs_py39), # Changed to tutorial002_py39 - pytest.param("tutorial002_py310", marks=needs_py310), # Changed to tutorial002_py310 + "tutorial002", # Changed to tutorial002 + pytest.param( + "tutorial002_py39", marks=needs_py39 + ), # Changed to tutorial002_py39 + pytest.param( + "tutorial002_py310", marks=needs_py310 + ), # Changed to tutorial002_py310 ], ) def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleType: @@ -36,9 +40,7 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleTyp connect_args["check_same_thread"] = False module.engine = create_engine( - module.sqlite_url, - connect_args=connect_args, - poolclass=StaticPool + module.sqlite_url, connect_args=connect_args, poolclass=StaticPool ) if hasattr(module, "create_db_and_tables"): module.create_db_and_tables() @@ -75,7 +77,6 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): assert data["age"] is None hero2_id = data["id"] - response = client.get("/heroes/") data = response.json() @@ -88,7 +89,6 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): assert data[1]["name"] == hero2_data["name"] assert data[1]["secret_name"] == hero2_data["secret_name"] - response = client.get("/openapi.json") assert response.status_code == 200, response.text assert response.json() == { @@ -233,7 +233,7 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): indexes = insp.get_indexes(str(module.Hero.__tablename__)) expected_indexes = [ { - "name": "ix_hero_age", # For tutorial002, order of expected indexes is different + "name": "ix_hero_age", # For tutorial002, order of expected indexes is different "dialect_options": {}, "column_names": ["age"], "unique": 0, @@ -246,10 +246,16 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): }, ] indexes_for_comparison = [tuple(sorted(d.items())) for d in indexes] - expected_indexes_for_comparison = [tuple(sorted(d.items())) for d in expected_indexes] + expected_indexes_for_comparison = [ + tuple(sorted(d.items())) for d in expected_indexes + ] for index_data_tuple in expected_indexes_for_comparison: - assert index_data_tuple in indexes_for_comparison, f"Expected index {index_data_tuple} not found in DB indexes {indexes_for_comparison}" + assert index_data_tuple in indexes_for_comparison, ( + f"Expected index {index_data_tuple} not found in DB indexes {indexes_for_comparison}" + ) indexes_for_comparison.remove(index_data_tuple) - assert len(indexes_for_comparison) == 0, f"Unexpected extra indexes found in DB: {indexes_for_comparison}" + assert len(indexes_for_comparison) == 0, ( + f"Unexpected extra indexes found in DB: {indexes_for_comparison}" + ) diff --git a/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py index 0d2b1ec9..51fdc80b 100644 --- a/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py @@ -22,7 +22,7 @@ from ....conftest import needs_py39, needs_py310 ], ) def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleType: - module_name = f"docs_src.tutorial.fastapi.read_one.{request.param}" # No .main + module_name = f"docs_src.tutorial.fastapi.read_one.{request.param}" # No .main if module_name in sys.modules: module = importlib.reload(sys.modules[module_name]) else: @@ -34,9 +34,7 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any) -> ModuleTyp connect_args["check_same_thread"] = False module.engine = create_engine( - module.sqlite_url, - connect_args=connect_args, - poolclass=StaticPool + module.sqlite_url, connect_args=connect_args, poolclass=StaticPool ) if hasattr(module, "create_db_and_tables"): module.create_db_and_tables() @@ -56,18 +54,18 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): } response = client.post("/heroes/", json=hero1_data) assert response.status_code == 200, response.text - hero1 = response.json() # Store created hero1 data + hero1 = response.json() # Store created hero1 data response = client.post("/heroes/", json=hero2_data) assert response.status_code == 200, response.text - hero2 = response.json() # Store created hero2 data + hero2 = response.json() # Store created hero2 data response_get_all = client.get("/heroes/") assert response_get_all.status_code == 200, response_get_all.text data_all = response_get_all.json() assert len(data_all) == 2 - hero_id_to_get = hero2["id"] # Use actual ID from created hero2 + hero_id_to_get = hero2["id"] # Use actual ID from created hero2 response_get_one = client.get(f"/heroes/{hero_id_to_get}") assert response_get_one.status_code == 200, response_get_one.text data_one = response_get_one.json() @@ -77,9 +75,11 @@ def test_tutorial(clear_sqlmodel: Any, module: ModuleType): assert data_one["id"] == hero2["id"] # Check for a non-existent ID - non_existent_id = hero1["id"] + hero2["id"] + 100 # A likely non-existent ID + non_existent_id = hero1["id"] + hero2["id"] + 100 # A likely non-existent ID response_get_non_existent = client.get(f"/heroes/{non_existent_id}") - assert response_get_non_existent.status_code == 404, response_get_non_existent.text + assert response_get_non_existent.status_code == 404, ( + response_get_non_existent.text + ) response_openapi = client.get("/openapi.json") assert response_openapi.status_code == 200, response_openapi.text diff --git a/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py index bcb9cb13..bc1379d7 100644 --- a/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py @@ -4,9 +4,8 @@ import types from typing import Any import pytest -from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import create_engine, SQLModel +from sqlmodel import SQLModel, create_engine from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -89,7 +88,7 @@ def test_tutorial(module: types.ModuleType): hero2_data = { "name": "Spider-Boy", "secret_name": "Pedro Parqueador", - "id": 9000, # This ID might be problematic if the DB auto-increments differently or if this ID is expected to be user-settable and unique + "id": 9000, # This ID might be problematic if the DB auto-increments differently or if this ID is expected to be user-settable and unique } hero3_data = { "name": "Rusty-Man", @@ -107,8 +106,10 @@ def test_tutorial(module: types.ModuleType): hero2_id = hero2["id"] response = client.post("/heroes/", json=hero3_data) assert response.status_code == 200, response.text - response = client.get("/heroes/9000") # This might fail if hero2_id is not 9000 - assert response.status_code == 404, response.text # Original test expects 404, this implies ID 9000 is not found after creation. This needs to align with how IDs are handled. + response = client.get("/heroes/9000") # This might fail if hero2_id is not 9000 + assert response.status_code == 404, ( + response.text + ) # Original test expects 404, this implies ID 9000 is not found after creation. This needs to align with how IDs are handled. response = client.get("/heroes/") assert response.status_code == 200, response.text @@ -120,18 +121,25 @@ def test_tutorial(module: types.ModuleType): data = response.json() assert data["name"] == hero1_data["name"] # Ensure team is loaded and correct - if "team" in data and data["team"] is not None: # Team might not be present if not correctly loaded by the endpoint + if ( + "team" in data and data["team"] is not None + ): # Team might not be present if not correctly loaded by the endpoint assert data["team"]["name"] == team_z_force["name"] - elif short_module_name != "tutorial001_py310": # tutorial001_py310.py doesn't include team in HeroPublic - # If team is expected, this is a failure. For tutorial001 and tutorial001_py39, team should be present. - assert "team" in data and data["team"] is not None, "Team data missing in hero response" - + elif ( + short_module_name != "tutorial001_py310" + ): # tutorial001_py310.py doesn't include team in HeroPublic + # If team is expected, this is a failure. For tutorial001 and tutorial001_py39, team should be present. + assert "team" in data and data["team"] is not None, ( + "Team data missing in hero response" + ) 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"}) # Test patching non-existent hero + response = client.patch( + "/heroes/9001", json={"name": "Dragon Cube X"} + ) # Test patching non-existent hero assert response.status_code == 404, response.text response = client.delete(f"/heroes/{hero2_id}") @@ -140,24 +148,24 @@ def test_tutorial(module: types.ModuleType): assert response.status_code == 200, response.text data = response.json() assert len(data) == 2 - response = client.delete("/heroes/9000") # Test deleting non-existent hero + response = client.delete("/heroes/9000") # Test deleting non-existent hero 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 len(data["heroes"]) > 0 # Ensure heroes are loaded + assert len(data["heroes"]) > 0 # Ensure heroes are loaded 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") # Test deleting non-existent team + response = client.delete("/teams/9000") # Test deleting non-existent team 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 # Only Z-Force should remain + assert len(data) == 1 # Only Z-Force should remain # OpenAPI schema check - this is a long part, keeping it as is from the original. # Small modification to handle potential differences in Pydantic v1 vs v2 for optional fields in schema @@ -177,10 +185,17 @@ def test_tutorial(module: types.ModuleType): # short_module_name is already defined at the start of the 'with TestClient' block # All versions (base, py39, py310) use HeroPublicWithTeam for this endpoint based on previous test run. - assert get_hero_path["responses"]["200"]["content"]["application/json"]["schema"]["$ref"] == "#/components/schemas/HeroPublicWithTeam" + assert ( + get_hero_path["responses"]["200"]["content"]["application/json"]["schema"][ + "$ref" + ] + == "#/components/schemas/HeroPublicWithTeam" + ) # Check HeroCreate schema for age and team_id nullability based on IsDict usage in original - hero_create_props = openapi_schema["components"]["schemas"]["HeroCreate"]["properties"] + hero_create_props = openapi_schema["components"]["schemas"]["HeroCreate"][ + "properties" + ] # For Pydantic v2 style (anyOf with type and null) vs Pydantic v1 (just type, optionality by not being in required) # This test was written with IsDict which complicates exact schema matching without knowing SQLModel version's Pydantic interaction # For simplicity, we check if 'age' and 'team_id' are present. Detailed check would need to adapt to SQLModel's Pydantic version. @@ -203,11 +218,19 @@ def test_tutorial(module: types.ModuleType): # It's better to check for key components and structures. # Check if TeamPublicWithHeroes has heroes list - team_public_with_heroes_props = openapi_schema["components"]["schemas"]["TeamPublicWithHeroes"]["properties"] + team_public_with_heroes_props = openapi_schema["components"]["schemas"][ + "TeamPublicWithHeroes" + ]["properties"] assert "heroes" in team_public_with_heroes_props assert team_public_with_heroes_props["heroes"]["type"] == "array" # short_module_name is already defined if short_module_name == "tutorial001_py310": - assert team_public_with_heroes_props["heroes"]["items"]["$ref"] == "#/components/schemas/HeroPublic" # tutorial001_py310 uses HeroPublic for heroes list + assert ( + team_public_with_heroes_props["heroes"]["items"]["$ref"] + == "#/components/schemas/HeroPublic" + ) # tutorial001_py310 uses HeroPublic for heroes list else: - assert team_public_with_heroes_props["heroes"]["items"]["$ref"] == "#/components/schemas/HeroPublic" # Original tutorial001.py seems to imply HeroPublic as well. + assert ( + team_public_with_heroes_props["heroes"]["items"]["$ref"] + == "#/components/schemas/HeroPublic" + ) # Original tutorial001.py seems to imply HeroPublic as well. diff --git a/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py index 2b935b23..b0dd9e94 100644 --- a/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py @@ -6,7 +6,7 @@ from typing import Any import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import create_engine, SQLModel +from sqlmodel import SQLModel, create_engine from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -67,7 +67,7 @@ def test_tutorial(module: types.ModuleType): assert data[0]["secret_name"] == hero_data["secret_name"] # Ensure other fields are present as per the model Hero (which is used as response_model) assert "id" in data[0] - assert "age" in data[0] # Even if None, it should be in the response + assert "age" in data[0] # Even if None, it should be in the response response = client.get("/openapi.json") assert response.status_code == 200, response.text diff --git a/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py index 388a2fba..0ee7bb48 100644 --- a/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py @@ -6,7 +6,7 @@ from typing import Any import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import create_engine, SQLModel +from sqlmodel import create_engine from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -52,10 +52,10 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any): # Let's rely on the app's startup event as per the tutorial's design. # If `create_db_and_tables` exists as a global function in the module (outside app event), then call it. if hasattr(mod, "create_db_and_tables") and callable(mod.create_db_and_tables): - # Check if it's the function that FastAPI would call, or a standalone one. - # This tutorial series usually has `create_db_and_tables` called by `app.on_event("startup")`. - # If the tests run TestClient(mod.app), startup events will run. - pass # Assuming startup event handles it. + # Check if it's the function that FastAPI would call, or a standalone one. + # This tutorial series usually has `create_db_and_tables` called by `app.on_event("startup")`. + # If the tests run TestClient(mod.app), startup events will run. + pass # Assuming startup event handles it. return mod @@ -67,7 +67,7 @@ def test_tutorial(module: types.ModuleType): hero2_data = { "name": "Spider-Boy", "secret_name": "Pedro Parqueador", - "id": 9000, # This ID might be ignored by DB if it's auto-incrementing primary key + "id": 9000, # This ID might be ignored by DB if it's auto-incrementing primary key } hero3_data = { "name": "Rusty-Man", @@ -79,13 +79,13 @@ def test_tutorial(module: types.ModuleType): response = client.post("/heroes/", json=hero2_data) assert response.status_code == 200, response.text - hero2_created = response.json() # Use the ID from the created hero + hero2_created = response.json() # Use the ID from the created hero hero2_id = hero2_created["id"] response = client.post("/heroes/", json=hero3_data) assert response.status_code == 200, response.text - response = client.get(f"/heroes/{hero2_id}") # Use the actual ID from DB + response = client.get(f"/heroes/{hero2_id}") # Use the actual ID from DB assert response.status_code == 200, response.text # If hero ID 9000 was intended to be a specific test case for a non-existent ID @@ -93,8 +93,10 @@ def test_tutorial(module: types.ModuleType): # Otherwise, if hero2 was expected to have ID 9000, this needs adjustment. # Given typical auto-increment, ID 9000 for hero2 is unlikely unless DB is reset and hero2 is first entry. # The original test implies hero2_data's ID is not necessarily the created ID. - response = client.get("/heroes/9000") # Check for a potentially non-existent ID - assert response.status_code == 404, response.text # Expect 404 if 9000 is not hero2_id and not another hero's ID + response = client.get("/heroes/9000") # Check for a potentially non-existent ID + assert response.status_code == 404, ( + response.text + ) # Expect 404 if 9000 is not hero2_id and not another hero's ID response = client.get("/heroes/") assert response.status_code == 200, response.text @@ -106,7 +108,9 @@ def test_tutorial(module: types.ModuleType): ) assert response.status_code == 200, response.text - response = client.patch("/heroes/9001", json={"name": "Dragon Cube X"}) # Non-existent ID + response = client.patch( + "/heroes/9001", json={"name": "Dragon Cube X"} + ) # Non-existent ID assert response.status_code == 404, response.text response = client.delete(f"/heroes/{hero2_id}") @@ -117,7 +121,9 @@ def test_tutorial(module: types.ModuleType): data = response.json() assert len(data) == 2 - response = client.delete("/heroes/9000") # Non-existent ID (same as the GET check) + response = client.delete( + "/heroes/9000" + ) # Non-existent ID (same as the GET check) assert response.status_code == 404, response.text response = client.get("/openapi.json") diff --git a/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py index 7fb38dac..471bdd2e 100644 --- a/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py @@ -6,12 +6,14 @@ from typing import Any import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import create_engine, SQLModel +from sqlmodel import create_engine from sqlmodel.pool import StaticPool # Adjust the import path based on the file's new location or structure # Assuming conftest.py is located at tests/conftest.py -from ....conftest import needs_py310 # This needs to be relative to this file's location +from ....conftest import ( + needs_py310, # This needs to be relative to this file's location +) @pytest.fixture( @@ -23,9 +25,7 @@ from ....conftest import needs_py310 # This needs to be relative to this file's ) def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any): module_name = request.param - full_module_name = ( - f"docs_src.tutorial.fastapi.simple_hero_api.{module_name}" - ) + full_module_name = f"docs_src.tutorial.fastapi.simple_hero_api.{module_name}" if full_module_name in sys.modules: mod = importlib.reload(sys.modules[full_module_name]) @@ -48,13 +48,15 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any): return mod -def test_tutorial(module: types.ModuleType): # clear_sqlmodel is implicitly used by get_module +def test_tutorial( + module: types.ModuleType, +): # clear_sqlmodel is implicitly used by get_module with TestClient(module.app) as client: hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"} hero2_data = { "name": "Spider-Boy", "secret_name": "Pedro Parqueador", - "id": 9000, # This ID is part of the test logic for this tutorial specifically + "id": 9000, # This ID is part of the test logic for this tutorial specifically } response = client.post("/heroes/", json=hero1_data) data = response.json() diff --git a/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py b/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py index a4dc8c5e..2f961193 100644 --- a/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py +++ b/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py @@ -6,7 +6,7 @@ from typing import Any import pytest from dirty_equals import IsDict from fastapi.testclient import TestClient -from sqlmodel import create_engine, SQLModel +from sqlmodel import create_engine from sqlmodel.pool import StaticPool from ....conftest import needs_py39, needs_py310 @@ -44,11 +44,13 @@ def get_module(request: pytest.FixtureRequest, clear_sqlmodel: Any): return mod -def test_tutorial(module: types.ModuleType): # clear_sqlmodel is implicitly used by get_module +def test_tutorial( + module: types.ModuleType, +): # clear_sqlmodel is implicitly used by get_module with TestClient(module.app) as client: # Hero Operations hero1_data = {"name": "Deadpond", "secret_name": "Dive Wilson"} - hero2_data = { # This hero's ID might be overridden by DB if not specified or if ID is auto-incrementing + hero2_data = { # This hero's ID might be overridden by DB if not specified or if ID is auto-incrementing "name": "Spider-Boy", "secret_name": "Pedro Parqueador", "id": 9000, @@ -61,29 +63,35 @@ def test_tutorial(module: types.ModuleType): # clear_sqlmodel is implicitly used response = client.post("/heroes/", json=hero2_data) assert response.status_code == 200, response.text hero2_created = response.json() - hero2_id = hero2_created["id"] # Use the actual ID returned by the DB + hero2_id = hero2_created["id"] # Use the actual ID returned by the DB response = client.post("/heroes/", json=hero3_data) assert response.status_code == 200, response.text - response = client.get(f"/heroes/{hero2_id}") # Use DB generated ID + response = client.get(f"/heroes/{hero2_id}") # Use DB generated ID assert response.status_code == 200, response.text - response = client.get("/heroes/9000") # Check for ID 9000 specifically (could be hero2_id or not) - if hero2_id == 9000 : # If hero2 got ID 9000 - assert response.status_code == 200, response.text - else: # If hero2 got a different ID, then 9000 should not exist - assert response.status_code == 404, response.text + response = client.get( + "/heroes/9000" + ) # Check for ID 9000 specifically (could be hero2_id or not) + if hero2_id == 9000: # If hero2 got ID 9000 + assert response.status_code == 200, response.text + else: # If hero2 got a different ID, then 9000 should not exist + 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"}) + 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"}) # Non-existent ID + response = client.patch( + "/heroes/9001", json={"name": "Dragon Cube X"} + ) # Non-existent ID assert response.status_code == 404, response.text response = client.delete(f"/heroes/{hero2_id}") @@ -94,13 +102,19 @@ def test_tutorial(module: types.ModuleType): # clear_sqlmodel is implicitly used data = response.json() assert len(data) == 2 - response = client.delete("/heroes/9000") # Try deleting ID 9000 - if hero2_id == 9000 and hero2_id not in [h["id"] for h in data]: # If it was hero2's ID and hero2 was deleted - assert response.status_code == 404 # Already deleted - elif hero2_id != 9000 and 9000 not in [h["id"] for h in data]: # If 9000 was never a valid ID among current heroes + response = client.delete("/heroes/9000") # Try deleting ID 9000 + if hero2_id == 9000 and hero2_id not in [ + h["id"] for h in data + ]: # If it was hero2's ID and hero2 was deleted + assert response.status_code == 404 # Already deleted + elif hero2_id != 9000 and 9000 not in [ + h["id"] for h in data + ]: # If 9000 was never a valid ID among current heroes assert response.status_code == 404 - else: # If 9000 was a valid ID of another hero still present (should not happen with current data) - assert response.status_code == 200 # This case is unlikely with current test data + else: # If 9000 was a valid ID of another hero still present (should not happen with current data) + assert ( + response.status_code == 200 + ) # This case is unlikely with current test data # Team Operations team_preventers_data = {"name": "Preventers", "headquarters": "Sharp Tower"} @@ -128,7 +142,7 @@ def test_tutorial(module: types.ModuleType): # clear_sqlmodel is implicitly used assert data["headquarters"] == team_preventers_created["headquarters"] assert data["id"] == team_preventers_created["id"] - response = client.get("/teams/9000") # Non-existent team ID + response = client.get("/teams/9000") # Non-existent team ID assert response.status_code == 404, response.text response = client.patch( @@ -136,16 +150,18 @@ def test_tutorial(module: types.ModuleType): # clear_sqlmodel is implicitly used ) data = response.json() assert response.status_code == 200, response.text - assert data["name"] == team_preventers_data["name"] # Name should be unchanged + assert data["name"] == team_preventers_data["name"] # Name should be unchanged assert data["headquarters"] == "Preventers Tower" - response = client.patch("/teams/9000", json={"name": "Freedom League"}) # Non-existent + response = client.patch( + "/teams/9000", json={"name": "Freedom League"} + ) # Non-existent 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") # Non-existent + response = client.delete("/teams/9000") # Non-existent assert response.status_code == 404, response.text response = client.get("/teams/") -- 2.47.3