tests and fixtures for clean test env
This commit is contained in:
parent
51d7a468cf
commit
174bd71413
19 changed files with 108 additions and 22 deletions
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
|
|
@ -2,5 +2,10 @@
|
|||
"cSpell.language": "en,de-DE",
|
||||
"cSpell.words": [
|
||||
"Chiara"
|
||||
]
|
||||
],
|
||||
"python.testing.pytestArgs": [
|
||||
"backend"
|
||||
],
|
||||
"python.testing.unittestEnabled": false,
|
||||
"python.testing.pytestEnabled": true
|
||||
}
|
||||
BIN
backend/dev.db
BIN
backend/dev.db
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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}"
|
||||
|
||||
|
|
@ -13,4 +14,4 @@ def create_db_and_tables():
|
|||
|
||||
def get_session() -> Generator[Session, None, None]:
|
||||
with Session(engine) as session:
|
||||
yield session
|
||||
yield session
|
||||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
from .user import User
|
||||
from .comment import Comment
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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")
|
||||
|
|
@ -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
|
||||
|
|
|
|||
BIN
backend/src/backend/routers/__pycache__/comments.cpython-314.pyc
Normal file
BIN
backend/src/backend/routers/__pycache__/comments.cpython-314.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +1,24 @@
|
|||
|
||||
# add 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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue