Skip to content

Latest commit

 

History

History
102 lines (71 loc) · 1.97 KB

lession4.md

File metadata and controls

102 lines (71 loc) · 1.97 KB

Lession 4

Unit Testing

Dependency Injection

As preperation for testing.

# dispo/dispo/api/room.py

# add
SessionDep = Annotated[Session, Depends(get_db)]

# change
async def create_room(room: Room):
    with Session(get_engine()) as db:
        db.add(room)
        db.commit()
        db.refresh(room)
# to
async def create_room(room: Room, db: SessionDep):
    db.add(room)
    db.commit()
    db.refresh(room)
    return room

# same for all other routes
# dispo/dispo/database.py
# add
def get_db() -> Generator:
    with Session(get_engine()) as session:
        yield session

Writing Test

Add pytest and httpx as dev dependency.

poetry add --group dev pytest httpx

# dispo/test/test_room.py
import pytest
from fastapi.testclient import TestClient
from sqlmodel import Session, SQLModel, StaticPool, create_engine

from dispo.database import get_db
from dispo.main import app
from dispo.models import Room


@pytest.fixture(name="session")
def session_fixture():
    engine = create_engine(
        "sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool
    )
    SQLModel.metadata.create_all(engine)
    with Session(engine) as session:
        yield session


@pytest.fixture(name="client")
def client_fixture(session: Session):
    def get_db_override():
        return session

    app.dependency_overrides[get_db] = get_db_override

    client = TestClient(app)
    yield client
    app.dependency_overrides.clear()


def test_create_room(client: TestClient):
    res = client.post(
        "/api/v1/rooms", json={"number": "123", "name": "President Suite"}
    )

    data = res.json()

    assert res.status_code == 200
    assert data["number"] == "123"
    assert data["name"] == "President Suite"
    assert data["id"] is not None

Config and run test in VS-Code

Task

  • Write test for method patch
  • you have to create the room first by sqlmodel
  • Story could be: Rename Wedding Suite to Honeymoon Suite