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.words": [
"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 SQLModel
from sqlmodel import create_engine
sqlite_file = "dev.db"
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 fastapi import APIRouter
from fastapi import FastAPI
@ -16,3 +17,6 @@ def on_startup():
router = APIRouter()
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
from typing import TYPE_CHECKING, Optional
from typing import TYPE_CHECKING
from sqlmodel import Relationship
from sqlmodel import DateTime
from sqlmodel import Field
from sqlmodel import SQLModel
if TYPE_CHECKING:
from ..models.user import User
from backend.models.user import User
class CommentBase(SQLModel):
pass
@ -15,6 +15,6 @@ class Comment(CommentBase, table=True):
id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True)
slug: str = Field(index=True)
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: 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
if TYPE_CHECKING:
from ..models.comment import Comment
from backend.models.comment import Comment
class UserBase(SQLModel):
pass
class User(UserBase):
id: uuid.UUID | None = Field(default_factory=uuid.uuid4, primary_key=True)
class User(UserBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
email: 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()
comments: list["Comment"] = Relationship(back_populates="user")
class RegisterUser(UserBase):
class NewUser(UserBase):
email: str
name: str
subscription: bool

View file

@ -2,3 +2,23 @@
# add comment
# delete comment
# 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 RegisterUser
from backend.models.user import User
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 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 = {
"email": "Test",
"email": "Test@Test.test",
"name": "Test1",
"subscription": True
}
response = client.post(url="/users/", json=new_user)
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
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 fastapi import Depends
from sqlmodel import Session
@ -21,5 +26,12 @@ router = APIRouter(
)
@router.post("/")
def register_user(session: Session = Depends(get_session)):
pass
def register_user(new_user: NewUser, session: Session = Depends(get_session)):
user = User.model_validate(new_user)
try:
session.add(user)
session.commit()
except IntegrityError as e:
session.rollback()
raise HTTPException(HTTP_400_BAD_REQUEST)