tests and fixtures for clean test env

This commit is contained in:
ebby 2026-09-12 20:34:35 +03:00
parent 51d7a468cf
commit 174bd71413
19 changed files with 108 additions and 22 deletions

View file

@ -2,5 +2,10 @@
"cSpell.language": "en,de-DE", "cSpell.language": "en,de-DE",
"cSpell.words": [ "cSpell.words": [
"Chiara" "Chiara"
] ],
"python.testing.pytestArgs": [
"backend"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
} }

Binary file not shown.

View file

@ -2,6 +2,7 @@ from collections.abc import Generator
from sqlmodel import Session from sqlmodel import Session
from sqlmodel import SQLModel from sqlmodel import SQLModel
from sqlmodel import create_engine from sqlmodel import create_engine
sqlite_file = "dev.db" sqlite_file = "dev.db"
sqlite_url = f"sqlite:///{sqlite_file}" sqlite_url = f"sqlite:///{sqlite_file}"

View file

@ -1,4 +1,5 @@
from .routers import users from sqlmodel import SQLModel
from .routers import users, comments
from backend.internal.database import create_db_and_tables from backend.internal.database import create_db_and_tables
from fastapi import APIRouter from fastapi import APIRouter
from fastapi import FastAPI from fastapi import FastAPI
@ -16,3 +17,6 @@ def on_startup():
router = APIRouter() router = APIRouter()
app.include_router(users.router) app.include_router(users.router)
app.include_router(comments.router)
print(SQLModel.metadata.tables.keys())

View file

@ -0,0 +1,2 @@
from .user import User
from .comment import Comment

View file

@ -1,12 +1,12 @@
from datetime import datetime
import uuid import uuid
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING
from sqlmodel import Relationship from sqlmodel import Relationship
from sqlmodel import DateTime
from sqlmodel import Field from sqlmodel import Field
from sqlmodel import SQLModel from sqlmodel import SQLModel
if TYPE_CHECKING: if TYPE_CHECKING:
from ..models.user import User from backend.models.user import User
class CommentBase(SQLModel): class CommentBase(SQLModel):
pass pass
@ -15,6 +15,6 @@ class Comment(CommentBase, table=True):
id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True) id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True)
slug: str = Field(index=True) slug: str = Field(index=True)
content: str = Field() content: str = Field()
date_time: DateTime = Field(default=DateTime()) date_time: datetime = Field(default=datetime.now())
user_id: uuid.UUID = Field(foreign_key="user.id") user_id: uuid.UUID = Field(foreign_key="user.id")
user: Optional["User"] = Relationship(back_populates="comments") user: "User" = Relationship(back_populates="comments")

View file

@ -5,20 +5,20 @@ from sqlmodel import Relationship
from sqlmodel import SQLModel from sqlmodel import SQLModel
if TYPE_CHECKING: if TYPE_CHECKING:
from ..models.comment import Comment from backend.models.comment import Comment
class UserBase(SQLModel): class UserBase(SQLModel):
pass pass
class User(UserBase): class User(UserBase, table=True):
id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True) id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
email: str = Field(unique=True) email: str = Field(unique=True)
name: str = Field(unique=True) name: str = Field(unique=True)
user_code: str = Field(unique=True) # TODO: create generation function user_code: str = Field(default="1234",unique=True) # TODO: create Generator
subscription: bool = Field() subscription: bool = Field()
comments: list["Comment"] = Relationship(back_populates="user") comments: list["Comment"] = Relationship(back_populates="user")
class RegisterUser(UserBase): class NewUser(UserBase):
email: str email: str
name: str name: str
subscription: bool subscription: bool

View file

@ -2,3 +2,23 @@
# add comment # add comment
# delete comment # delete comment
# get comments # get comments
from backend.internal.database import get_session
from fastapi import Depends
from sqlmodel import Session
from fastapi import APIRouter
from ..models.comment import Comment
router = APIRouter(
prefix="/comments",
tags=["comments"],
dependencies=[],
responses={404: {"description": "Not found"}},
)
@router.post("/")
def register_user(session: Session = Depends(get_session)):
comment = {"test":"test"}
comment1 = Comment.model_validate(comment)
session.add(comment)
session.commit()

View file

@ -1,15 +1,57 @@
from httpx2 import post from backend.models.user import User
from backend.models.user import RegisterUser from backend.internal.database import get_session
from sqlmodel import Session
from sqlmodel import StaticPool
from sqlmodel import create_engine
import pytest
from backend.internal.database import engine
from sqlmodel import SQLModel
from backend.main import app from backend.main import app
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
client = TestClient(app) @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
def test_register_user_works():
@pytest.fixture(name="client")
def client_fixture(session: Session):
def get_session_override():
return session
app.dependency_overrides[get_session] = get_session_override
client = TestClient(app)
yield client
app.dependency_overrides.clear()
def test_register_user_works(client: TestClient):
print(SQLModel.metadata.tables.keys())
new_user = { new_user = {
"email": "Test", "email": "Test@Test.test",
"name": "Test1", "name": "Test1",
"subscription": True "subscription": True
} }
response = client.post(url="/users/", json=new_user) response = client.post(url="/users/", json=new_user)
assert response.status_code == 200 assert response.status_code == 200
def test_email_not_unique(session: Session, client: TestClient):
new_user = {
"email": "Test@Test.test",
"name": "Test1",
"subscription": True
}
user = User.model_validate(new_user)
session.add(user)
session.commit()
response = client.post(url="/users/", json=new_user)
assert response.status_code == 400

View file

@ -8,6 +8,11 @@
# delete all deactivated users after 48h # delete all deactivated users after 48h
from starlette.status import HTTP_400_BAD_REQUEST
from fastapi import HTTPException
from sqlalchemy.exc import IntegrityError
from backend.models.user import User
from backend.models.user import NewUser
from backend.internal.database import get_session from backend.internal.database import get_session
from fastapi import Depends from fastapi import Depends
from sqlmodel import Session from sqlmodel import Session
@ -21,5 +26,12 @@ router = APIRouter(
) )
@router.post("/") @router.post("/")
def register_user(session: Session = Depends(get_session)): def register_user(new_user: NewUser, session: Session = Depends(get_session)):
pass user = User.model_validate(new_user)
try:
session.add(user)
session.commit()
except IntegrityError as e:
session.rollback()
raise HTTPException(HTTP_400_BAD_REQUEST)